You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ucl_msgpack.c 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626
  1. /*
  2. * Copyright (c) 2015, Vsevolod Stakhov
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY AUTHOR ''AS IS'' AND ANY
  14. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  15. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  16. * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
  17. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  18. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  19. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  20. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  21. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  22. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  23. */
  24. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif
  27. #include "ucl.h"
  28. #include "ucl_internal.h"
  29. #ifdef HAVE_ENDIAN_H
  30. #include <endian.h>
  31. #elif defined(HAVE_SYS_ENDIAN_H)
  32. #include <sys/endian.h>
  33. #elif defined(HAVE_MACHINE_ENDIAN_H)
  34. #include <machine/endian.h>
  35. #endif
  36. #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
  37. #if __BYTE_ORDER == __LITTLE_ENDIAN
  38. #define __LITTLE_ENDIAN__
  39. #elif __BYTE_ORDER == __BIG_ENDIAN
  40. #define __BIG_ENDIAN__
  41. #elif _WIN32
  42. #define __LITTLE_ENDIAN__
  43. #endif
  44. #endif
  45. #define SWAP_LE_BE16(val) ((uint16_t) ( \
  46. (uint16_t) ((uint16_t) (val) >> 8) | \
  47. (uint16_t) ((uint16_t) (val) << 8)))
  48. #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3)
  49. # define SWAP_LE_BE32(val) ((uint32_t)__builtin_bswap32 ((uint32_t)(val)))
  50. # define SWAP_LE_BE64(val) ((uint64_t)__builtin_bswap64 ((uint64_t)(val)))
  51. #else
  52. #define SWAP_LE_BE32(val) ((uint32_t)( \
  53. (((uint32_t)(val) & (uint32_t)0x000000ffU) << 24) | \
  54. (((uint32_t)(val) & (uint32_t)0x0000ff00U) << 8) | \
  55. (((uint32_t)(val) & (uint32_t)0x00ff0000U) >> 8) | \
  56. (((uint32_t)(val) & (uint32_t)0xff000000U) >> 24)))
  57. #define SWAP_LE_BE64(val) ((uint64_t)( \
  58. (((uint64_t)(val) & \
  59. (uint64_t)(0x00000000000000ffULL)) << 56) | \
  60. (((uint64_t)(val) & \
  61. (uint64_t)(0x000000000000ff00ULL)) << 40) | \
  62. (((uint64_t)(val) & \
  63. (uint64_t)(0x0000000000ff0000ULL)) << 24) | \
  64. (((uint64_t)(val) & \
  65. (uint64_t) (0x00000000ff000000ULL)) << 8) | \
  66. (((uint64_t)(val) & \
  67. (uint64_t)(0x000000ff00000000ULL)) >> 8) | \
  68. (((uint64_t)(val) & \
  69. (uint64_t)(0x0000ff0000000000ULL)) >> 24) | \
  70. (((uint64_t)(val) & \
  71. (uint64_t)(0x00ff000000000000ULL)) >> 40) | \
  72. (((uint64_t)(val) & \
  73. (uint64_t)(0xff00000000000000ULL)) >> 56)))
  74. #endif
  75. #ifdef __LITTLE_ENDIAN__
  76. #define TO_BE16 SWAP_LE_BE16
  77. #define TO_BE32 SWAP_LE_BE32
  78. #define TO_BE64 SWAP_LE_BE64
  79. #define FROM_BE16 SWAP_LE_BE16
  80. #define FROM_BE32 SWAP_LE_BE32
  81. #define FROM_BE64 SWAP_LE_BE64
  82. #else
  83. #define TO_BE16(val) (uint16_t)(val)
  84. #define TO_BE32(val) (uint32_t)(val)
  85. #define TO_BE64(val) (uint64_t)(val)
  86. #define FROM_BE16(val) (uint16_t)(val)
  87. #define FROM_BE32(val) (uint32_t)(val)
  88. #define FROM_BE64(val) (uint64_t)(val)
  89. #endif
  90. void
  91. ucl_emitter_print_int_msgpack (struct ucl_emitter_context *ctx, int64_t val)
  92. {
  93. const struct ucl_emitter_functions *func = ctx->func;
  94. unsigned char buf[sizeof(uint64_t) + 1];
  95. const unsigned char mask_positive = 0x7f, mask_negative = 0xe0,
  96. uint8_ch = 0xcc, uint16_ch = 0xcd, uint32_ch = 0xce, uint64_ch = 0xcf,
  97. int8_ch = 0xd0, int16_ch = 0xd1, int32_ch = 0xd2, int64_ch = 0xd3;
  98. unsigned len;
  99. if (val >= 0) {
  100. if (val <= 0x7f) {
  101. /* Fixed num 7 bits */
  102. len = 1;
  103. buf[0] = mask_positive & val;
  104. }
  105. else if (val <= UINT8_MAX) {
  106. len = 2;
  107. buf[0] = uint8_ch;
  108. buf[1] = val & 0xff;
  109. }
  110. else if (val <= UINT16_MAX) {
  111. uint16_t v = TO_BE16 (val);
  112. len = 3;
  113. buf[0] = uint16_ch;
  114. memcpy (&buf[1], &v, sizeof (v));
  115. }
  116. else if (val <= UINT32_MAX) {
  117. uint32_t v = TO_BE32 (val);
  118. len = 5;
  119. buf[0] = uint32_ch;
  120. memcpy (&buf[1], &v, sizeof (v));
  121. }
  122. else {
  123. uint64_t v = TO_BE64 (val);
  124. len = 9;
  125. buf[0] = uint64_ch;
  126. memcpy (&buf[1], &v, sizeof (v));
  127. }
  128. }
  129. else {
  130. uint64_t uval;
  131. /* Bithack abs */
  132. uval = ((val ^ (val >> 63)) - (val >> 63));
  133. if (val > -(1 << 5)) {
  134. len = 1;
  135. buf[0] = (mask_negative | uval) & 0xff;
  136. }
  137. else if (uval <= INT8_MAX) {
  138. uint8_t v = (uint8_t)val;
  139. len = 2;
  140. buf[0] = int8_ch;
  141. buf[1] = v;
  142. }
  143. else if (uval <= INT16_MAX) {
  144. uint16_t v = TO_BE16 (val);
  145. len = 3;
  146. buf[0] = int16_ch;
  147. memcpy (&buf[1], &v, sizeof (v));
  148. }
  149. else if (uval <= INT32_MAX) {
  150. uint32_t v = TO_BE32 (val);
  151. len = 5;
  152. buf[0] = int32_ch;
  153. memcpy (&buf[1], &v, sizeof (v));
  154. }
  155. else {
  156. uint64_t v = TO_BE64 (val);
  157. len = 9;
  158. buf[0] = int64_ch;
  159. memcpy (&buf[1], &v, sizeof (v));
  160. }
  161. }
  162. func->ucl_emitter_append_len (buf, len, func->ud);
  163. }
  164. void
  165. ucl_emitter_print_double_msgpack (struct ucl_emitter_context *ctx, double val)
  166. {
  167. const struct ucl_emitter_functions *func = ctx->func;
  168. union {
  169. double d;
  170. uint64_t i;
  171. } u;
  172. const unsigned char dbl_ch = 0xcb;
  173. unsigned char buf[sizeof(double) + 1];
  174. /* Convert to big endian */
  175. u.d = val;
  176. u.i = TO_BE64 (u.i);
  177. buf[0] = dbl_ch;
  178. memcpy (&buf[1], &u.d, sizeof (double));
  179. func->ucl_emitter_append_len (buf, sizeof (buf), func->ud);
  180. }
  181. void
  182. ucl_emitter_print_bool_msgpack (struct ucl_emitter_context *ctx, bool val)
  183. {
  184. const struct ucl_emitter_functions *func = ctx->func;
  185. const unsigned char true_ch = 0xc3, false_ch = 0xc2;
  186. func->ucl_emitter_append_character (val ? true_ch : false_ch, 1, func->ud);
  187. }
  188. void
  189. ucl_emitter_print_string_msgpack (struct ucl_emitter_context *ctx,
  190. const char *s, size_t len)
  191. {
  192. const struct ucl_emitter_functions *func = ctx->func;
  193. const unsigned char fix_mask = 0xA0, l8_ch = 0xd9, l16_ch = 0xda, l32_ch = 0xdb;
  194. unsigned char buf[5];
  195. unsigned blen;
  196. if (len <= 0x1F) {
  197. blen = 1;
  198. buf[0] = (len | fix_mask) & 0xff;
  199. }
  200. else if (len <= 0xff) {
  201. blen = 2;
  202. buf[0] = l8_ch;
  203. buf[1] = len & 0xff;
  204. }
  205. else if (len <= 0xffff) {
  206. uint16_t bl = TO_BE16 (len);
  207. blen = 3;
  208. buf[0] = l16_ch;
  209. memcpy (&buf[1], &bl, sizeof (bl));
  210. }
  211. else {
  212. uint32_t bl = TO_BE32 (len);
  213. blen = 5;
  214. buf[0] = l32_ch;
  215. memcpy (&buf[1], &bl, sizeof (bl));
  216. }
  217. func->ucl_emitter_append_len (buf, blen, func->ud);
  218. func->ucl_emitter_append_len (s, len, func->ud);
  219. }
  220. void
  221. ucl_emitter_print_binary_string_msgpack (struct ucl_emitter_context *ctx,
  222. const char *s, size_t len)
  223. {
  224. const struct ucl_emitter_functions *func = ctx->func;
  225. const unsigned char l8_ch = 0xc4, l16_ch = 0xc5, l32_ch = 0xc6;
  226. unsigned char buf[5];
  227. unsigned blen;
  228. if (len <= 0xff) {
  229. blen = 2;
  230. buf[0] = l8_ch;
  231. buf[1] = len & 0xff;
  232. }
  233. else if (len <= 0xffff) {
  234. uint16_t bl = TO_BE16 (len);
  235. blen = 3;
  236. buf[0] = l16_ch;
  237. memcpy (&buf[1], &bl, sizeof (bl));
  238. }
  239. else {
  240. uint32_t bl = TO_BE32 (len);
  241. blen = 5;
  242. buf[0] = l32_ch;
  243. memcpy (&buf[1], &bl, sizeof (bl));
  244. }
  245. func->ucl_emitter_append_len (buf, blen, func->ud);
  246. func->ucl_emitter_append_len (s, len, func->ud);
  247. }
  248. void
  249. ucl_emitter_print_null_msgpack (struct ucl_emitter_context *ctx)
  250. {
  251. const struct ucl_emitter_functions *func = ctx->func;
  252. const unsigned char nil = 0xc0;
  253. func->ucl_emitter_append_character (nil, 1, func->ud);
  254. }
  255. void
  256. ucl_emitter_print_key_msgpack (bool print_key, struct ucl_emitter_context *ctx,
  257. const ucl_object_t *obj)
  258. {
  259. if (print_key) {
  260. ucl_emitter_print_string_msgpack (ctx, obj->key, obj->keylen);
  261. }
  262. }
  263. void
  264. ucl_emitter_print_array_msgpack (struct ucl_emitter_context *ctx, size_t len)
  265. {
  266. const struct ucl_emitter_functions *func = ctx->func;
  267. const unsigned char fix_mask = 0x90, l16_ch = 0xdc, l32_ch = 0xdd;
  268. unsigned char buf[5];
  269. unsigned blen;
  270. if (len <= 0xF) {
  271. blen = 1;
  272. buf[0] = (len | fix_mask) & 0xff;
  273. }
  274. else if (len <= 0xffff) {
  275. uint16_t bl = TO_BE16 (len);
  276. blen = 3;
  277. buf[0] = l16_ch;
  278. memcpy (&buf[1], &bl, sizeof (bl));
  279. }
  280. else {
  281. uint32_t bl = TO_BE32 (len);
  282. blen = 5;
  283. buf[0] = l32_ch;
  284. memcpy (&buf[1], &bl, sizeof (bl));
  285. }
  286. func->ucl_emitter_append_len (buf, blen, func->ud);
  287. }
  288. void
  289. ucl_emitter_print_object_msgpack (struct ucl_emitter_context *ctx, size_t len)
  290. {
  291. const struct ucl_emitter_functions *func = ctx->func;
  292. const unsigned char fix_mask = 0x80, l16_ch = 0xde, l32_ch = 0xdf;
  293. unsigned char buf[5];
  294. unsigned blen;
  295. if (len <= 0xF) {
  296. blen = 1;
  297. buf[0] = (len | fix_mask) & 0xff;
  298. }
  299. else if (len <= 0xffff) {
  300. uint16_t bl = TO_BE16 (len);
  301. blen = 3;
  302. buf[0] = l16_ch;
  303. memcpy (&buf[1], &bl, sizeof (bl));
  304. }
  305. else {
  306. uint32_t bl = TO_BE32 (len);
  307. blen = 5;
  308. buf[0] = l32_ch;
  309. memcpy (&buf[1], &bl, sizeof (bl));
  310. }
  311. func->ucl_emitter_append_len (buf, blen, func->ud);
  312. }
  313. enum ucl_msgpack_format {
  314. msgpack_positive_fixint = 0,
  315. msgpack_fixmap,
  316. msgpack_fixarray,
  317. msgpack_fixstr,
  318. msgpack_nil,
  319. msgpack_false,
  320. msgpack_true,
  321. msgpack_bin8,
  322. msgpack_bin16,
  323. msgpack_bin32,
  324. msgpack_ext8,
  325. msgpack_ext16,
  326. msgpack_ext32,
  327. msgpack_float32,
  328. msgpack_float64,
  329. msgpack_uint8,
  330. msgpack_uint16,
  331. msgpack_uint32,
  332. msgpack_uint64,
  333. msgpack_int8,
  334. msgpack_int16,
  335. msgpack_int32,
  336. msgpack_int64,
  337. msgpack_fixext1,
  338. msgpack_fixext2,
  339. msgpack_fixext4,
  340. msgpack_fixext8,
  341. msgpack_fixext16,
  342. msgpack_str8,
  343. msgpack_str16,
  344. msgpack_str32,
  345. msgpack_array16,
  346. msgpack_array32,
  347. msgpack_map16,
  348. msgpack_map32,
  349. msgpack_negative_fixint,
  350. msgpack_invalid
  351. };
  352. typedef ssize_t (*ucl_msgpack_parse_function)(struct ucl_parser *parser,
  353. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  354. const unsigned char *pos, size_t remain);
  355. static ssize_t ucl_msgpack_parse_map (struct ucl_parser *parser,
  356. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  357. const unsigned char *pos, size_t remain);
  358. static ssize_t ucl_msgpack_parse_array (struct ucl_parser *parser,
  359. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  360. const unsigned char *pos, size_t remain);
  361. static ssize_t ucl_msgpack_parse_string (struct ucl_parser *parser,
  362. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  363. const unsigned char *pos, size_t remain);
  364. static ssize_t ucl_msgpack_parse_int (struct ucl_parser *parser,
  365. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  366. const unsigned char *pos, size_t remain);
  367. static ssize_t ucl_msgpack_parse_float (struct ucl_parser *parser,
  368. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  369. const unsigned char *pos, size_t remain);
  370. static ssize_t ucl_msgpack_parse_bool (struct ucl_parser *parser,
  371. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  372. const unsigned char *pos, size_t remain);
  373. static ssize_t ucl_msgpack_parse_null (struct ucl_parser *parser,
  374. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  375. const unsigned char *pos, size_t remain);
  376. static ssize_t ucl_msgpack_parse_ignore (struct ucl_parser *parser,
  377. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  378. const unsigned char *pos, size_t remain);
  379. #define MSGPACK_FLAG_FIXED (1 << 0)
  380. #define MSGPACK_FLAG_CONTAINER (1 << 1)
  381. #define MSGPACK_FLAG_TYPEVALUE (1 << 2)
  382. #define MSGPACK_FLAG_EXT (1 << 3)
  383. #define MSGPACK_FLAG_ASSOC (1 << 4)
  384. #define MSGPACK_FLAG_KEY (1 << 5)
  385. #define MSGPACK_CONTAINER_BIT (1ULL << 62)
  386. /*
  387. * Search tree packed in array
  388. */
  389. struct ucl_msgpack_parser {
  390. uint8_t prefix; /* Prefix byte */
  391. uint8_t prefixlen; /* Length of prefix in bits */
  392. uint8_t fmt; /* The desired format */
  393. uint8_t len; /* Length of the object
  394. (either length bytes
  395. or length of value in case
  396. of fixed objects */
  397. uint8_t flags; /* Flags of the specified type */
  398. ucl_msgpack_parse_function func; /* Parser function */
  399. } parsers[] = {
  400. {
  401. 0xa0,
  402. 3,
  403. msgpack_fixstr,
  404. 0,
  405. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_KEY,
  406. ucl_msgpack_parse_string
  407. },
  408. {
  409. 0x0,
  410. 1,
  411. msgpack_positive_fixint,
  412. 0,
  413. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
  414. ucl_msgpack_parse_int
  415. },
  416. {
  417. 0xe0,
  418. 3,
  419. msgpack_negative_fixint,
  420. 0,
  421. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
  422. ucl_msgpack_parse_int
  423. },
  424. {
  425. 0x80,
  426. 4,
  427. msgpack_fixmap,
  428. 0,
  429. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  430. ucl_msgpack_parse_map
  431. },
  432. {
  433. 0x90,
  434. 4,
  435. msgpack_fixarray,
  436. 0,
  437. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER,
  438. ucl_msgpack_parse_array
  439. },
  440. {
  441. 0xd9,
  442. 8,
  443. msgpack_str8,
  444. 1,
  445. MSGPACK_FLAG_KEY,
  446. ucl_msgpack_parse_string
  447. },
  448. {
  449. 0xc4,
  450. 8,
  451. msgpack_bin8,
  452. 1,
  453. MSGPACK_FLAG_KEY,
  454. ucl_msgpack_parse_string
  455. },
  456. {
  457. 0xcf,
  458. 8,
  459. msgpack_uint64,
  460. 8,
  461. MSGPACK_FLAG_FIXED,
  462. ucl_msgpack_parse_int
  463. },
  464. {
  465. 0xd3,
  466. 8,
  467. msgpack_int64,
  468. 8,
  469. MSGPACK_FLAG_FIXED,
  470. ucl_msgpack_parse_int
  471. },
  472. {
  473. 0xce,
  474. 8,
  475. msgpack_uint32,
  476. 4,
  477. MSGPACK_FLAG_FIXED,
  478. ucl_msgpack_parse_int
  479. },
  480. {
  481. 0xd2,
  482. 8,
  483. msgpack_int32,
  484. 4,
  485. MSGPACK_FLAG_FIXED,
  486. ucl_msgpack_parse_int
  487. },
  488. {
  489. 0xcb,
  490. 8,
  491. msgpack_float64,
  492. 8,
  493. MSGPACK_FLAG_FIXED,
  494. ucl_msgpack_parse_float
  495. },
  496. {
  497. 0xca,
  498. 8,
  499. msgpack_float32,
  500. 4,
  501. MSGPACK_FLAG_FIXED,
  502. ucl_msgpack_parse_float
  503. },
  504. {
  505. 0xc2,
  506. 8,
  507. msgpack_false,
  508. 1,
  509. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  510. ucl_msgpack_parse_bool
  511. },
  512. {
  513. 0xc3,
  514. 8,
  515. msgpack_true,
  516. 1,
  517. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  518. ucl_msgpack_parse_bool
  519. },
  520. {
  521. 0xcc,
  522. 8,
  523. msgpack_uint8,
  524. 1,
  525. MSGPACK_FLAG_FIXED,
  526. ucl_msgpack_parse_int
  527. },
  528. {
  529. 0xcd,
  530. 8,
  531. msgpack_uint16,
  532. 2,
  533. MSGPACK_FLAG_FIXED,
  534. ucl_msgpack_parse_int
  535. },
  536. {
  537. 0xd0,
  538. 8,
  539. msgpack_int8,
  540. 1,
  541. MSGPACK_FLAG_FIXED,
  542. ucl_msgpack_parse_int
  543. },
  544. {
  545. 0xd1,
  546. 8,
  547. msgpack_int16,
  548. 2,
  549. MSGPACK_FLAG_FIXED,
  550. ucl_msgpack_parse_int
  551. },
  552. {
  553. 0xc0,
  554. 8,
  555. msgpack_nil,
  556. 0,
  557. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  558. ucl_msgpack_parse_null
  559. },
  560. {
  561. 0xda,
  562. 8,
  563. msgpack_str16,
  564. 2,
  565. MSGPACK_FLAG_KEY,
  566. ucl_msgpack_parse_string
  567. },
  568. {
  569. 0xdb,
  570. 8,
  571. msgpack_str32,
  572. 4,
  573. MSGPACK_FLAG_KEY,
  574. ucl_msgpack_parse_string
  575. },
  576. {
  577. 0xc5,
  578. 8,
  579. msgpack_bin16,
  580. 2,
  581. MSGPACK_FLAG_KEY,
  582. ucl_msgpack_parse_string
  583. },
  584. {
  585. 0xc6,
  586. 8,
  587. msgpack_bin32,
  588. 4,
  589. MSGPACK_FLAG_KEY,
  590. ucl_msgpack_parse_string
  591. },
  592. {
  593. 0xdc,
  594. 8,
  595. msgpack_array16,
  596. 2,
  597. MSGPACK_FLAG_CONTAINER,
  598. ucl_msgpack_parse_array
  599. },
  600. {
  601. 0xdd,
  602. 8,
  603. msgpack_array32,
  604. 4,
  605. MSGPACK_FLAG_CONTAINER,
  606. ucl_msgpack_parse_array
  607. },
  608. {
  609. 0xde,
  610. 8,
  611. msgpack_map16,
  612. 2,
  613. MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  614. ucl_msgpack_parse_map
  615. },
  616. {
  617. 0xdf,
  618. 8,
  619. msgpack_map32,
  620. 4,
  621. MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  622. ucl_msgpack_parse_map
  623. },
  624. {
  625. 0xc7,
  626. 8,
  627. msgpack_ext8,
  628. 1,
  629. MSGPACK_FLAG_EXT,
  630. ucl_msgpack_parse_ignore
  631. },
  632. {
  633. 0xc8,
  634. 8,
  635. msgpack_ext16,
  636. 2,
  637. MSGPACK_FLAG_EXT,
  638. ucl_msgpack_parse_ignore
  639. },
  640. {
  641. 0xc9,
  642. 8,
  643. msgpack_ext32,
  644. 4,
  645. MSGPACK_FLAG_EXT,
  646. ucl_msgpack_parse_ignore
  647. },
  648. {
  649. 0xd4,
  650. 8,
  651. msgpack_fixext1,
  652. 1,
  653. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  654. ucl_msgpack_parse_ignore
  655. },
  656. {
  657. 0xd5,
  658. 8,
  659. msgpack_fixext2,
  660. 2,
  661. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  662. ucl_msgpack_parse_ignore
  663. },
  664. {
  665. 0xd6,
  666. 8,
  667. msgpack_fixext4,
  668. 4,
  669. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  670. ucl_msgpack_parse_ignore
  671. },
  672. {
  673. 0xd7,
  674. 8,
  675. msgpack_fixext8,
  676. 8,
  677. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  678. ucl_msgpack_parse_ignore
  679. },
  680. {
  681. 0xd8,
  682. 8,
  683. msgpack_fixext16,
  684. 16,
  685. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  686. ucl_msgpack_parse_ignore
  687. }
  688. };
  689. #undef MSGPACK_DEBUG_PARSER
  690. static inline struct ucl_msgpack_parser *
  691. ucl_msgpack_get_parser_from_type (unsigned char t)
  692. {
  693. unsigned int i, shift, mask;
  694. for (i = 0; i < sizeof (parsers) / sizeof (parsers[0]); i ++) {
  695. shift = CHAR_BIT - parsers[i].prefixlen;
  696. mask = parsers[i].prefix >> shift;
  697. if (mask == (((unsigned int)t) >> shift)) {
  698. return &parsers[i];
  699. }
  700. }
  701. return NULL;
  702. }
  703. static inline struct ucl_stack *
  704. ucl_msgpack_get_container (struct ucl_parser *parser,
  705. struct ucl_msgpack_parser *obj_parser, uint64_t len)
  706. {
  707. struct ucl_stack *stack;
  708. assert (obj_parser != NULL);
  709. if (obj_parser->flags & MSGPACK_FLAG_CONTAINER) {
  710. assert ((len & MSGPACK_CONTAINER_BIT) == 0);
  711. /*
  712. * Insert new container to the stack
  713. */
  714. if (parser->stack == NULL) {
  715. parser->stack = calloc (1, sizeof (struct ucl_stack));
  716. if (parser->stack == NULL) {
  717. ucl_create_err (&parser->err, "no memory");
  718. return NULL;
  719. }
  720. }
  721. else {
  722. stack = calloc (1, sizeof (struct ucl_stack));
  723. if (stack == NULL) {
  724. ucl_create_err (&parser->err, "no memory");
  725. return NULL;
  726. }
  727. stack->next = parser->stack;
  728. parser->stack = stack;
  729. }
  730. parser->stack->level = len | MSGPACK_CONTAINER_BIT;
  731. #ifdef MSGPACK_DEBUG_PARSER
  732. stack = parser->stack;
  733. while (stack) {
  734. fprintf(stderr, "+");
  735. stack = stack->next;
  736. }
  737. fprintf(stderr, "%s -> %d\n", obj_parser->flags & MSGPACK_FLAG_ASSOC ? "object" : "array", (int)len);
  738. #endif
  739. }
  740. else {
  741. /*
  742. * Get the current stack top
  743. */
  744. if (parser->stack) {
  745. return parser->stack;
  746. }
  747. else {
  748. ucl_create_err (&parser->err, "bad top level object for msgpack");
  749. return NULL;
  750. }
  751. }
  752. return parser->stack;
  753. }
  754. static bool
  755. ucl_msgpack_is_container_finished (struct ucl_stack *container)
  756. {
  757. uint64_t level;
  758. assert (container != NULL);
  759. if (container->level & MSGPACK_CONTAINER_BIT) {
  760. level = container->level & ~MSGPACK_CONTAINER_BIT;
  761. if (level == 0) {
  762. return true;
  763. }
  764. }
  765. return false;
  766. }
  767. static bool
  768. ucl_msgpack_insert_object (struct ucl_parser *parser,
  769. const unsigned char *key,
  770. size_t keylen, ucl_object_t *obj)
  771. {
  772. uint64_t level;
  773. struct ucl_stack *container;
  774. container = parser->stack;
  775. assert (container != NULL);
  776. assert (container->level > 0);
  777. assert (obj != NULL);
  778. assert (container->obj != NULL);
  779. if (container->obj->type == UCL_ARRAY) {
  780. ucl_array_append (container->obj, obj);
  781. }
  782. else if (container->obj->type == UCL_OBJECT) {
  783. if (key == NULL || keylen == 0) {
  784. ucl_create_err (&parser->err, "cannot insert object with no key");
  785. return false;
  786. }
  787. obj->key = key;
  788. obj->keylen = keylen;
  789. if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
  790. ucl_copy_key_trash (obj);
  791. }
  792. ucl_parser_process_object_element (parser, obj);
  793. }
  794. else {
  795. ucl_create_err (&parser->err, "bad container type");
  796. return false;
  797. }
  798. if (container->level & MSGPACK_CONTAINER_BIT) {
  799. level = container->level & ~MSGPACK_CONTAINER_BIT;
  800. container->level = (level - 1) | MSGPACK_CONTAINER_BIT;
  801. }
  802. return true;
  803. }
  804. static struct ucl_stack *
  805. ucl_msgpack_get_next_container (struct ucl_parser *parser)
  806. {
  807. struct ucl_stack *cur = NULL;
  808. uint64_t level;
  809. cur = parser->stack;
  810. if (cur == NULL) {
  811. return NULL;
  812. }
  813. if (cur->level & MSGPACK_CONTAINER_BIT) {
  814. level = cur->level & ~MSGPACK_CONTAINER_BIT;
  815. if (level == 0) {
  816. /* We need to switch to the previous container */
  817. parser->stack = cur->next;
  818. parser->cur_obj = cur->obj;
  819. free (cur);
  820. #ifdef MSGPACK_DEBUG_PARSER
  821. cur = parser->stack;
  822. while (cur) {
  823. fprintf(stderr, "-");
  824. cur = cur->next;
  825. }
  826. fprintf(stderr, "-%s -> %d\n", parser->cur_obj->type == UCL_OBJECT ? "object" : "array", (int)parser->cur_obj->len);
  827. #endif
  828. return ucl_msgpack_get_next_container (parser);
  829. }
  830. }
  831. /*
  832. * For UCL containers we don't know length, so we just insert the whole
  833. * message pack blob into the top level container
  834. */
  835. assert (cur->obj != NULL);
  836. return cur;
  837. }
  838. #define CONSUME_RET do { \
  839. if (ret != -1) { \
  840. p += ret; \
  841. remain -= ret; \
  842. obj_parser = NULL; \
  843. assert (remain >= 0); \
  844. } \
  845. else { \
  846. ucl_create_err (&parser->err, \
  847. "cannot parse type %d of len %u", \
  848. (int)obj_parser->fmt, \
  849. (unsigned)len); \
  850. return false; \
  851. } \
  852. } while(0)
  853. #define GET_NEXT_STATE do { \
  854. container = ucl_msgpack_get_next_container (parser); \
  855. if (container == NULL) { \
  856. ucl_create_err (&parser->err, \
  857. "empty container"); \
  858. return false; \
  859. } \
  860. next_state = container->obj->type == UCL_OBJECT ? \
  861. read_assoc_key : read_array_value; \
  862. } while(0)
  863. static bool
  864. ucl_msgpack_consume (struct ucl_parser *parser)
  865. {
  866. const unsigned char *p, *end, *key = NULL;
  867. struct ucl_stack *container;
  868. enum e_msgpack_parser_state {
  869. read_type,
  870. start_assoc,
  871. start_array,
  872. read_assoc_key,
  873. read_assoc_value,
  874. finish_assoc_value,
  875. read_array_value,
  876. finish_array_value,
  877. error_state
  878. } state = read_type, next_state = error_state;
  879. struct ucl_msgpack_parser *obj_parser = NULL;
  880. uint64_t len = 0;
  881. ssize_t ret, remain, keylen = 0;
  882. #ifdef MSGPACK_DEBUG_PARSER
  883. uint64_t i;
  884. enum e_msgpack_parser_state hist[256];
  885. #endif
  886. p = parser->chunks->begin;
  887. remain = parser->chunks->remain;
  888. end = p + remain;
  889. while (p < end) {
  890. #ifdef MSGPACK_DEBUG_PARSER
  891. hist[i++ % 256] = state;
  892. #endif
  893. switch (state) {
  894. case read_type:
  895. obj_parser = ucl_msgpack_get_parser_from_type (*p);
  896. if (obj_parser == NULL) {
  897. ucl_create_err (&parser->err, "unknown msgpack format: %x",
  898. (unsigned int)*p);
  899. return false;
  900. }
  901. /* Now check length sanity */
  902. if (obj_parser->flags & MSGPACK_FLAG_FIXED) {
  903. if (obj_parser->len == 0) {
  904. /* We have an embedded size */
  905. len = *p & ~obj_parser->prefix;
  906. }
  907. else {
  908. if (remain < obj_parser->len) {
  909. ucl_create_err (&parser->err, "not enough data remain to "
  910. "read object's length: %u remain, %u needed",
  911. (unsigned)remain, obj_parser->len);
  912. return false;
  913. }
  914. len = obj_parser->len;
  915. }
  916. if (!(obj_parser->flags & MSGPACK_FLAG_TYPEVALUE)) {
  917. /* We must pass value as the second byte */
  918. if (remain > 0) {
  919. p ++;
  920. remain --;
  921. }
  922. }
  923. else {
  924. /* Len is irrelevant now */
  925. len = 0;
  926. }
  927. }
  928. else {
  929. /* Length is not embedded */
  930. if (remain < obj_parser->len) {
  931. ucl_create_err (&parser->err, "not enough data remain to "
  932. "read object's length: %u remain, %u needed",
  933. (unsigned)remain, obj_parser->len);
  934. return false;
  935. }
  936. p ++;
  937. remain --;
  938. switch (obj_parser->len) {
  939. case 1:
  940. len = *p;
  941. break;
  942. case 2:
  943. len = FROM_BE16 (*(uint16_t *)p);
  944. break;
  945. case 4:
  946. len = FROM_BE32 (*(uint32_t *)p);
  947. break;
  948. case 8:
  949. len = FROM_BE64 (*(uint64_t *)p);
  950. break;
  951. default:
  952. assert (0);
  953. break;
  954. }
  955. p += obj_parser->len;
  956. remain -= obj_parser->len;
  957. }
  958. if (obj_parser->flags & MSGPACK_FLAG_ASSOC) {
  959. /* We have just read the new associative map */
  960. state = start_assoc;
  961. }
  962. else if (obj_parser->flags & MSGPACK_FLAG_CONTAINER){
  963. state = start_array;
  964. }
  965. else {
  966. state = next_state;
  967. }
  968. break;
  969. case start_assoc:
  970. parser->cur_obj = ucl_object_new_full (UCL_OBJECT,
  971. parser->chunks->priority);
  972. /* Insert to the previous level container */
  973. if (parser->stack && !ucl_msgpack_insert_object (parser,
  974. key, keylen, parser->cur_obj)) {
  975. return false;
  976. }
  977. /* Get new container */
  978. container = ucl_msgpack_get_container (parser, obj_parser, len);
  979. if (container == NULL) {
  980. return false;
  981. }
  982. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  983. p, remain);
  984. CONSUME_RET;
  985. key = NULL;
  986. keylen = 0;
  987. if (len > 0) {
  988. state = read_type;
  989. next_state = read_assoc_key;
  990. }
  991. else {
  992. /* Empty object */
  993. state = finish_assoc_value;
  994. }
  995. break;
  996. case start_array:
  997. parser->cur_obj = ucl_object_new_full (UCL_ARRAY,
  998. parser->chunks->priority);
  999. /* Insert to the previous level container */
  1000. if (parser->stack && !ucl_msgpack_insert_object (parser,
  1001. key, keylen, parser->cur_obj)) {
  1002. return false;
  1003. }
  1004. /* Get new container */
  1005. container = ucl_msgpack_get_container (parser, obj_parser, len);
  1006. if (container == NULL) {
  1007. return false;
  1008. }
  1009. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1010. p, remain);
  1011. CONSUME_RET;
  1012. if (len > 0) {
  1013. state = read_type;
  1014. next_state = read_array_value;
  1015. }
  1016. else {
  1017. /* Empty array */
  1018. state = finish_array_value;
  1019. }
  1020. break;
  1021. case read_array_value:
  1022. /*
  1023. * p is now at the value start, len now contains length read and
  1024. * obj_parser contains the corresponding specific parser
  1025. */
  1026. container = parser->stack;
  1027. if (container == NULL) {
  1028. return false;
  1029. }
  1030. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1031. p, remain);
  1032. CONSUME_RET;
  1033. /* Insert value to the container and check if we have finished array */
  1034. if (!ucl_msgpack_insert_object (parser, NULL, 0,
  1035. parser->cur_obj)) {
  1036. return false;
  1037. }
  1038. if (ucl_msgpack_is_container_finished (container)) {
  1039. state = finish_array_value;
  1040. }
  1041. else {
  1042. /* Read more elements */
  1043. state = read_type;
  1044. next_state = read_array_value;
  1045. }
  1046. break;
  1047. case read_assoc_key:
  1048. /*
  1049. * Keys must have string type for ucl msgpack
  1050. */
  1051. if (!(obj_parser->flags & MSGPACK_FLAG_KEY)) {
  1052. ucl_create_err (&parser->err, "bad type for key: %u, expected "
  1053. "string", (unsigned)obj_parser->fmt);
  1054. return false;
  1055. }
  1056. key = p;
  1057. keylen = len;
  1058. if (keylen > remain || keylen == 0) {
  1059. ucl_create_err (&parser->err, "too long or empty key");
  1060. return false;
  1061. }
  1062. p += len;
  1063. remain -= len;
  1064. state = read_type;
  1065. next_state = read_assoc_value;
  1066. break;
  1067. case read_assoc_value:
  1068. /*
  1069. * p is now at the value start, len now contains length read and
  1070. * obj_parser contains the corresponding specific parser
  1071. */
  1072. container = parser->stack;
  1073. if (container == NULL) {
  1074. return false;
  1075. }
  1076. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1077. p, remain);
  1078. CONSUME_RET;
  1079. assert (key != NULL && keylen > 0);
  1080. if (!ucl_msgpack_insert_object (parser, key, keylen,
  1081. parser->cur_obj)) {
  1082. return false;
  1083. }
  1084. key = NULL;
  1085. keylen = 0;
  1086. if (ucl_msgpack_is_container_finished (container)) {
  1087. state = finish_assoc_value;
  1088. }
  1089. else {
  1090. /* Read more elements */
  1091. state = read_type;
  1092. next_state = read_assoc_key;
  1093. }
  1094. break;
  1095. case finish_array_value:
  1096. case finish_assoc_value:
  1097. GET_NEXT_STATE;
  1098. state = read_type;
  1099. break;
  1100. case error_state:
  1101. ucl_create_err (&parser->err, "invalid state machine state");
  1102. return false;
  1103. }
  1104. }
  1105. /* Check the finishing state */
  1106. switch (state) {
  1107. case start_array:
  1108. case start_assoc:
  1109. /* Empty container at the end */
  1110. if (len != 0) {
  1111. ucl_create_err (&parser->err, "invalid non-empty container at the end");
  1112. return false;
  1113. }
  1114. parser->cur_obj = ucl_object_new_full (
  1115. state == start_array ? UCL_ARRAY : UCL_OBJECT,
  1116. parser->chunks->priority);
  1117. /* Insert to the previous level container */
  1118. if (!ucl_msgpack_insert_object (parser,
  1119. key, keylen, parser->cur_obj)) {
  1120. return false;
  1121. }
  1122. /* Get new container */
  1123. container = ucl_msgpack_get_container (parser, obj_parser, len);
  1124. if (container == NULL) {
  1125. return false;
  1126. }
  1127. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1128. p, remain);
  1129. break;
  1130. case read_array_value:
  1131. case read_assoc_value:
  1132. if (len != 0) {
  1133. ucl_create_err (&parser->err, "unfinished value at the end");
  1134. return false;
  1135. }
  1136. container = parser->stack;
  1137. if (container == NULL) {
  1138. return false;
  1139. }
  1140. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1141. p, remain);
  1142. CONSUME_RET;
  1143. /* Insert value to the container and check if we have finished array */
  1144. if (!ucl_msgpack_insert_object (parser, NULL, 0,
  1145. parser->cur_obj)) {
  1146. return false;
  1147. }
  1148. break;
  1149. case finish_array_value:
  1150. case finish_assoc_value:
  1151. case read_type:
  1152. /* Valid finishing state */
  1153. break;
  1154. default:
  1155. /* Invalid finishing state */
  1156. ucl_create_err (&parser->err, "invalid state machine finishing state: %d",
  1157. state);
  1158. return false;
  1159. }
  1160. /* Rewind to the top level container */
  1161. ucl_msgpack_get_next_container (parser);
  1162. assert (parser->stack == NULL ||
  1163. (parser->stack->level & MSGPACK_CONTAINER_BIT) == 0);
  1164. return true;
  1165. }
  1166. bool
  1167. ucl_parse_msgpack (struct ucl_parser *parser)
  1168. {
  1169. ucl_object_t *container = NULL;
  1170. const unsigned char *p;
  1171. bool ret;
  1172. assert (parser != NULL);
  1173. assert (parser->chunks != NULL);
  1174. assert (parser->chunks->begin != NULL);
  1175. assert (parser->chunks->remain != 0);
  1176. p = parser->chunks->begin;
  1177. if (parser->stack) {
  1178. container = parser->stack->obj;
  1179. }
  1180. /*
  1181. * When we start parsing message pack chunk, we must ensure that we
  1182. * have either a valid container or the top object inside message pack is
  1183. * of container type
  1184. */
  1185. if (container == NULL) {
  1186. if ((*p & 0x80) != 0x80 && !(*p >= 0xdc && *p <= 0xdf)) {
  1187. ucl_create_err (&parser->err, "bad top level object for msgpack");
  1188. return false;
  1189. }
  1190. }
  1191. ret = ucl_msgpack_consume (parser);
  1192. if (ret && parser->top_obj == NULL) {
  1193. parser->top_obj = parser->cur_obj;
  1194. }
  1195. return ret;
  1196. }
  1197. static ssize_t
  1198. ucl_msgpack_parse_map (struct ucl_parser *parser,
  1199. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1200. const unsigned char *pos, size_t remain)
  1201. {
  1202. container->obj = parser->cur_obj;
  1203. return 0;
  1204. }
  1205. static ssize_t
  1206. ucl_msgpack_parse_array (struct ucl_parser *parser,
  1207. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1208. const unsigned char *pos, size_t remain)
  1209. {
  1210. container->obj = parser->cur_obj;
  1211. return 0;
  1212. }
  1213. static ssize_t
  1214. ucl_msgpack_parse_string (struct ucl_parser *parser,
  1215. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1216. const unsigned char *pos, size_t remain)
  1217. {
  1218. ucl_object_t *obj;
  1219. if (len > remain) {
  1220. return -1;
  1221. }
  1222. obj = ucl_object_new_full (UCL_STRING, parser->chunks->priority);
  1223. obj->value.sv = pos;
  1224. obj->len = len;
  1225. if (fmt >= msgpack_bin8 && fmt <= msgpack_bin32) {
  1226. obj->flags |= UCL_OBJECT_BINARY;
  1227. }
  1228. if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
  1229. if (obj->flags & UCL_OBJECT_BINARY) {
  1230. obj->trash_stack[UCL_TRASH_VALUE] = malloc (len);
  1231. if (obj->trash_stack[UCL_TRASH_VALUE] != NULL) {
  1232. memcpy (obj->trash_stack[UCL_TRASH_VALUE], pos, len);
  1233. }
  1234. }
  1235. else {
  1236. ucl_copy_value_trash (obj);
  1237. }
  1238. }
  1239. parser->cur_obj = obj;
  1240. return len;
  1241. }
  1242. static ssize_t
  1243. ucl_msgpack_parse_int (struct ucl_parser *parser,
  1244. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1245. const unsigned char *pos, size_t remain)
  1246. {
  1247. ucl_object_t *obj;
  1248. int8_t iv8;
  1249. int16_t iv16;
  1250. int32_t iv32;
  1251. int64_t iv64;
  1252. uint16_t uiv16;
  1253. uint32_t uiv32;
  1254. uint64_t uiv64;
  1255. if (len > remain) {
  1256. return -1;
  1257. }
  1258. obj = ucl_object_new_full (UCL_INT, parser->chunks->priority);
  1259. switch (fmt) {
  1260. case msgpack_positive_fixint:
  1261. obj->value.iv = (*pos & 0x7f);
  1262. len = 1;
  1263. break;
  1264. case msgpack_negative_fixint:
  1265. obj->value.iv = - (*pos & 0x1f);
  1266. len = 1;
  1267. break;
  1268. case msgpack_uint8:
  1269. obj->value.iv = (unsigned char)*pos;
  1270. len = 1;
  1271. break;
  1272. case msgpack_int8:
  1273. memcpy (&iv8, pos, sizeof (iv8));
  1274. obj->value.iv = iv8;
  1275. len = 1;
  1276. break;
  1277. case msgpack_int16:
  1278. memcpy (&iv16, pos, sizeof (iv16));
  1279. iv16 = FROM_BE16 (iv16);
  1280. obj->value.iv = iv16;
  1281. len = 2;
  1282. break;
  1283. case msgpack_uint16:
  1284. memcpy (&uiv16, pos, sizeof (uiv16));
  1285. uiv16 = FROM_BE16 (uiv16);
  1286. obj->value.iv = uiv16;
  1287. len = 2;
  1288. break;
  1289. case msgpack_int32:
  1290. memcpy (&iv32, pos, sizeof (iv32));
  1291. iv32 = FROM_BE32 (iv32);
  1292. obj->value.iv = iv32;
  1293. len = 4;
  1294. break;
  1295. case msgpack_uint32:
  1296. memcpy(&uiv32, pos, sizeof(uiv32));
  1297. uiv32 = FROM_BE32(uiv32);
  1298. obj->value.iv = uiv32;
  1299. len = 4;
  1300. break;
  1301. case msgpack_int64:
  1302. memcpy (&iv64, pos, sizeof (iv64));
  1303. iv64 = FROM_BE64 (iv64);
  1304. obj->value.iv = iv64;
  1305. len = 8;
  1306. break;
  1307. case msgpack_uint64:
  1308. memcpy(&uiv64, pos, sizeof(uiv64));
  1309. uiv64 = FROM_BE64(uiv64);
  1310. obj->value.iv = uiv64;
  1311. len = 8;
  1312. break;
  1313. default:
  1314. assert (0);
  1315. break;
  1316. }
  1317. parser->cur_obj = obj;
  1318. return len;
  1319. }
  1320. static ssize_t
  1321. ucl_msgpack_parse_float (struct ucl_parser *parser,
  1322. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1323. const unsigned char *pos, size_t remain)
  1324. {
  1325. ucl_object_t *obj;
  1326. union {
  1327. uint32_t i;
  1328. float f;
  1329. } d;
  1330. uint64_t uiv64;
  1331. if (len > remain) {
  1332. return -1;
  1333. }
  1334. obj = ucl_object_new_full (UCL_FLOAT, parser->chunks->priority);
  1335. switch (fmt) {
  1336. case msgpack_float32:
  1337. memcpy(&d.i, pos, sizeof(d.i));
  1338. d.i = FROM_BE32(d.i);
  1339. /* XXX: can be slow */
  1340. obj->value.dv = d.f;
  1341. len = 4;
  1342. break;
  1343. case msgpack_float64:
  1344. memcpy(&uiv64, pos, sizeof(uiv64));
  1345. uiv64 = FROM_BE64(uiv64);
  1346. obj->value.iv = uiv64;
  1347. len = 8;
  1348. break;
  1349. default:
  1350. assert (0);
  1351. break;
  1352. }
  1353. parser->cur_obj = obj;
  1354. return len;
  1355. }
  1356. static ssize_t
  1357. ucl_msgpack_parse_bool (struct ucl_parser *parser,
  1358. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1359. const unsigned char *pos, size_t remain)
  1360. {
  1361. ucl_object_t *obj;
  1362. if (len > remain) {
  1363. return -1;
  1364. }
  1365. obj = ucl_object_new_full (UCL_BOOLEAN, parser->chunks->priority);
  1366. switch (fmt) {
  1367. case msgpack_true:
  1368. obj->value.iv = true;
  1369. break;
  1370. case msgpack_false:
  1371. obj->value.iv = false;
  1372. break;
  1373. default:
  1374. assert (0);
  1375. break;
  1376. }
  1377. parser->cur_obj = obj;
  1378. return 1;
  1379. }
  1380. static ssize_t
  1381. ucl_msgpack_parse_null (struct ucl_parser *parser,
  1382. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1383. const unsigned char *pos, size_t remain)
  1384. {
  1385. ucl_object_t *obj;
  1386. if (len > remain) {
  1387. return -1;
  1388. }
  1389. obj = ucl_object_new_full (UCL_NULL, parser->chunks->priority);
  1390. parser->cur_obj = obj;
  1391. return 1;
  1392. }
  1393. static ssize_t
  1394. ucl_msgpack_parse_ignore (struct ucl_parser *parser,
  1395. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1396. const unsigned char *pos, size_t remain)
  1397. {
  1398. if (len > remain) {
  1399. return -1;
  1400. }
  1401. switch (fmt) {
  1402. case msgpack_fixext1:
  1403. len = 2;
  1404. break;
  1405. case msgpack_fixext2:
  1406. len = 3;
  1407. break;
  1408. case msgpack_fixext4:
  1409. len = 5;
  1410. break;
  1411. case msgpack_fixext8:
  1412. len = 9;
  1413. break;
  1414. case msgpack_fixext16:
  1415. len = 17;
  1416. break;
  1417. case msgpack_ext8:
  1418. case msgpack_ext16:
  1419. case msgpack_ext32:
  1420. len = len + 1;
  1421. break;
  1422. default:
  1423. ucl_create_err (&parser->err, "bad type: %x", (unsigned)fmt);
  1424. return -1;
  1425. }
  1426. return len;
  1427. }