A simple and efficient MsgPack binary serialization library in a self-contained header file from https://github.com/rtsisyk/msgpuck
msgpuck.h@0:86aa62fedb9b, 2014-11-26 (annotated)
- Committer:
- yihui
- Date:
- Wed Nov 26 09:51:18 2014 +0000
- Revision:
- 0:86aa62fedb9b
from https://github.com/xiongyihui/msgpuck/tree/1007efa26a6c11e68be29a56011094755edce888
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 0:86aa62fedb9b | 1 | #ifndef MSGPUCK_H_INCLUDED |
yihui | 0:86aa62fedb9b | 2 | #define MSGPUCK_H_INCLUDED |
yihui | 0:86aa62fedb9b | 3 | /* |
yihui | 0:86aa62fedb9b | 4 | * Copyright (c) 2013 MsgPuck Authors |
yihui | 0:86aa62fedb9b | 5 | * All rights reserved. |
yihui | 0:86aa62fedb9b | 6 | * |
yihui | 0:86aa62fedb9b | 7 | * Redistribution and use in source and binary forms, with or |
yihui | 0:86aa62fedb9b | 8 | * without modification, are permitted provided that the following |
yihui | 0:86aa62fedb9b | 9 | * conditions are met: |
yihui | 0:86aa62fedb9b | 10 | * |
yihui | 0:86aa62fedb9b | 11 | * 1. Redistributions of source code must retain the above |
yihui | 0:86aa62fedb9b | 12 | * copyright notice, this list of conditions and the |
yihui | 0:86aa62fedb9b | 13 | * following disclaimer. |
yihui | 0:86aa62fedb9b | 14 | * |
yihui | 0:86aa62fedb9b | 15 | * 2. Redistributions in binary form must reproduce the above |
yihui | 0:86aa62fedb9b | 16 | * copyright notice, this list of conditions and the following |
yihui | 0:86aa62fedb9b | 17 | * disclaimer in the documentation and/or other materials |
yihui | 0:86aa62fedb9b | 18 | * provided with the distribution. |
yihui | 0:86aa62fedb9b | 19 | * |
yihui | 0:86aa62fedb9b | 20 | * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND |
yihui | 0:86aa62fedb9b | 21 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
yihui | 0:86aa62fedb9b | 22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
yihui | 0:86aa62fedb9b | 23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
yihui | 0:86aa62fedb9b | 24 | * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
yihui | 0:86aa62fedb9b | 25 | * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
yihui | 0:86aa62fedb9b | 26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
yihui | 0:86aa62fedb9b | 27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
yihui | 0:86aa62fedb9b | 28 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
yihui | 0:86aa62fedb9b | 29 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
yihui | 0:86aa62fedb9b | 30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF |
yihui | 0:86aa62fedb9b | 31 | * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
yihui | 0:86aa62fedb9b | 32 | * SUCH DAMAGE. |
yihui | 0:86aa62fedb9b | 33 | */ |
yihui | 0:86aa62fedb9b | 34 | |
yihui | 0:86aa62fedb9b | 35 | /** |
yihui | 0:86aa62fedb9b | 36 | * \file msgpuck.h |
yihui | 0:86aa62fedb9b | 37 | * MsgPuck |
yihui | 0:86aa62fedb9b | 38 | * \brief MsgPuck is a simple and efficient MsgPack encoder/decoder |
yihui | 0:86aa62fedb9b | 39 | * library in a single self-contained file. |
yihui | 0:86aa62fedb9b | 40 | * |
yihui | 0:86aa62fedb9b | 41 | * Usage example: |
yihui | 0:86aa62fedb9b | 42 | * \code |
yihui | 0:86aa62fedb9b | 43 | * // Encode |
yihui | 0:86aa62fedb9b | 44 | * char buf[1024]; |
yihui | 0:86aa62fedb9b | 45 | * char *w = buf; |
yihui | 0:86aa62fedb9b | 46 | * w = mp_encode_array(w, 4) |
yihui | 0:86aa62fedb9b | 47 | * w = mp_encode_uint(w, 10); |
yihui | 0:86aa62fedb9b | 48 | * w = mp_encode_str(w, "hello world", strlen("hello world")); |
yihui | 0:86aa62fedb9b | 49 | * w = mp_encode_bool(w, true); |
yihui | 0:86aa62fedb9b | 50 | * w = mp_encode_double(w, 3.1415); |
yihui | 0:86aa62fedb9b | 51 | * |
yihui | 0:86aa62fedb9b | 52 | * // Validate |
yihui | 0:86aa62fedb9b | 53 | * const char *b = buf; |
yihui | 0:86aa62fedb9b | 54 | * int r = mp_check(&b, w); |
yihui | 0:86aa62fedb9b | 55 | * assert(!r) |
yihui | 0:86aa62fedb9b | 56 | * assert(b == w); |
yihui | 0:86aa62fedb9b | 57 | * |
yihui | 0:86aa62fedb9b | 58 | * // Decode |
yihui | 0:86aa62fedb9b | 59 | * uint32_t size; |
yihui | 0:86aa62fedb9b | 60 | * uint64_t ival; |
yihui | 0:86aa62fedb9b | 61 | * const char *sval; |
yihui | 0:86aa62fedb9b | 62 | * uint32_t sval_len; |
yihui | 0:86aa62fedb9b | 63 | * bool bval; |
yihui | 0:86aa62fedb9b | 64 | * double dval; |
yihui | 0:86aa62fedb9b | 65 | * |
yihui | 0:86aa62fedb9b | 66 | * const char *r = buf; |
yihui | 0:86aa62fedb9b | 67 | * |
yihui | 0:86aa62fedb9b | 68 | * size = mp_decode_array(&r); |
yihui | 0:86aa62fedb9b | 69 | * // size is 4 |
yihui | 0:86aa62fedb9b | 70 | * |
yihui | 0:86aa62fedb9b | 71 | * ival = mp_decode_uint(&r); |
yihui | 0:86aa62fedb9b | 72 | * // ival is 10; |
yihui | 0:86aa62fedb9b | 73 | * |
yihui | 0:86aa62fedb9b | 74 | * sval = mp_decode_str(&r, &sval_len); |
yihui | 0:86aa62fedb9b | 75 | * // sval is "hello world", sval_len is strlen("hello world") |
yihui | 0:86aa62fedb9b | 76 | * |
yihui | 0:86aa62fedb9b | 77 | * bval = mp_decode_bool(&r); |
yihui | 0:86aa62fedb9b | 78 | * // bval is true |
yihui | 0:86aa62fedb9b | 79 | * |
yihui | 0:86aa62fedb9b | 80 | * dval = mp_decode_double(&r); |
yihui | 0:86aa62fedb9b | 81 | * // dval is 3.1415 |
yihui | 0:86aa62fedb9b | 82 | * |
yihui | 0:86aa62fedb9b | 83 | * assert(r == w); |
yihui | 0:86aa62fedb9b | 84 | * \endcode |
yihui | 0:86aa62fedb9b | 85 | * |
yihui | 0:86aa62fedb9b | 86 | * \note Supported compilers. |
yihui | 0:86aa62fedb9b | 87 | * The implementation requires a C99+ or C++03+ compatible compiler. |
yihui | 0:86aa62fedb9b | 88 | * |
yihui | 0:86aa62fedb9b | 89 | * \note Inline functions. |
yihui | 0:86aa62fedb9b | 90 | * The implementation is compatible with both C99 and GNU inline functions. |
yihui | 0:86aa62fedb9b | 91 | * Please define MP_SOURCE 1 before \#include <msgpuck.h> in a single |
yihui | 0:86aa62fedb9b | 92 | * compilation unit. This module will be used to store non-inlined versions of |
yihui | 0:86aa62fedb9b | 93 | * functions and global tables. |
yihui | 0:86aa62fedb9b | 94 | */ |
yihui | 0:86aa62fedb9b | 95 | |
yihui | 0:86aa62fedb9b | 96 | #if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) |
yihui | 0:86aa62fedb9b | 97 | #define __STDC_CONSTANT_MACROS 1 /* make ะก++ to be happy */ |
yihui | 0:86aa62fedb9b | 98 | #endif |
yihui | 0:86aa62fedb9b | 99 | #if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS) |
yihui | 0:86aa62fedb9b | 100 | #define __STDC_LIMIT_MACROS 1 /* make ะก++ to be happy */ |
yihui | 0:86aa62fedb9b | 101 | #endif |
yihui | 0:86aa62fedb9b | 102 | #include <stdlib.h> |
yihui | 0:86aa62fedb9b | 103 | #include <stdint.h> |
yihui | 0:86aa62fedb9b | 104 | #include <stddef.h> |
yihui | 0:86aa62fedb9b | 105 | #include <stdbool.h> |
yihui | 0:86aa62fedb9b | 106 | #include <string.h> |
yihui | 0:86aa62fedb9b | 107 | #include <assert.h> |
yihui | 0:86aa62fedb9b | 108 | #include <stdarg.h> |
yihui | 0:86aa62fedb9b | 109 | |
yihui | 0:86aa62fedb9b | 110 | #if defined(__cplusplus) |
yihui | 0:86aa62fedb9b | 111 | extern "C" { |
yihui | 0:86aa62fedb9b | 112 | #endif /* defined(__cplusplus) */ |
yihui | 0:86aa62fedb9b | 113 | |
yihui | 0:86aa62fedb9b | 114 | /* |
yihui | 0:86aa62fedb9b | 115 | * {{{ Platform-specific definitions |
yihui | 0:86aa62fedb9b | 116 | */ |
yihui | 0:86aa62fedb9b | 117 | |
yihui | 0:86aa62fedb9b | 118 | /** \cond 0 **/ |
yihui | 0:86aa62fedb9b | 119 | |
yihui | 0:86aa62fedb9b | 120 | #if defined(__CC_ARM) |
yihui | 0:86aa62fedb9b | 121 | #define SET(p,val,type) (*((__packed type *)(p))=(val)) |
yihui | 0:86aa62fedb9b | 122 | #define GET(p,val,type) ((val)=*((__packed type *)(p))) |
yihui | 0:86aa62fedb9b | 123 | #elif defined(__GNUC__) |
yihui | 0:86aa62fedb9b | 124 | #define SET(p,val,type) struct unaligned_##type { type x __attribute__((packed)); }; \ |
yihui | 0:86aa62fedb9b | 125 | (((unaligned_##type __attribute__((may_alias))*)(p))->x=(val)) |
yihui | 0:86aa62fedb9b | 126 | #define GET(p,val,type) struct unaligned_##type { type x __attribute__((packed)); }; \ |
yihui | 0:86aa62fedb9b | 127 | ((val)=((unaligned_##type __attribute__((may_alias))*)(p))->x) |
yihui | 0:86aa62fedb9b | 128 | #else |
yihui | 0:86aa62fedb9b | 129 | #define SET(p,val,type) (*((type *)p)=(val)) |
yihui | 0:86aa62fedb9b | 130 | #define GET(p,val,type) ((val)=*((type *)p)) |
yihui | 0:86aa62fedb9b | 131 | #endif |
yihui | 0:86aa62fedb9b | 132 | |
yihui | 0:86aa62fedb9b | 133 | #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) |
yihui | 0:86aa62fedb9b | 134 | #if !defined(MP_SOURCE) |
yihui | 0:86aa62fedb9b | 135 | #define MP_PROTO extern inline |
yihui | 0:86aa62fedb9b | 136 | #define MP_IMPL extern inline |
yihui | 0:86aa62fedb9b | 137 | #else /* defined(MP_SOURCE) */ |
yihui | 0:86aa62fedb9b | 138 | #define MP_PROTO |
yihui | 0:86aa62fedb9b | 139 | #define MP_IMPL |
yihui | 0:86aa62fedb9b | 140 | #endif |
yihui | 0:86aa62fedb9b | 141 | #define MP_ALWAYSINLINE |
yihui | 0:86aa62fedb9b | 142 | #else /* C99 inline */ |
yihui | 0:86aa62fedb9b | 143 | #if !defined(MP_SOURCE) |
yihui | 0:86aa62fedb9b | 144 | #define MP_PROTO inline |
yihui | 0:86aa62fedb9b | 145 | #define MP_IMPL inline |
yihui | 0:86aa62fedb9b | 146 | #else /* defined(MP_SOURCE) */ |
yihui | 0:86aa62fedb9b | 147 | #define MP_PROTO extern inline |
yihui | 0:86aa62fedb9b | 148 | #define MP_IMPL inline |
yihui | 0:86aa62fedb9b | 149 | #endif |
yihui | 0:86aa62fedb9b | 150 | #define MP_ALWAYSINLINE __attribute__((always_inline)) |
yihui | 0:86aa62fedb9b | 151 | #endif /* GNU inline or C99 inline */ |
yihui | 0:86aa62fedb9b | 152 | |
yihui | 0:86aa62fedb9b | 153 | #if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || \ |
yihui | 0:86aa62fedb9b | 154 | defined __SUNPRO_C || defined __SUNPRO_CC |
yihui | 0:86aa62fedb9b | 155 | #define MP_GCC_VERSION(major, minor) 0 |
yihui | 0:86aa62fedb9b | 156 | #else |
yihui | 0:86aa62fedb9b | 157 | #define MP_GCC_VERSION(major, minor) (__GNUC__ > (major) || \ |
yihui | 0:86aa62fedb9b | 158 | (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) |
yihui | 0:86aa62fedb9b | 159 | #endif |
yihui | 0:86aa62fedb9b | 160 | |
yihui | 0:86aa62fedb9b | 161 | #if !defined(__has_builtin) |
yihui | 0:86aa62fedb9b | 162 | #define __has_builtin(x) 0 /* clang */ |
yihui | 0:86aa62fedb9b | 163 | #endif |
yihui | 0:86aa62fedb9b | 164 | |
yihui | 0:86aa62fedb9b | 165 | #if MP_GCC_VERSION(2, 9) || __has_builtin(__builtin_expect) |
yihui | 0:86aa62fedb9b | 166 | #define mp_likely(x) __builtin_expect((x), 1) |
yihui | 0:86aa62fedb9b | 167 | #define mp_unlikely(x) __builtin_expect((x), 0) |
yihui | 0:86aa62fedb9b | 168 | #else |
yihui | 0:86aa62fedb9b | 169 | #define mp_likely(x) (x) |
yihui | 0:86aa62fedb9b | 170 | #define mp_unlikely(x) (x) |
yihui | 0:86aa62fedb9b | 171 | #endif |
yihui | 0:86aa62fedb9b | 172 | |
yihui | 0:86aa62fedb9b | 173 | #if MP_GCC_VERSION(4, 5) || __has_builtin(__builtin_unreachable) |
yihui | 0:86aa62fedb9b | 174 | #define mp_unreachable() (assert(0), __builtin_unreachable()) |
yihui | 0:86aa62fedb9b | 175 | #else |
yihui | 0:86aa62fedb9b | 176 | MP_PROTO void |
yihui | 0:86aa62fedb9b | 177 | mp_unreachable(void) __attribute__((noreturn)); |
yihui | 0:86aa62fedb9b | 178 | MP_PROTO void |
yihui | 0:86aa62fedb9b | 179 | mp_unreachable(void) { assert(0); abort(); } |
yihui | 0:86aa62fedb9b | 180 | #define mp_unreachable() (assert(0)) |
yihui | 0:86aa62fedb9b | 181 | #endif |
yihui | 0:86aa62fedb9b | 182 | |
yihui | 0:86aa62fedb9b | 183 | #define mp_bswap_u8(x) (x) /* just to simplify mp_load/mp_store macroses */ |
yihui | 0:86aa62fedb9b | 184 | |
yihui | 0:86aa62fedb9b | 185 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
yihui | 0:86aa62fedb9b | 186 | |
yihui | 0:86aa62fedb9b | 187 | #if MP_GCC_VERSION(4, 8) || __has_builtin(__builtin_bswap16) |
yihui | 0:86aa62fedb9b | 188 | #define mp_bswap_u16(x) __builtin_bswap16(x) |
yihui | 0:86aa62fedb9b | 189 | #else /* !MP_GCC_VERSION(4, 8) */ |
yihui | 0:86aa62fedb9b | 190 | #define mp_bswap_u16(x) ( \ |
yihui | 0:86aa62fedb9b | 191 | (((x) << 8) & 0xff00) | \ |
yihui | 0:86aa62fedb9b | 192 | (((x) >> 8) & 0x00ff) ) |
yihui | 0:86aa62fedb9b | 193 | #endif |
yihui | 0:86aa62fedb9b | 194 | |
yihui | 0:86aa62fedb9b | 195 | #if MP_GCC_VERSION(4, 3) || __has_builtin(__builtin_bswap32) |
yihui | 0:86aa62fedb9b | 196 | #define mp_bswap_u32(x) __builtin_bswap32(x) |
yihui | 0:86aa62fedb9b | 197 | #else /* !MP_GCC_VERSION(4, 3) */ |
yihui | 0:86aa62fedb9b | 198 | #define mp_bswap_u32(x) ( \ |
yihui | 0:86aa62fedb9b | 199 | (((x) << 24) & UINT32_C(0xff000000)) | \ |
yihui | 0:86aa62fedb9b | 200 | (((x) << 8) & UINT32_C(0x00ff0000)) | \ |
yihui | 0:86aa62fedb9b | 201 | (((x) >> 8) & UINT32_C(0x0000ff00)) | \ |
yihui | 0:86aa62fedb9b | 202 | (((x) >> 24) & UINT32_C(0x000000ff)) ) |
yihui | 0:86aa62fedb9b | 203 | #endif |
yihui | 0:86aa62fedb9b | 204 | |
yihui | 0:86aa62fedb9b | 205 | #if MP_GCC_VERSION(4, 3) || __has_builtin(__builtin_bswap64) |
yihui | 0:86aa62fedb9b | 206 | #define mp_bswap_u64(x) __builtin_bswap64(x) |
yihui | 0:86aa62fedb9b | 207 | #else /* !MP_GCC_VERSION(4, 3) */ |
yihui | 0:86aa62fedb9b | 208 | #define mp_bswap_u64(x) (\ |
yihui | 0:86aa62fedb9b | 209 | (((x) << 56) & UINT64_C(0xff00000000000000)) | \ |
yihui | 0:86aa62fedb9b | 210 | (((x) << 40) & UINT64_C(0x00ff000000000000)) | \ |
yihui | 0:86aa62fedb9b | 211 | (((x) << 24) & UINT64_C(0x0000ff0000000000)) | \ |
yihui | 0:86aa62fedb9b | 212 | (((x) << 8) & UINT64_C(0x000000ff00000000)) | \ |
yihui | 0:86aa62fedb9b | 213 | (((x) >> 8) & UINT64_C(0x00000000ff000000)) | \ |
yihui | 0:86aa62fedb9b | 214 | (((x) >> 24) & UINT64_C(0x0000000000ff0000)) | \ |
yihui | 0:86aa62fedb9b | 215 | (((x) >> 40) & UINT64_C(0x000000000000ff00)) | \ |
yihui | 0:86aa62fedb9b | 216 | (((x) >> 56) & UINT64_C(0x00000000000000ff)) ) |
yihui | 0:86aa62fedb9b | 217 | #endif |
yihui | 0:86aa62fedb9b | 218 | |
yihui | 0:86aa62fedb9b | 219 | #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ |
yihui | 0:86aa62fedb9b | 220 | |
yihui | 0:86aa62fedb9b | 221 | #define mp_bswap_u16(x) (x) |
yihui | 0:86aa62fedb9b | 222 | #define mp_bswap_u32(x) (x) |
yihui | 0:86aa62fedb9b | 223 | #define mp_bswap_u64(x) (x) |
yihui | 0:86aa62fedb9b | 224 | |
yihui | 0:86aa62fedb9b | 225 | #else |
yihui | 0:86aa62fedb9b | 226 | #error Unsupported __BYTE_ORDER__ |
yihui | 0:86aa62fedb9b | 227 | #endif |
yihui | 0:86aa62fedb9b | 228 | |
yihui | 0:86aa62fedb9b | 229 | #if !defined(__FLOAT_WORD_ORDER__) |
yihui | 0:86aa62fedb9b | 230 | #define __FLOAT_WORD_ORDER__ __BYTE_ORDER__ |
yihui | 0:86aa62fedb9b | 231 | #endif /* defined(__FLOAT_WORD_ORDER__) */ |
yihui | 0:86aa62fedb9b | 232 | |
yihui | 0:86aa62fedb9b | 233 | #if __FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__ |
yihui | 0:86aa62fedb9b | 234 | MP_PROTO float |
yihui | 0:86aa62fedb9b | 235 | mp_bswap_float(float f); |
yihui | 0:86aa62fedb9b | 236 | |
yihui | 0:86aa62fedb9b | 237 | MP_PROTO double |
yihui | 0:86aa62fedb9b | 238 | mp_bswap_double(double d); |
yihui | 0:86aa62fedb9b | 239 | |
yihui | 0:86aa62fedb9b | 240 | MP_IMPL float |
yihui | 0:86aa62fedb9b | 241 | mp_bswap_float(float f) |
yihui | 0:86aa62fedb9b | 242 | { |
yihui | 0:86aa62fedb9b | 243 | union { |
yihui | 0:86aa62fedb9b | 244 | float f; |
yihui | 0:86aa62fedb9b | 245 | uint32_t n; |
yihui | 0:86aa62fedb9b | 246 | } cast; |
yihui | 0:86aa62fedb9b | 247 | cast.f = f; |
yihui | 0:86aa62fedb9b | 248 | cast.n = mp_bswap_u32(cast.n); |
yihui | 0:86aa62fedb9b | 249 | return cast.f; |
yihui | 0:86aa62fedb9b | 250 | } |
yihui | 0:86aa62fedb9b | 251 | |
yihui | 0:86aa62fedb9b | 252 | MP_IMPL double |
yihui | 0:86aa62fedb9b | 253 | mp_bswap_double(double d) |
yihui | 0:86aa62fedb9b | 254 | { |
yihui | 0:86aa62fedb9b | 255 | union { |
yihui | 0:86aa62fedb9b | 256 | double d; |
yihui | 0:86aa62fedb9b | 257 | uint64_t n; |
yihui | 0:86aa62fedb9b | 258 | } cast; |
yihui | 0:86aa62fedb9b | 259 | cast.d = d; |
yihui | 0:86aa62fedb9b | 260 | cast.n = mp_bswap_u64(cast.n); |
yihui | 0:86aa62fedb9b | 261 | return cast.d; |
yihui | 0:86aa62fedb9b | 262 | } |
yihui | 0:86aa62fedb9b | 263 | #elif __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ |
yihui | 0:86aa62fedb9b | 264 | #define mp_bswap_float(x) (x) |
yihui | 0:86aa62fedb9b | 265 | #define mp_bswap_double(x) (x) |
yihui | 0:86aa62fedb9b | 266 | #else |
yihui | 0:86aa62fedb9b | 267 | #error Unsupported __FLOAT_WORD_ORDER__ |
yihui | 0:86aa62fedb9b | 268 | #endif |
yihui | 0:86aa62fedb9b | 269 | |
yihui | 0:86aa62fedb9b | 270 | #define MP_LOAD_STORE(name, type) \ |
yihui | 0:86aa62fedb9b | 271 | MP_PROTO type \ |
yihui | 0:86aa62fedb9b | 272 | mp_load_##name(const char **data); \ |
yihui | 0:86aa62fedb9b | 273 | MP_IMPL type \ |
yihui | 0:86aa62fedb9b | 274 | mp_load_##name(const char **data) \ |
yihui | 0:86aa62fedb9b | 275 | { \ |
yihui | 0:86aa62fedb9b | 276 | type val; \ |
yihui | 0:86aa62fedb9b | 277 | GET(*data, val, type); \ |
yihui | 0:86aa62fedb9b | 278 | val = mp_bswap_##name(val); \ |
yihui | 0:86aa62fedb9b | 279 | *data += sizeof(type); \ |
yihui | 0:86aa62fedb9b | 280 | return val; \ |
yihui | 0:86aa62fedb9b | 281 | } \ |
yihui | 0:86aa62fedb9b | 282 | MP_PROTO char * \ |
yihui | 0:86aa62fedb9b | 283 | mp_store_##name(char *data, type val); \ |
yihui | 0:86aa62fedb9b | 284 | MP_IMPL char * \ |
yihui | 0:86aa62fedb9b | 285 | mp_store_##name(char *data, type val) \ |
yihui | 0:86aa62fedb9b | 286 | { \ |
yihui | 0:86aa62fedb9b | 287 | val = mp_bswap_##name(val); \ |
yihui | 0:86aa62fedb9b | 288 | SET(data, val, type); \ |
yihui | 0:86aa62fedb9b | 289 | return data + sizeof(type); \ |
yihui | 0:86aa62fedb9b | 290 | } |
yihui | 0:86aa62fedb9b | 291 | |
yihui | 0:86aa62fedb9b | 292 | MP_LOAD_STORE(u8, uint8_t); |
yihui | 0:86aa62fedb9b | 293 | MP_LOAD_STORE(u16, uint16_t); |
yihui | 0:86aa62fedb9b | 294 | MP_LOAD_STORE(u32, uint32_t); |
yihui | 0:86aa62fedb9b | 295 | MP_LOAD_STORE(u64, uint64_t); |
yihui | 0:86aa62fedb9b | 296 | MP_LOAD_STORE(float, float); |
yihui | 0:86aa62fedb9b | 297 | MP_LOAD_STORE(double, double); |
yihui | 0:86aa62fedb9b | 298 | |
yihui | 0:86aa62fedb9b | 299 | /** \endcond */ |
yihui | 0:86aa62fedb9b | 300 | |
yihui | 0:86aa62fedb9b | 301 | /* |
yihui | 0:86aa62fedb9b | 302 | * }}} |
yihui | 0:86aa62fedb9b | 303 | */ |
yihui | 0:86aa62fedb9b | 304 | |
yihui | 0:86aa62fedb9b | 305 | /* |
yihui | 0:86aa62fedb9b | 306 | * {{{ API definition |
yihui | 0:86aa62fedb9b | 307 | */ |
yihui | 0:86aa62fedb9b | 308 | |
yihui | 0:86aa62fedb9b | 309 | /** |
yihui | 0:86aa62fedb9b | 310 | * \brief MsgPack data types |
yihui | 0:86aa62fedb9b | 311 | */ |
yihui | 0:86aa62fedb9b | 312 | enum mp_type { |
yihui | 0:86aa62fedb9b | 313 | MP_NIL = 0, |
yihui | 0:86aa62fedb9b | 314 | MP_UINT, |
yihui | 0:86aa62fedb9b | 315 | MP_INT, |
yihui | 0:86aa62fedb9b | 316 | MP_STR, |
yihui | 0:86aa62fedb9b | 317 | MP_BIN, |
yihui | 0:86aa62fedb9b | 318 | MP_ARRAY, |
yihui | 0:86aa62fedb9b | 319 | MP_MAP, |
yihui | 0:86aa62fedb9b | 320 | MP_BOOL, |
yihui | 0:86aa62fedb9b | 321 | MP_FLOAT, |
yihui | 0:86aa62fedb9b | 322 | MP_DOUBLE, |
yihui | 0:86aa62fedb9b | 323 | MP_EXT |
yihui | 0:86aa62fedb9b | 324 | }; |
yihui | 0:86aa62fedb9b | 325 | |
yihui | 0:86aa62fedb9b | 326 | /** |
yihui | 0:86aa62fedb9b | 327 | * \brief Determine MsgPack type by a first byte \a c of encoded data. |
yihui | 0:86aa62fedb9b | 328 | * |
yihui | 0:86aa62fedb9b | 329 | * Example usage: |
yihui | 0:86aa62fedb9b | 330 | * \code |
yihui | 0:86aa62fedb9b | 331 | * assert(MP_ARRAY == mp_typeof(0x90)); |
yihui | 0:86aa62fedb9b | 332 | * \endcode |
yihui | 0:86aa62fedb9b | 333 | * |
yihui | 0:86aa62fedb9b | 334 | * \param c - a first byte of encoded data |
yihui | 0:86aa62fedb9b | 335 | * \return MsgPack type |
yihui | 0:86aa62fedb9b | 336 | */ |
yihui | 0:86aa62fedb9b | 337 | MP_PROTO __attribute__((pure)) enum mp_type |
yihui | 0:86aa62fedb9b | 338 | mp_typeof(const char c); |
yihui | 0:86aa62fedb9b | 339 | |
yihui | 0:86aa62fedb9b | 340 | /** |
yihui | 0:86aa62fedb9b | 341 | * \brief Calculate exact buffer size needed to store an array header of |
yihui | 0:86aa62fedb9b | 342 | * \a size elements. Maximum return value is 5. For performance reasons you |
yihui | 0:86aa62fedb9b | 343 | * can preallocate buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 344 | * \param size - a number of elements |
yihui | 0:86aa62fedb9b | 345 | * \return buffer size in bytes (max is 5) |
yihui | 0:86aa62fedb9b | 346 | */ |
yihui | 0:86aa62fedb9b | 347 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 348 | mp_sizeof_array(uint32_t size); |
yihui | 0:86aa62fedb9b | 349 | |
yihui | 0:86aa62fedb9b | 350 | /** |
yihui | 0:86aa62fedb9b | 351 | * \brief Encode an array header of \a size elements. |
yihui | 0:86aa62fedb9b | 352 | * |
yihui | 0:86aa62fedb9b | 353 | * All array members must be encoded after the header. |
yihui | 0:86aa62fedb9b | 354 | * |
yihui | 0:86aa62fedb9b | 355 | * Example usage: |
yihui | 0:86aa62fedb9b | 356 | * \code |
yihui | 0:86aa62fedb9b | 357 | * // Encode |
yihui | 0:86aa62fedb9b | 358 | * char buf[1024]; |
yihui | 0:86aa62fedb9b | 359 | * char *w = buf; |
yihui | 0:86aa62fedb9b | 360 | * w = mp_encode_array(w, 2) |
yihui | 0:86aa62fedb9b | 361 | * w = mp_encode_uint(w, 10); |
yihui | 0:86aa62fedb9b | 362 | * w = mp_encode_uint(w, 15); |
yihui | 0:86aa62fedb9b | 363 | * |
yihui | 0:86aa62fedb9b | 364 | * // Decode |
yihui | 0:86aa62fedb9b | 365 | * const char *r = buf; |
yihui | 0:86aa62fedb9b | 366 | * uint32_t size = mp_decode_array(&r); |
yihui | 0:86aa62fedb9b | 367 | * for (uint32_t i = 0; i < size; i++) { |
yihui | 0:86aa62fedb9b | 368 | * uint64_t val = mp_decode_uint(&r); |
yihui | 0:86aa62fedb9b | 369 | * } |
yihui | 0:86aa62fedb9b | 370 | * assert (r == w); |
yihui | 0:86aa62fedb9b | 371 | * \endcode |
yihui | 0:86aa62fedb9b | 372 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 373 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 374 | * \param size - a number of elements |
yihui | 0:86aa62fedb9b | 375 | * \return \a data + \link mp_sizeof_array() mp_sizeof_array(size) \endlink |
yihui | 0:86aa62fedb9b | 376 | * \sa mp_sizeof_array |
yihui | 0:86aa62fedb9b | 377 | */ |
yihui | 0:86aa62fedb9b | 378 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 379 | mp_encode_array(char *data, uint32_t size); |
yihui | 0:86aa62fedb9b | 380 | |
yihui | 0:86aa62fedb9b | 381 | /** |
yihui | 0:86aa62fedb9b | 382 | * \brief Check that \a cur buffer has enough bytes to decode an array header |
yihui | 0:86aa62fedb9b | 383 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 384 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 385 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 386 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 387 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 388 | * \pre mp_typeof(*cur) == MP_ARRAY |
yihui | 0:86aa62fedb9b | 389 | */ |
yihui | 0:86aa62fedb9b | 390 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 391 | mp_check_array(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 392 | |
yihui | 0:86aa62fedb9b | 393 | /** |
yihui | 0:86aa62fedb9b | 394 | * \brief Decode an array header from MsgPack \a data. |
yihui | 0:86aa62fedb9b | 395 | * |
yihui | 0:86aa62fedb9b | 396 | * All array members must be decoded after the header. |
yihui | 0:86aa62fedb9b | 397 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 398 | * \return the number of elements in an array |
yihui | 0:86aa62fedb9b | 399 | * \post *data = *data + mp_sizeof_array(retval) |
yihui | 0:86aa62fedb9b | 400 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 401 | */ |
yihui | 0:86aa62fedb9b | 402 | MP_PROTO uint32_t |
yihui | 0:86aa62fedb9b | 403 | mp_decode_array(const char **data); |
yihui | 0:86aa62fedb9b | 404 | |
yihui | 0:86aa62fedb9b | 405 | /** |
yihui | 0:86aa62fedb9b | 406 | * \brief Calculate exact buffer size needed to store a map header of |
yihui | 0:86aa62fedb9b | 407 | * \a size elements. Maximum return value is 5. For performance reasons you |
yihui | 0:86aa62fedb9b | 408 | * can preallocate buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 409 | * \param size - a number of elements |
yihui | 0:86aa62fedb9b | 410 | * \return buffer size in bytes (max is 5) |
yihui | 0:86aa62fedb9b | 411 | */ |
yihui | 0:86aa62fedb9b | 412 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 413 | mp_sizeof_map(uint32_t size); |
yihui | 0:86aa62fedb9b | 414 | |
yihui | 0:86aa62fedb9b | 415 | /** |
yihui | 0:86aa62fedb9b | 416 | * \brief Encode a map header of \a size elements. |
yihui | 0:86aa62fedb9b | 417 | * |
yihui | 0:86aa62fedb9b | 418 | * All map key-value pairs must be encoded after the header. |
yihui | 0:86aa62fedb9b | 419 | * |
yihui | 0:86aa62fedb9b | 420 | * Example usage: |
yihui | 0:86aa62fedb9b | 421 | * \code |
yihui | 0:86aa62fedb9b | 422 | * char buf[1024]; |
yihui | 0:86aa62fedb9b | 423 | * |
yihui | 0:86aa62fedb9b | 424 | * // Encode |
yihui | 0:86aa62fedb9b | 425 | * char *w = buf; |
yihui | 0:86aa62fedb9b | 426 | * w = mp_encode_map(b, 2); |
yihui | 0:86aa62fedb9b | 427 | * w = mp_encode_str(b, "key1", 4); |
yihui | 0:86aa62fedb9b | 428 | * w = mp_encode_str(b, "value1", 6); |
yihui | 0:86aa62fedb9b | 429 | * w = mp_encode_str(b, "key2", 4); |
yihui | 0:86aa62fedb9b | 430 | * w = mp_encode_str(b, "value2", 6); |
yihui | 0:86aa62fedb9b | 431 | * |
yihui | 0:86aa62fedb9b | 432 | * // Decode |
yihui | 0:86aa62fedb9b | 433 | * const char *r = buf; |
yihui | 0:86aa62fedb9b | 434 | * uint32_t size = mp_decode_map(&r); |
yihui | 0:86aa62fedb9b | 435 | * for (uint32_t i = 0; i < size; i++) { |
yihui | 0:86aa62fedb9b | 436 | * // Use switch(mp_typeof(**r)) to support more types |
yihui | 0:86aa62fedb9b | 437 | * uint32_t key_len, val_len; |
yihui | 0:86aa62fedb9b | 438 | * const char *key = mp_decode_str(&r, key_len); |
yihui | 0:86aa62fedb9b | 439 | * const char *val = mp_decode_str(&r, val_len); |
yihui | 0:86aa62fedb9b | 440 | * } |
yihui | 0:86aa62fedb9b | 441 | * assert (r == w); |
yihui | 0:86aa62fedb9b | 442 | * \endcode |
yihui | 0:86aa62fedb9b | 443 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 444 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 445 | * \param size - a number of key/value pairs |
yihui | 0:86aa62fedb9b | 446 | * \return \a data + \link mp_sizeof_map() mp_sizeof_map(size)\endlink |
yihui | 0:86aa62fedb9b | 447 | * \sa mp_sizeof_map |
yihui | 0:86aa62fedb9b | 448 | */ |
yihui | 0:86aa62fedb9b | 449 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 450 | mp_encode_map(char *data, uint32_t size); |
yihui | 0:86aa62fedb9b | 451 | |
yihui | 0:86aa62fedb9b | 452 | /** |
yihui | 0:86aa62fedb9b | 453 | * \brief Check that \a cur buffer has enough bytes to decode a map header |
yihui | 0:86aa62fedb9b | 454 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 455 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 456 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 457 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 458 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 459 | * \pre mp_typeof(*cur) == MP_MAP |
yihui | 0:86aa62fedb9b | 460 | */ |
yihui | 0:86aa62fedb9b | 461 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 462 | mp_check_map(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 463 | |
yihui | 0:86aa62fedb9b | 464 | /** |
yihui | 0:86aa62fedb9b | 465 | * \brief Decode a map header from MsgPack \a data. |
yihui | 0:86aa62fedb9b | 466 | * |
yihui | 0:86aa62fedb9b | 467 | * All map key-value pairs must be decoded after the header. |
yihui | 0:86aa62fedb9b | 468 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 469 | * \return the number of key/value pairs in a map |
yihui | 0:86aa62fedb9b | 470 | * \post *data = *data + mp_sizeof_array(retval) |
yihui | 0:86aa62fedb9b | 471 | * \sa \link mp_encode_map() An usage example \endlink |
yihui | 0:86aa62fedb9b | 472 | */ |
yihui | 0:86aa62fedb9b | 473 | MP_PROTO uint32_t |
yihui | 0:86aa62fedb9b | 474 | mp_decode_map(const char **data); |
yihui | 0:86aa62fedb9b | 475 | |
yihui | 0:86aa62fedb9b | 476 | /** |
yihui | 0:86aa62fedb9b | 477 | * \brief Calculate exact buffer size needed to store an integer \a num. |
yihui | 0:86aa62fedb9b | 478 | * Maximum return value is 9. For performance reasons you can preallocate |
yihui | 0:86aa62fedb9b | 479 | * buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 480 | * Example usage: |
yihui | 0:86aa62fedb9b | 481 | * \code |
yihui | 0:86aa62fedb9b | 482 | * char **data = ...; |
yihui | 0:86aa62fedb9b | 483 | * char *end = *data; |
yihui | 0:86aa62fedb9b | 484 | * my_buffer_ensure(mp_sizeof_uint(x), &end); |
yihui | 0:86aa62fedb9b | 485 | * // my_buffer_ensure(9, &end); |
yihui | 0:86aa62fedb9b | 486 | * mp_encode_uint(buffer, x); |
yihui | 0:86aa62fedb9b | 487 | * \endcode |
yihui | 0:86aa62fedb9b | 488 | * \param num - a number |
yihui | 0:86aa62fedb9b | 489 | * \return buffer size in bytes (max is 9) |
yihui | 0:86aa62fedb9b | 490 | */ |
yihui | 0:86aa62fedb9b | 491 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 492 | mp_sizeof_uint(uint64_t num); |
yihui | 0:86aa62fedb9b | 493 | |
yihui | 0:86aa62fedb9b | 494 | /** |
yihui | 0:86aa62fedb9b | 495 | * \brief Calculate exact buffer size needed to store an integer \a num. |
yihui | 0:86aa62fedb9b | 496 | * Maximum return value is 9. For performance reasons you can preallocate |
yihui | 0:86aa62fedb9b | 497 | * buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 498 | * \param num - a number |
yihui | 0:86aa62fedb9b | 499 | * \return buffer size in bytes (max is 9) |
yihui | 0:86aa62fedb9b | 500 | * \pre \a num < 0 |
yihui | 0:86aa62fedb9b | 501 | */ |
yihui | 0:86aa62fedb9b | 502 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 503 | mp_sizeof_int(int64_t num); |
yihui | 0:86aa62fedb9b | 504 | |
yihui | 0:86aa62fedb9b | 505 | /** |
yihui | 0:86aa62fedb9b | 506 | * \brief Encode an unsigned integer \a num. |
yihui | 0:86aa62fedb9b | 507 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 508 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 509 | * \param num - a number |
yihui | 0:86aa62fedb9b | 510 | * \return \a data + mp_sizeof_uint(\a num) |
yihui | 0:86aa62fedb9b | 511 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 512 | * \sa mp_sizeof_uint() |
yihui | 0:86aa62fedb9b | 513 | */ |
yihui | 0:86aa62fedb9b | 514 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 515 | mp_encode_uint(char *data, uint64_t num); |
yihui | 0:86aa62fedb9b | 516 | |
yihui | 0:86aa62fedb9b | 517 | /** |
yihui | 0:86aa62fedb9b | 518 | * \brief Encode a signed integer \a num. |
yihui | 0:86aa62fedb9b | 519 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 520 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 521 | * \param num - a number |
yihui | 0:86aa62fedb9b | 522 | * \return \a data + mp_sizeof_int(\a num) |
yihui | 0:86aa62fedb9b | 523 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 524 | * \sa mp_sizeof_int() |
yihui | 0:86aa62fedb9b | 525 | * \pre \a num < 0 |
yihui | 0:86aa62fedb9b | 526 | */ |
yihui | 0:86aa62fedb9b | 527 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 528 | mp_encode_int(char *data, int64_t num); |
yihui | 0:86aa62fedb9b | 529 | |
yihui | 0:86aa62fedb9b | 530 | /** |
yihui | 0:86aa62fedb9b | 531 | * \brief Check that \a cur buffer has enough bytes to decode an uint |
yihui | 0:86aa62fedb9b | 532 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 533 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 534 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 535 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 536 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 537 | * \pre mp_typeof(*cur) == MP_UINT |
yihui | 0:86aa62fedb9b | 538 | */ |
yihui | 0:86aa62fedb9b | 539 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 540 | mp_check_uint(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 541 | |
yihui | 0:86aa62fedb9b | 542 | /** |
yihui | 0:86aa62fedb9b | 543 | * \brief Check that \a cur buffer has enough bytes to decode an int |
yihui | 0:86aa62fedb9b | 544 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 545 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 546 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 547 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 548 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 549 | * \pre mp_typeof(*cur) == MP_INT |
yihui | 0:86aa62fedb9b | 550 | */ |
yihui | 0:86aa62fedb9b | 551 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 552 | mp_check_int(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 553 | |
yihui | 0:86aa62fedb9b | 554 | /** |
yihui | 0:86aa62fedb9b | 555 | * \brief Decode an unsigned integer from MsgPack \a data |
yihui | 0:86aa62fedb9b | 556 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 557 | * \return an unsigned number |
yihui | 0:86aa62fedb9b | 558 | * \post *data = *data + mp_sizeof_uint(retval) |
yihui | 0:86aa62fedb9b | 559 | */ |
yihui | 0:86aa62fedb9b | 560 | MP_PROTO uint64_t |
yihui | 0:86aa62fedb9b | 561 | mp_decode_uint(const char **data); |
yihui | 0:86aa62fedb9b | 562 | |
yihui | 0:86aa62fedb9b | 563 | /** |
yihui | 0:86aa62fedb9b | 564 | * \brief Decode a signed integer from MsgPack \a data |
yihui | 0:86aa62fedb9b | 565 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 566 | * \return an unsigned number |
yihui | 0:86aa62fedb9b | 567 | * \post *data = *data + mp_sizeof_int(retval) |
yihui | 0:86aa62fedb9b | 568 | */ |
yihui | 0:86aa62fedb9b | 569 | MP_PROTO int64_t |
yihui | 0:86aa62fedb9b | 570 | mp_decode_int(const char **data); |
yihui | 0:86aa62fedb9b | 571 | |
yihui | 0:86aa62fedb9b | 572 | /** |
yihui | 0:86aa62fedb9b | 573 | * \brief Compare two packed unsigned integers. |
yihui | 0:86aa62fedb9b | 574 | * |
yihui | 0:86aa62fedb9b | 575 | * The function is faster than two mp_decode_uint() calls. |
yihui | 0:86aa62fedb9b | 576 | * \param data_a unsigned int a |
yihui | 0:86aa62fedb9b | 577 | * \param data_b unsigned int b |
yihui | 0:86aa62fedb9b | 578 | * \retval < 0 when \a a < \a b |
yihui | 0:86aa62fedb9b | 579 | * \retval 0 when \a a == \a b |
yihui | 0:86aa62fedb9b | 580 | * \retval > 0 when \a a > \a b |
yihui | 0:86aa62fedb9b | 581 | */ |
yihui | 0:86aa62fedb9b | 582 | MP_PROTO __attribute__((pure)) int |
yihui | 0:86aa62fedb9b | 583 | mp_compare_uint(const char *data_a, const char *data_b); |
yihui | 0:86aa62fedb9b | 584 | |
yihui | 0:86aa62fedb9b | 585 | /** |
yihui | 0:86aa62fedb9b | 586 | * \brief Calculate exact buffer size needed to store a float \a num. |
yihui | 0:86aa62fedb9b | 587 | * The return value is always 5. The function was added to provide integrity of |
yihui | 0:86aa62fedb9b | 588 | * the library. |
yihui | 0:86aa62fedb9b | 589 | * \param num - a float |
yihui | 0:86aa62fedb9b | 590 | * \return buffer size in bytes (always 5) |
yihui | 0:86aa62fedb9b | 591 | */ |
yihui | 0:86aa62fedb9b | 592 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 593 | mp_sizeof_float(float num); |
yihui | 0:86aa62fedb9b | 594 | |
yihui | 0:86aa62fedb9b | 595 | /** |
yihui | 0:86aa62fedb9b | 596 | * \brief Calculate exact buffer size needed to store a double \a num. |
yihui | 0:86aa62fedb9b | 597 | * The return value is either 5 or 9. The function was added to provide |
yihui | 0:86aa62fedb9b | 598 | * integrity of the library. For performance reasons you can preallocate buffer |
yihui | 0:86aa62fedb9b | 599 | * for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 600 | * \param num - a double |
yihui | 0:86aa62fedb9b | 601 | * \return buffer size in bytes (5 or 9) |
yihui | 0:86aa62fedb9b | 602 | */ |
yihui | 0:86aa62fedb9b | 603 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 604 | mp_sizeof_double(double num); |
yihui | 0:86aa62fedb9b | 605 | |
yihui | 0:86aa62fedb9b | 606 | /** |
yihui | 0:86aa62fedb9b | 607 | * \brief Encode a float \a num. |
yihui | 0:86aa62fedb9b | 608 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 609 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 610 | * \param num - a float |
yihui | 0:86aa62fedb9b | 611 | * \return \a data + mp_sizeof_float(\a num) |
yihui | 0:86aa62fedb9b | 612 | * \sa mp_sizeof_float() |
yihui | 0:86aa62fedb9b | 613 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 614 | */ |
yihui | 0:86aa62fedb9b | 615 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 616 | mp_encode_float(char *data, float num); |
yihui | 0:86aa62fedb9b | 617 | |
yihui | 0:86aa62fedb9b | 618 | /** |
yihui | 0:86aa62fedb9b | 619 | * \brief Encode a double \a num. |
yihui | 0:86aa62fedb9b | 620 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 621 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 622 | * \param num - a float |
yihui | 0:86aa62fedb9b | 623 | * \return \a data + mp_sizeof_double(\a num) |
yihui | 0:86aa62fedb9b | 624 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 625 | * \sa mp_sizeof_double() |
yihui | 0:86aa62fedb9b | 626 | */ |
yihui | 0:86aa62fedb9b | 627 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 628 | mp_encode_double(char *data, double num); |
yihui | 0:86aa62fedb9b | 629 | |
yihui | 0:86aa62fedb9b | 630 | /** |
yihui | 0:86aa62fedb9b | 631 | * \brief Check that \a cur buffer has enough bytes to decode a float |
yihui | 0:86aa62fedb9b | 632 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 633 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 634 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 635 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 636 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 637 | * \pre mp_typeof(*cur) == MP_FLOAT |
yihui | 0:86aa62fedb9b | 638 | */ |
yihui | 0:86aa62fedb9b | 639 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 640 | mp_check_float(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 641 | |
yihui | 0:86aa62fedb9b | 642 | /** |
yihui | 0:86aa62fedb9b | 643 | * \brief Check that \a cur buffer has enough bytes to decode a double |
yihui | 0:86aa62fedb9b | 644 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 645 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 646 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 647 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 648 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 649 | * \pre mp_typeof(*cur) == MP_DOUBLE |
yihui | 0:86aa62fedb9b | 650 | */ |
yihui | 0:86aa62fedb9b | 651 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 652 | mp_check_double(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 653 | |
yihui | 0:86aa62fedb9b | 654 | /** |
yihui | 0:86aa62fedb9b | 655 | * \brief Decode a float from MsgPack \a data |
yihui | 0:86aa62fedb9b | 656 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 657 | * \return a float |
yihui | 0:86aa62fedb9b | 658 | * \post *data = *data + mp_sizeof_float(retval) |
yihui | 0:86aa62fedb9b | 659 | */ |
yihui | 0:86aa62fedb9b | 660 | MP_PROTO float |
yihui | 0:86aa62fedb9b | 661 | mp_decode_float(const char **data); |
yihui | 0:86aa62fedb9b | 662 | |
yihui | 0:86aa62fedb9b | 663 | /** |
yihui | 0:86aa62fedb9b | 664 | * \brief Decode a double from MsgPack \a data |
yihui | 0:86aa62fedb9b | 665 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 666 | * \return a double |
yihui | 0:86aa62fedb9b | 667 | * \post *data = *data + mp_sizeof_double(retval) |
yihui | 0:86aa62fedb9b | 668 | */ |
yihui | 0:86aa62fedb9b | 669 | MP_PROTO double |
yihui | 0:86aa62fedb9b | 670 | mp_decode_double(const char **data); |
yihui | 0:86aa62fedb9b | 671 | |
yihui | 0:86aa62fedb9b | 672 | /** |
yihui | 0:86aa62fedb9b | 673 | * \brief Calculate exact buffer size needed to store a string header of |
yihui | 0:86aa62fedb9b | 674 | * length \a num. Maximum return value is 5. For performance reasons you can |
yihui | 0:86aa62fedb9b | 675 | * preallocate buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 676 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 677 | * \return size in chars (max is 5) |
yihui | 0:86aa62fedb9b | 678 | */ |
yihui | 0:86aa62fedb9b | 679 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 680 | mp_sizeof_strl(uint32_t len); |
yihui | 0:86aa62fedb9b | 681 | |
yihui | 0:86aa62fedb9b | 682 | /** |
yihui | 0:86aa62fedb9b | 683 | * \brief Equivalent to mp_sizeof_strl(\a len) + \a len. |
yihui | 0:86aa62fedb9b | 684 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 685 | * \return size in chars (max is 5 + \a len) |
yihui | 0:86aa62fedb9b | 686 | */ |
yihui | 0:86aa62fedb9b | 687 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 688 | mp_sizeof_str(uint32_t len); |
yihui | 0:86aa62fedb9b | 689 | |
yihui | 0:86aa62fedb9b | 690 | /** |
yihui | 0:86aa62fedb9b | 691 | * \brief Calculate exact buffer size needed to store a binstring header of |
yihui | 0:86aa62fedb9b | 692 | * length \a num. Maximum return value is 5. For performance reasons you can |
yihui | 0:86aa62fedb9b | 693 | * preallocate buffer for maximum size without calling the function. |
yihui | 0:86aa62fedb9b | 694 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 695 | * \return size in chars (max is 5) |
yihui | 0:86aa62fedb9b | 696 | */ |
yihui | 0:86aa62fedb9b | 697 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 698 | mp_sizeof_binl(uint32_t len); |
yihui | 0:86aa62fedb9b | 699 | |
yihui | 0:86aa62fedb9b | 700 | /** |
yihui | 0:86aa62fedb9b | 701 | * \brief Equivalent to mp_sizeof_binl(\a len) + \a len. |
yihui | 0:86aa62fedb9b | 702 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 703 | * \return size in chars (max is 5 + \a len) |
yihui | 0:86aa62fedb9b | 704 | */ |
yihui | 0:86aa62fedb9b | 705 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 706 | mp_sizeof_bin(uint32_t len); |
yihui | 0:86aa62fedb9b | 707 | |
yihui | 0:86aa62fedb9b | 708 | /** |
yihui | 0:86aa62fedb9b | 709 | * \brief Encode a string header of length \a len. |
yihui | 0:86aa62fedb9b | 710 | * |
yihui | 0:86aa62fedb9b | 711 | * The function encodes MsgPack header (\em only header) for a string of |
yihui | 0:86aa62fedb9b | 712 | * length \a len. You should append actual string data to the buffer manually |
yihui | 0:86aa62fedb9b | 713 | * after encoding the header (exactly \a len bytes without trailing '\0'). |
yihui | 0:86aa62fedb9b | 714 | * |
yihui | 0:86aa62fedb9b | 715 | * This approach is very useful for cases when the total length of the string |
yihui | 0:86aa62fedb9b | 716 | * is known in advance, but the string data is not stored in a single |
yihui | 0:86aa62fedb9b | 717 | * continuous buffer (e.g. network packets). |
yihui | 0:86aa62fedb9b | 718 | * |
yihui | 0:86aa62fedb9b | 719 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 720 | * Usage example: |
yihui | 0:86aa62fedb9b | 721 | * \code |
yihui | 0:86aa62fedb9b | 722 | * char buffer[1024]; |
yihui | 0:86aa62fedb9b | 723 | * char *b = buffer; |
yihui | 0:86aa62fedb9b | 724 | * b = mp_encode_strl(b, hdr.total_len); |
yihui | 0:86aa62fedb9b | 725 | * char *s = b; |
yihui | 0:86aa62fedb9b | 726 | * memcpy(b, pkt1.data, pkt1.len) |
yihui | 0:86aa62fedb9b | 727 | * b += pkt1.len; |
yihui | 0:86aa62fedb9b | 728 | * // get next packet |
yihui | 0:86aa62fedb9b | 729 | * memcpy(b, pkt2.data, pkt2.len) |
yihui | 0:86aa62fedb9b | 730 | * b += pkt2.len; |
yihui | 0:86aa62fedb9b | 731 | * // get next packet |
yihui | 0:86aa62fedb9b | 732 | * memcpy(b, pkt1.data, pkt3.len) |
yihui | 0:86aa62fedb9b | 733 | * b += pkt3.len; |
yihui | 0:86aa62fedb9b | 734 | * |
yihui | 0:86aa62fedb9b | 735 | * // Check that all data was received |
yihui | 0:86aa62fedb9b | 736 | * assert(hdr.total_len == (uint32_t) (b - s)) |
yihui | 0:86aa62fedb9b | 737 | * \endcode |
yihui | 0:86aa62fedb9b | 738 | * Hint: you can dynamically reallocate the buffer during the process. |
yihui | 0:86aa62fedb9b | 739 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 740 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 741 | * \return \a data + mp_sizeof_strl(len) |
yihui | 0:86aa62fedb9b | 742 | * \sa mp_sizeof_strl() |
yihui | 0:86aa62fedb9b | 743 | */ |
yihui | 0:86aa62fedb9b | 744 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 745 | mp_encode_strl(char *data, uint32_t len); |
yihui | 0:86aa62fedb9b | 746 | |
yihui | 0:86aa62fedb9b | 747 | /** |
yihui | 0:86aa62fedb9b | 748 | * \brief Encode a string of length \a len. |
yihui | 0:86aa62fedb9b | 749 | * The function is equivalent to mp_encode_strl() + memcpy. |
yihui | 0:86aa62fedb9b | 750 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 751 | * \param str - a pointer to string data |
yihui | 0:86aa62fedb9b | 752 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 753 | * \return \a data + mp_sizeof_str(len) == |
yihui | 0:86aa62fedb9b | 754 | * data + mp_sizeof_strl(len) + len |
yihui | 0:86aa62fedb9b | 755 | * \sa mp_encode_strl |
yihui | 0:86aa62fedb9b | 756 | */ |
yihui | 0:86aa62fedb9b | 757 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 758 | mp_encode_str(char *data, const char *str, uint32_t len); |
yihui | 0:86aa62fedb9b | 759 | |
yihui | 0:86aa62fedb9b | 760 | /** |
yihui | 0:86aa62fedb9b | 761 | * \brief Encode a binstring header of length \a len. |
yihui | 0:86aa62fedb9b | 762 | * See mp_encode_strl() for more details. |
yihui | 0:86aa62fedb9b | 763 | * \param data - a bufer |
yihui | 0:86aa62fedb9b | 764 | * \param len - a string length |
yihui | 0:86aa62fedb9b | 765 | * \return data + mp_sizeof_binl(\a len) |
yihui | 0:86aa62fedb9b | 766 | * \sa mp_encode_strl |
yihui | 0:86aa62fedb9b | 767 | */ |
yihui | 0:86aa62fedb9b | 768 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 769 | mp_encode_binl(char *data, uint32_t len); |
yihui | 0:86aa62fedb9b | 770 | |
yihui | 0:86aa62fedb9b | 771 | /** |
yihui | 0:86aa62fedb9b | 772 | * \brief Encode a binstring of length \a len. |
yihui | 0:86aa62fedb9b | 773 | * The function is equivalent to mp_encode_binl() + memcpy. |
yihui | 0:86aa62fedb9b | 774 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 775 | * \param str - a pointer to binstring data |
yihui | 0:86aa62fedb9b | 776 | * \param len - a binstring length |
yihui | 0:86aa62fedb9b | 777 | * \return \a data + mp_sizeof_bin(\a len) == |
yihui | 0:86aa62fedb9b | 778 | * data + mp_sizeof_binl(\a len) + \a len |
yihui | 0:86aa62fedb9b | 779 | * \sa mp_encode_strl |
yihui | 0:86aa62fedb9b | 780 | */ |
yihui | 0:86aa62fedb9b | 781 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 782 | mp_encode_bin(char *data, const char *str, uint32_t len); |
yihui | 0:86aa62fedb9b | 783 | |
yihui | 0:86aa62fedb9b | 784 | /** |
yihui | 0:86aa62fedb9b | 785 | * \brief Encode a sequence of values according to format string. |
yihui | 0:86aa62fedb9b | 786 | * Example: mp_format(buf, sz, "[%d {%d%s%d%s}]", 42, 0, "false", 1, "true"); |
yihui | 0:86aa62fedb9b | 787 | * to get a msgpack array of two items: number 42 and map (0->"false, 2->"true") |
yihui | 0:86aa62fedb9b | 788 | * Does not write items that don't fit to data_size argument. |
yihui | 0:86aa62fedb9b | 789 | * |
yihui | 0:86aa62fedb9b | 790 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 791 | * \param data_size - a buffer size |
yihui | 0:86aa62fedb9b | 792 | * \param format - zero-end string, containing structure of resulting |
yihui | 0:86aa62fedb9b | 793 | * msgpack and types of next arguments. |
yihui | 0:86aa62fedb9b | 794 | * Format can contain '[' and ']' pairs, defining arrays, |
yihui | 0:86aa62fedb9b | 795 | * '{' and '}' pairs, defining maps, and format specifiers, described below: |
yihui | 0:86aa62fedb9b | 796 | * %d, %i - int |
yihui | 0:86aa62fedb9b | 797 | * %u - unsigned int |
yihui | 0:86aa62fedb9b | 798 | * %ld, %li - long |
yihui | 0:86aa62fedb9b | 799 | * %lu - unsigned long |
yihui | 0:86aa62fedb9b | 800 | * %lld, %lli - long long |
yihui | 0:86aa62fedb9b | 801 | * %llu - unsigned long long |
yihui | 0:86aa62fedb9b | 802 | * %hd, %hi - short |
yihui | 0:86aa62fedb9b | 803 | * %hu - unsigned short |
yihui | 0:86aa62fedb9b | 804 | * %hhd, %hhi - char (as number) |
yihui | 0:86aa62fedb9b | 805 | * %hhu - unsigned char (as number) |
yihui | 0:86aa62fedb9b | 806 | * %f - float |
yihui | 0:86aa62fedb9b | 807 | * %lf - double |
yihui | 0:86aa62fedb9b | 808 | * %b - bool |
yihui | 0:86aa62fedb9b | 809 | * %s - zero-end string |
yihui | 0:86aa62fedb9b | 810 | * %.*s - string with specified length |
yihui | 0:86aa62fedb9b | 811 | * %% is ignored |
yihui | 0:86aa62fedb9b | 812 | * %<smth else> assert and undefined behaviour |
yihui | 0:86aa62fedb9b | 813 | * NIL - a nil value |
yihui | 0:86aa62fedb9b | 814 | * all other symbols are ignored. |
yihui | 0:86aa62fedb9b | 815 | * |
yihui | 0:86aa62fedb9b | 816 | * \return the number of requred bytes. |
yihui | 0:86aa62fedb9b | 817 | * \retval > data_size means that is not enough space |
yihui | 0:86aa62fedb9b | 818 | * and whole msgpack was not encoded. |
yihui | 0:86aa62fedb9b | 819 | */ |
yihui | 0:86aa62fedb9b | 820 | MP_PROTO size_t |
yihui | 0:86aa62fedb9b | 821 | mp_format(char *data, size_t data_size, const char *format, ...); |
yihui | 0:86aa62fedb9b | 822 | |
yihui | 0:86aa62fedb9b | 823 | /** |
yihui | 0:86aa62fedb9b | 824 | * \brief mp_format variation, taking variable argument list |
yihui | 0:86aa62fedb9b | 825 | * Example: |
yihui | 0:86aa62fedb9b | 826 | * va_list args; |
yihui | 0:86aa62fedb9b | 827 | * va_start(args, fmt); |
yihui | 0:86aa62fedb9b | 828 | * mp_vformat(data, data_size, fmt, args); |
yihui | 0:86aa62fedb9b | 829 | * va_end(args); |
yihui | 0:86aa62fedb9b | 830 | * \sa \link mp_format() |
yihui | 0:86aa62fedb9b | 831 | */ |
yihui | 0:86aa62fedb9b | 832 | MP_PROTO size_t |
yihui | 0:86aa62fedb9b | 833 | mp_vformat(char *data, size_t data_size, const char *format, va_list args); |
yihui | 0:86aa62fedb9b | 834 | |
yihui | 0:86aa62fedb9b | 835 | /** |
yihui | 0:86aa62fedb9b | 836 | * \brief Check that \a cur buffer has enough bytes to decode a string header |
yihui | 0:86aa62fedb9b | 837 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 838 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 839 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 840 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 841 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 842 | * \pre mp_typeof(*cur) == MP_STR |
yihui | 0:86aa62fedb9b | 843 | */ |
yihui | 0:86aa62fedb9b | 844 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 845 | mp_check_strl(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 846 | |
yihui | 0:86aa62fedb9b | 847 | /** |
yihui | 0:86aa62fedb9b | 848 | * \brief Check that \a cur buffer has enough bytes to decode a binstring header |
yihui | 0:86aa62fedb9b | 849 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 850 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 851 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 852 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 853 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 854 | * \pre mp_typeof(*cur) == MP_BIN |
yihui | 0:86aa62fedb9b | 855 | */ |
yihui | 0:86aa62fedb9b | 856 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 857 | mp_check_binl(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 858 | |
yihui | 0:86aa62fedb9b | 859 | /** |
yihui | 0:86aa62fedb9b | 860 | * \brief Decode a length of a string from MsgPack \a data |
yihui | 0:86aa62fedb9b | 861 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 862 | * \return a length of astring |
yihui | 0:86aa62fedb9b | 863 | * \post *data = *data + mp_sizeof_strl(retval) |
yihui | 0:86aa62fedb9b | 864 | * \sa mp_encode_strl |
yihui | 0:86aa62fedb9b | 865 | */ |
yihui | 0:86aa62fedb9b | 866 | MP_PROTO uint32_t |
yihui | 0:86aa62fedb9b | 867 | mp_decode_strl(const char **data); |
yihui | 0:86aa62fedb9b | 868 | |
yihui | 0:86aa62fedb9b | 869 | /** |
yihui | 0:86aa62fedb9b | 870 | * \brief Decode a string from MsgPack \a data |
yihui | 0:86aa62fedb9b | 871 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 872 | * \param len - the pointer to save a string length |
yihui | 0:86aa62fedb9b | 873 | * \return a pointer to a decoded string |
yihui | 0:86aa62fedb9b | 874 | * \post *data = *data + mp_sizeof_str(*len) |
yihui | 0:86aa62fedb9b | 875 | * \sa mp_encode_binl |
yihui | 0:86aa62fedb9b | 876 | */ |
yihui | 0:86aa62fedb9b | 877 | MP_PROTO const char * |
yihui | 0:86aa62fedb9b | 878 | mp_decode_str(const char **data, uint32_t *len); |
yihui | 0:86aa62fedb9b | 879 | |
yihui | 0:86aa62fedb9b | 880 | /** |
yihui | 0:86aa62fedb9b | 881 | * \brief Decode a length of a binstring from MsgPack \a data |
yihui | 0:86aa62fedb9b | 882 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 883 | * \return a length of a binstring |
yihui | 0:86aa62fedb9b | 884 | * \post *data = *data + mp_sizeof_binl(retval) |
yihui | 0:86aa62fedb9b | 885 | * \sa mp_encode_binl |
yihui | 0:86aa62fedb9b | 886 | */ |
yihui | 0:86aa62fedb9b | 887 | MP_PROTO uint32_t |
yihui | 0:86aa62fedb9b | 888 | mp_decode_binl(const char **data); |
yihui | 0:86aa62fedb9b | 889 | |
yihui | 0:86aa62fedb9b | 890 | /** |
yihui | 0:86aa62fedb9b | 891 | * \brief Decode a binstring from MsgPack \a data |
yihui | 0:86aa62fedb9b | 892 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 893 | * \param len - the pointer to save a binstring length |
yihui | 0:86aa62fedb9b | 894 | * \return a pointer to a decoded binstring |
yihui | 0:86aa62fedb9b | 895 | * \post *data = *data + mp_sizeof_str(*len) |
yihui | 0:86aa62fedb9b | 896 | * \sa mp_encode_binl |
yihui | 0:86aa62fedb9b | 897 | */ |
yihui | 0:86aa62fedb9b | 898 | MP_PROTO const char * |
yihui | 0:86aa62fedb9b | 899 | mp_decode_bin(const char **data, uint32_t *len); |
yihui | 0:86aa62fedb9b | 900 | |
yihui | 0:86aa62fedb9b | 901 | /** |
yihui | 0:86aa62fedb9b | 902 | * \brief Calculate exact buffer size needed to store the nil value. |
yihui | 0:86aa62fedb9b | 903 | * The return value is always 1. The function was added to provide integrity of |
yihui | 0:86aa62fedb9b | 904 | * the library. |
yihui | 0:86aa62fedb9b | 905 | * \return buffer size in bytes (always 1) |
yihui | 0:86aa62fedb9b | 906 | */ |
yihui | 0:86aa62fedb9b | 907 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 908 | mp_sizeof_nil(void); |
yihui | 0:86aa62fedb9b | 909 | |
yihui | 0:86aa62fedb9b | 910 | /** |
yihui | 0:86aa62fedb9b | 911 | * \brief Encode the nil value. |
yihui | 0:86aa62fedb9b | 912 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 913 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 914 | * \return \a data + mp_sizeof_nil() |
yihui | 0:86aa62fedb9b | 915 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 916 | * \sa mp_sizeof_nil() |
yihui | 0:86aa62fedb9b | 917 | */ |
yihui | 0:86aa62fedb9b | 918 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 919 | mp_encode_nil(char *data); |
yihui | 0:86aa62fedb9b | 920 | |
yihui | 0:86aa62fedb9b | 921 | /** |
yihui | 0:86aa62fedb9b | 922 | * \brief Check that \a cur buffer has enough bytes to decode nil |
yihui | 0:86aa62fedb9b | 923 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 924 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 925 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 926 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 927 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 928 | * \pre mp_typeof(*cur) == MP_NIL |
yihui | 0:86aa62fedb9b | 929 | */ |
yihui | 0:86aa62fedb9b | 930 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 931 | mp_check_nil(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 932 | |
yihui | 0:86aa62fedb9b | 933 | /** |
yihui | 0:86aa62fedb9b | 934 | * \brief Decode the nil value from MsgPack \a data |
yihui | 0:86aa62fedb9b | 935 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 936 | * \post *data = *data + mp_sizeof_nil() |
yihui | 0:86aa62fedb9b | 937 | */ |
yihui | 0:86aa62fedb9b | 938 | MP_PROTO void |
yihui | 0:86aa62fedb9b | 939 | mp_decode_nil(const char **data); |
yihui | 0:86aa62fedb9b | 940 | |
yihui | 0:86aa62fedb9b | 941 | /** |
yihui | 0:86aa62fedb9b | 942 | * \brief Calculate exact buffer size needed to store a boolean value. |
yihui | 0:86aa62fedb9b | 943 | * The return value is always 1. The function was added to provide integrity of |
yihui | 0:86aa62fedb9b | 944 | * the library. |
yihui | 0:86aa62fedb9b | 945 | * \return buffer size in bytes (always 1) |
yihui | 0:86aa62fedb9b | 946 | */ |
yihui | 0:86aa62fedb9b | 947 | MP_PROTO __attribute__((const)) uint32_t |
yihui | 0:86aa62fedb9b | 948 | mp_sizeof_bool(bool val); |
yihui | 0:86aa62fedb9b | 949 | |
yihui | 0:86aa62fedb9b | 950 | /** |
yihui | 0:86aa62fedb9b | 951 | * \brief Encode a bool value \a val. |
yihui | 0:86aa62fedb9b | 952 | * It is your responsibility to ensure that \a data has enough space. |
yihui | 0:86aa62fedb9b | 953 | * \param data - a buffer |
yihui | 0:86aa62fedb9b | 954 | * \param val - a bool |
yihui | 0:86aa62fedb9b | 955 | * \return \a data + mp_sizeof_bool(val) |
yihui | 0:86aa62fedb9b | 956 | * \sa \link mp_encode_array() An usage example \endlink |
yihui | 0:86aa62fedb9b | 957 | * \sa mp_sizeof_bool() |
yihui | 0:86aa62fedb9b | 958 | */ |
yihui | 0:86aa62fedb9b | 959 | MP_PROTO char * |
yihui | 0:86aa62fedb9b | 960 | mp_encode_bool(char *data, bool val); |
yihui | 0:86aa62fedb9b | 961 | |
yihui | 0:86aa62fedb9b | 962 | /** |
yihui | 0:86aa62fedb9b | 963 | * \brief Check that \a cur buffer has enough bytes to decode a bool value |
yihui | 0:86aa62fedb9b | 964 | * \param cur buffer |
yihui | 0:86aa62fedb9b | 965 | * \param end end of the buffer |
yihui | 0:86aa62fedb9b | 966 | * \retval 0 - buffer has enough bytes |
yihui | 0:86aa62fedb9b | 967 | * \retval > 0 - the number of remaining bytes to read |
yihui | 0:86aa62fedb9b | 968 | * \pre cur < end |
yihui | 0:86aa62fedb9b | 969 | * \pre mp_typeof(*cur) == MP_BOOL |
yihui | 0:86aa62fedb9b | 970 | */ |
yihui | 0:86aa62fedb9b | 971 | MP_PROTO __attribute__((pure)) ptrdiff_t |
yihui | 0:86aa62fedb9b | 972 | mp_check_bool(const char *cur, const char *end); |
yihui | 0:86aa62fedb9b | 973 | |
yihui | 0:86aa62fedb9b | 974 | /** |
yihui | 0:86aa62fedb9b | 975 | * \brief Decode a bool value from MsgPack \a data |
yihui | 0:86aa62fedb9b | 976 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 977 | * \return a decoded bool value |
yihui | 0:86aa62fedb9b | 978 | * \post *data = *data + mp_sizeof_bool(retval) |
yihui | 0:86aa62fedb9b | 979 | */ |
yihui | 0:86aa62fedb9b | 980 | MP_PROTO bool |
yihui | 0:86aa62fedb9b | 981 | mp_decode_bool(const char **data); |
yihui | 0:86aa62fedb9b | 982 | |
yihui | 0:86aa62fedb9b | 983 | /** |
yihui | 0:86aa62fedb9b | 984 | * \brief Skip one element in a packed \a data. |
yihui | 0:86aa62fedb9b | 985 | * |
yihui | 0:86aa62fedb9b | 986 | * The function is faster than mp_typeof + mp_decode_XXX() combination. |
yihui | 0:86aa62fedb9b | 987 | * For arrays and maps the function also skips all members. |
yihui | 0:86aa62fedb9b | 988 | * For strings and binstrings the function also skips the string data. |
yihui | 0:86aa62fedb9b | 989 | * |
yihui | 0:86aa62fedb9b | 990 | * Usage example: |
yihui | 0:86aa62fedb9b | 991 | * \code |
yihui | 0:86aa62fedb9b | 992 | * char buf[1024]; |
yihui | 0:86aa62fedb9b | 993 | * |
yihui | 0:86aa62fedb9b | 994 | * char *w = buf; |
yihui | 0:86aa62fedb9b | 995 | * // First MsgPack object |
yihui | 0:86aa62fedb9b | 996 | * w = mp_encode_uint(w, 10); |
yihui | 0:86aa62fedb9b | 997 | * |
yihui | 0:86aa62fedb9b | 998 | * // Second MsgPack object |
yihui | 0:86aa62fedb9b | 999 | * w = mp_encode_array(w, 4); |
yihui | 0:86aa62fedb9b | 1000 | * w = mp_encode_array(w, 2); |
yihui | 0:86aa62fedb9b | 1001 | * // Begin of an inner array |
yihui | 0:86aa62fedb9b | 1002 | * w = mp_encode_str(w, "second inner 1", 14); |
yihui | 0:86aa62fedb9b | 1003 | * w = mp_encode_str(w, "second inner 2", 14); |
yihui | 0:86aa62fedb9b | 1004 | * // End of an inner array |
yihui | 0:86aa62fedb9b | 1005 | * w = mp_encode_str(w, "second", 6); |
yihui | 0:86aa62fedb9b | 1006 | * w = mp_encode_uint(w, 20); |
yihui | 0:86aa62fedb9b | 1007 | * w = mp_encode_bool(w, true); |
yihui | 0:86aa62fedb9b | 1008 | * |
yihui | 0:86aa62fedb9b | 1009 | * // Third MsgPack object |
yihui | 0:86aa62fedb9b | 1010 | * w = mp_encode_str(w, "third", 5); |
yihui | 0:86aa62fedb9b | 1011 | * // EOF |
yihui | 0:86aa62fedb9b | 1012 | * |
yihui | 0:86aa62fedb9b | 1013 | * const char *r = buf; |
yihui | 0:86aa62fedb9b | 1014 | * |
yihui | 0:86aa62fedb9b | 1015 | * // First MsgPack object |
yihui | 0:86aa62fedb9b | 1016 | * assert(mp_typeof(**r) == MP_UINT); |
yihui | 0:86aa62fedb9b | 1017 | * mp_next(&r); // skip the first object |
yihui | 0:86aa62fedb9b | 1018 | * |
yihui | 0:86aa62fedb9b | 1019 | * // Second MsgPack object |
yihui | 0:86aa62fedb9b | 1020 | * assert(mp_typeof(**r) == MP_ARRAY); |
yihui | 0:86aa62fedb9b | 1021 | * mp_decode_array(&r); |
yihui | 0:86aa62fedb9b | 1022 | * assert(mp_typeof(**r) == MP_ARRAY); // inner array |
yihui | 0:86aa62fedb9b | 1023 | * mp_next(&r); // -->> skip the entire inner array (with all members) |
yihui | 0:86aa62fedb9b | 1024 | * assert(mp_typeof(**r) == MP_STR); // second |
yihui | 0:86aa62fedb9b | 1025 | * mp_next(&r); |
yihui | 0:86aa62fedb9b | 1026 | * assert(mp_typeof(**r) == MP_UINT); // 20 |
yihui | 0:86aa62fedb9b | 1027 | * mp_next(&r); |
yihui | 0:86aa62fedb9b | 1028 | * assert(mp_typeof(**r) == MP_BOOL); // true |
yihui | 0:86aa62fedb9b | 1029 | * mp_next(&r); |
yihui | 0:86aa62fedb9b | 1030 | * |
yihui | 0:86aa62fedb9b | 1031 | * // Third MsgPack object |
yihui | 0:86aa62fedb9b | 1032 | * assert(mp_typeof(**r) == MP_STR); // third |
yihui | 0:86aa62fedb9b | 1033 | * mp_next(&r); |
yihui | 0:86aa62fedb9b | 1034 | * |
yihui | 0:86aa62fedb9b | 1035 | * assert(r == w); // EOF |
yihui | 0:86aa62fedb9b | 1036 | * |
yihui | 0:86aa62fedb9b | 1037 | * \endcode |
yihui | 0:86aa62fedb9b | 1038 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 1039 | * \post *data = *data + mp_sizeof_TYPE() where TYPE is mp_typeof(**data) |
yihui | 0:86aa62fedb9b | 1040 | */ |
yihui | 0:86aa62fedb9b | 1041 | MP_PROTO void |
yihui | 0:86aa62fedb9b | 1042 | mp_next(const char **data); |
yihui | 0:86aa62fedb9b | 1043 | |
yihui | 0:86aa62fedb9b | 1044 | /** |
yihui | 0:86aa62fedb9b | 1045 | * \brief Equivalent to mp_next() but also validates MsgPack in \a data. |
yihui | 0:86aa62fedb9b | 1046 | * \param data - the pointer to a buffer |
yihui | 0:86aa62fedb9b | 1047 | * \param end - the end of a buffer |
yihui | 0:86aa62fedb9b | 1048 | * \retval 0 when MsgPack in \a data is valid. |
yihui | 0:86aa62fedb9b | 1049 | * \retval != 0 when MsgPack in \a data is not valid. |
yihui | 0:86aa62fedb9b | 1050 | * \post *data = *data + mp_sizeof_TYPE() where TYPE is mp_typeof(**data) |
yihui | 0:86aa62fedb9b | 1051 | * \post *data is not defined if MsgPack is not valid |
yihui | 0:86aa62fedb9b | 1052 | * \sa mp_next() |
yihui | 0:86aa62fedb9b | 1053 | */ |
yihui | 0:86aa62fedb9b | 1054 | MP_PROTO int |
yihui | 0:86aa62fedb9b | 1055 | mp_check(const char **data, const char *end); |
yihui | 0:86aa62fedb9b | 1056 | |
yihui | 0:86aa62fedb9b | 1057 | /* |
yihui | 0:86aa62fedb9b | 1058 | * }}} |
yihui | 0:86aa62fedb9b | 1059 | */ |
yihui | 0:86aa62fedb9b | 1060 | |
yihui | 0:86aa62fedb9b | 1061 | /* |
yihui | 0:86aa62fedb9b | 1062 | * {{{ Implementation |
yihui | 0:86aa62fedb9b | 1063 | */ |
yihui | 0:86aa62fedb9b | 1064 | |
yihui | 0:86aa62fedb9b | 1065 | /** \cond 0 */ |
yihui | 0:86aa62fedb9b | 1066 | extern const enum mp_type mp_type_hint[]; |
yihui | 0:86aa62fedb9b | 1067 | extern const int8_t mp_parser_hint[]; |
yihui | 0:86aa62fedb9b | 1068 | |
yihui | 0:86aa62fedb9b | 1069 | MP_IMPL MP_ALWAYSINLINE enum mp_type |
yihui | 0:86aa62fedb9b | 1070 | mp_typeof(const char c) |
yihui | 0:86aa62fedb9b | 1071 | { |
yihui | 0:86aa62fedb9b | 1072 | return mp_type_hint[(uint8_t) c]; |
yihui | 0:86aa62fedb9b | 1073 | } |
yihui | 0:86aa62fedb9b | 1074 | |
yihui | 0:86aa62fedb9b | 1075 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1076 | mp_sizeof_array(uint32_t size) |
yihui | 0:86aa62fedb9b | 1077 | { |
yihui | 0:86aa62fedb9b | 1078 | if (size <= 15) { |
yihui | 0:86aa62fedb9b | 1079 | return 1; |
yihui | 0:86aa62fedb9b | 1080 | } else if (size <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1081 | return 1 + sizeof(uint16_t); |
yihui | 0:86aa62fedb9b | 1082 | } else { |
yihui | 0:86aa62fedb9b | 1083 | return 1 + sizeof(uint32_t); |
yihui | 0:86aa62fedb9b | 1084 | } |
yihui | 0:86aa62fedb9b | 1085 | } |
yihui | 0:86aa62fedb9b | 1086 | |
yihui | 0:86aa62fedb9b | 1087 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1088 | mp_encode_array(char *data, uint32_t size) |
yihui | 0:86aa62fedb9b | 1089 | { |
yihui | 0:86aa62fedb9b | 1090 | if (size <= 15) { |
yihui | 0:86aa62fedb9b | 1091 | return mp_store_u8(data, 0x90 | size); |
yihui | 0:86aa62fedb9b | 1092 | } else if (size <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1093 | data = mp_store_u8(data, 0xdc); |
yihui | 0:86aa62fedb9b | 1094 | return mp_store_u16(data, size); |
yihui | 0:86aa62fedb9b | 1095 | return data; |
yihui | 0:86aa62fedb9b | 1096 | } else { |
yihui | 0:86aa62fedb9b | 1097 | data = mp_store_u8(data, 0xdd); |
yihui | 0:86aa62fedb9b | 1098 | return mp_store_u32(data, size); |
yihui | 0:86aa62fedb9b | 1099 | } |
yihui | 0:86aa62fedb9b | 1100 | } |
yihui | 0:86aa62fedb9b | 1101 | |
yihui | 0:86aa62fedb9b | 1102 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1103 | mp_check_array(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1104 | { |
yihui | 0:86aa62fedb9b | 1105 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1106 | assert(mp_typeof(*cur) == MP_ARRAY); |
yihui | 0:86aa62fedb9b | 1107 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1108 | if (mp_likely(!(c & 0x40))) |
yihui | 0:86aa62fedb9b | 1109 | return cur - end; |
yihui | 0:86aa62fedb9b | 1110 | |
yihui | 0:86aa62fedb9b | 1111 | assert(c >= 0xdc && c <= 0xdd); /* must be checked above by mp_typeof */ |
yihui | 0:86aa62fedb9b | 1112 | uint32_t hsize = 2U << (c & 0x1); /* 0xdc->2, 0xdd->4 */ |
yihui | 0:86aa62fedb9b | 1113 | return hsize - (end - cur); |
yihui | 0:86aa62fedb9b | 1114 | } |
yihui | 0:86aa62fedb9b | 1115 | |
yihui | 0:86aa62fedb9b | 1116 | MP_PROTO uint32_t |
yihui | 0:86aa62fedb9b | 1117 | mp_decode_array_slowpath(uint8_t c, const char **data); |
yihui | 0:86aa62fedb9b | 1118 | |
yihui | 0:86aa62fedb9b | 1119 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1120 | mp_decode_array_slowpath(uint8_t c, const char **data) |
yihui | 0:86aa62fedb9b | 1121 | { |
yihui | 0:86aa62fedb9b | 1122 | uint32_t size; |
yihui | 0:86aa62fedb9b | 1123 | switch (c & 0x1) { |
yihui | 0:86aa62fedb9b | 1124 | case 0xdc & 0x1: |
yihui | 0:86aa62fedb9b | 1125 | size = mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1126 | return size; |
yihui | 0:86aa62fedb9b | 1127 | case 0xdd & 0x1: |
yihui | 0:86aa62fedb9b | 1128 | size = mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1129 | return size; |
yihui | 0:86aa62fedb9b | 1130 | default: |
yihui | 0:86aa62fedb9b | 1131 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1132 | } |
yihui | 0:86aa62fedb9b | 1133 | } |
yihui | 0:86aa62fedb9b | 1134 | |
yihui | 0:86aa62fedb9b | 1135 | MP_IMPL MP_ALWAYSINLINE uint32_t |
yihui | 0:86aa62fedb9b | 1136 | mp_decode_array(const char **data) |
yihui | 0:86aa62fedb9b | 1137 | { |
yihui | 0:86aa62fedb9b | 1138 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1139 | |
yihui | 0:86aa62fedb9b | 1140 | if (mp_likely(!(c & 0x40))) |
yihui | 0:86aa62fedb9b | 1141 | return (c & 0xf); |
yihui | 0:86aa62fedb9b | 1142 | |
yihui | 0:86aa62fedb9b | 1143 | return mp_decode_array_slowpath(c, data); |
yihui | 0:86aa62fedb9b | 1144 | } |
yihui | 0:86aa62fedb9b | 1145 | |
yihui | 0:86aa62fedb9b | 1146 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1147 | mp_sizeof_map(uint32_t size) |
yihui | 0:86aa62fedb9b | 1148 | { |
yihui | 0:86aa62fedb9b | 1149 | if (size <= 15) { |
yihui | 0:86aa62fedb9b | 1150 | return 1; |
yihui | 0:86aa62fedb9b | 1151 | } else if (size <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1152 | return 1 + sizeof(uint16_t); |
yihui | 0:86aa62fedb9b | 1153 | } else { |
yihui | 0:86aa62fedb9b | 1154 | return 1 + sizeof(uint32_t); |
yihui | 0:86aa62fedb9b | 1155 | } |
yihui | 0:86aa62fedb9b | 1156 | } |
yihui | 0:86aa62fedb9b | 1157 | |
yihui | 0:86aa62fedb9b | 1158 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1159 | mp_encode_map(char *data, uint32_t size) |
yihui | 0:86aa62fedb9b | 1160 | { |
yihui | 0:86aa62fedb9b | 1161 | if (size <= 15) { |
yihui | 0:86aa62fedb9b | 1162 | return mp_store_u8(data, 0x80 | size); |
yihui | 0:86aa62fedb9b | 1163 | } else if (size <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1164 | data = mp_store_u8(data, 0xde); |
yihui | 0:86aa62fedb9b | 1165 | data = mp_store_u16(data, size); |
yihui | 0:86aa62fedb9b | 1166 | return data; |
yihui | 0:86aa62fedb9b | 1167 | } else { |
yihui | 0:86aa62fedb9b | 1168 | data = mp_store_u8(data, 0xdf); |
yihui | 0:86aa62fedb9b | 1169 | data = mp_store_u32(data, size); |
yihui | 0:86aa62fedb9b | 1170 | return data; |
yihui | 0:86aa62fedb9b | 1171 | } |
yihui | 0:86aa62fedb9b | 1172 | } |
yihui | 0:86aa62fedb9b | 1173 | |
yihui | 0:86aa62fedb9b | 1174 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1175 | mp_check_map(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1176 | { |
yihui | 0:86aa62fedb9b | 1177 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1178 | assert(mp_typeof(*cur) == MP_MAP); |
yihui | 0:86aa62fedb9b | 1179 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1180 | if (mp_likely((c & ~0xfU) == 0x80)) |
yihui | 0:86aa62fedb9b | 1181 | return cur - end; |
yihui | 0:86aa62fedb9b | 1182 | |
yihui | 0:86aa62fedb9b | 1183 | assert(c >= 0xde && c <= 0xdf); /* must be checked above by mp_typeof */ |
yihui | 0:86aa62fedb9b | 1184 | uint32_t hsize = 2U << (c & 0x1); /* 0xde->2, 0xdf->4 */ |
yihui | 0:86aa62fedb9b | 1185 | return hsize - (end - cur); |
yihui | 0:86aa62fedb9b | 1186 | } |
yihui | 0:86aa62fedb9b | 1187 | |
yihui | 0:86aa62fedb9b | 1188 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1189 | mp_decode_map(const char **data) |
yihui | 0:86aa62fedb9b | 1190 | { |
yihui | 0:86aa62fedb9b | 1191 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1192 | switch (c) { |
yihui | 0:86aa62fedb9b | 1193 | case 0x80 ... 0x8f: |
yihui | 0:86aa62fedb9b | 1194 | return c & 0xf; |
yihui | 0:86aa62fedb9b | 1195 | case 0xde: |
yihui | 0:86aa62fedb9b | 1196 | return mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1197 | case 0xdf: |
yihui | 0:86aa62fedb9b | 1198 | return mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1199 | default: |
yihui | 0:86aa62fedb9b | 1200 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1201 | } |
yihui | 0:86aa62fedb9b | 1202 | } |
yihui | 0:86aa62fedb9b | 1203 | |
yihui | 0:86aa62fedb9b | 1204 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1205 | mp_sizeof_uint(uint64_t num) |
yihui | 0:86aa62fedb9b | 1206 | { |
yihui | 0:86aa62fedb9b | 1207 | if (num <= 0x7f) { |
yihui | 0:86aa62fedb9b | 1208 | return 1; |
yihui | 0:86aa62fedb9b | 1209 | } else if (num <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1210 | return 1 + sizeof(uint8_t); |
yihui | 0:86aa62fedb9b | 1211 | } else if (num <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1212 | return 1 + sizeof(uint16_t); |
yihui | 0:86aa62fedb9b | 1213 | } else if (num <= UINT32_MAX) { |
yihui | 0:86aa62fedb9b | 1214 | return 1 + sizeof(uint32_t); |
yihui | 0:86aa62fedb9b | 1215 | } else { |
yihui | 0:86aa62fedb9b | 1216 | return 1 + sizeof(uint64_t); |
yihui | 0:86aa62fedb9b | 1217 | } |
yihui | 0:86aa62fedb9b | 1218 | } |
yihui | 0:86aa62fedb9b | 1219 | |
yihui | 0:86aa62fedb9b | 1220 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1221 | mp_sizeof_int(int64_t num) |
yihui | 0:86aa62fedb9b | 1222 | { |
yihui | 0:86aa62fedb9b | 1223 | assert(num < 0); |
yihui | 0:86aa62fedb9b | 1224 | if (num >= -0x20) { |
yihui | 0:86aa62fedb9b | 1225 | return 1; |
yihui | 0:86aa62fedb9b | 1226 | } else if (num >= INT8_MIN && num <= INT8_MAX) { |
yihui | 0:86aa62fedb9b | 1227 | return 1 + sizeof(int8_t); |
yihui | 0:86aa62fedb9b | 1228 | } else if (num >= INT16_MIN && num <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1229 | return 1 + sizeof(int16_t); |
yihui | 0:86aa62fedb9b | 1230 | } else if (num >= INT32_MIN && num <= UINT32_MAX) { |
yihui | 0:86aa62fedb9b | 1231 | return 1 + sizeof(int32_t); |
yihui | 0:86aa62fedb9b | 1232 | } else { |
yihui | 0:86aa62fedb9b | 1233 | return 1 + sizeof(int64_t); |
yihui | 0:86aa62fedb9b | 1234 | } |
yihui | 0:86aa62fedb9b | 1235 | } |
yihui | 0:86aa62fedb9b | 1236 | |
yihui | 0:86aa62fedb9b | 1237 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1238 | mp_check_uint(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1239 | { |
yihui | 0:86aa62fedb9b | 1240 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1241 | assert(mp_typeof(*cur) == MP_UINT); |
yihui | 0:86aa62fedb9b | 1242 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1243 | return mp_parser_hint[c] - (end - cur); |
yihui | 0:86aa62fedb9b | 1244 | } |
yihui | 0:86aa62fedb9b | 1245 | |
yihui | 0:86aa62fedb9b | 1246 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1247 | mp_check_int(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1248 | { |
yihui | 0:86aa62fedb9b | 1249 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1250 | assert(mp_typeof(*cur) == MP_INT); |
yihui | 0:86aa62fedb9b | 1251 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1252 | return mp_parser_hint[c] - (end - cur); |
yihui | 0:86aa62fedb9b | 1253 | } |
yihui | 0:86aa62fedb9b | 1254 | |
yihui | 0:86aa62fedb9b | 1255 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1256 | mp_encode_uint(char *data, uint64_t num) |
yihui | 0:86aa62fedb9b | 1257 | { |
yihui | 0:86aa62fedb9b | 1258 | if (num <= 0x7f) { |
yihui | 0:86aa62fedb9b | 1259 | return mp_store_u8(data, num); |
yihui | 0:86aa62fedb9b | 1260 | } else if (num <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1261 | data = mp_store_u8(data, 0xcc); |
yihui | 0:86aa62fedb9b | 1262 | return mp_store_u8(data, num); |
yihui | 0:86aa62fedb9b | 1263 | } else if (num <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1264 | data = mp_store_u8(data, 0xcd); |
yihui | 0:86aa62fedb9b | 1265 | return mp_store_u16(data, num); |
yihui | 0:86aa62fedb9b | 1266 | } else if (num <= UINT32_MAX) { |
yihui | 0:86aa62fedb9b | 1267 | data = mp_store_u8(data, 0xce); |
yihui | 0:86aa62fedb9b | 1268 | return mp_store_u32(data, num); |
yihui | 0:86aa62fedb9b | 1269 | } else { |
yihui | 0:86aa62fedb9b | 1270 | data = mp_store_u8(data, 0xcf); |
yihui | 0:86aa62fedb9b | 1271 | return mp_store_u64(data, num); |
yihui | 0:86aa62fedb9b | 1272 | } |
yihui | 0:86aa62fedb9b | 1273 | } |
yihui | 0:86aa62fedb9b | 1274 | |
yihui | 0:86aa62fedb9b | 1275 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1276 | mp_encode_int(char *data, int64_t num) |
yihui | 0:86aa62fedb9b | 1277 | { |
yihui | 0:86aa62fedb9b | 1278 | assert(num < 0); |
yihui | 0:86aa62fedb9b | 1279 | if (num >= -0x20) { |
yihui | 0:86aa62fedb9b | 1280 | return mp_store_u8(data, 0xe0 | num); |
yihui | 0:86aa62fedb9b | 1281 | } else if (num >= INT8_MIN) { |
yihui | 0:86aa62fedb9b | 1282 | data = mp_store_u8(data, 0xd0); |
yihui | 0:86aa62fedb9b | 1283 | return mp_store_u8(data, num); |
yihui | 0:86aa62fedb9b | 1284 | } else if (num >= INT16_MIN) { |
yihui | 0:86aa62fedb9b | 1285 | data = mp_store_u8(data, 0xd1); |
yihui | 0:86aa62fedb9b | 1286 | return mp_store_u16(data, num); |
yihui | 0:86aa62fedb9b | 1287 | } else if (num >= INT32_MIN) { |
yihui | 0:86aa62fedb9b | 1288 | data = mp_store_u8(data, 0xd2); |
yihui | 0:86aa62fedb9b | 1289 | return mp_store_u32(data, num); |
yihui | 0:86aa62fedb9b | 1290 | } else { |
yihui | 0:86aa62fedb9b | 1291 | data = mp_store_u8(data, 0xd3); |
yihui | 0:86aa62fedb9b | 1292 | return mp_store_u64(data, num); |
yihui | 0:86aa62fedb9b | 1293 | } |
yihui | 0:86aa62fedb9b | 1294 | } |
yihui | 0:86aa62fedb9b | 1295 | |
yihui | 0:86aa62fedb9b | 1296 | MP_IMPL uint64_t |
yihui | 0:86aa62fedb9b | 1297 | mp_decode_uint(const char **data) |
yihui | 0:86aa62fedb9b | 1298 | { |
yihui | 0:86aa62fedb9b | 1299 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1300 | |
yihui | 0:86aa62fedb9b | 1301 | switch (c) { |
yihui | 0:86aa62fedb9b | 1302 | case 0x00 ... 0x7f: |
yihui | 0:86aa62fedb9b | 1303 | return c; |
yihui | 0:86aa62fedb9b | 1304 | case 0xcc: |
yihui | 0:86aa62fedb9b | 1305 | return mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1306 | case 0xcd: |
yihui | 0:86aa62fedb9b | 1307 | return mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1308 | case 0xce: |
yihui | 0:86aa62fedb9b | 1309 | return mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1310 | case 0xcf: |
yihui | 0:86aa62fedb9b | 1311 | return mp_load_u64(data); |
yihui | 0:86aa62fedb9b | 1312 | default: |
yihui | 0:86aa62fedb9b | 1313 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1314 | } |
yihui | 0:86aa62fedb9b | 1315 | } |
yihui | 0:86aa62fedb9b | 1316 | |
yihui | 0:86aa62fedb9b | 1317 | MP_IMPL int |
yihui | 0:86aa62fedb9b | 1318 | mp_compare_uint(const char *data_a, const char *data_b) |
yihui | 0:86aa62fedb9b | 1319 | { |
yihui | 0:86aa62fedb9b | 1320 | uint8_t ca = mp_load_u8(&data_a); |
yihui | 0:86aa62fedb9b | 1321 | uint8_t cb = mp_load_u8(&data_b); |
yihui | 0:86aa62fedb9b | 1322 | |
yihui | 0:86aa62fedb9b | 1323 | int r = ca - cb; |
yihui | 0:86aa62fedb9b | 1324 | if (r != 0) |
yihui | 0:86aa62fedb9b | 1325 | return r; |
yihui | 0:86aa62fedb9b | 1326 | |
yihui | 0:86aa62fedb9b | 1327 | if (ca <= 0x7f) |
yihui | 0:86aa62fedb9b | 1328 | return 0; |
yihui | 0:86aa62fedb9b | 1329 | |
yihui | 0:86aa62fedb9b | 1330 | uint64_t a, b; |
yihui | 0:86aa62fedb9b | 1331 | switch (ca & 0x3) { |
yihui | 0:86aa62fedb9b | 1332 | case 0xcc & 0x3: |
yihui | 0:86aa62fedb9b | 1333 | a = mp_load_u8(&data_a); |
yihui | 0:86aa62fedb9b | 1334 | b = mp_load_u8(&data_b); |
yihui | 0:86aa62fedb9b | 1335 | break; |
yihui | 0:86aa62fedb9b | 1336 | case 0xcd & 0x3: |
yihui | 0:86aa62fedb9b | 1337 | a = mp_load_u16(&data_a); |
yihui | 0:86aa62fedb9b | 1338 | b = mp_load_u16(&data_b); |
yihui | 0:86aa62fedb9b | 1339 | break; |
yihui | 0:86aa62fedb9b | 1340 | case 0xce & 0x3: |
yihui | 0:86aa62fedb9b | 1341 | a = mp_load_u32(&data_a); |
yihui | 0:86aa62fedb9b | 1342 | b = mp_load_u32(&data_b); |
yihui | 0:86aa62fedb9b | 1343 | break; |
yihui | 0:86aa62fedb9b | 1344 | case 0xcf & 0x3: |
yihui | 0:86aa62fedb9b | 1345 | a = mp_load_u64(&data_a); |
yihui | 0:86aa62fedb9b | 1346 | b = mp_load_u64(&data_b); |
yihui | 0:86aa62fedb9b | 1347 | return a < b ? -1 : a > b; |
yihui | 0:86aa62fedb9b | 1348 | break; |
yihui | 0:86aa62fedb9b | 1349 | default: |
yihui | 0:86aa62fedb9b | 1350 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1351 | } |
yihui | 0:86aa62fedb9b | 1352 | |
yihui | 0:86aa62fedb9b | 1353 | int64_t v = (a - b); |
yihui | 0:86aa62fedb9b | 1354 | return (v > 0) - (v < 0); |
yihui | 0:86aa62fedb9b | 1355 | } |
yihui | 0:86aa62fedb9b | 1356 | |
yihui | 0:86aa62fedb9b | 1357 | MP_IMPL int64_t |
yihui | 0:86aa62fedb9b | 1358 | mp_decode_int(const char **data) |
yihui | 0:86aa62fedb9b | 1359 | { |
yihui | 0:86aa62fedb9b | 1360 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1361 | switch (c) { |
yihui | 0:86aa62fedb9b | 1362 | case 0xe0 ... 0xff: |
yihui | 0:86aa62fedb9b | 1363 | return (int8_t) (c); |
yihui | 0:86aa62fedb9b | 1364 | case 0xd0: |
yihui | 0:86aa62fedb9b | 1365 | return (int8_t) mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1366 | case 0xd1: |
yihui | 0:86aa62fedb9b | 1367 | return (int16_t) mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1368 | case 0xd2: |
yihui | 0:86aa62fedb9b | 1369 | return (int32_t) mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1370 | case 0xd3: |
yihui | 0:86aa62fedb9b | 1371 | return (int64_t) mp_load_u64(data); |
yihui | 0:86aa62fedb9b | 1372 | default: |
yihui | 0:86aa62fedb9b | 1373 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1374 | } |
yihui | 0:86aa62fedb9b | 1375 | } |
yihui | 0:86aa62fedb9b | 1376 | |
yihui | 0:86aa62fedb9b | 1377 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1378 | mp_sizeof_float(float num) |
yihui | 0:86aa62fedb9b | 1379 | { |
yihui | 0:86aa62fedb9b | 1380 | (void) num; |
yihui | 0:86aa62fedb9b | 1381 | return 1 + sizeof(float); |
yihui | 0:86aa62fedb9b | 1382 | } |
yihui | 0:86aa62fedb9b | 1383 | |
yihui | 0:86aa62fedb9b | 1384 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1385 | mp_sizeof_double(double num) |
yihui | 0:86aa62fedb9b | 1386 | { |
yihui | 0:86aa62fedb9b | 1387 | (void) num; |
yihui | 0:86aa62fedb9b | 1388 | return 1 + sizeof(double); |
yihui | 0:86aa62fedb9b | 1389 | } |
yihui | 0:86aa62fedb9b | 1390 | |
yihui | 0:86aa62fedb9b | 1391 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1392 | mp_check_float(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1393 | { |
yihui | 0:86aa62fedb9b | 1394 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1395 | assert(mp_typeof(*cur) == MP_FLOAT); |
yihui | 0:86aa62fedb9b | 1396 | return 1 + sizeof(float) - (end - cur); |
yihui | 0:86aa62fedb9b | 1397 | } |
yihui | 0:86aa62fedb9b | 1398 | |
yihui | 0:86aa62fedb9b | 1399 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1400 | mp_check_double(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1401 | { |
yihui | 0:86aa62fedb9b | 1402 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1403 | assert(mp_typeof(*cur) == MP_DOUBLE); |
yihui | 0:86aa62fedb9b | 1404 | return 1 + sizeof(double) - (end - cur); |
yihui | 0:86aa62fedb9b | 1405 | } |
yihui | 0:86aa62fedb9b | 1406 | |
yihui | 0:86aa62fedb9b | 1407 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1408 | mp_encode_float(char *data, float num) |
yihui | 0:86aa62fedb9b | 1409 | { |
yihui | 0:86aa62fedb9b | 1410 | data = mp_store_u8(data, 0xca); |
yihui | 0:86aa62fedb9b | 1411 | return mp_store_float(data, num); |
yihui | 0:86aa62fedb9b | 1412 | } |
yihui | 0:86aa62fedb9b | 1413 | |
yihui | 0:86aa62fedb9b | 1414 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1415 | mp_encode_double(char *data, double num) |
yihui | 0:86aa62fedb9b | 1416 | { |
yihui | 0:86aa62fedb9b | 1417 | data = mp_store_u8(data, 0xcb); |
yihui | 0:86aa62fedb9b | 1418 | return mp_store_double(data, num); |
yihui | 0:86aa62fedb9b | 1419 | } |
yihui | 0:86aa62fedb9b | 1420 | |
yihui | 0:86aa62fedb9b | 1421 | MP_IMPL float |
yihui | 0:86aa62fedb9b | 1422 | mp_decode_float(const char **data) |
yihui | 0:86aa62fedb9b | 1423 | { |
yihui | 0:86aa62fedb9b | 1424 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1425 | assert(c == 0xca); |
yihui | 0:86aa62fedb9b | 1426 | (void) c; |
yihui | 0:86aa62fedb9b | 1427 | return mp_load_float(data); |
yihui | 0:86aa62fedb9b | 1428 | } |
yihui | 0:86aa62fedb9b | 1429 | |
yihui | 0:86aa62fedb9b | 1430 | MP_IMPL double |
yihui | 0:86aa62fedb9b | 1431 | mp_decode_double(const char **data) |
yihui | 0:86aa62fedb9b | 1432 | { |
yihui | 0:86aa62fedb9b | 1433 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1434 | assert(c == 0xcb); |
yihui | 0:86aa62fedb9b | 1435 | (void) c; |
yihui | 0:86aa62fedb9b | 1436 | return mp_load_double(data); |
yihui | 0:86aa62fedb9b | 1437 | } |
yihui | 0:86aa62fedb9b | 1438 | |
yihui | 0:86aa62fedb9b | 1439 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1440 | mp_sizeof_strl(uint32_t len) |
yihui | 0:86aa62fedb9b | 1441 | { |
yihui | 0:86aa62fedb9b | 1442 | if (len <= 31) { |
yihui | 0:86aa62fedb9b | 1443 | return 1; |
yihui | 0:86aa62fedb9b | 1444 | } else if (len <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1445 | return 1 + sizeof(uint8_t); |
yihui | 0:86aa62fedb9b | 1446 | } else if (len <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1447 | return 1 + sizeof(uint16_t); |
yihui | 0:86aa62fedb9b | 1448 | } else { |
yihui | 0:86aa62fedb9b | 1449 | return 1 + sizeof(uint32_t); |
yihui | 0:86aa62fedb9b | 1450 | } |
yihui | 0:86aa62fedb9b | 1451 | } |
yihui | 0:86aa62fedb9b | 1452 | |
yihui | 0:86aa62fedb9b | 1453 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1454 | mp_sizeof_str(uint32_t len) |
yihui | 0:86aa62fedb9b | 1455 | { |
yihui | 0:86aa62fedb9b | 1456 | return mp_sizeof_strl(len) + len; |
yihui | 0:86aa62fedb9b | 1457 | } |
yihui | 0:86aa62fedb9b | 1458 | |
yihui | 0:86aa62fedb9b | 1459 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1460 | mp_sizeof_binl(uint32_t len) |
yihui | 0:86aa62fedb9b | 1461 | { |
yihui | 0:86aa62fedb9b | 1462 | if (len <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1463 | return 1 + sizeof(uint8_t); |
yihui | 0:86aa62fedb9b | 1464 | } else if (len <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1465 | return 1 + sizeof(uint16_t); |
yihui | 0:86aa62fedb9b | 1466 | } else { |
yihui | 0:86aa62fedb9b | 1467 | return 1 + sizeof(uint32_t); |
yihui | 0:86aa62fedb9b | 1468 | } |
yihui | 0:86aa62fedb9b | 1469 | } |
yihui | 0:86aa62fedb9b | 1470 | |
yihui | 0:86aa62fedb9b | 1471 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1472 | mp_sizeof_bin(uint32_t len) |
yihui | 0:86aa62fedb9b | 1473 | { |
yihui | 0:86aa62fedb9b | 1474 | return mp_sizeof_binl(len) + len; |
yihui | 0:86aa62fedb9b | 1475 | } |
yihui | 0:86aa62fedb9b | 1476 | |
yihui | 0:86aa62fedb9b | 1477 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1478 | mp_encode_strl(char *data, uint32_t len) |
yihui | 0:86aa62fedb9b | 1479 | { |
yihui | 0:86aa62fedb9b | 1480 | if (len <= 31) { |
yihui | 0:86aa62fedb9b | 1481 | return mp_store_u8(data, 0xa0 | (uint8_t) len); |
yihui | 0:86aa62fedb9b | 1482 | } else if (len <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1483 | data = mp_store_u8(data, 0xd9); |
yihui | 0:86aa62fedb9b | 1484 | return mp_store_u8(data, len); |
yihui | 0:86aa62fedb9b | 1485 | } else if (len <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1486 | data = mp_store_u8(data, 0xda); |
yihui | 0:86aa62fedb9b | 1487 | return mp_store_u16(data, len); |
yihui | 0:86aa62fedb9b | 1488 | } else { |
yihui | 0:86aa62fedb9b | 1489 | data = mp_store_u8(data, 0xdb); |
yihui | 0:86aa62fedb9b | 1490 | return mp_store_u32(data, len); |
yihui | 0:86aa62fedb9b | 1491 | } |
yihui | 0:86aa62fedb9b | 1492 | } |
yihui | 0:86aa62fedb9b | 1493 | |
yihui | 0:86aa62fedb9b | 1494 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1495 | mp_encode_str(char *data, const char *str, uint32_t len) |
yihui | 0:86aa62fedb9b | 1496 | { |
yihui | 0:86aa62fedb9b | 1497 | data = mp_encode_strl(data, len); |
yihui | 0:86aa62fedb9b | 1498 | memcpy(data, str, len); |
yihui | 0:86aa62fedb9b | 1499 | return data + len; |
yihui | 0:86aa62fedb9b | 1500 | } |
yihui | 0:86aa62fedb9b | 1501 | |
yihui | 0:86aa62fedb9b | 1502 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1503 | mp_encode_binl(char *data, uint32_t len) |
yihui | 0:86aa62fedb9b | 1504 | { |
yihui | 0:86aa62fedb9b | 1505 | if (len <= UINT8_MAX) { |
yihui | 0:86aa62fedb9b | 1506 | data = mp_store_u8(data, 0xc4); |
yihui | 0:86aa62fedb9b | 1507 | return mp_store_u8(data, len); |
yihui | 0:86aa62fedb9b | 1508 | } else if (len <= UINT16_MAX) { |
yihui | 0:86aa62fedb9b | 1509 | data = mp_store_u8(data, 0xc5); |
yihui | 0:86aa62fedb9b | 1510 | return mp_store_u16(data, len); |
yihui | 0:86aa62fedb9b | 1511 | } else { |
yihui | 0:86aa62fedb9b | 1512 | data = mp_store_u8(data, 0xc6); |
yihui | 0:86aa62fedb9b | 1513 | return mp_store_u32(data, len); |
yihui | 0:86aa62fedb9b | 1514 | } |
yihui | 0:86aa62fedb9b | 1515 | } |
yihui | 0:86aa62fedb9b | 1516 | |
yihui | 0:86aa62fedb9b | 1517 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1518 | mp_encode_bin(char *data, const char *str, uint32_t len) |
yihui | 0:86aa62fedb9b | 1519 | { |
yihui | 0:86aa62fedb9b | 1520 | data = mp_encode_binl(data, len); |
yihui | 0:86aa62fedb9b | 1521 | memcpy(data, str, len); |
yihui | 0:86aa62fedb9b | 1522 | return data + len; |
yihui | 0:86aa62fedb9b | 1523 | } |
yihui | 0:86aa62fedb9b | 1524 | |
yihui | 0:86aa62fedb9b | 1525 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1526 | mp_check_strl(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1527 | { |
yihui | 0:86aa62fedb9b | 1528 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1529 | assert(mp_typeof(*cur) == MP_STR); |
yihui | 0:86aa62fedb9b | 1530 | |
yihui | 0:86aa62fedb9b | 1531 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1532 | if (mp_likely(c & ~0x1f) == 0xa0) |
yihui | 0:86aa62fedb9b | 1533 | return cur - end; |
yihui | 0:86aa62fedb9b | 1534 | |
yihui | 0:86aa62fedb9b | 1535 | assert(c >= 0xd9 && c <= 0xdb); /* must be checked above by mp_typeof */ |
yihui | 0:86aa62fedb9b | 1536 | uint32_t hsize = 1U << (c & 0x3) >> 1; /* 0xd9->1, 0xda->2, 0xdb->4 */ |
yihui | 0:86aa62fedb9b | 1537 | return hsize - (end - cur); |
yihui | 0:86aa62fedb9b | 1538 | } |
yihui | 0:86aa62fedb9b | 1539 | |
yihui | 0:86aa62fedb9b | 1540 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1541 | mp_check_binl(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1542 | { |
yihui | 0:86aa62fedb9b | 1543 | uint8_t c = mp_load_u8(&cur); |
yihui | 0:86aa62fedb9b | 1544 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1545 | assert(mp_typeof(c) == MP_BIN); |
yihui | 0:86aa62fedb9b | 1546 | |
yihui | 0:86aa62fedb9b | 1547 | assert(c >= 0xc4 && c <= 0xc6); /* must be checked above by mp_typeof */ |
yihui | 0:86aa62fedb9b | 1548 | uint32_t hsize = 1U << (c & 0x3); /* 0xc4->1, 0xc5->2, 0xc6->4 */ |
yihui | 0:86aa62fedb9b | 1549 | return hsize - (end - cur); |
yihui | 0:86aa62fedb9b | 1550 | } |
yihui | 0:86aa62fedb9b | 1551 | |
yihui | 0:86aa62fedb9b | 1552 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1553 | mp_decode_strl(const char **data) |
yihui | 0:86aa62fedb9b | 1554 | { |
yihui | 0:86aa62fedb9b | 1555 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1556 | |
yihui | 0:86aa62fedb9b | 1557 | switch (c) { |
yihui | 0:86aa62fedb9b | 1558 | case 0xa0 ... 0xbf: |
yihui | 0:86aa62fedb9b | 1559 | return c & 0x1f; |
yihui | 0:86aa62fedb9b | 1560 | case 0xd9: |
yihui | 0:86aa62fedb9b | 1561 | return mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1562 | case 0xda: |
yihui | 0:86aa62fedb9b | 1563 | return mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1564 | case 0xdb: |
yihui | 0:86aa62fedb9b | 1565 | return mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1566 | default: |
yihui | 0:86aa62fedb9b | 1567 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1568 | } |
yihui | 0:86aa62fedb9b | 1569 | } |
yihui | 0:86aa62fedb9b | 1570 | |
yihui | 0:86aa62fedb9b | 1571 | MP_IMPL const char * |
yihui | 0:86aa62fedb9b | 1572 | mp_decode_str(const char **data, uint32_t *len) |
yihui | 0:86aa62fedb9b | 1573 | { |
yihui | 0:86aa62fedb9b | 1574 | assert(len != NULL); |
yihui | 0:86aa62fedb9b | 1575 | |
yihui | 0:86aa62fedb9b | 1576 | *len = mp_decode_strl(data); |
yihui | 0:86aa62fedb9b | 1577 | const char *str = *data; |
yihui | 0:86aa62fedb9b | 1578 | *data += *len; |
yihui | 0:86aa62fedb9b | 1579 | return str; |
yihui | 0:86aa62fedb9b | 1580 | } |
yihui | 0:86aa62fedb9b | 1581 | |
yihui | 0:86aa62fedb9b | 1582 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1583 | mp_decode_binl(const char **data) |
yihui | 0:86aa62fedb9b | 1584 | { |
yihui | 0:86aa62fedb9b | 1585 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1586 | |
yihui | 0:86aa62fedb9b | 1587 | switch (c) { |
yihui | 0:86aa62fedb9b | 1588 | case 0xc4: |
yihui | 0:86aa62fedb9b | 1589 | return mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1590 | case 0xc5: |
yihui | 0:86aa62fedb9b | 1591 | return mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1592 | case 0xc6: |
yihui | 0:86aa62fedb9b | 1593 | return mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1594 | default: |
yihui | 0:86aa62fedb9b | 1595 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1596 | } |
yihui | 0:86aa62fedb9b | 1597 | } |
yihui | 0:86aa62fedb9b | 1598 | |
yihui | 0:86aa62fedb9b | 1599 | MP_IMPL const char * |
yihui | 0:86aa62fedb9b | 1600 | mp_decode_bin(const char **data, uint32_t *len) |
yihui | 0:86aa62fedb9b | 1601 | { |
yihui | 0:86aa62fedb9b | 1602 | assert(len != NULL); |
yihui | 0:86aa62fedb9b | 1603 | |
yihui | 0:86aa62fedb9b | 1604 | *len = mp_decode_binl(data); |
yihui | 0:86aa62fedb9b | 1605 | const char *str = *data; |
yihui | 0:86aa62fedb9b | 1606 | *data += *len; |
yihui | 0:86aa62fedb9b | 1607 | return str; |
yihui | 0:86aa62fedb9b | 1608 | } |
yihui | 0:86aa62fedb9b | 1609 | |
yihui | 0:86aa62fedb9b | 1610 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1611 | mp_sizeof_nil() |
yihui | 0:86aa62fedb9b | 1612 | { |
yihui | 0:86aa62fedb9b | 1613 | return 1; |
yihui | 0:86aa62fedb9b | 1614 | } |
yihui | 0:86aa62fedb9b | 1615 | |
yihui | 0:86aa62fedb9b | 1616 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1617 | mp_encode_nil(char *data) |
yihui | 0:86aa62fedb9b | 1618 | { |
yihui | 0:86aa62fedb9b | 1619 | return mp_store_u8(data, 0xc0); |
yihui | 0:86aa62fedb9b | 1620 | } |
yihui | 0:86aa62fedb9b | 1621 | |
yihui | 0:86aa62fedb9b | 1622 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1623 | mp_check_nil(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1624 | { |
yihui | 0:86aa62fedb9b | 1625 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1626 | assert(mp_typeof(*cur) == MP_NIL); |
yihui | 0:86aa62fedb9b | 1627 | return 1 - (end - cur); |
yihui | 0:86aa62fedb9b | 1628 | } |
yihui | 0:86aa62fedb9b | 1629 | |
yihui | 0:86aa62fedb9b | 1630 | MP_IMPL void |
yihui | 0:86aa62fedb9b | 1631 | mp_decode_nil(const char **data) |
yihui | 0:86aa62fedb9b | 1632 | { |
yihui | 0:86aa62fedb9b | 1633 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1634 | assert(c == 0xc0); |
yihui | 0:86aa62fedb9b | 1635 | (void) c; |
yihui | 0:86aa62fedb9b | 1636 | } |
yihui | 0:86aa62fedb9b | 1637 | |
yihui | 0:86aa62fedb9b | 1638 | MP_IMPL uint32_t |
yihui | 0:86aa62fedb9b | 1639 | mp_sizeof_bool(bool val) |
yihui | 0:86aa62fedb9b | 1640 | { |
yihui | 0:86aa62fedb9b | 1641 | (void) val; |
yihui | 0:86aa62fedb9b | 1642 | return 1; |
yihui | 0:86aa62fedb9b | 1643 | } |
yihui | 0:86aa62fedb9b | 1644 | |
yihui | 0:86aa62fedb9b | 1645 | MP_IMPL char * |
yihui | 0:86aa62fedb9b | 1646 | mp_encode_bool(char *data, bool val) |
yihui | 0:86aa62fedb9b | 1647 | { |
yihui | 0:86aa62fedb9b | 1648 | return mp_store_u8(data, 0xc2 | (val & 1)); |
yihui | 0:86aa62fedb9b | 1649 | } |
yihui | 0:86aa62fedb9b | 1650 | |
yihui | 0:86aa62fedb9b | 1651 | MP_IMPL ptrdiff_t |
yihui | 0:86aa62fedb9b | 1652 | mp_check_bool(const char *cur, const char *end) |
yihui | 0:86aa62fedb9b | 1653 | { |
yihui | 0:86aa62fedb9b | 1654 | assert(cur < end); |
yihui | 0:86aa62fedb9b | 1655 | assert(mp_typeof(*cur) == MP_BOOL); |
yihui | 0:86aa62fedb9b | 1656 | return 1 - (end - cur); |
yihui | 0:86aa62fedb9b | 1657 | } |
yihui | 0:86aa62fedb9b | 1658 | |
yihui | 0:86aa62fedb9b | 1659 | MP_IMPL bool |
yihui | 0:86aa62fedb9b | 1660 | mp_decode_bool(const char **data) |
yihui | 0:86aa62fedb9b | 1661 | { |
yihui | 0:86aa62fedb9b | 1662 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1663 | switch (c) { |
yihui | 0:86aa62fedb9b | 1664 | case 0xc3: |
yihui | 0:86aa62fedb9b | 1665 | return true; |
yihui | 0:86aa62fedb9b | 1666 | case 0xc2: |
yihui | 0:86aa62fedb9b | 1667 | return false; |
yihui | 0:86aa62fedb9b | 1668 | default: |
yihui | 0:86aa62fedb9b | 1669 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1670 | } |
yihui | 0:86aa62fedb9b | 1671 | } |
yihui | 0:86aa62fedb9b | 1672 | |
yihui | 0:86aa62fedb9b | 1673 | /** See mp_parser_hint */ |
yihui | 0:86aa62fedb9b | 1674 | enum { |
yihui | 0:86aa62fedb9b | 1675 | MP_HINT = -32, |
yihui | 0:86aa62fedb9b | 1676 | MP_HINT_STR_8 = MP_HINT, |
yihui | 0:86aa62fedb9b | 1677 | MP_HINT_STR_16 = MP_HINT - 1, |
yihui | 0:86aa62fedb9b | 1678 | MP_HINT_STR_32 = MP_HINT - 2, |
yihui | 0:86aa62fedb9b | 1679 | MP_HINT_ARRAY_16 = MP_HINT - 3, |
yihui | 0:86aa62fedb9b | 1680 | MP_HINT_ARRAY_32 = MP_HINT - 4, |
yihui | 0:86aa62fedb9b | 1681 | MP_HINT_MAP_16 = MP_HINT - 5, |
yihui | 0:86aa62fedb9b | 1682 | MP_HINT_MAP_32 = MP_HINT - 6, |
yihui | 0:86aa62fedb9b | 1683 | MP_HINT_EXT_8 = MP_HINT - 7, |
yihui | 0:86aa62fedb9b | 1684 | MP_HINT_EXT_16 = MP_HINT - 8, |
yihui | 0:86aa62fedb9b | 1685 | MP_HINT_EXT_32 = MP_HINT - 9 |
yihui | 0:86aa62fedb9b | 1686 | }; |
yihui | 0:86aa62fedb9b | 1687 | |
yihui | 0:86aa62fedb9b | 1688 | MP_PROTO void |
yihui | 0:86aa62fedb9b | 1689 | mp_next_slowpath(const char **data, int k); |
yihui | 0:86aa62fedb9b | 1690 | |
yihui | 0:86aa62fedb9b | 1691 | MP_IMPL void |
yihui | 0:86aa62fedb9b | 1692 | mp_next_slowpath(const char **data, int k) |
yihui | 0:86aa62fedb9b | 1693 | { |
yihui | 0:86aa62fedb9b | 1694 | for (; k > 0; k--) { |
yihui | 0:86aa62fedb9b | 1695 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1696 | int l = mp_parser_hint[c]; |
yihui | 0:86aa62fedb9b | 1697 | if (mp_likely(l >= 0)) { |
yihui | 0:86aa62fedb9b | 1698 | *data += l; |
yihui | 0:86aa62fedb9b | 1699 | continue; |
yihui | 0:86aa62fedb9b | 1700 | } else if (mp_likely(l > MP_HINT)) { |
yihui | 0:86aa62fedb9b | 1701 | k -= l; |
yihui | 0:86aa62fedb9b | 1702 | continue; |
yihui | 0:86aa62fedb9b | 1703 | } |
yihui | 0:86aa62fedb9b | 1704 | |
yihui | 0:86aa62fedb9b | 1705 | uint32_t len; |
yihui | 0:86aa62fedb9b | 1706 | switch (l) { |
yihui | 0:86aa62fedb9b | 1707 | case MP_HINT_STR_8: |
yihui | 0:86aa62fedb9b | 1708 | /* MP_STR (8) */ |
yihui | 0:86aa62fedb9b | 1709 | len = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1710 | *data += len; |
yihui | 0:86aa62fedb9b | 1711 | break; |
yihui | 0:86aa62fedb9b | 1712 | case MP_HINT_STR_16: |
yihui | 0:86aa62fedb9b | 1713 | /* MP_STR (16) */ |
yihui | 0:86aa62fedb9b | 1714 | len = mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1715 | *data += len; |
yihui | 0:86aa62fedb9b | 1716 | break; |
yihui | 0:86aa62fedb9b | 1717 | case MP_HINT_STR_32: |
yihui | 0:86aa62fedb9b | 1718 | /* MP_STR (32) */ |
yihui | 0:86aa62fedb9b | 1719 | len = mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1720 | *data += len; |
yihui | 0:86aa62fedb9b | 1721 | break; |
yihui | 0:86aa62fedb9b | 1722 | case MP_HINT_ARRAY_16: |
yihui | 0:86aa62fedb9b | 1723 | /* MP_ARRAY (16) */ |
yihui | 0:86aa62fedb9b | 1724 | k += mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1725 | break; |
yihui | 0:86aa62fedb9b | 1726 | case MP_HINT_ARRAY_32: |
yihui | 0:86aa62fedb9b | 1727 | /* MP_ARRAY (32) */ |
yihui | 0:86aa62fedb9b | 1728 | k += mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1729 | break; |
yihui | 0:86aa62fedb9b | 1730 | case MP_HINT_MAP_16: |
yihui | 0:86aa62fedb9b | 1731 | /* MP_MAP (16) */ |
yihui | 0:86aa62fedb9b | 1732 | k += 2 * mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1733 | break; |
yihui | 0:86aa62fedb9b | 1734 | case MP_HINT_MAP_32: |
yihui | 0:86aa62fedb9b | 1735 | /* MP_MAP (32) */ |
yihui | 0:86aa62fedb9b | 1736 | k += 2 * mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1737 | break; |
yihui | 0:86aa62fedb9b | 1738 | case MP_HINT_EXT_8: |
yihui | 0:86aa62fedb9b | 1739 | /* MP_EXT (8) */ |
yihui | 0:86aa62fedb9b | 1740 | len = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1741 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1742 | *data += len; |
yihui | 0:86aa62fedb9b | 1743 | break; |
yihui | 0:86aa62fedb9b | 1744 | case MP_HINT_EXT_16: |
yihui | 0:86aa62fedb9b | 1745 | /* MP_EXT (16) */ |
yihui | 0:86aa62fedb9b | 1746 | len = mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1747 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1748 | *data += len; |
yihui | 0:86aa62fedb9b | 1749 | break; |
yihui | 0:86aa62fedb9b | 1750 | case MP_HINT_EXT_32: |
yihui | 0:86aa62fedb9b | 1751 | /* MP_EXT (32) */ |
yihui | 0:86aa62fedb9b | 1752 | len = mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1753 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1754 | *data += len; |
yihui | 0:86aa62fedb9b | 1755 | break; |
yihui | 0:86aa62fedb9b | 1756 | default: |
yihui | 0:86aa62fedb9b | 1757 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1758 | } |
yihui | 0:86aa62fedb9b | 1759 | } |
yihui | 0:86aa62fedb9b | 1760 | } |
yihui | 0:86aa62fedb9b | 1761 | |
yihui | 0:86aa62fedb9b | 1762 | MP_IMPL void |
yihui | 0:86aa62fedb9b | 1763 | mp_next(const char **data) |
yihui | 0:86aa62fedb9b | 1764 | { |
yihui | 0:86aa62fedb9b | 1765 | int k = 1; |
yihui | 0:86aa62fedb9b | 1766 | for (; k > 0; k--) { |
yihui | 0:86aa62fedb9b | 1767 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1768 | int l = mp_parser_hint[c]; |
yihui | 0:86aa62fedb9b | 1769 | if (mp_likely(l >= 0)) { |
yihui | 0:86aa62fedb9b | 1770 | *data += l; |
yihui | 0:86aa62fedb9b | 1771 | continue; |
yihui | 0:86aa62fedb9b | 1772 | } else if (mp_likely(c == 0xd9)){ |
yihui | 0:86aa62fedb9b | 1773 | /* MP_STR (8) */ |
yihui | 0:86aa62fedb9b | 1774 | uint8_t len = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1775 | *data += len; |
yihui | 0:86aa62fedb9b | 1776 | continue; |
yihui | 0:86aa62fedb9b | 1777 | } else if (l > MP_HINT) { |
yihui | 0:86aa62fedb9b | 1778 | k -= l; |
yihui | 0:86aa62fedb9b | 1779 | continue; |
yihui | 0:86aa62fedb9b | 1780 | } else { |
yihui | 0:86aa62fedb9b | 1781 | *data -= sizeof(uint8_t); |
yihui | 0:86aa62fedb9b | 1782 | return mp_next_slowpath(data, k); |
yihui | 0:86aa62fedb9b | 1783 | } |
yihui | 0:86aa62fedb9b | 1784 | } |
yihui | 0:86aa62fedb9b | 1785 | } |
yihui | 0:86aa62fedb9b | 1786 | |
yihui | 0:86aa62fedb9b | 1787 | MP_IMPL int |
yihui | 0:86aa62fedb9b | 1788 | mp_check(const char **data, const char *end) |
yihui | 0:86aa62fedb9b | 1789 | { |
yihui | 0:86aa62fedb9b | 1790 | int k; |
yihui | 0:86aa62fedb9b | 1791 | for (k = 1; k > 0; k--) { |
yihui | 0:86aa62fedb9b | 1792 | if (mp_unlikely(*data >= end)) |
yihui | 0:86aa62fedb9b | 1793 | return 1; |
yihui | 0:86aa62fedb9b | 1794 | |
yihui | 0:86aa62fedb9b | 1795 | uint8_t c = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1796 | int l = mp_parser_hint[c]; |
yihui | 0:86aa62fedb9b | 1797 | if (mp_likely(l >= 0)) { |
yihui | 0:86aa62fedb9b | 1798 | *data += l; |
yihui | 0:86aa62fedb9b | 1799 | continue; |
yihui | 0:86aa62fedb9b | 1800 | } else if (mp_likely(l > MP_HINT)) { |
yihui | 0:86aa62fedb9b | 1801 | k -= l; |
yihui | 0:86aa62fedb9b | 1802 | continue; |
yihui | 0:86aa62fedb9b | 1803 | } |
yihui | 0:86aa62fedb9b | 1804 | |
yihui | 0:86aa62fedb9b | 1805 | uint32_t len; |
yihui | 0:86aa62fedb9b | 1806 | switch (l) { |
yihui | 0:86aa62fedb9b | 1807 | case MP_HINT_STR_8: |
yihui | 0:86aa62fedb9b | 1808 | /* MP_STR (8) */ |
yihui | 0:86aa62fedb9b | 1809 | if (mp_unlikely(*data + sizeof(uint8_t) > end)) |
yihui | 0:86aa62fedb9b | 1810 | return 1; |
yihui | 0:86aa62fedb9b | 1811 | len = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1812 | *data += len; |
yihui | 0:86aa62fedb9b | 1813 | break; |
yihui | 0:86aa62fedb9b | 1814 | case MP_HINT_STR_16: |
yihui | 0:86aa62fedb9b | 1815 | /* MP_STR (16) */ |
yihui | 0:86aa62fedb9b | 1816 | if (mp_unlikely(*data + sizeof(uint16_t) > end)) |
yihui | 0:86aa62fedb9b | 1817 | return 1; |
yihui | 0:86aa62fedb9b | 1818 | len = mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1819 | *data += len; |
yihui | 0:86aa62fedb9b | 1820 | break; |
yihui | 0:86aa62fedb9b | 1821 | case MP_HINT_STR_32: |
yihui | 0:86aa62fedb9b | 1822 | /* MP_STR (32) */ |
yihui | 0:86aa62fedb9b | 1823 | if (mp_unlikely(*data + sizeof(uint32_t) > end)) |
yihui | 0:86aa62fedb9b | 1824 | return 1; |
yihui | 0:86aa62fedb9b | 1825 | len = mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1826 | *data += len; |
yihui | 0:86aa62fedb9b | 1827 | break; |
yihui | 0:86aa62fedb9b | 1828 | case MP_HINT_ARRAY_16: |
yihui | 0:86aa62fedb9b | 1829 | /* MP_ARRAY (16) */ |
yihui | 0:86aa62fedb9b | 1830 | if (mp_unlikely(*data + sizeof(uint16_t) > end)) |
yihui | 0:86aa62fedb9b | 1831 | return 1; |
yihui | 0:86aa62fedb9b | 1832 | k += mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1833 | break; |
yihui | 0:86aa62fedb9b | 1834 | case MP_HINT_ARRAY_32: |
yihui | 0:86aa62fedb9b | 1835 | /* MP_ARRAY (32) */ |
yihui | 0:86aa62fedb9b | 1836 | if (mp_unlikely(*data + sizeof(uint32_t) > end)) |
yihui | 0:86aa62fedb9b | 1837 | return 1; |
yihui | 0:86aa62fedb9b | 1838 | k += mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1839 | break; |
yihui | 0:86aa62fedb9b | 1840 | case MP_HINT_MAP_16: |
yihui | 0:86aa62fedb9b | 1841 | /* MP_MAP (16) */ |
yihui | 0:86aa62fedb9b | 1842 | if (mp_unlikely(*data + sizeof(uint16_t) > end)) |
yihui | 0:86aa62fedb9b | 1843 | return false; |
yihui | 0:86aa62fedb9b | 1844 | k += 2 * mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1845 | break; |
yihui | 0:86aa62fedb9b | 1846 | case MP_HINT_MAP_32: |
yihui | 0:86aa62fedb9b | 1847 | /* MP_MAP (32) */ |
yihui | 0:86aa62fedb9b | 1848 | if (mp_unlikely(*data + sizeof(uint32_t) > end)) |
yihui | 0:86aa62fedb9b | 1849 | return 1; |
yihui | 0:86aa62fedb9b | 1850 | k += 2 * mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1851 | break; |
yihui | 0:86aa62fedb9b | 1852 | case MP_HINT_EXT_8: |
yihui | 0:86aa62fedb9b | 1853 | /* MP_EXT (8) */ |
yihui | 0:86aa62fedb9b | 1854 | if (mp_unlikely(*data + sizeof(uint8_t) + 1 > end)) |
yihui | 0:86aa62fedb9b | 1855 | return 1; |
yihui | 0:86aa62fedb9b | 1856 | len = mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1857 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1858 | *data += len; |
yihui | 0:86aa62fedb9b | 1859 | break; |
yihui | 0:86aa62fedb9b | 1860 | case MP_HINT_EXT_16: |
yihui | 0:86aa62fedb9b | 1861 | /* MP_EXT (16) */ |
yihui | 0:86aa62fedb9b | 1862 | if (mp_unlikely(*data + sizeof(uint16_t) + 1 > end)) |
yihui | 0:86aa62fedb9b | 1863 | return 1; |
yihui | 0:86aa62fedb9b | 1864 | len = mp_load_u16(data); |
yihui | 0:86aa62fedb9b | 1865 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1866 | *data += len; |
yihui | 0:86aa62fedb9b | 1867 | break; |
yihui | 0:86aa62fedb9b | 1868 | case MP_HINT_EXT_32: |
yihui | 0:86aa62fedb9b | 1869 | /* MP_EXT (32) */ |
yihui | 0:86aa62fedb9b | 1870 | if (mp_unlikely(*data + sizeof(uint32_t) + 1 > end)) |
yihui | 0:86aa62fedb9b | 1871 | return 1; |
yihui | 0:86aa62fedb9b | 1872 | len = mp_load_u32(data); |
yihui | 0:86aa62fedb9b | 1873 | mp_load_u8(data); |
yihui | 0:86aa62fedb9b | 1874 | *data += len; |
yihui | 0:86aa62fedb9b | 1875 | break; |
yihui | 0:86aa62fedb9b | 1876 | default: |
yihui | 0:86aa62fedb9b | 1877 | mp_unreachable(); |
yihui | 0:86aa62fedb9b | 1878 | } |
yihui | 0:86aa62fedb9b | 1879 | } |
yihui | 0:86aa62fedb9b | 1880 | |
yihui | 0:86aa62fedb9b | 1881 | if (mp_unlikely(*data > end)) |
yihui | 0:86aa62fedb9b | 1882 | return 1; |
yihui | 0:86aa62fedb9b | 1883 | |
yihui | 0:86aa62fedb9b | 1884 | return 0; |
yihui | 0:86aa62fedb9b | 1885 | } |
yihui | 0:86aa62fedb9b | 1886 | |
yihui | 0:86aa62fedb9b | 1887 | MP_IMPL size_t |
yihui | 0:86aa62fedb9b | 1888 | mp_vformat(char *data, size_t data_size, const char *format, va_list vl) |
yihui | 0:86aa62fedb9b | 1889 | { |
yihui | 0:86aa62fedb9b | 1890 | size_t result = 0; |
yihui | 0:86aa62fedb9b | 1891 | |
yihui | 0:86aa62fedb9b | 1892 | for (const char *f = format; *f; f++) { |
yihui | 0:86aa62fedb9b | 1893 | if (f[0] == '[') { |
yihui | 0:86aa62fedb9b | 1894 | uint32_t size = 0; |
yihui | 0:86aa62fedb9b | 1895 | int level = 1; |
yihui | 0:86aa62fedb9b | 1896 | for (const char *e = f + 1; level && *e; e++) { |
yihui | 0:86aa62fedb9b | 1897 | if (*e == '[' || *e == '{') { |
yihui | 0:86aa62fedb9b | 1898 | if (level == 1) |
yihui | 0:86aa62fedb9b | 1899 | size++; |
yihui | 0:86aa62fedb9b | 1900 | level++; |
yihui | 0:86aa62fedb9b | 1901 | } else if (*e == ']' || *e == '}') { |
yihui | 0:86aa62fedb9b | 1902 | level--; |
yihui | 0:86aa62fedb9b | 1903 | /* opened '[' must be closed by ']' */ |
yihui | 0:86aa62fedb9b | 1904 | assert(level || *e == ']'); |
yihui | 0:86aa62fedb9b | 1905 | } else if (*e == '%') { |
yihui | 0:86aa62fedb9b | 1906 | if (e[1] == '%') |
yihui | 0:86aa62fedb9b | 1907 | e++; |
yihui | 0:86aa62fedb9b | 1908 | else if (level == 1) |
yihui | 0:86aa62fedb9b | 1909 | size++; |
yihui | 0:86aa62fedb9b | 1910 | } else if (*e == 'N' && e[1] == 'I' |
yihui | 0:86aa62fedb9b | 1911 | && e[2] == 'L' && level == 1) { |
yihui | 0:86aa62fedb9b | 1912 | size++; |
yihui | 0:86aa62fedb9b | 1913 | } |
yihui | 0:86aa62fedb9b | 1914 | } |
yihui | 0:86aa62fedb9b | 1915 | /* opened '[' must be closed */ |
yihui | 0:86aa62fedb9b | 1916 | assert(level == 0); |
yihui | 0:86aa62fedb9b | 1917 | result += mp_sizeof_array(size); |
yihui | 0:86aa62fedb9b | 1918 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1919 | data = mp_encode_array(data, size); |
yihui | 0:86aa62fedb9b | 1920 | } else if (f[0] == '{') { |
yihui | 0:86aa62fedb9b | 1921 | uint32_t count = 0; |
yihui | 0:86aa62fedb9b | 1922 | int level = 1; |
yihui | 0:86aa62fedb9b | 1923 | for (const char *e = f + 1; level && *e; e++) { |
yihui | 0:86aa62fedb9b | 1924 | if (*e == '[' || *e == '{') { |
yihui | 0:86aa62fedb9b | 1925 | if (level == 1) |
yihui | 0:86aa62fedb9b | 1926 | count++; |
yihui | 0:86aa62fedb9b | 1927 | level++; |
yihui | 0:86aa62fedb9b | 1928 | } else if (*e == ']' || *e == '}') { |
yihui | 0:86aa62fedb9b | 1929 | level--; |
yihui | 0:86aa62fedb9b | 1930 | /* opened '{' must be closed by '}' */ |
yihui | 0:86aa62fedb9b | 1931 | assert(level || *e == '}'); |
yihui | 0:86aa62fedb9b | 1932 | } else if (*e == '%') { |
yihui | 0:86aa62fedb9b | 1933 | if (e[1] == '%') |
yihui | 0:86aa62fedb9b | 1934 | e++; |
yihui | 0:86aa62fedb9b | 1935 | else if (level == 1) |
yihui | 0:86aa62fedb9b | 1936 | count++; |
yihui | 0:86aa62fedb9b | 1937 | } else if (*e == 'N' && e[1] == 'I' |
yihui | 0:86aa62fedb9b | 1938 | && e[2] == 'L' && level == 1) { |
yihui | 0:86aa62fedb9b | 1939 | count++; |
yihui | 0:86aa62fedb9b | 1940 | } |
yihui | 0:86aa62fedb9b | 1941 | } |
yihui | 0:86aa62fedb9b | 1942 | /* opened '{' must be closed */ |
yihui | 0:86aa62fedb9b | 1943 | assert(level == 0); |
yihui | 0:86aa62fedb9b | 1944 | /* since map is a pair list, count must be even */ |
yihui | 0:86aa62fedb9b | 1945 | assert(count % 2 == 0); |
yihui | 0:86aa62fedb9b | 1946 | uint32_t size = count / 2; |
yihui | 0:86aa62fedb9b | 1947 | result += mp_sizeof_map(size); |
yihui | 0:86aa62fedb9b | 1948 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1949 | data = mp_encode_map(data, size); |
yihui | 0:86aa62fedb9b | 1950 | } else if (f[0] == '%') { |
yihui | 0:86aa62fedb9b | 1951 | f++; |
yihui | 0:86aa62fedb9b | 1952 | assert(f[0]); |
yihui | 0:86aa62fedb9b | 1953 | int64_t int_value = 0; |
yihui | 0:86aa62fedb9b | 1954 | int int_status = 0; /* 1 - signed, 2 - unsigned */ |
yihui | 0:86aa62fedb9b | 1955 | |
yihui | 0:86aa62fedb9b | 1956 | if (f[0] == 'd' || f[0] == 'i') { |
yihui | 0:86aa62fedb9b | 1957 | int_value = va_arg(vl, int); |
yihui | 0:86aa62fedb9b | 1958 | int_status = 1; |
yihui | 0:86aa62fedb9b | 1959 | } else if (f[0] == 'u') { |
yihui | 0:86aa62fedb9b | 1960 | int_value = va_arg(vl, unsigned int); |
yihui | 0:86aa62fedb9b | 1961 | int_status = 2; |
yihui | 0:86aa62fedb9b | 1962 | } else if (f[0] == 's') { |
yihui | 0:86aa62fedb9b | 1963 | const char *str = va_arg(vl, const char *); |
yihui | 0:86aa62fedb9b | 1964 | uint32_t len = (uint32_t)strlen(str); |
yihui | 0:86aa62fedb9b | 1965 | result += mp_sizeof_str(len); |
yihui | 0:86aa62fedb9b | 1966 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1967 | data = mp_encode_str(data, str, len); |
yihui | 0:86aa62fedb9b | 1968 | } else if (f[0] == '.' && f[1] == '*' && f[2] == 's') { |
yihui | 0:86aa62fedb9b | 1969 | uint32_t len = va_arg(vl, uint32_t); |
yihui | 0:86aa62fedb9b | 1970 | const char *str = va_arg(vl, const char *); |
yihui | 0:86aa62fedb9b | 1971 | result += mp_sizeof_str(len); |
yihui | 0:86aa62fedb9b | 1972 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1973 | data = mp_encode_str(data, str, len); |
yihui | 0:86aa62fedb9b | 1974 | f += 2; |
yihui | 0:86aa62fedb9b | 1975 | } else if(f[0] == 'f') { |
yihui | 0:86aa62fedb9b | 1976 | float v = (float)va_arg(vl, double); |
yihui | 0:86aa62fedb9b | 1977 | result += mp_sizeof_float(v); |
yihui | 0:86aa62fedb9b | 1978 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1979 | data = mp_encode_float(data, v); |
yihui | 0:86aa62fedb9b | 1980 | } else if(f[0] == 'l' && f[1] == 'f') { |
yihui | 0:86aa62fedb9b | 1981 | double v = va_arg(vl, double); |
yihui | 0:86aa62fedb9b | 1982 | result += mp_sizeof_double(v); |
yihui | 0:86aa62fedb9b | 1983 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1984 | data = mp_encode_double(data, v); |
yihui | 0:86aa62fedb9b | 1985 | f++; |
yihui | 0:86aa62fedb9b | 1986 | } else if(f[0] == 'b') { |
yihui | 0:86aa62fedb9b | 1987 | bool v = (bool)va_arg(vl, int); |
yihui | 0:86aa62fedb9b | 1988 | result += mp_sizeof_bool(v); |
yihui | 0:86aa62fedb9b | 1989 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 1990 | data = mp_encode_bool(data, v); |
yihui | 0:86aa62fedb9b | 1991 | } else if (f[0] == 'l' |
yihui | 0:86aa62fedb9b | 1992 | && (f[1] == 'd' || f[1] == 'i')) { |
yihui | 0:86aa62fedb9b | 1993 | int_value = va_arg(vl, long); |
yihui | 0:86aa62fedb9b | 1994 | int_status = 1; |
yihui | 0:86aa62fedb9b | 1995 | f++; |
yihui | 0:86aa62fedb9b | 1996 | } else if (f[0] == 'l' && f[1] == 'u') { |
yihui | 0:86aa62fedb9b | 1997 | int_value = va_arg(vl, unsigned long); |
yihui | 0:86aa62fedb9b | 1998 | int_status = 2; |
yihui | 0:86aa62fedb9b | 1999 | f++; |
yihui | 0:86aa62fedb9b | 2000 | } else if (f[0] == 'l' && f[1] == 'l' |
yihui | 0:86aa62fedb9b | 2001 | && (f[2] == 'd' || f[2] == 'i')) { |
yihui | 0:86aa62fedb9b | 2002 | int_value = va_arg(vl, long long); |
yihui | 0:86aa62fedb9b | 2003 | int_status = 1; |
yihui | 0:86aa62fedb9b | 2004 | f += 2; |
yihui | 0:86aa62fedb9b | 2005 | } else if (f[0] == 'l' && f[1] == 'l' && f[2] == 'u') { |
yihui | 0:86aa62fedb9b | 2006 | int_value = va_arg(vl, unsigned long long); |
yihui | 0:86aa62fedb9b | 2007 | int_status = 2; |
yihui | 0:86aa62fedb9b | 2008 | f += 2; |
yihui | 0:86aa62fedb9b | 2009 | } else if (f[0] == 'h' |
yihui | 0:86aa62fedb9b | 2010 | && (f[1] == 'd' || f[1] == 'i')) { |
yihui | 0:86aa62fedb9b | 2011 | int_value = va_arg(vl, int); |
yihui | 0:86aa62fedb9b | 2012 | int_status = 1; |
yihui | 0:86aa62fedb9b | 2013 | f++; |
yihui | 0:86aa62fedb9b | 2014 | } else if (f[0] == 'h' && f[1] == 'u') { |
yihui | 0:86aa62fedb9b | 2015 | int_value = va_arg(vl, unsigned int); |
yihui | 0:86aa62fedb9b | 2016 | int_status = 2; |
yihui | 0:86aa62fedb9b | 2017 | f++; |
yihui | 0:86aa62fedb9b | 2018 | } else if (f[0] == 'h' && f[1] == 'h' |
yihui | 0:86aa62fedb9b | 2019 | && (f[2] == 'd' || f[2] == 'i')) { |
yihui | 0:86aa62fedb9b | 2020 | int_value = va_arg(vl, int); |
yihui | 0:86aa62fedb9b | 2021 | int_status = 1; |
yihui | 0:86aa62fedb9b | 2022 | f += 2; |
yihui | 0:86aa62fedb9b | 2023 | } else if (f[0] == 'h' && f[1] == 'h' && f[2] == 'u') { |
yihui | 0:86aa62fedb9b | 2024 | int_value = va_arg(vl, unsigned int); |
yihui | 0:86aa62fedb9b | 2025 | int_status = 2; |
yihui | 0:86aa62fedb9b | 2026 | f += 2; |
yihui | 0:86aa62fedb9b | 2027 | } else if (f[0] != '%') { |
yihui | 0:86aa62fedb9b | 2028 | /* unexpected format specifier */ |
yihui | 0:86aa62fedb9b | 2029 | assert(false); |
yihui | 0:86aa62fedb9b | 2030 | } |
yihui | 0:86aa62fedb9b | 2031 | |
yihui | 0:86aa62fedb9b | 2032 | if (int_status == 1 && int_value < 0) { |
yihui | 0:86aa62fedb9b | 2033 | result += mp_sizeof_int(int_value); |
yihui | 0:86aa62fedb9b | 2034 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 2035 | data = mp_encode_int(data, int_value); |
yihui | 0:86aa62fedb9b | 2036 | } else if(int_status) { |
yihui | 0:86aa62fedb9b | 2037 | result += mp_sizeof_uint(int_value); |
yihui | 0:86aa62fedb9b | 2038 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 2039 | data = mp_encode_uint(data, int_value); |
yihui | 0:86aa62fedb9b | 2040 | } |
yihui | 0:86aa62fedb9b | 2041 | } else if (f[0] == 'N' && f[1] == 'I' && f[2] == 'L') { |
yihui | 0:86aa62fedb9b | 2042 | result += mp_sizeof_nil(); |
yihui | 0:86aa62fedb9b | 2043 | if (result <= data_size) |
yihui | 0:86aa62fedb9b | 2044 | data = mp_encode_nil(data); |
yihui | 0:86aa62fedb9b | 2045 | f += 2; |
yihui | 0:86aa62fedb9b | 2046 | } |
yihui | 0:86aa62fedb9b | 2047 | } |
yihui | 0:86aa62fedb9b | 2048 | return result; |
yihui | 0:86aa62fedb9b | 2049 | } |
yihui | 0:86aa62fedb9b | 2050 | |
yihui | 0:86aa62fedb9b | 2051 | MP_IMPL size_t |
yihui | 0:86aa62fedb9b | 2052 | mp_format(char *data, size_t data_size, const char *format, ...) |
yihui | 0:86aa62fedb9b | 2053 | { |
yihui | 0:86aa62fedb9b | 2054 | va_list args; |
yihui | 0:86aa62fedb9b | 2055 | va_start(args, format); |
yihui | 0:86aa62fedb9b | 2056 | size_t res = mp_vformat(data, data_size, format, args); |
yihui | 0:86aa62fedb9b | 2057 | va_end(args); |
yihui | 0:86aa62fedb9b | 2058 | return res; |
yihui | 0:86aa62fedb9b | 2059 | } |
yihui | 0:86aa62fedb9b | 2060 | |
yihui | 0:86aa62fedb9b | 2061 | /** \endcond */ |
yihui | 0:86aa62fedb9b | 2062 | |
yihui | 0:86aa62fedb9b | 2063 | /* |
yihui | 0:86aa62fedb9b | 2064 | * }}} |
yihui | 0:86aa62fedb9b | 2065 | */ |
yihui | 0:86aa62fedb9b | 2066 | |
yihui | 0:86aa62fedb9b | 2067 | /* |
yihui | 0:86aa62fedb9b | 2068 | * {{{ Implementation: parser tables |
yihui | 0:86aa62fedb9b | 2069 | */ |
yihui | 0:86aa62fedb9b | 2070 | |
yihui | 0:86aa62fedb9b | 2071 | /** \cond 0 */ |
yihui | 0:86aa62fedb9b | 2072 | |
yihui | 0:86aa62fedb9b | 2073 | #if defined(MP_SOURCE) |
yihui | 0:86aa62fedb9b | 2074 | |
yihui | 0:86aa62fedb9b | 2075 | /** |
yihui | 0:86aa62fedb9b | 2076 | * This lookup table used by mp_sizeof() to determine enum mp_type by the first |
yihui | 0:86aa62fedb9b | 2077 | * byte of MsgPack element. |
yihui | 0:86aa62fedb9b | 2078 | */ |
yihui | 0:86aa62fedb9b | 2079 | const enum mp_type mp_type_hint[256]= { |
yihui | 0:86aa62fedb9b | 2080 | /* {{{ MP_UINT (fixed) */ |
yihui | 0:86aa62fedb9b | 2081 | /* 0x00 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2082 | /* 0x01 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2083 | /* 0x02 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2084 | /* 0x03 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2085 | /* 0x04 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2086 | /* 0x05 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2087 | /* 0x06 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2088 | /* 0x07 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2089 | /* 0x08 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2090 | /* 0x09 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2091 | /* 0x0a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2092 | /* 0x0b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2093 | /* 0x0c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2094 | /* 0x0d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2095 | /* 0x0e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2096 | /* 0x0f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2097 | /* 0x10 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2098 | /* 0x11 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2099 | /* 0x12 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2100 | /* 0x13 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2101 | /* 0x14 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2102 | /* 0x15 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2103 | /* 0x16 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2104 | /* 0x17 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2105 | /* 0x18 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2106 | /* 0x19 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2107 | /* 0x1a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2108 | /* 0x1b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2109 | /* 0x1c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2110 | /* 0x1d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2111 | /* 0x1e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2112 | /* 0x1f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2113 | /* 0x20 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2114 | /* 0x21 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2115 | /* 0x22 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2116 | /* 0x23 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2117 | /* 0x24 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2118 | /* 0x25 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2119 | /* 0x26 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2120 | /* 0x27 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2121 | /* 0x28 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2122 | /* 0x29 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2123 | /* 0x2a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2124 | /* 0x2b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2125 | /* 0x2c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2126 | /* 0x2d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2127 | /* 0x2e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2128 | /* 0x2f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2129 | /* 0x30 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2130 | /* 0x31 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2131 | /* 0x32 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2132 | /* 0x33 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2133 | /* 0x34 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2134 | /* 0x35 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2135 | /* 0x36 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2136 | /* 0x37 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2137 | /* 0x38 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2138 | /* 0x39 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2139 | /* 0x3a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2140 | /* 0x3b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2141 | /* 0x3c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2142 | /* 0x3d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2143 | /* 0x3e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2144 | /* 0x3f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2145 | /* 0x40 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2146 | /* 0x41 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2147 | /* 0x42 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2148 | /* 0x43 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2149 | /* 0x44 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2150 | /* 0x45 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2151 | /* 0x46 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2152 | /* 0x47 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2153 | /* 0x48 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2154 | /* 0x49 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2155 | /* 0x4a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2156 | /* 0x4b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2157 | /* 0x4c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2158 | /* 0x4d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2159 | /* 0x4e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2160 | /* 0x4f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2161 | /* 0x50 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2162 | /* 0x51 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2163 | /* 0x52 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2164 | /* 0x53 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2165 | /* 0x54 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2166 | /* 0x55 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2167 | /* 0x56 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2168 | /* 0x57 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2169 | /* 0x58 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2170 | /* 0x59 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2171 | /* 0x5a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2172 | /* 0x5b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2173 | /* 0x5c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2174 | /* 0x5d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2175 | /* 0x5e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2176 | /* 0x5f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2177 | /* 0x60 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2178 | /* 0x61 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2179 | /* 0x62 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2180 | /* 0x63 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2181 | /* 0x64 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2182 | /* 0x65 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2183 | /* 0x66 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2184 | /* 0x67 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2185 | /* 0x68 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2186 | /* 0x69 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2187 | /* 0x6a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2188 | /* 0x6b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2189 | /* 0x6c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2190 | /* 0x6d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2191 | /* 0x6e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2192 | /* 0x6f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2193 | /* 0x70 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2194 | /* 0x71 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2195 | /* 0x72 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2196 | /* 0x73 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2197 | /* 0x74 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2198 | /* 0x75 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2199 | /* 0x76 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2200 | /* 0x77 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2201 | /* 0x78 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2202 | /* 0x79 */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2203 | /* 0x7a */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2204 | /* 0x7b */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2205 | /* 0x7c */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2206 | /* 0x7d */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2207 | /* 0x7e */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2208 | /* 0x7f */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2209 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2210 | |
yihui | 0:86aa62fedb9b | 2211 | /* {{{ MP_MAP (fixed) */ |
yihui | 0:86aa62fedb9b | 2212 | /* 0x80 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2213 | /* 0x81 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2214 | /* 0x82 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2215 | /* 0x83 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2216 | /* 0x84 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2217 | /* 0x85 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2218 | /* 0x86 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2219 | /* 0x87 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2220 | /* 0x88 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2221 | /* 0x89 */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2222 | /* 0x8a */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2223 | /* 0x8b */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2224 | /* 0x8c */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2225 | /* 0x8d */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2226 | /* 0x8e */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2227 | /* 0x8f */ MP_MAP, |
yihui | 0:86aa62fedb9b | 2228 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2229 | |
yihui | 0:86aa62fedb9b | 2230 | /* {{{ MP_ARRAY (fixed) */ |
yihui | 0:86aa62fedb9b | 2231 | /* 0x90 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2232 | /* 0x91 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2233 | /* 0x92 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2234 | /* 0x93 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2235 | /* 0x94 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2236 | /* 0x95 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2237 | /* 0x96 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2238 | /* 0x97 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2239 | /* 0x98 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2240 | /* 0x99 */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2241 | /* 0x9a */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2242 | /* 0x9b */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2243 | /* 0x9c */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2244 | /* 0x9d */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2245 | /* 0x9e */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2246 | /* 0x9f */ MP_ARRAY, |
yihui | 0:86aa62fedb9b | 2247 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2248 | |
yihui | 0:86aa62fedb9b | 2249 | /* {{{ MP_STR (fixed) */ |
yihui | 0:86aa62fedb9b | 2250 | /* 0xa0 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2251 | /* 0xa1 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2252 | /* 0xa2 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2253 | /* 0xa3 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2254 | /* 0xa4 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2255 | /* 0xa5 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2256 | /* 0xa6 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2257 | /* 0xa7 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2258 | /* 0xa8 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2259 | /* 0xa9 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2260 | /* 0xaa */ MP_STR, |
yihui | 0:86aa62fedb9b | 2261 | /* 0xab */ MP_STR, |
yihui | 0:86aa62fedb9b | 2262 | /* 0xac */ MP_STR, |
yihui | 0:86aa62fedb9b | 2263 | /* 0xad */ MP_STR, |
yihui | 0:86aa62fedb9b | 2264 | /* 0xae */ MP_STR, |
yihui | 0:86aa62fedb9b | 2265 | /* 0xaf */ MP_STR, |
yihui | 0:86aa62fedb9b | 2266 | /* 0xb0 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2267 | /* 0xb1 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2268 | /* 0xb2 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2269 | /* 0xb3 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2270 | /* 0xb4 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2271 | /* 0xb5 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2272 | /* 0xb6 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2273 | /* 0xb7 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2274 | /* 0xb8 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2275 | /* 0xb9 */ MP_STR, |
yihui | 0:86aa62fedb9b | 2276 | /* 0xba */ MP_STR, |
yihui | 0:86aa62fedb9b | 2277 | /* 0xbb */ MP_STR, |
yihui | 0:86aa62fedb9b | 2278 | /* 0xbc */ MP_STR, |
yihui | 0:86aa62fedb9b | 2279 | /* 0xbd */ MP_STR, |
yihui | 0:86aa62fedb9b | 2280 | /* 0xbe */ MP_STR, |
yihui | 0:86aa62fedb9b | 2281 | /* 0xbf */ MP_STR, |
yihui | 0:86aa62fedb9b | 2282 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2283 | |
yihui | 0:86aa62fedb9b | 2284 | /* {{{ MP_NIL, MP_BOOL */ |
yihui | 0:86aa62fedb9b | 2285 | /* 0xc0 */ MP_NIL, |
yihui | 0:86aa62fedb9b | 2286 | /* 0xc1 */ MP_EXT, /* never used */ |
yihui | 0:86aa62fedb9b | 2287 | /* 0xc2 */ MP_BOOL, |
yihui | 0:86aa62fedb9b | 2288 | /* 0xc3 */ MP_BOOL, |
yihui | 0:86aa62fedb9b | 2289 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2290 | |
yihui | 0:86aa62fedb9b | 2291 | /* {{{ MP_BIN */ |
yihui | 0:86aa62fedb9b | 2292 | /* 0xc4 */ MP_BIN, /* MP_BIN(8) */ |
yihui | 0:86aa62fedb9b | 2293 | /* 0xc5 */ MP_BIN, /* MP_BIN(16) */ |
yihui | 0:86aa62fedb9b | 2294 | /* 0xc6 */ MP_BIN, /* MP_BIN(32) */ |
yihui | 0:86aa62fedb9b | 2295 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2296 | |
yihui | 0:86aa62fedb9b | 2297 | /* {{{ MP_EXT */ |
yihui | 0:86aa62fedb9b | 2298 | /* 0xc7 */ MP_EXT, |
yihui | 0:86aa62fedb9b | 2299 | /* 0xc8 */ MP_EXT, |
yihui | 0:86aa62fedb9b | 2300 | /* 0xc9 */ MP_EXT, |
yihui | 0:86aa62fedb9b | 2301 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2302 | |
yihui | 0:86aa62fedb9b | 2303 | /* {{{ MP_FLOAT, MP_DOUBLE */ |
yihui | 0:86aa62fedb9b | 2304 | /* 0xca */ MP_FLOAT, |
yihui | 0:86aa62fedb9b | 2305 | /* 0xcb */ MP_DOUBLE, |
yihui | 0:86aa62fedb9b | 2306 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2307 | |
yihui | 0:86aa62fedb9b | 2308 | /* {{{ MP_UINT */ |
yihui | 0:86aa62fedb9b | 2309 | /* 0xcc */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2310 | /* 0xcd */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2311 | /* 0xce */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2312 | /* 0xcf */ MP_UINT, |
yihui | 0:86aa62fedb9b | 2313 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2314 | |
yihui | 0:86aa62fedb9b | 2315 | /* {{{ MP_INT */ |
yihui | 0:86aa62fedb9b | 2316 | /* 0xd0 */ MP_INT, /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2317 | /* 0xd1 */ MP_INT, /* MP_INT (16) */ |
yihui | 0:86aa62fedb9b | 2318 | /* 0xd2 */ MP_INT, /* MP_INT (32) */ |
yihui | 0:86aa62fedb9b | 2319 | /* 0xd3 */ MP_INT, /* MP_INT (64) */ |
yihui | 0:86aa62fedb9b | 2320 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2321 | |
yihui | 0:86aa62fedb9b | 2322 | /* {{{ MP_EXT */ |
yihui | 0:86aa62fedb9b | 2323 | /* 0xd4 */ MP_EXT, /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2324 | /* 0xd5 */ MP_EXT, /* MP_INT (16) */ |
yihui | 0:86aa62fedb9b | 2325 | /* 0xd6 */ MP_EXT, /* MP_INT (32) */ |
yihui | 0:86aa62fedb9b | 2326 | /* 0xd7 */ MP_EXT, /* MP_INT (64) */ |
yihui | 0:86aa62fedb9b | 2327 | /* 0xd8 */ MP_EXT, /* MP_INT (127) */ |
yihui | 0:86aa62fedb9b | 2328 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2329 | |
yihui | 0:86aa62fedb9b | 2330 | /* {{{ MP_STR */ |
yihui | 0:86aa62fedb9b | 2331 | /* 0xd9 */ MP_STR, /* MP_STR(8) */ |
yihui | 0:86aa62fedb9b | 2332 | /* 0xda */ MP_STR, /* MP_STR(16) */ |
yihui | 0:86aa62fedb9b | 2333 | /* 0xdb */ MP_STR, /* MP_STR(32) */ |
yihui | 0:86aa62fedb9b | 2334 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2335 | |
yihui | 0:86aa62fedb9b | 2336 | /* {{{ MP_ARRAY */ |
yihui | 0:86aa62fedb9b | 2337 | /* 0xdc */ MP_ARRAY, /* MP_ARRAY(16) */ |
yihui | 0:86aa62fedb9b | 2338 | /* 0xdd */ MP_ARRAY, /* MP_ARRAY(32) */ |
yihui | 0:86aa62fedb9b | 2339 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2340 | |
yihui | 0:86aa62fedb9b | 2341 | /* {{{ MP_MAP */ |
yihui | 0:86aa62fedb9b | 2342 | /* 0xde */ MP_MAP, /* MP_MAP (16) */ |
yihui | 0:86aa62fedb9b | 2343 | /* 0xdf */ MP_MAP, /* MP_MAP (32) */ |
yihui | 0:86aa62fedb9b | 2344 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2345 | |
yihui | 0:86aa62fedb9b | 2346 | /* {{{ MP_INT */ |
yihui | 0:86aa62fedb9b | 2347 | /* 0xe0 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2348 | /* 0xe1 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2349 | /* 0xe2 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2350 | /* 0xe3 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2351 | /* 0xe4 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2352 | /* 0xe5 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2353 | /* 0xe6 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2354 | /* 0xe7 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2355 | /* 0xe8 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2356 | /* 0xe9 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2357 | /* 0xea */ MP_INT, |
yihui | 0:86aa62fedb9b | 2358 | /* 0xeb */ MP_INT, |
yihui | 0:86aa62fedb9b | 2359 | /* 0xec */ MP_INT, |
yihui | 0:86aa62fedb9b | 2360 | /* 0xed */ MP_INT, |
yihui | 0:86aa62fedb9b | 2361 | /* 0xee */ MP_INT, |
yihui | 0:86aa62fedb9b | 2362 | /* 0xef */ MP_INT, |
yihui | 0:86aa62fedb9b | 2363 | /* 0xf0 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2364 | /* 0xf1 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2365 | /* 0xf2 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2366 | /* 0xf3 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2367 | /* 0xf4 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2368 | /* 0xf5 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2369 | /* 0xf6 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2370 | /* 0xf7 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2371 | /* 0xf8 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2372 | /* 0xf9 */ MP_INT, |
yihui | 0:86aa62fedb9b | 2373 | /* 0xfa */ MP_INT, |
yihui | 0:86aa62fedb9b | 2374 | /* 0xfb */ MP_INT, |
yihui | 0:86aa62fedb9b | 2375 | /* 0xfc */ MP_INT, |
yihui | 0:86aa62fedb9b | 2376 | /* 0xfd */ MP_INT, |
yihui | 0:86aa62fedb9b | 2377 | /* 0xfe */ MP_INT, |
yihui | 0:86aa62fedb9b | 2378 | /* 0xff */ MP_INT |
yihui | 0:86aa62fedb9b | 2379 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2380 | }; |
yihui | 0:86aa62fedb9b | 2381 | |
yihui | 0:86aa62fedb9b | 2382 | /** |
yihui | 0:86aa62fedb9b | 2383 | * This lookup table used by mp_next() and mp_check() to determine |
yihui | 0:86aa62fedb9b | 2384 | * size of MsgPack element by its first byte. |
yihui | 0:86aa62fedb9b | 2385 | * A positive value contains size of the element (excluding the first byte). |
yihui | 0:86aa62fedb9b | 2386 | * A negative value means the element is compound (e.g. array or map) |
yihui | 0:86aa62fedb9b | 2387 | * of size (-n). |
yihui | 0:86aa62fedb9b | 2388 | * MP_HINT_* values used for special cases handled by switch() statement. |
yihui | 0:86aa62fedb9b | 2389 | */ |
yihui | 0:86aa62fedb9b | 2390 | const int8_t mp_parser_hint[256] = { |
yihui | 0:86aa62fedb9b | 2391 | /* {{{ MP_UINT(fixed) **/ |
yihui | 0:86aa62fedb9b | 2392 | /* 0x00 */ 0, |
yihui | 0:86aa62fedb9b | 2393 | /* 0x01 */ 0, |
yihui | 0:86aa62fedb9b | 2394 | /* 0x02 */ 0, |
yihui | 0:86aa62fedb9b | 2395 | /* 0x03 */ 0, |
yihui | 0:86aa62fedb9b | 2396 | /* 0x04 */ 0, |
yihui | 0:86aa62fedb9b | 2397 | /* 0x05 */ 0, |
yihui | 0:86aa62fedb9b | 2398 | /* 0x06 */ 0, |
yihui | 0:86aa62fedb9b | 2399 | /* 0x07 */ 0, |
yihui | 0:86aa62fedb9b | 2400 | /* 0x08 */ 0, |
yihui | 0:86aa62fedb9b | 2401 | /* 0x09 */ 0, |
yihui | 0:86aa62fedb9b | 2402 | /* 0x0a */ 0, |
yihui | 0:86aa62fedb9b | 2403 | /* 0x0b */ 0, |
yihui | 0:86aa62fedb9b | 2404 | /* 0x0c */ 0, |
yihui | 0:86aa62fedb9b | 2405 | /* 0x0d */ 0, |
yihui | 0:86aa62fedb9b | 2406 | /* 0x0e */ 0, |
yihui | 0:86aa62fedb9b | 2407 | /* 0x0f */ 0, |
yihui | 0:86aa62fedb9b | 2408 | /* 0x10 */ 0, |
yihui | 0:86aa62fedb9b | 2409 | /* 0x11 */ 0, |
yihui | 0:86aa62fedb9b | 2410 | /* 0x12 */ 0, |
yihui | 0:86aa62fedb9b | 2411 | /* 0x13 */ 0, |
yihui | 0:86aa62fedb9b | 2412 | /* 0x14 */ 0, |
yihui | 0:86aa62fedb9b | 2413 | /* 0x15 */ 0, |
yihui | 0:86aa62fedb9b | 2414 | /* 0x16 */ 0, |
yihui | 0:86aa62fedb9b | 2415 | /* 0x17 */ 0, |
yihui | 0:86aa62fedb9b | 2416 | /* 0x18 */ 0, |
yihui | 0:86aa62fedb9b | 2417 | /* 0x19 */ 0, |
yihui | 0:86aa62fedb9b | 2418 | /* 0x1a */ 0, |
yihui | 0:86aa62fedb9b | 2419 | /* 0x1b */ 0, |
yihui | 0:86aa62fedb9b | 2420 | /* 0x1c */ 0, |
yihui | 0:86aa62fedb9b | 2421 | /* 0x1d */ 0, |
yihui | 0:86aa62fedb9b | 2422 | /* 0x1e */ 0, |
yihui | 0:86aa62fedb9b | 2423 | /* 0x1f */ 0, |
yihui | 0:86aa62fedb9b | 2424 | /* 0x20 */ 0, |
yihui | 0:86aa62fedb9b | 2425 | /* 0x21 */ 0, |
yihui | 0:86aa62fedb9b | 2426 | /* 0x22 */ 0, |
yihui | 0:86aa62fedb9b | 2427 | /* 0x23 */ 0, |
yihui | 0:86aa62fedb9b | 2428 | /* 0x24 */ 0, |
yihui | 0:86aa62fedb9b | 2429 | /* 0x25 */ 0, |
yihui | 0:86aa62fedb9b | 2430 | /* 0x26 */ 0, |
yihui | 0:86aa62fedb9b | 2431 | /* 0x27 */ 0, |
yihui | 0:86aa62fedb9b | 2432 | /* 0x28 */ 0, |
yihui | 0:86aa62fedb9b | 2433 | /* 0x29 */ 0, |
yihui | 0:86aa62fedb9b | 2434 | /* 0x2a */ 0, |
yihui | 0:86aa62fedb9b | 2435 | /* 0x2b */ 0, |
yihui | 0:86aa62fedb9b | 2436 | /* 0x2c */ 0, |
yihui | 0:86aa62fedb9b | 2437 | /* 0x2d */ 0, |
yihui | 0:86aa62fedb9b | 2438 | /* 0x2e */ 0, |
yihui | 0:86aa62fedb9b | 2439 | /* 0x2f */ 0, |
yihui | 0:86aa62fedb9b | 2440 | /* 0x30 */ 0, |
yihui | 0:86aa62fedb9b | 2441 | /* 0x31 */ 0, |
yihui | 0:86aa62fedb9b | 2442 | /* 0x32 */ 0, |
yihui | 0:86aa62fedb9b | 2443 | /* 0x33 */ 0, |
yihui | 0:86aa62fedb9b | 2444 | /* 0x34 */ 0, |
yihui | 0:86aa62fedb9b | 2445 | /* 0x35 */ 0, |
yihui | 0:86aa62fedb9b | 2446 | /* 0x36 */ 0, |
yihui | 0:86aa62fedb9b | 2447 | /* 0x37 */ 0, |
yihui | 0:86aa62fedb9b | 2448 | /* 0x38 */ 0, |
yihui | 0:86aa62fedb9b | 2449 | /* 0x39 */ 0, |
yihui | 0:86aa62fedb9b | 2450 | /* 0x3a */ 0, |
yihui | 0:86aa62fedb9b | 2451 | /* 0x3b */ 0, |
yihui | 0:86aa62fedb9b | 2452 | /* 0x3c */ 0, |
yihui | 0:86aa62fedb9b | 2453 | /* 0x3d */ 0, |
yihui | 0:86aa62fedb9b | 2454 | /* 0x3e */ 0, |
yihui | 0:86aa62fedb9b | 2455 | /* 0x3f */ 0, |
yihui | 0:86aa62fedb9b | 2456 | /* 0x40 */ 0, |
yihui | 0:86aa62fedb9b | 2457 | /* 0x41 */ 0, |
yihui | 0:86aa62fedb9b | 2458 | /* 0x42 */ 0, |
yihui | 0:86aa62fedb9b | 2459 | /* 0x43 */ 0, |
yihui | 0:86aa62fedb9b | 2460 | /* 0x44 */ 0, |
yihui | 0:86aa62fedb9b | 2461 | /* 0x45 */ 0, |
yihui | 0:86aa62fedb9b | 2462 | /* 0x46 */ 0, |
yihui | 0:86aa62fedb9b | 2463 | /* 0x47 */ 0, |
yihui | 0:86aa62fedb9b | 2464 | /* 0x48 */ 0, |
yihui | 0:86aa62fedb9b | 2465 | /* 0x49 */ 0, |
yihui | 0:86aa62fedb9b | 2466 | /* 0x4a */ 0, |
yihui | 0:86aa62fedb9b | 2467 | /* 0x4b */ 0, |
yihui | 0:86aa62fedb9b | 2468 | /* 0x4c */ 0, |
yihui | 0:86aa62fedb9b | 2469 | /* 0x4d */ 0, |
yihui | 0:86aa62fedb9b | 2470 | /* 0x4e */ 0, |
yihui | 0:86aa62fedb9b | 2471 | /* 0x4f */ 0, |
yihui | 0:86aa62fedb9b | 2472 | /* 0x50 */ 0, |
yihui | 0:86aa62fedb9b | 2473 | /* 0x51 */ 0, |
yihui | 0:86aa62fedb9b | 2474 | /* 0x52 */ 0, |
yihui | 0:86aa62fedb9b | 2475 | /* 0x53 */ 0, |
yihui | 0:86aa62fedb9b | 2476 | /* 0x54 */ 0, |
yihui | 0:86aa62fedb9b | 2477 | /* 0x55 */ 0, |
yihui | 0:86aa62fedb9b | 2478 | /* 0x56 */ 0, |
yihui | 0:86aa62fedb9b | 2479 | /* 0x57 */ 0, |
yihui | 0:86aa62fedb9b | 2480 | /* 0x58 */ 0, |
yihui | 0:86aa62fedb9b | 2481 | /* 0x59 */ 0, |
yihui | 0:86aa62fedb9b | 2482 | /* 0x5a */ 0, |
yihui | 0:86aa62fedb9b | 2483 | /* 0x5b */ 0, |
yihui | 0:86aa62fedb9b | 2484 | /* 0x5c */ 0, |
yihui | 0:86aa62fedb9b | 2485 | /* 0x5d */ 0, |
yihui | 0:86aa62fedb9b | 2486 | /* 0x5e */ 0, |
yihui | 0:86aa62fedb9b | 2487 | /* 0x5f */ 0, |
yihui | 0:86aa62fedb9b | 2488 | /* 0x60 */ 0, |
yihui | 0:86aa62fedb9b | 2489 | /* 0x61 */ 0, |
yihui | 0:86aa62fedb9b | 2490 | /* 0x62 */ 0, |
yihui | 0:86aa62fedb9b | 2491 | /* 0x63 */ 0, |
yihui | 0:86aa62fedb9b | 2492 | /* 0x64 */ 0, |
yihui | 0:86aa62fedb9b | 2493 | /* 0x65 */ 0, |
yihui | 0:86aa62fedb9b | 2494 | /* 0x66 */ 0, |
yihui | 0:86aa62fedb9b | 2495 | /* 0x67 */ 0, |
yihui | 0:86aa62fedb9b | 2496 | /* 0x68 */ 0, |
yihui | 0:86aa62fedb9b | 2497 | /* 0x69 */ 0, |
yihui | 0:86aa62fedb9b | 2498 | /* 0x6a */ 0, |
yihui | 0:86aa62fedb9b | 2499 | /* 0x6b */ 0, |
yihui | 0:86aa62fedb9b | 2500 | /* 0x6c */ 0, |
yihui | 0:86aa62fedb9b | 2501 | /* 0x6d */ 0, |
yihui | 0:86aa62fedb9b | 2502 | /* 0x6e */ 0, |
yihui | 0:86aa62fedb9b | 2503 | /* 0x6f */ 0, |
yihui | 0:86aa62fedb9b | 2504 | /* 0x70 */ 0, |
yihui | 0:86aa62fedb9b | 2505 | /* 0x71 */ 0, |
yihui | 0:86aa62fedb9b | 2506 | /* 0x72 */ 0, |
yihui | 0:86aa62fedb9b | 2507 | /* 0x73 */ 0, |
yihui | 0:86aa62fedb9b | 2508 | /* 0x74 */ 0, |
yihui | 0:86aa62fedb9b | 2509 | /* 0x75 */ 0, |
yihui | 0:86aa62fedb9b | 2510 | /* 0x76 */ 0, |
yihui | 0:86aa62fedb9b | 2511 | /* 0x77 */ 0, |
yihui | 0:86aa62fedb9b | 2512 | /* 0x78 */ 0, |
yihui | 0:86aa62fedb9b | 2513 | /* 0x79 */ 0, |
yihui | 0:86aa62fedb9b | 2514 | /* 0x7a */ 0, |
yihui | 0:86aa62fedb9b | 2515 | /* 0x7b */ 0, |
yihui | 0:86aa62fedb9b | 2516 | /* 0x7c */ 0, |
yihui | 0:86aa62fedb9b | 2517 | /* 0x7d */ 0, |
yihui | 0:86aa62fedb9b | 2518 | /* 0x7e */ 0, |
yihui | 0:86aa62fedb9b | 2519 | /* 0x7f */ 0, |
yihui | 0:86aa62fedb9b | 2520 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2521 | |
yihui | 0:86aa62fedb9b | 2522 | /* {{{ MP_MAP (fixed) */ |
yihui | 0:86aa62fedb9b | 2523 | /* 0x80 */ 0, /* empty map - just skip one byte */ |
yihui | 0:86aa62fedb9b | 2524 | /* 0x81 */ -2, /* 2 elements follow */ |
yihui | 0:86aa62fedb9b | 2525 | /* 0x82 */ -4, |
yihui | 0:86aa62fedb9b | 2526 | /* 0x83 */ -6, |
yihui | 0:86aa62fedb9b | 2527 | /* 0x84 */ -8, |
yihui | 0:86aa62fedb9b | 2528 | /* 0x85 */ -10, |
yihui | 0:86aa62fedb9b | 2529 | /* 0x86 */ -12, |
yihui | 0:86aa62fedb9b | 2530 | /* 0x87 */ -14, |
yihui | 0:86aa62fedb9b | 2531 | /* 0x88 */ -16, |
yihui | 0:86aa62fedb9b | 2532 | /* 0x89 */ -18, |
yihui | 0:86aa62fedb9b | 2533 | /* 0x8a */ -20, |
yihui | 0:86aa62fedb9b | 2534 | /* 0x8b */ -22, |
yihui | 0:86aa62fedb9b | 2535 | /* 0x8c */ -24, |
yihui | 0:86aa62fedb9b | 2536 | /* 0x8d */ -26, |
yihui | 0:86aa62fedb9b | 2537 | /* 0x8e */ -28, |
yihui | 0:86aa62fedb9b | 2538 | /* 0x8f */ -30, |
yihui | 0:86aa62fedb9b | 2539 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2540 | |
yihui | 0:86aa62fedb9b | 2541 | /* {{{ MP_ARRAY (fixed) */ |
yihui | 0:86aa62fedb9b | 2542 | /* 0x90 */ 0, /* empty array - just skip one byte */ |
yihui | 0:86aa62fedb9b | 2543 | /* 0x91 */ -1, /* 1 element follows */ |
yihui | 0:86aa62fedb9b | 2544 | /* 0x92 */ -2, |
yihui | 0:86aa62fedb9b | 2545 | /* 0x93 */ -3, |
yihui | 0:86aa62fedb9b | 2546 | /* 0x94 */ -4, |
yihui | 0:86aa62fedb9b | 2547 | /* 0x95 */ -5, |
yihui | 0:86aa62fedb9b | 2548 | /* 0x96 */ -6, |
yihui | 0:86aa62fedb9b | 2549 | /* 0x97 */ -7, |
yihui | 0:86aa62fedb9b | 2550 | /* 0x98 */ -8, |
yihui | 0:86aa62fedb9b | 2551 | /* 0x99 */ -9, |
yihui | 0:86aa62fedb9b | 2552 | /* 0x9a */ -10, |
yihui | 0:86aa62fedb9b | 2553 | /* 0x9b */ -11, |
yihui | 0:86aa62fedb9b | 2554 | /* 0x9c */ -12, |
yihui | 0:86aa62fedb9b | 2555 | /* 0x9d */ -13, |
yihui | 0:86aa62fedb9b | 2556 | /* 0x9e */ -14, |
yihui | 0:86aa62fedb9b | 2557 | /* 0x9f */ -15, |
yihui | 0:86aa62fedb9b | 2558 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2559 | |
yihui | 0:86aa62fedb9b | 2560 | /* {{{ MP_STR (fixed) */ |
yihui | 0:86aa62fedb9b | 2561 | /* 0xa0 */ 0, |
yihui | 0:86aa62fedb9b | 2562 | /* 0xa1 */ 1, |
yihui | 0:86aa62fedb9b | 2563 | /* 0xa2 */ 2, |
yihui | 0:86aa62fedb9b | 2564 | /* 0xa3 */ 3, |
yihui | 0:86aa62fedb9b | 2565 | /* 0xa4 */ 4, |
yihui | 0:86aa62fedb9b | 2566 | /* 0xa5 */ 5, |
yihui | 0:86aa62fedb9b | 2567 | /* 0xa6 */ 6, |
yihui | 0:86aa62fedb9b | 2568 | /* 0xa7 */ 7, |
yihui | 0:86aa62fedb9b | 2569 | /* 0xa8 */ 8, |
yihui | 0:86aa62fedb9b | 2570 | /* 0xa9 */ 9, |
yihui | 0:86aa62fedb9b | 2571 | /* 0xaa */ 10, |
yihui | 0:86aa62fedb9b | 2572 | /* 0xab */ 11, |
yihui | 0:86aa62fedb9b | 2573 | /* 0xac */ 12, |
yihui | 0:86aa62fedb9b | 2574 | /* 0xad */ 13, |
yihui | 0:86aa62fedb9b | 2575 | /* 0xae */ 14, |
yihui | 0:86aa62fedb9b | 2576 | /* 0xaf */ 15, |
yihui | 0:86aa62fedb9b | 2577 | /* 0xb0 */ 16, |
yihui | 0:86aa62fedb9b | 2578 | /* 0xb1 */ 17, |
yihui | 0:86aa62fedb9b | 2579 | /* 0xb2 */ 18, |
yihui | 0:86aa62fedb9b | 2580 | /* 0xb3 */ 19, |
yihui | 0:86aa62fedb9b | 2581 | /* 0xb4 */ 20, |
yihui | 0:86aa62fedb9b | 2582 | /* 0xb5 */ 21, |
yihui | 0:86aa62fedb9b | 2583 | /* 0xb6 */ 22, |
yihui | 0:86aa62fedb9b | 2584 | /* 0xb7 */ 23, |
yihui | 0:86aa62fedb9b | 2585 | /* 0xb8 */ 24, |
yihui | 0:86aa62fedb9b | 2586 | /* 0xb9 */ 25, |
yihui | 0:86aa62fedb9b | 2587 | /* 0xba */ 26, |
yihui | 0:86aa62fedb9b | 2588 | /* 0xbb */ 27, |
yihui | 0:86aa62fedb9b | 2589 | /* 0xbc */ 28, |
yihui | 0:86aa62fedb9b | 2590 | /* 0xbd */ 29, |
yihui | 0:86aa62fedb9b | 2591 | /* 0xbe */ 30, |
yihui | 0:86aa62fedb9b | 2592 | /* 0xbf */ 31, |
yihui | 0:86aa62fedb9b | 2593 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2594 | |
yihui | 0:86aa62fedb9b | 2595 | /* {{{ MP_NIL, MP_BOOL */ |
yihui | 0:86aa62fedb9b | 2596 | /* 0xc0 */ 0, /* MP_NIL */ |
yihui | 0:86aa62fedb9b | 2597 | /* 0xc1 */ 0, /* never used */ |
yihui | 0:86aa62fedb9b | 2598 | /* 0xc2 */ 0, /* MP_BOOL*/ |
yihui | 0:86aa62fedb9b | 2599 | /* 0xc3 */ 0, /* MP_BOOL*/ |
yihui | 0:86aa62fedb9b | 2600 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2601 | |
yihui | 0:86aa62fedb9b | 2602 | /* {{{ MP_BIN */ |
yihui | 0:86aa62fedb9b | 2603 | /* 0xc4 */ MP_HINT_STR_8, /* MP_BIN (8) */ |
yihui | 0:86aa62fedb9b | 2604 | /* 0xc5 */ MP_HINT_STR_16, /* MP_BIN (16) */ |
yihui | 0:86aa62fedb9b | 2605 | /* 0xc6 */ MP_HINT_STR_32, /* MP_BIN (32) */ |
yihui | 0:86aa62fedb9b | 2606 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2607 | |
yihui | 0:86aa62fedb9b | 2608 | /* {{{ MP_EXT */ |
yihui | 0:86aa62fedb9b | 2609 | /* 0xc7 */ MP_HINT_EXT_8, /* MP_EXT (8) */ |
yihui | 0:86aa62fedb9b | 2610 | /* 0xc8 */ MP_HINT_EXT_16, /* MP_EXT (16) */ |
yihui | 0:86aa62fedb9b | 2611 | /* 0xc9 */ MP_HINT_EXT_32, /* MP_EXT (32) */ |
yihui | 0:86aa62fedb9b | 2612 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2613 | |
yihui | 0:86aa62fedb9b | 2614 | /* {{{ MP_FLOAT, MP_DOUBLE */ |
yihui | 0:86aa62fedb9b | 2615 | /* 0xca */ sizeof(float), /* MP_FLOAT */ |
yihui | 0:86aa62fedb9b | 2616 | /* 0xcb */ sizeof(double), /* MP_DOUBLE */ |
yihui | 0:86aa62fedb9b | 2617 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2618 | |
yihui | 0:86aa62fedb9b | 2619 | /* {{{ MP_UINT */ |
yihui | 0:86aa62fedb9b | 2620 | /* 0xcc */ sizeof(uint8_t), /* MP_UINT (8) */ |
yihui | 0:86aa62fedb9b | 2621 | /* 0xcd */ sizeof(uint16_t), /* MP_UINT (16) */ |
yihui | 0:86aa62fedb9b | 2622 | /* 0xce */ sizeof(uint32_t), /* MP_UINT (32) */ |
yihui | 0:86aa62fedb9b | 2623 | /* 0xcf */ sizeof(uint64_t), /* MP_UINT (64) */ |
yihui | 0:86aa62fedb9b | 2624 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2625 | |
yihui | 0:86aa62fedb9b | 2626 | /* {{{ MP_INT */ |
yihui | 0:86aa62fedb9b | 2627 | /* 0xd0 */ sizeof(uint8_t), /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2628 | /* 0xd1 */ sizeof(uint16_t), /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2629 | /* 0xd2 */ sizeof(uint32_t), /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2630 | /* 0xd3 */ sizeof(uint64_t), /* MP_INT (8) */ |
yihui | 0:86aa62fedb9b | 2631 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2632 | |
yihui | 0:86aa62fedb9b | 2633 | /* {{{ MP_EXT (fixext) */ |
yihui | 0:86aa62fedb9b | 2634 | /* 0xd4 */ 2, /* MP_EXT (fixext 8) */ |
yihui | 0:86aa62fedb9b | 2635 | /* 0xd5 */ 3, /* MP_EXT (fixext 16) */ |
yihui | 0:86aa62fedb9b | 2636 | /* 0xd6 */ 5, /* MP_EXT (fixext 32) */ |
yihui | 0:86aa62fedb9b | 2637 | /* 0xd7 */ 9, /* MP_EXT (fixext 64) */ |
yihui | 0:86aa62fedb9b | 2638 | /* 0xd8 */ 17, /* MP_EXT (fixext 128) */ |
yihui | 0:86aa62fedb9b | 2639 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2640 | |
yihui | 0:86aa62fedb9b | 2641 | /* {{{ MP_STR */ |
yihui | 0:86aa62fedb9b | 2642 | /* 0xd9 */ MP_HINT_STR_8, /* MP_STR (8) */ |
yihui | 0:86aa62fedb9b | 2643 | /* 0xda */ MP_HINT_STR_16, /* MP_STR (16) */ |
yihui | 0:86aa62fedb9b | 2644 | /* 0xdb */ MP_HINT_STR_32, /* MP_STR (32) */ |
yihui | 0:86aa62fedb9b | 2645 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2646 | |
yihui | 0:86aa62fedb9b | 2647 | /* {{{ MP_ARRAY */ |
yihui | 0:86aa62fedb9b | 2648 | /* 0xdc */ MP_HINT_ARRAY_16, /* MP_ARRAY (16) */ |
yihui | 0:86aa62fedb9b | 2649 | /* 0xdd */ MP_HINT_ARRAY_32, /* MP_ARRAY (32) */ |
yihui | 0:86aa62fedb9b | 2650 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2651 | |
yihui | 0:86aa62fedb9b | 2652 | /* {{{ MP_MAP */ |
yihui | 0:86aa62fedb9b | 2653 | /* 0xde */ MP_HINT_MAP_16, /* MP_MAP (16) */ |
yihui | 0:86aa62fedb9b | 2654 | /* 0xdf */ MP_HINT_MAP_32, /* MP_MAP (32) */ |
yihui | 0:86aa62fedb9b | 2655 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2656 | |
yihui | 0:86aa62fedb9b | 2657 | /* {{{ MP_INT (fixed) */ |
yihui | 0:86aa62fedb9b | 2658 | /* 0xe0 */ 0, |
yihui | 0:86aa62fedb9b | 2659 | /* 0xe1 */ 0, |
yihui | 0:86aa62fedb9b | 2660 | /* 0xe2 */ 0, |
yihui | 0:86aa62fedb9b | 2661 | /* 0xe3 */ 0, |
yihui | 0:86aa62fedb9b | 2662 | /* 0xe4 */ 0, |
yihui | 0:86aa62fedb9b | 2663 | /* 0xe5 */ 0, |
yihui | 0:86aa62fedb9b | 2664 | /* 0xe6 */ 0, |
yihui | 0:86aa62fedb9b | 2665 | /* 0xe7 */ 0, |
yihui | 0:86aa62fedb9b | 2666 | /* 0xe8 */ 0, |
yihui | 0:86aa62fedb9b | 2667 | /* 0xe9 */ 0, |
yihui | 0:86aa62fedb9b | 2668 | /* 0xea */ 0, |
yihui | 0:86aa62fedb9b | 2669 | /* 0xeb */ 0, |
yihui | 0:86aa62fedb9b | 2670 | /* 0xec */ 0, |
yihui | 0:86aa62fedb9b | 2671 | /* 0xed */ 0, |
yihui | 0:86aa62fedb9b | 2672 | /* 0xee */ 0, |
yihui | 0:86aa62fedb9b | 2673 | /* 0xef */ 0, |
yihui | 0:86aa62fedb9b | 2674 | /* 0xf0 */ 0, |
yihui | 0:86aa62fedb9b | 2675 | /* 0xf1 */ 0, |
yihui | 0:86aa62fedb9b | 2676 | /* 0xf2 */ 0, |
yihui | 0:86aa62fedb9b | 2677 | /* 0xf3 */ 0, |
yihui | 0:86aa62fedb9b | 2678 | /* 0xf4 */ 0, |
yihui | 0:86aa62fedb9b | 2679 | /* 0xf5 */ 0, |
yihui | 0:86aa62fedb9b | 2680 | /* 0xf6 */ 0, |
yihui | 0:86aa62fedb9b | 2681 | /* 0xf7 */ 0, |
yihui | 0:86aa62fedb9b | 2682 | /* 0xf8 */ 0, |
yihui | 0:86aa62fedb9b | 2683 | /* 0xf9 */ 0, |
yihui | 0:86aa62fedb9b | 2684 | /* 0xfa */ 0, |
yihui | 0:86aa62fedb9b | 2685 | /* 0xfb */ 0, |
yihui | 0:86aa62fedb9b | 2686 | /* 0xfc */ 0, |
yihui | 0:86aa62fedb9b | 2687 | /* 0xfd */ 0, |
yihui | 0:86aa62fedb9b | 2688 | /* 0xfe */ 0, |
yihui | 0:86aa62fedb9b | 2689 | /* 0xff */ 0 |
yihui | 0:86aa62fedb9b | 2690 | /* }}} */ |
yihui | 0:86aa62fedb9b | 2691 | }; |
yihui | 0:86aa62fedb9b | 2692 | |
yihui | 0:86aa62fedb9b | 2693 | #endif /* defined(MP_SOURCE) */ |
yihui | 0:86aa62fedb9b | 2694 | |
yihui | 0:86aa62fedb9b | 2695 | /** \endcond */ |
yihui | 0:86aa62fedb9b | 2696 | |
yihui | 0:86aa62fedb9b | 2697 | /* |
yihui | 0:86aa62fedb9b | 2698 | * }}} |
yihui | 0:86aa62fedb9b | 2699 | */ |
yihui | 0:86aa62fedb9b | 2700 | |
yihui | 0:86aa62fedb9b | 2701 | #if defined(__cplusplus) |
yihui | 0:86aa62fedb9b | 2702 | } /* extern "C" */ |
yihui | 0:86aa62fedb9b | 2703 | #endif /* defined(__cplusplus) */ |
yihui | 0:86aa62fedb9b | 2704 | |
yihui | 0:86aa62fedb9b | 2705 | #undef MP_LOAD_STORE |
yihui | 0:86aa62fedb9b | 2706 | #undef MP_SOURCE |
yihui | 0:86aa62fedb9b | 2707 | #undef MP_PROTO |
yihui | 0:86aa62fedb9b | 2708 | #undef MP_IMPL |
yihui | 0:86aa62fedb9b | 2709 | #undef MP_ALWAYSINLINE |
yihui | 0:86aa62fedb9b | 2710 | #undef MP_GCC_VERSION |
yihui | 0:86aa62fedb9b | 2711 | |
yihui | 0:86aa62fedb9b | 2712 | #endif /* MSGPUCK_H_INCLUDED */ |