A simple and efficient MsgPack binary serialization library in a self-contained header file from https://github.com/rtsisyk/msgpuck

Dependents:   msgpuck_example

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?

UserRevisionLine numberNew 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 */