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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615
  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. /*
  386. * Search tree packed in array
  387. */
  388. static struct ucl_msgpack_parser {
  389. uint8_t prefix; /* Prefix byte */
  390. uint8_t prefixlen; /* Length of prefix in bits */
  391. uint8_t fmt; /* The desired format */
  392. uint8_t len; /* Length of the object
  393. (either length bytes
  394. or length of value in case
  395. of fixed objects */
  396. uint8_t flags; /* Flags of the specified type */
  397. ucl_msgpack_parse_function func; /* Parser function */
  398. } parsers[] = {
  399. {
  400. 0xa0,
  401. 3,
  402. msgpack_fixstr,
  403. 0,
  404. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_KEY,
  405. ucl_msgpack_parse_string
  406. },
  407. {
  408. 0x0,
  409. 1,
  410. msgpack_positive_fixint,
  411. 0,
  412. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
  413. ucl_msgpack_parse_int
  414. },
  415. {
  416. 0xe0,
  417. 3,
  418. msgpack_negative_fixint,
  419. 0,
  420. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
  421. ucl_msgpack_parse_int
  422. },
  423. {
  424. 0x80,
  425. 4,
  426. msgpack_fixmap,
  427. 0,
  428. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  429. ucl_msgpack_parse_map
  430. },
  431. {
  432. 0x90,
  433. 4,
  434. msgpack_fixarray,
  435. 0,
  436. MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER,
  437. ucl_msgpack_parse_array
  438. },
  439. {
  440. 0xd9,
  441. 8,
  442. msgpack_str8,
  443. 1,
  444. MSGPACK_FLAG_KEY,
  445. ucl_msgpack_parse_string
  446. },
  447. {
  448. 0xc4,
  449. 8,
  450. msgpack_bin8,
  451. 1,
  452. MSGPACK_FLAG_KEY,
  453. ucl_msgpack_parse_string
  454. },
  455. {
  456. 0xcf,
  457. 8,
  458. msgpack_uint64,
  459. 8,
  460. MSGPACK_FLAG_FIXED,
  461. ucl_msgpack_parse_int
  462. },
  463. {
  464. 0xd3,
  465. 8,
  466. msgpack_int64,
  467. 8,
  468. MSGPACK_FLAG_FIXED,
  469. ucl_msgpack_parse_int
  470. },
  471. {
  472. 0xce,
  473. 8,
  474. msgpack_uint32,
  475. 4,
  476. MSGPACK_FLAG_FIXED,
  477. ucl_msgpack_parse_int
  478. },
  479. {
  480. 0xd2,
  481. 8,
  482. msgpack_int32,
  483. 4,
  484. MSGPACK_FLAG_FIXED,
  485. ucl_msgpack_parse_int
  486. },
  487. {
  488. 0xcb,
  489. 8,
  490. msgpack_float64,
  491. 8,
  492. MSGPACK_FLAG_FIXED,
  493. ucl_msgpack_parse_float
  494. },
  495. {
  496. 0xca,
  497. 8,
  498. msgpack_float32,
  499. 4,
  500. MSGPACK_FLAG_FIXED,
  501. ucl_msgpack_parse_float
  502. },
  503. {
  504. 0xc2,
  505. 8,
  506. msgpack_false,
  507. 1,
  508. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  509. ucl_msgpack_parse_bool
  510. },
  511. {
  512. 0xc3,
  513. 8,
  514. msgpack_true,
  515. 1,
  516. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  517. ucl_msgpack_parse_bool
  518. },
  519. {
  520. 0xcc,
  521. 8,
  522. msgpack_uint8,
  523. 1,
  524. MSGPACK_FLAG_FIXED,
  525. ucl_msgpack_parse_int
  526. },
  527. {
  528. 0xcd,
  529. 8,
  530. msgpack_uint16,
  531. 2,
  532. MSGPACK_FLAG_FIXED,
  533. ucl_msgpack_parse_int
  534. },
  535. {
  536. 0xd0,
  537. 8,
  538. msgpack_int8,
  539. 1,
  540. MSGPACK_FLAG_FIXED,
  541. ucl_msgpack_parse_int
  542. },
  543. {
  544. 0xd1,
  545. 8,
  546. msgpack_int16,
  547. 2,
  548. MSGPACK_FLAG_FIXED,
  549. ucl_msgpack_parse_int
  550. },
  551. {
  552. 0xc0,
  553. 8,
  554. msgpack_nil,
  555. 0,
  556. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
  557. ucl_msgpack_parse_null
  558. },
  559. {
  560. 0xda,
  561. 8,
  562. msgpack_str16,
  563. 2,
  564. MSGPACK_FLAG_KEY,
  565. ucl_msgpack_parse_string
  566. },
  567. {
  568. 0xdb,
  569. 8,
  570. msgpack_str32,
  571. 4,
  572. MSGPACK_FLAG_KEY,
  573. ucl_msgpack_parse_string
  574. },
  575. {
  576. 0xc5,
  577. 8,
  578. msgpack_bin16,
  579. 2,
  580. MSGPACK_FLAG_KEY,
  581. ucl_msgpack_parse_string
  582. },
  583. {
  584. 0xc6,
  585. 8,
  586. msgpack_bin32,
  587. 4,
  588. MSGPACK_FLAG_KEY,
  589. ucl_msgpack_parse_string
  590. },
  591. {
  592. 0xdc,
  593. 8,
  594. msgpack_array16,
  595. 2,
  596. MSGPACK_FLAG_CONTAINER,
  597. ucl_msgpack_parse_array
  598. },
  599. {
  600. 0xdd,
  601. 8,
  602. msgpack_array32,
  603. 4,
  604. MSGPACK_FLAG_CONTAINER,
  605. ucl_msgpack_parse_array
  606. },
  607. {
  608. 0xde,
  609. 8,
  610. msgpack_map16,
  611. 2,
  612. MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  613. ucl_msgpack_parse_map
  614. },
  615. {
  616. 0xdf,
  617. 8,
  618. msgpack_map32,
  619. 4,
  620. MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
  621. ucl_msgpack_parse_map
  622. },
  623. {
  624. 0xc7,
  625. 8,
  626. msgpack_ext8,
  627. 1,
  628. MSGPACK_FLAG_EXT,
  629. ucl_msgpack_parse_ignore
  630. },
  631. {
  632. 0xc8,
  633. 8,
  634. msgpack_ext16,
  635. 2,
  636. MSGPACK_FLAG_EXT,
  637. ucl_msgpack_parse_ignore
  638. },
  639. {
  640. 0xc9,
  641. 8,
  642. msgpack_ext32,
  643. 4,
  644. MSGPACK_FLAG_EXT,
  645. ucl_msgpack_parse_ignore
  646. },
  647. {
  648. 0xd4,
  649. 8,
  650. msgpack_fixext1,
  651. 1,
  652. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  653. ucl_msgpack_parse_ignore
  654. },
  655. {
  656. 0xd5,
  657. 8,
  658. msgpack_fixext2,
  659. 2,
  660. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  661. ucl_msgpack_parse_ignore
  662. },
  663. {
  664. 0xd6,
  665. 8,
  666. msgpack_fixext4,
  667. 4,
  668. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  669. ucl_msgpack_parse_ignore
  670. },
  671. {
  672. 0xd7,
  673. 8,
  674. msgpack_fixext8,
  675. 8,
  676. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  677. ucl_msgpack_parse_ignore
  678. },
  679. {
  680. 0xd8,
  681. 8,
  682. msgpack_fixext16,
  683. 16,
  684. MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
  685. ucl_msgpack_parse_ignore
  686. }
  687. };
  688. #undef MSGPACK_DEBUG_PARSER
  689. static inline struct ucl_msgpack_parser *
  690. ucl_msgpack_get_parser_from_type (unsigned char t)
  691. {
  692. unsigned int i, shift, mask;
  693. for (i = 0; i < sizeof (parsers) / sizeof (parsers[0]); i ++) {
  694. shift = CHAR_BIT - parsers[i].prefixlen;
  695. mask = parsers[i].prefix >> shift;
  696. if (mask == (((unsigned int)t) >> shift)) {
  697. return &parsers[i];
  698. }
  699. }
  700. return NULL;
  701. }
  702. static inline struct ucl_stack *
  703. ucl_msgpack_get_container (struct ucl_parser *parser,
  704. struct ucl_msgpack_parser *obj_parser, uint64_t len)
  705. {
  706. struct ucl_stack *stack;
  707. assert (obj_parser != NULL);
  708. if (obj_parser->flags & MSGPACK_FLAG_CONTAINER) {
  709. /*
  710. * Insert new container to the stack
  711. */
  712. if (parser->stack == NULL) {
  713. parser->stack = calloc (1, sizeof (struct ucl_stack));
  714. if (parser->stack == NULL) {
  715. ucl_create_err (&parser->err, "no memory");
  716. return NULL;
  717. }
  718. parser->stack->chunk = parser->chunks;
  719. }
  720. else {
  721. stack = calloc (1, sizeof (struct ucl_stack));
  722. if (stack == NULL) {
  723. ucl_create_err (&parser->err, "no memory");
  724. return NULL;
  725. }
  726. stack->chunk = parser->chunks;
  727. stack->next = parser->stack;
  728. parser->stack = stack;
  729. }
  730. parser->stack->e.len = len;
  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. assert (container != NULL);
  758. if (container->e.len == 0) {
  759. return true;
  760. }
  761. return false;
  762. }
  763. static bool
  764. ucl_msgpack_insert_object (struct ucl_parser *parser,
  765. const unsigned char *key,
  766. size_t keylen, ucl_object_t *obj)
  767. {
  768. struct ucl_stack *container;
  769. container = parser->stack;
  770. assert (container != NULL);
  771. assert (container->e.len > 0);
  772. assert (obj != NULL);
  773. assert (container->obj != NULL);
  774. if (container->obj->type == UCL_ARRAY) {
  775. ucl_array_append (container->obj, obj);
  776. }
  777. else if (container->obj->type == UCL_OBJECT) {
  778. if (key == NULL || keylen == 0) {
  779. ucl_create_err (&parser->err, "cannot insert object with no key");
  780. return false;
  781. }
  782. obj->key = key;
  783. obj->keylen = keylen;
  784. if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
  785. ucl_copy_key_trash (obj);
  786. }
  787. ucl_parser_process_object_element (parser, obj);
  788. }
  789. else {
  790. ucl_create_err (&parser->err, "bad container type");
  791. return false;
  792. }
  793. container->e.len--;
  794. return true;
  795. }
  796. static struct ucl_stack *
  797. ucl_msgpack_get_next_container (struct ucl_parser *parser)
  798. {
  799. struct ucl_stack *cur = NULL;
  800. uint64_t len;
  801. cur = parser->stack;
  802. if (cur == NULL) {
  803. return NULL;
  804. }
  805. len = cur->e.len;
  806. if (len == 0) {
  807. /* We need to switch to the previous container */
  808. parser->stack = cur->next;
  809. parser->cur_obj = cur->obj;
  810. free (cur);
  811. #ifdef MSGPACK_DEBUG_PARSER
  812. cur = parser->stack;
  813. while (cur) {
  814. fprintf(stderr, "-");
  815. cur = cur->next;
  816. }
  817. fprintf(stderr, "-%s -> %d\n", parser->cur_obj->type == UCL_OBJECT ? "object" : "array", (int)parser->cur_obj->len);
  818. #endif
  819. return ucl_msgpack_get_next_container (parser);
  820. }
  821. /*
  822. * For UCL containers we don't know length, so we just insert the whole
  823. * message pack blob into the top level container
  824. */
  825. assert (cur->obj != NULL);
  826. return cur;
  827. }
  828. #define CONSUME_RET do { \
  829. if (ret != -1) { \
  830. p += ret; \
  831. remain -= ret; \
  832. obj_parser = NULL; \
  833. assert (remain >= 0); \
  834. } \
  835. else { \
  836. ucl_create_err (&parser->err, \
  837. "cannot parse type %d of len %u", \
  838. (int)obj_parser->fmt, \
  839. (unsigned)len); \
  840. return false; \
  841. } \
  842. } while(0)
  843. #define GET_NEXT_STATE do { \
  844. container = ucl_msgpack_get_next_container (parser); \
  845. if (container == NULL) { \
  846. ucl_create_err (&parser->err, \
  847. "empty container"); \
  848. return false; \
  849. } \
  850. next_state = container->obj->type == UCL_OBJECT ? \
  851. read_assoc_key : read_array_value; \
  852. } while(0)
  853. static bool
  854. ucl_msgpack_consume (struct ucl_parser *parser)
  855. {
  856. const unsigned char *p, *end, *key = NULL;
  857. struct ucl_stack *container;
  858. enum e_msgpack_parser_state {
  859. read_type,
  860. start_assoc,
  861. start_array,
  862. read_assoc_key,
  863. read_assoc_value,
  864. finish_assoc_value,
  865. read_array_value,
  866. finish_array_value,
  867. error_state
  868. } state = read_type, next_state = error_state;
  869. struct ucl_msgpack_parser *obj_parser = NULL;
  870. uint64_t len = 0;
  871. ssize_t ret, remain, keylen = 0;
  872. #ifdef MSGPACK_DEBUG_PARSER
  873. uint64_t i;
  874. enum e_msgpack_parser_state hist[256];
  875. #endif
  876. p = parser->chunks->begin;
  877. remain = parser->chunks->remain;
  878. end = p + remain;
  879. while (p < end) {
  880. #ifdef MSGPACK_DEBUG_PARSER
  881. hist[i++ % 256] = state;
  882. #endif
  883. switch (state) {
  884. case read_type:
  885. obj_parser = ucl_msgpack_get_parser_from_type (*p);
  886. if (obj_parser == NULL) {
  887. ucl_create_err (&parser->err, "unknown msgpack format: %x",
  888. (unsigned int)*p);
  889. return false;
  890. }
  891. /* Now check length sanity */
  892. if (obj_parser->flags & MSGPACK_FLAG_FIXED) {
  893. if (obj_parser->len == 0) {
  894. /* We have an embedded size */
  895. len = *p & ~obj_parser->prefix;
  896. }
  897. else {
  898. if (remain < obj_parser->len) {
  899. ucl_create_err (&parser->err, "not enough data remain to "
  900. "read object's length: %u remain, %u needed",
  901. (unsigned)remain, obj_parser->len);
  902. return false;
  903. }
  904. len = obj_parser->len;
  905. }
  906. if (!(obj_parser->flags & MSGPACK_FLAG_TYPEVALUE)) {
  907. /* We must pass value as the second byte */
  908. if (remain > 0) {
  909. p ++;
  910. remain --;
  911. }
  912. }
  913. else {
  914. /* Len is irrelevant now */
  915. len = 0;
  916. }
  917. }
  918. else {
  919. /* Length is not embedded */
  920. if (remain < obj_parser->len) {
  921. ucl_create_err (&parser->err, "not enough data remain to "
  922. "read object's length: %u remain, %u needed",
  923. (unsigned)remain, obj_parser->len);
  924. return false;
  925. }
  926. p ++;
  927. remain --;
  928. switch (obj_parser->len) {
  929. case 1:
  930. len = *p;
  931. break;
  932. case 2:
  933. len = FROM_BE16 (*(uint16_t *)p);
  934. break;
  935. case 4:
  936. len = FROM_BE32 (*(uint32_t *)p);
  937. break;
  938. case 8:
  939. len = FROM_BE64 (*(uint64_t *)p);
  940. break;
  941. default:
  942. assert (0);
  943. break;
  944. }
  945. p += obj_parser->len;
  946. remain -= obj_parser->len;
  947. }
  948. if (obj_parser->flags & MSGPACK_FLAG_ASSOC) {
  949. /* We have just read the new associative map */
  950. state = start_assoc;
  951. }
  952. else if (obj_parser->flags & MSGPACK_FLAG_CONTAINER){
  953. state = start_array;
  954. }
  955. else {
  956. state = next_state;
  957. }
  958. break;
  959. case start_assoc:
  960. parser->cur_obj = ucl_object_new_full (UCL_OBJECT,
  961. parser->chunks->priority);
  962. /* Insert to the previous level container */
  963. if (parser->stack && !ucl_msgpack_insert_object (parser,
  964. key, keylen, parser->cur_obj)) {
  965. return false;
  966. }
  967. /* Get new container */
  968. container = ucl_msgpack_get_container (parser, obj_parser, len);
  969. if (container == NULL) {
  970. return false;
  971. }
  972. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  973. p, remain);
  974. CONSUME_RET;
  975. key = NULL;
  976. keylen = 0;
  977. if (len > 0) {
  978. state = read_type;
  979. next_state = read_assoc_key;
  980. }
  981. else {
  982. /* Empty object */
  983. state = finish_assoc_value;
  984. }
  985. break;
  986. case start_array:
  987. parser->cur_obj = ucl_object_new_full (UCL_ARRAY,
  988. parser->chunks->priority);
  989. /* Insert to the previous level container */
  990. if (parser->stack && !ucl_msgpack_insert_object (parser,
  991. key, keylen, parser->cur_obj)) {
  992. return false;
  993. }
  994. /* Get new container */
  995. container = ucl_msgpack_get_container (parser, obj_parser, len);
  996. if (container == NULL) {
  997. return false;
  998. }
  999. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1000. p, remain);
  1001. CONSUME_RET;
  1002. if (len > 0) {
  1003. state = read_type;
  1004. next_state = read_array_value;
  1005. }
  1006. else {
  1007. /* Empty array */
  1008. state = finish_array_value;
  1009. }
  1010. break;
  1011. case read_array_value:
  1012. /*
  1013. * p is now at the value start, len now contains length read and
  1014. * obj_parser contains the corresponding specific parser
  1015. */
  1016. container = parser->stack;
  1017. if (container == NULL) {
  1018. return false;
  1019. }
  1020. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1021. p, remain);
  1022. CONSUME_RET;
  1023. /* Insert value to the container and check if we have finished array */
  1024. if (!ucl_msgpack_insert_object (parser, NULL, 0,
  1025. parser->cur_obj)) {
  1026. return false;
  1027. }
  1028. if (ucl_msgpack_is_container_finished (container)) {
  1029. state = finish_array_value;
  1030. }
  1031. else {
  1032. /* Read more elements */
  1033. state = read_type;
  1034. next_state = read_array_value;
  1035. }
  1036. break;
  1037. case read_assoc_key:
  1038. /*
  1039. * Keys must have string type for ucl msgpack
  1040. */
  1041. if (!(obj_parser->flags & MSGPACK_FLAG_KEY)) {
  1042. ucl_create_err (&parser->err, "bad type for key: %u, expected "
  1043. "string", (unsigned)obj_parser->fmt);
  1044. return false;
  1045. }
  1046. key = p;
  1047. keylen = len;
  1048. if (keylen > remain || keylen == 0) {
  1049. ucl_create_err (&parser->err, "too long or empty key");
  1050. return false;
  1051. }
  1052. p += len;
  1053. remain -= len;
  1054. state = read_type;
  1055. next_state = read_assoc_value;
  1056. break;
  1057. case read_assoc_value:
  1058. /*
  1059. * p is now at the value start, len now contains length read and
  1060. * obj_parser contains the corresponding specific parser
  1061. */
  1062. container = parser->stack;
  1063. if (container == NULL) {
  1064. return false;
  1065. }
  1066. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1067. p, remain);
  1068. CONSUME_RET;
  1069. assert (key != NULL && keylen > 0);
  1070. if (!ucl_msgpack_insert_object (parser, key, keylen,
  1071. parser->cur_obj)) {
  1072. return false;
  1073. }
  1074. key = NULL;
  1075. keylen = 0;
  1076. if (ucl_msgpack_is_container_finished (container)) {
  1077. state = finish_assoc_value;
  1078. }
  1079. else {
  1080. /* Read more elements */
  1081. state = read_type;
  1082. next_state = read_assoc_key;
  1083. }
  1084. break;
  1085. case finish_array_value:
  1086. case finish_assoc_value:
  1087. GET_NEXT_STATE;
  1088. state = read_type;
  1089. break;
  1090. case error_state:
  1091. ucl_create_err (&parser->err, "invalid state machine state");
  1092. return false;
  1093. }
  1094. }
  1095. /* Check the finishing state */
  1096. switch (state) {
  1097. case start_array:
  1098. case start_assoc:
  1099. /* Empty container at the end */
  1100. if (len != 0) {
  1101. ucl_create_err (&parser->err, "invalid non-empty container at the end");
  1102. return false;
  1103. }
  1104. parser->cur_obj = ucl_object_new_full (
  1105. state == start_array ? UCL_ARRAY : UCL_OBJECT,
  1106. parser->chunks->priority);
  1107. /* Insert to the previous level container */
  1108. if (!ucl_msgpack_insert_object (parser,
  1109. key, keylen, parser->cur_obj)) {
  1110. return false;
  1111. }
  1112. /* Get new container */
  1113. container = ucl_msgpack_get_container (parser, obj_parser, len);
  1114. if (container == NULL) {
  1115. return false;
  1116. }
  1117. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1118. p, remain);
  1119. break;
  1120. case read_array_value:
  1121. case read_assoc_value:
  1122. if (len != 0) {
  1123. ucl_create_err (&parser->err, "unfinished value at the end");
  1124. return false;
  1125. }
  1126. container = parser->stack;
  1127. if (container == NULL) {
  1128. return false;
  1129. }
  1130. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1131. p, remain);
  1132. CONSUME_RET;
  1133. /* Insert value to the container and check if we have finished array */
  1134. if (!ucl_msgpack_insert_object (parser, NULL, 0,
  1135. parser->cur_obj)) {
  1136. return false;
  1137. }
  1138. break;
  1139. case finish_array_value:
  1140. case finish_assoc_value:
  1141. case read_type:
  1142. /* Valid finishing state */
  1143. break;
  1144. default:
  1145. /* Invalid finishing state */
  1146. ucl_create_err (&parser->err, "invalid state machine finishing state: %d",
  1147. state);
  1148. return false;
  1149. }
  1150. /* Rewind to the top level container */
  1151. ucl_msgpack_get_next_container (parser);
  1152. assert (parser->stack == NULL);
  1153. return true;
  1154. }
  1155. bool
  1156. ucl_parse_msgpack (struct ucl_parser *parser)
  1157. {
  1158. ucl_object_t *container = NULL;
  1159. const unsigned char *p;
  1160. bool ret;
  1161. assert (parser != NULL);
  1162. assert (parser->chunks != NULL);
  1163. assert (parser->chunks->begin != NULL);
  1164. assert (parser->chunks->remain != 0);
  1165. p = parser->chunks->begin;
  1166. if (parser->stack) {
  1167. container = parser->stack->obj;
  1168. }
  1169. /*
  1170. * When we start parsing message pack chunk, we must ensure that we
  1171. * have either a valid container or the top object inside message pack is
  1172. * of container type
  1173. */
  1174. if (container == NULL) {
  1175. if ((*p & 0x80) != 0x80 && !(*p >= 0xdc && *p <= 0xdf)) {
  1176. ucl_create_err (&parser->err, "bad top level object for msgpack");
  1177. return false;
  1178. }
  1179. }
  1180. ret = ucl_msgpack_consume (parser);
  1181. if (ret && parser->top_obj == NULL) {
  1182. parser->top_obj = parser->cur_obj;
  1183. }
  1184. return ret;
  1185. }
  1186. static ssize_t
  1187. ucl_msgpack_parse_map (struct ucl_parser *parser,
  1188. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1189. const unsigned char *pos, size_t remain)
  1190. {
  1191. container->obj = parser->cur_obj;
  1192. return 0;
  1193. }
  1194. static ssize_t
  1195. ucl_msgpack_parse_array (struct ucl_parser *parser,
  1196. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1197. const unsigned char *pos, size_t remain)
  1198. {
  1199. container->obj = parser->cur_obj;
  1200. return 0;
  1201. }
  1202. static ssize_t
  1203. ucl_msgpack_parse_string (struct ucl_parser *parser,
  1204. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1205. const unsigned char *pos, size_t remain)
  1206. {
  1207. ucl_object_t *obj;
  1208. if (len > remain) {
  1209. return -1;
  1210. }
  1211. obj = ucl_object_new_full (UCL_STRING, parser->chunks->priority);
  1212. obj->value.sv = pos;
  1213. obj->len = len;
  1214. if (fmt >= msgpack_bin8 && fmt <= msgpack_bin32) {
  1215. obj->flags |= UCL_OBJECT_BINARY;
  1216. }
  1217. if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
  1218. if (obj->flags & UCL_OBJECT_BINARY) {
  1219. obj->trash_stack[UCL_TRASH_VALUE] = malloc (len);
  1220. if (obj->trash_stack[UCL_TRASH_VALUE] != NULL) {
  1221. memcpy (obj->trash_stack[UCL_TRASH_VALUE], pos, len);
  1222. }
  1223. }
  1224. else {
  1225. ucl_copy_value_trash (obj);
  1226. }
  1227. }
  1228. parser->cur_obj = obj;
  1229. return len;
  1230. }
  1231. static ssize_t
  1232. ucl_msgpack_parse_int (struct ucl_parser *parser,
  1233. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1234. const unsigned char *pos, size_t remain)
  1235. {
  1236. ucl_object_t *obj;
  1237. int8_t iv8;
  1238. int16_t iv16;
  1239. int32_t iv32;
  1240. int64_t iv64;
  1241. uint16_t uiv16;
  1242. uint32_t uiv32;
  1243. uint64_t uiv64;
  1244. if (len > remain) {
  1245. return -1;
  1246. }
  1247. obj = ucl_object_new_full (UCL_INT, parser->chunks->priority);
  1248. switch (fmt) {
  1249. case msgpack_positive_fixint:
  1250. obj->value.iv = (*pos & 0x7f);
  1251. len = 1;
  1252. break;
  1253. case msgpack_negative_fixint:
  1254. obj->value.iv = - (*pos & 0x1f);
  1255. len = 1;
  1256. break;
  1257. case msgpack_uint8:
  1258. obj->value.iv = (unsigned char)*pos;
  1259. len = 1;
  1260. break;
  1261. case msgpack_int8:
  1262. memcpy (&iv8, pos, sizeof (iv8));
  1263. obj->value.iv = iv8;
  1264. len = 1;
  1265. break;
  1266. case msgpack_int16:
  1267. memcpy (&iv16, pos, sizeof (iv16));
  1268. iv16 = FROM_BE16 (iv16);
  1269. obj->value.iv = iv16;
  1270. len = 2;
  1271. break;
  1272. case msgpack_uint16:
  1273. memcpy (&uiv16, pos, sizeof (uiv16));
  1274. uiv16 = FROM_BE16 (uiv16);
  1275. obj->value.iv = uiv16;
  1276. len = 2;
  1277. break;
  1278. case msgpack_int32:
  1279. memcpy (&iv32, pos, sizeof (iv32));
  1280. iv32 = FROM_BE32 (iv32);
  1281. obj->value.iv = iv32;
  1282. len = 4;
  1283. break;
  1284. case msgpack_uint32:
  1285. memcpy(&uiv32, pos, sizeof(uiv32));
  1286. uiv32 = FROM_BE32(uiv32);
  1287. obj->value.iv = uiv32;
  1288. len = 4;
  1289. break;
  1290. case msgpack_int64:
  1291. memcpy (&iv64, pos, sizeof (iv64));
  1292. iv64 = FROM_BE64 (iv64);
  1293. obj->value.iv = iv64;
  1294. len = 8;
  1295. break;
  1296. case msgpack_uint64:
  1297. memcpy(&uiv64, pos, sizeof(uiv64));
  1298. uiv64 = FROM_BE64(uiv64);
  1299. obj->value.iv = uiv64;
  1300. len = 8;
  1301. break;
  1302. default:
  1303. assert (0);
  1304. break;
  1305. }
  1306. parser->cur_obj = obj;
  1307. return len;
  1308. }
  1309. static ssize_t
  1310. ucl_msgpack_parse_float (struct ucl_parser *parser,
  1311. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1312. const unsigned char *pos, size_t remain)
  1313. {
  1314. ucl_object_t *obj;
  1315. union {
  1316. uint32_t i;
  1317. float f;
  1318. } d;
  1319. uint64_t uiv64;
  1320. if (len > remain) {
  1321. return -1;
  1322. }
  1323. obj = ucl_object_new_full (UCL_FLOAT, parser->chunks->priority);
  1324. switch (fmt) {
  1325. case msgpack_float32:
  1326. memcpy(&d.i, pos, sizeof(d.i));
  1327. d.i = FROM_BE32(d.i);
  1328. /* XXX: can be slow */
  1329. obj->value.dv = d.f;
  1330. len = 4;
  1331. break;
  1332. case msgpack_float64:
  1333. memcpy(&uiv64, pos, sizeof(uiv64));
  1334. uiv64 = FROM_BE64(uiv64);
  1335. obj->value.iv = uiv64;
  1336. len = 8;
  1337. break;
  1338. default:
  1339. assert (0);
  1340. break;
  1341. }
  1342. parser->cur_obj = obj;
  1343. return len;
  1344. }
  1345. static ssize_t
  1346. ucl_msgpack_parse_bool (struct ucl_parser *parser,
  1347. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1348. const unsigned char *pos, size_t remain)
  1349. {
  1350. ucl_object_t *obj;
  1351. if (len > remain) {
  1352. return -1;
  1353. }
  1354. obj = ucl_object_new_full (UCL_BOOLEAN, parser->chunks->priority);
  1355. switch (fmt) {
  1356. case msgpack_true:
  1357. obj->value.iv = true;
  1358. break;
  1359. case msgpack_false:
  1360. obj->value.iv = false;
  1361. break;
  1362. default:
  1363. assert (0);
  1364. break;
  1365. }
  1366. parser->cur_obj = obj;
  1367. return 1;
  1368. }
  1369. static ssize_t
  1370. ucl_msgpack_parse_null (struct ucl_parser *parser,
  1371. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1372. const unsigned char *pos, size_t remain)
  1373. {
  1374. ucl_object_t *obj;
  1375. if (len > remain) {
  1376. return -1;
  1377. }
  1378. obj = ucl_object_new_full (UCL_NULL, parser->chunks->priority);
  1379. parser->cur_obj = obj;
  1380. return 1;
  1381. }
  1382. static ssize_t
  1383. ucl_msgpack_parse_ignore (struct ucl_parser *parser,
  1384. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1385. const unsigned char *pos, size_t remain)
  1386. {
  1387. if (len > remain) {
  1388. return -1;
  1389. }
  1390. switch (fmt) {
  1391. case msgpack_fixext1:
  1392. len = 2;
  1393. break;
  1394. case msgpack_fixext2:
  1395. len = 3;
  1396. break;
  1397. case msgpack_fixext4:
  1398. len = 5;
  1399. break;
  1400. case msgpack_fixext8:
  1401. len = 9;
  1402. break;
  1403. case msgpack_fixext16:
  1404. len = 17;
  1405. break;
  1406. case msgpack_ext8:
  1407. case msgpack_ext16:
  1408. case msgpack_ext32:
  1409. len = len + 1;
  1410. break;
  1411. default:
  1412. ucl_create_err (&parser->err, "bad type: %x", (unsigned)fmt);
  1413. return -1;
  1414. }
  1415. return len;
  1416. }