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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649
  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. 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. remain --;
  921. if (remain < obj_parser->len) {
  922. ucl_create_err (&parser->err, "not enough data remain to "
  923. "read object's length: %u remain, %u needed",
  924. (unsigned)remain, obj_parser->len);
  925. return false;
  926. }
  927. p ++;
  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. ucl_create_err (&parser->err, "invalid length of the length field: %u",
  943. (unsigned)obj_parser->len);
  944. return false;
  945. }
  946. p += obj_parser->len;
  947. remain -= obj_parser->len;
  948. }
  949. if (obj_parser->flags & MSGPACK_FLAG_ASSOC) {
  950. /* We have just read the new associative map */
  951. state = start_assoc;
  952. }
  953. else if (obj_parser->flags & MSGPACK_FLAG_CONTAINER){
  954. state = start_array;
  955. }
  956. else {
  957. state = next_state;
  958. }
  959. break;
  960. case start_assoc:
  961. parser->cur_obj = ucl_object_new_full (UCL_OBJECT,
  962. parser->chunks->priority);
  963. /* Insert to the previous level container */
  964. if (parser->stack && !ucl_msgpack_insert_object (parser,
  965. key, keylen, parser->cur_obj)) {
  966. return false;
  967. }
  968. /* Get new container */
  969. container = ucl_msgpack_get_container (parser, obj_parser, len);
  970. if (container == NULL) {
  971. return false;
  972. }
  973. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  974. p, remain);
  975. CONSUME_RET;
  976. key = NULL;
  977. keylen = 0;
  978. if (len > 0) {
  979. state = read_type;
  980. next_state = read_assoc_key;
  981. }
  982. else {
  983. /* Empty object */
  984. state = finish_assoc_value;
  985. }
  986. break;
  987. case start_array:
  988. parser->cur_obj = ucl_object_new_full (UCL_ARRAY,
  989. parser->chunks->priority);
  990. /* Insert to the previous level container */
  991. if (parser->stack && !ucl_msgpack_insert_object (parser,
  992. key, keylen, parser->cur_obj)) {
  993. return false;
  994. }
  995. /* Get new container */
  996. container = ucl_msgpack_get_container (parser, obj_parser, len);
  997. if (container == NULL) {
  998. return false;
  999. }
  1000. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1001. p, remain);
  1002. CONSUME_RET;
  1003. if (len > 0) {
  1004. state = read_type;
  1005. next_state = read_array_value;
  1006. }
  1007. else {
  1008. /* Empty array */
  1009. state = finish_array_value;
  1010. }
  1011. break;
  1012. case read_array_value:
  1013. /*
  1014. * p is now at the value start, len now contains length read and
  1015. * obj_parser contains the corresponding specific parser
  1016. */
  1017. container = parser->stack;
  1018. if (parser->stack == NULL) {
  1019. ucl_create_err (&parser->err,
  1020. "read assoc value when no container represented");
  1021. return false;
  1022. }
  1023. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1024. p, remain);
  1025. CONSUME_RET;
  1026. /* Insert value to the container and check if we have finished array */
  1027. if (parser->cur_obj) {
  1028. if (!ucl_msgpack_insert_object(parser, NULL, 0,
  1029. parser->cur_obj)) {
  1030. return false;
  1031. }
  1032. }
  1033. else {
  1034. /* We have parsed ext, ignore it */
  1035. }
  1036. if (ucl_msgpack_is_container_finished (container)) {
  1037. state = finish_array_value;
  1038. }
  1039. else {
  1040. /* Read more elements */
  1041. state = read_type;
  1042. next_state = read_array_value;
  1043. }
  1044. break;
  1045. case read_assoc_key:
  1046. /*
  1047. * Keys must have string type for ucl msgpack
  1048. */
  1049. if (!(obj_parser->flags & MSGPACK_FLAG_KEY)) {
  1050. ucl_create_err (&parser->err, "bad type for key: %u, expected "
  1051. "string", (unsigned)obj_parser->fmt);
  1052. return false;
  1053. }
  1054. key = p;
  1055. keylen = len;
  1056. if (keylen > remain || keylen == 0) {
  1057. ucl_create_err (&parser->err, "too long or empty key");
  1058. return false;
  1059. }
  1060. p += len;
  1061. remain -= len;
  1062. state = read_type;
  1063. next_state = read_assoc_value;
  1064. break;
  1065. case read_assoc_value:
  1066. /*
  1067. * p is now at the value start, len now contains length read and
  1068. * obj_parser contains the corresponding specific parser
  1069. */
  1070. container = parser->stack;
  1071. if (container == NULL) {
  1072. ucl_create_err (&parser->err,
  1073. "read assoc value when no container represented");
  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 (parser->cur_obj) {
  1081. if (!ucl_msgpack_insert_object(parser, key, keylen,
  1082. parser->cur_obj)) {
  1083. return false;
  1084. }
  1085. }
  1086. key = NULL;
  1087. keylen = 0;
  1088. if (ucl_msgpack_is_container_finished (container)) {
  1089. state = finish_assoc_value;
  1090. }
  1091. else {
  1092. /* Read more elements */
  1093. state = read_type;
  1094. next_state = read_assoc_key;
  1095. }
  1096. break;
  1097. case finish_array_value:
  1098. case finish_assoc_value:
  1099. GET_NEXT_STATE;
  1100. state = read_type;
  1101. break;
  1102. case error_state:
  1103. ucl_create_err (&parser->err, "invalid state machine state");
  1104. return false;
  1105. }
  1106. }
  1107. /* Check the finishing state */
  1108. switch (state) {
  1109. case start_array:
  1110. case start_assoc:
  1111. /* Empty container at the end */
  1112. if (len != 0) {
  1113. ucl_create_err (&parser->err,
  1114. "invalid non-empty container at the end; len=%zu",
  1115. (uintmax_t)len);
  1116. return false;
  1117. }
  1118. parser->cur_obj = ucl_object_new_full (
  1119. state == start_array ? UCL_ARRAY : UCL_OBJECT,
  1120. parser->chunks->priority);
  1121. if (parser->stack == NULL) {
  1122. ucl_create_err (&parser->err,
  1123. "read assoc value when no container represented");
  1124. return false;
  1125. }
  1126. /* Insert to the previous level container */
  1127. if (!ucl_msgpack_insert_object (parser,
  1128. key, keylen, parser->cur_obj)) {
  1129. return false;
  1130. }
  1131. /* Get new container */
  1132. container = ucl_msgpack_get_container (parser, obj_parser, len);
  1133. if (container == NULL) {
  1134. return false;
  1135. }
  1136. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1137. p, remain);
  1138. break;
  1139. case read_array_value:
  1140. case read_assoc_value:
  1141. if (len != 0) {
  1142. ucl_create_err (&parser->err, "unfinished value at the end");
  1143. return false;
  1144. }
  1145. container = parser->stack;
  1146. if (parser->stack == NULL) {
  1147. ucl_create_err (&parser->err,
  1148. "read assoc value when no container represented");
  1149. return false;
  1150. }
  1151. ret = obj_parser->func (parser, container, len, obj_parser->fmt,
  1152. p, remain);
  1153. CONSUME_RET;
  1154. /* Insert value to the container and check if we have finished array */
  1155. if (parser->cur_obj) {
  1156. if (!ucl_msgpack_insert_object(parser, NULL, 0,
  1157. parser->cur_obj)) {
  1158. return false;
  1159. }
  1160. }
  1161. break;
  1162. case finish_array_value:
  1163. case finish_assoc_value:
  1164. case read_type:
  1165. /* Valid finishing state */
  1166. break;
  1167. default:
  1168. /* Invalid finishing state */
  1169. ucl_create_err (&parser->err, "invalid state machine finishing state: %d",
  1170. state);
  1171. return false;
  1172. }
  1173. /* Rewind to the top level container */
  1174. ucl_msgpack_get_next_container (parser);
  1175. if (parser->stack != NULL) {
  1176. ucl_create_err (&parser->err, "incomplete container");
  1177. return false;
  1178. }
  1179. return true;
  1180. }
  1181. bool
  1182. ucl_parse_msgpack (struct ucl_parser *parser)
  1183. {
  1184. ucl_object_t *container = NULL;
  1185. const unsigned char *p;
  1186. bool ret;
  1187. assert (parser != NULL);
  1188. assert (parser->chunks != NULL);
  1189. assert (parser->chunks->begin != NULL);
  1190. assert (parser->chunks->remain != 0);
  1191. p = parser->chunks->begin;
  1192. if (parser->stack) {
  1193. container = parser->stack->obj;
  1194. }
  1195. /*
  1196. * When we start parsing message pack chunk, we must ensure that we
  1197. * have either a valid container or the top object inside message pack is
  1198. * of container type
  1199. */
  1200. if (container == NULL) {
  1201. if ((*p & 0x80) != 0x80 && !(*p >= 0xdc && *p <= 0xdf)) {
  1202. ucl_create_err (&parser->err, "bad top level object for msgpack");
  1203. return false;
  1204. }
  1205. }
  1206. ret = ucl_msgpack_consume (parser);
  1207. if (ret && parser->top_obj == NULL) {
  1208. parser->top_obj = parser->cur_obj;
  1209. }
  1210. return ret;
  1211. }
  1212. static ssize_t
  1213. ucl_msgpack_parse_map (struct ucl_parser *parser,
  1214. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1215. const unsigned char *pos, size_t remain)
  1216. {
  1217. container->obj = parser->cur_obj;
  1218. return 0;
  1219. }
  1220. static ssize_t
  1221. ucl_msgpack_parse_array (struct ucl_parser *parser,
  1222. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1223. const unsigned char *pos, size_t remain)
  1224. {
  1225. container->obj = parser->cur_obj;
  1226. return 0;
  1227. }
  1228. static ssize_t
  1229. ucl_msgpack_parse_string (struct ucl_parser *parser,
  1230. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1231. const unsigned char *pos, size_t remain)
  1232. {
  1233. ucl_object_t *obj;
  1234. if (len > remain) {
  1235. return -1;
  1236. }
  1237. obj = ucl_object_new_full (UCL_STRING, parser->chunks->priority);
  1238. obj->value.sv = pos;
  1239. obj->len = len;
  1240. if (fmt >= msgpack_bin8 && fmt <= msgpack_bin32) {
  1241. obj->flags |= UCL_OBJECT_BINARY;
  1242. }
  1243. if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
  1244. if (obj->flags & UCL_OBJECT_BINARY) {
  1245. obj->trash_stack[UCL_TRASH_VALUE] = malloc (len);
  1246. if (obj->trash_stack[UCL_TRASH_VALUE] != NULL) {
  1247. memcpy (obj->trash_stack[UCL_TRASH_VALUE], pos, len);
  1248. }
  1249. }
  1250. else {
  1251. ucl_copy_value_trash (obj);
  1252. }
  1253. }
  1254. parser->cur_obj = obj;
  1255. return len;
  1256. }
  1257. static ssize_t
  1258. ucl_msgpack_parse_int (struct ucl_parser *parser,
  1259. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1260. const unsigned char *pos, size_t remain)
  1261. {
  1262. ucl_object_t *obj;
  1263. int8_t iv8;
  1264. int16_t iv16;
  1265. int32_t iv32;
  1266. int64_t iv64;
  1267. uint16_t uiv16;
  1268. uint32_t uiv32;
  1269. uint64_t uiv64;
  1270. if (len > remain) {
  1271. return -1;
  1272. }
  1273. obj = ucl_object_new_full (UCL_INT, parser->chunks->priority);
  1274. switch (fmt) {
  1275. case msgpack_positive_fixint:
  1276. obj->value.iv = (*pos & 0x7f);
  1277. len = 1;
  1278. break;
  1279. case msgpack_negative_fixint:
  1280. obj->value.iv = - (*pos & 0x1f);
  1281. len = 1;
  1282. break;
  1283. case msgpack_uint8:
  1284. obj->value.iv = (unsigned char)*pos;
  1285. len = 1;
  1286. break;
  1287. case msgpack_int8:
  1288. memcpy (&iv8, pos, sizeof (iv8));
  1289. obj->value.iv = iv8;
  1290. len = 1;
  1291. break;
  1292. case msgpack_int16:
  1293. memcpy (&iv16, pos, sizeof (iv16));
  1294. iv16 = FROM_BE16 (iv16);
  1295. obj->value.iv = iv16;
  1296. len = 2;
  1297. break;
  1298. case msgpack_uint16:
  1299. memcpy (&uiv16, pos, sizeof (uiv16));
  1300. uiv16 = FROM_BE16 (uiv16);
  1301. obj->value.iv = uiv16;
  1302. len = 2;
  1303. break;
  1304. case msgpack_int32:
  1305. memcpy (&iv32, pos, sizeof (iv32));
  1306. iv32 = FROM_BE32 (iv32);
  1307. obj->value.iv = iv32;
  1308. len = 4;
  1309. break;
  1310. case msgpack_uint32:
  1311. memcpy(&uiv32, pos, sizeof(uiv32));
  1312. uiv32 = FROM_BE32(uiv32);
  1313. obj->value.iv = uiv32;
  1314. len = 4;
  1315. break;
  1316. case msgpack_int64:
  1317. memcpy (&iv64, pos, sizeof (iv64));
  1318. iv64 = FROM_BE64 (iv64);
  1319. obj->value.iv = iv64;
  1320. len = 8;
  1321. break;
  1322. case msgpack_uint64:
  1323. memcpy(&uiv64, pos, sizeof(uiv64));
  1324. uiv64 = FROM_BE64(uiv64);
  1325. obj->value.iv = uiv64;
  1326. len = 8;
  1327. break;
  1328. default:
  1329. assert (0);
  1330. break;
  1331. }
  1332. parser->cur_obj = obj;
  1333. return len;
  1334. }
  1335. static ssize_t
  1336. ucl_msgpack_parse_float (struct ucl_parser *parser,
  1337. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1338. const unsigned char *pos, size_t remain)
  1339. {
  1340. ucl_object_t *obj;
  1341. union {
  1342. uint32_t i;
  1343. float f;
  1344. } d;
  1345. uint64_t uiv64;
  1346. if (len > remain) {
  1347. return -1;
  1348. }
  1349. obj = ucl_object_new_full (UCL_FLOAT, parser->chunks->priority);
  1350. switch (fmt) {
  1351. case msgpack_float32:
  1352. memcpy(&d.i, pos, sizeof(d.i));
  1353. d.i = FROM_BE32(d.i);
  1354. /* XXX: can be slow */
  1355. obj->value.dv = d.f;
  1356. len = 4;
  1357. break;
  1358. case msgpack_float64:
  1359. memcpy(&uiv64, pos, sizeof(uiv64));
  1360. uiv64 = FROM_BE64(uiv64);
  1361. obj->value.iv = uiv64;
  1362. len = 8;
  1363. break;
  1364. default:
  1365. assert (0);
  1366. break;
  1367. }
  1368. parser->cur_obj = obj;
  1369. return len;
  1370. }
  1371. static ssize_t
  1372. ucl_msgpack_parse_bool (struct ucl_parser *parser,
  1373. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1374. const unsigned char *pos, size_t remain)
  1375. {
  1376. ucl_object_t *obj;
  1377. if (len > remain) {
  1378. return -1;
  1379. }
  1380. obj = ucl_object_new_full (UCL_BOOLEAN, parser->chunks->priority);
  1381. switch (fmt) {
  1382. case msgpack_true:
  1383. obj->value.iv = true;
  1384. break;
  1385. case msgpack_false:
  1386. obj->value.iv = false;
  1387. break;
  1388. default:
  1389. assert (0);
  1390. break;
  1391. }
  1392. parser->cur_obj = obj;
  1393. return 1;
  1394. }
  1395. static ssize_t
  1396. ucl_msgpack_parse_null (struct ucl_parser *parser,
  1397. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1398. const unsigned char *pos, size_t remain)
  1399. {
  1400. ucl_object_t *obj;
  1401. if (len > remain) {
  1402. return -1;
  1403. }
  1404. obj = ucl_object_new_full (UCL_NULL, parser->chunks->priority);
  1405. parser->cur_obj = obj;
  1406. return 1;
  1407. }
  1408. static ssize_t
  1409. ucl_msgpack_parse_ignore (struct ucl_parser *parser,
  1410. struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
  1411. const unsigned char *pos, size_t remain)
  1412. {
  1413. if (len > remain) {
  1414. return -1;
  1415. }
  1416. switch (fmt) {
  1417. case msgpack_fixext1:
  1418. len = 2;
  1419. break;
  1420. case msgpack_fixext2:
  1421. len = 3;
  1422. break;
  1423. case msgpack_fixext4:
  1424. len = 5;
  1425. break;
  1426. case msgpack_fixext8:
  1427. len = 9;
  1428. break;
  1429. case msgpack_fixext16:
  1430. len = 17;
  1431. break;
  1432. case msgpack_ext8:
  1433. case msgpack_ext16:
  1434. case msgpack_ext32:
  1435. len = len + 1;
  1436. break;
  1437. default:
  1438. ucl_create_err (&parser->err, "bad type: %x", (unsigned)fmt);
  1439. return -1;
  1440. }
  1441. parser->cur_obj = NULL;
  1442. return len;
  1443. }