2 * Copyright (c) 2015, Vsevolod Stakhov
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.
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.
31 #include "ucl_internal.h"
35 #elif defined(HAVE_SYS_ENDIAN_H)
36 #include <sys/endian.h>
37 #elif defined(HAVE_MACHINE_ENDIAN_H)
38 #include <machine/endian.h>
41 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
42 #if __BYTE_ORDER == __LITTLE_ENDIAN
43 #define __LITTLE_ENDIAN__
44 #elif __BYTE_ORDER == __BIG_ENDIAN
45 #define __BIG_ENDIAN__
47 #define __LITTLE_ENDIAN__
51 #define SWAP_LE_BE16(val) ((uint16_t) ( \
52 (uint16_t) ((uint16_t) (val) >> 8) | \
53 (uint16_t) ((uint16_t) (val) << 8)))
55 #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3)
56 # define SWAP_LE_BE32(val) ((uint32_t)__builtin_bswap32 ((uint32_t)(val)))
57 # define SWAP_LE_BE64(val) ((uint64_t)__builtin_bswap64 ((uint64_t)(val)))
59 #define SWAP_LE_BE32(val) ((uint32_t)( \
60 (((uint32_t)(val) & (uint32_t)0x000000ffU) << 24) | \
61 (((uint32_t)(val) & (uint32_t)0x0000ff00U) << 8) | \
62 (((uint32_t)(val) & (uint32_t)0x00ff0000U) >> 8) | \
63 (((uint32_t)(val) & (uint32_t)0xff000000U) >> 24)))
65 #define SWAP_LE_BE64(val) ((uint64_t)( \
67 (uint64_t)(0x00000000000000ffULL)) << 56) | \
69 (uint64_t)(0x000000000000ff00ULL)) << 40) | \
71 (uint64_t)(0x0000000000ff0000ULL)) << 24) | \
73 (uint64_t) (0x00000000ff000000ULL)) << 8) | \
75 (uint64_t)(0x000000ff00000000ULL)) >> 8) | \
77 (uint64_t)(0x0000ff0000000000ULL)) >> 24) | \
79 (uint64_t)(0x00ff000000000000ULL)) >> 40) | \
81 (uint64_t)(0xff00000000000000ULL)) >> 56)))
84 #ifdef __LITTLE_ENDIAN__
85 #define TO_BE16 SWAP_LE_BE16
86 #define TO_BE32 SWAP_LE_BE32
87 #define TO_BE64 SWAP_LE_BE64
88 #define FROM_BE16 SWAP_LE_BE16
89 #define FROM_BE32 SWAP_LE_BE32
90 #define FROM_BE64 SWAP_LE_BE64
92 #define TO_BE16(val) (uint16_t)(val)
93 #define TO_BE32(val) (uint32_t)(val)
94 #define TO_BE64(val) (uint64_t)(val)
95 #define FROM_BE16(val) (uint16_t)(val)
96 #define FROM_BE32(val) (uint32_t)(val)
97 #define FROM_BE64(val) (uint64_t)(val)
101 ucl_emitter_print_int_msgpack (struct ucl_emitter_context *ctx, int64_t val)
103 const struct ucl_emitter_functions *func = ctx->func;
104 unsigned char buf[sizeof(uint64_t) + 1];
105 const unsigned char mask_positive = 0x7f, mask_negative = 0xe0,
106 uint8_ch = 0xcc, uint16_ch = 0xcd, uint32_ch = 0xce, uint64_ch = 0xcf,
107 int8_ch = 0xd0, int16_ch = 0xd1, int32_ch = 0xd2, int64_ch = 0xd3;
112 /* Fixed num 7 bits */
114 buf[0] = mask_positive & val;
116 else if (val <= UINT8_MAX) {
121 else if (val <= UINT16_MAX) {
122 uint16_t v = TO_BE16 (val);
126 memcpy (&buf[1], &v, sizeof (v));
128 else if (val <= UINT32_MAX) {
129 uint32_t v = TO_BE32 (val);
133 memcpy (&buf[1], &v, sizeof (v));
136 uint64_t v = TO_BE64 (val);
140 memcpy (&buf[1], &v, sizeof (v));
146 uval = ((val ^ (val >> 63)) - (val >> 63));
148 if (val > -(1 << 5)) {
150 buf[0] = (mask_negative | uval) & 0xff;
152 else if (uval <= INT8_MAX) {
153 uint8_t v = (uint8_t)val;
158 else if (uval <= INT16_MAX) {
159 uint16_t v = TO_BE16 (val);
163 memcpy (&buf[1], &v, sizeof (v));
165 else if (uval <= INT32_MAX) {
166 uint32_t v = TO_BE32 (val);
170 memcpy (&buf[1], &v, sizeof (v));
173 uint64_t v = TO_BE64 (val);
177 memcpy (&buf[1], &v, sizeof (v));
181 func->ucl_emitter_append_len (buf, len, func->ud);
185 ucl_emitter_print_double_msgpack (struct ucl_emitter_context *ctx, double val)
187 const struct ucl_emitter_functions *func = ctx->func;
192 const unsigned char dbl_ch = 0xcb;
193 unsigned char buf[sizeof(double) + 1];
195 /* Convert to big endian */
200 memcpy (&buf[1], &u.d, sizeof (double));
201 func->ucl_emitter_append_len (buf, sizeof (buf), func->ud);
205 ucl_emitter_print_bool_msgpack (struct ucl_emitter_context *ctx, bool val)
207 const struct ucl_emitter_functions *func = ctx->func;
208 const unsigned char true_ch = 0xc3, false_ch = 0xc2;
210 func->ucl_emitter_append_character (val ? true_ch : false_ch, 1, func->ud);
214 ucl_emitter_print_string_msgpack (struct ucl_emitter_context *ctx,
215 const char *s, size_t len)
217 const struct ucl_emitter_functions *func = ctx->func;
218 const unsigned char fix_mask = 0xA0, l8_ch = 0xd9, l16_ch = 0xda, l32_ch = 0xdb;
219 unsigned char buf[5];
224 buf[0] = (len | fix_mask) & 0xff;
226 else if (len <= 0xff) {
231 else if (len <= 0xffff) {
232 uint16_t bl = TO_BE16 (len);
236 memcpy (&buf[1], &bl, sizeof (bl));
239 uint32_t bl = TO_BE32 (len);
243 memcpy (&buf[1], &bl, sizeof (bl));
246 func->ucl_emitter_append_len (buf, blen, func->ud);
247 func->ucl_emitter_append_len (s, len, func->ud);
251 ucl_emitter_print_binary_string_msgpack (struct ucl_emitter_context *ctx,
252 const char *s, size_t len)
254 const struct ucl_emitter_functions *func = ctx->func;
255 const unsigned char l8_ch = 0xc4, l16_ch = 0xc5, l32_ch = 0xc6;
256 unsigned char buf[5];
264 else if (len <= 0xffff) {
265 uint16_t bl = TO_BE16 (len);
269 memcpy (&buf[1], &bl, sizeof (bl));
272 uint32_t bl = TO_BE32 (len);
276 memcpy (&buf[1], &bl, sizeof (bl));
279 func->ucl_emitter_append_len (buf, blen, func->ud);
280 func->ucl_emitter_append_len (s, len, func->ud);
284 ucl_emitter_print_null_msgpack (struct ucl_emitter_context *ctx)
286 const struct ucl_emitter_functions *func = ctx->func;
287 const unsigned char nil = 0xc0;
289 func->ucl_emitter_append_character (nil, 1, func->ud);
293 ucl_emitter_print_key_msgpack (bool print_key, struct ucl_emitter_context *ctx,
294 const ucl_object_t *obj)
297 ucl_emitter_print_string_msgpack (ctx, obj->key, obj->keylen);
302 ucl_emitter_print_array_msgpack (struct ucl_emitter_context *ctx, size_t len)
304 const struct ucl_emitter_functions *func = ctx->func;
305 const unsigned char fix_mask = 0x90, l16_ch = 0xdc, l32_ch = 0xdd;
306 unsigned char buf[5];
311 buf[0] = (len | fix_mask) & 0xff;
313 else if (len <= 0xffff) {
314 uint16_t bl = TO_BE16 (len);
318 memcpy (&buf[1], &bl, sizeof (bl));
321 uint32_t bl = TO_BE32 (len);
325 memcpy (&buf[1], &bl, sizeof (bl));
328 func->ucl_emitter_append_len (buf, blen, func->ud);
332 ucl_emitter_print_object_msgpack (struct ucl_emitter_context *ctx, size_t len)
334 const struct ucl_emitter_functions *func = ctx->func;
335 const unsigned char fix_mask = 0x80, l16_ch = 0xde, l32_ch = 0xdf;
336 unsigned char buf[5];
341 buf[0] = (len | fix_mask) & 0xff;
343 else if (len <= 0xffff) {
344 uint16_t bl = TO_BE16 (len);
348 memcpy (&buf[1], &bl, sizeof (bl));
351 uint32_t bl = TO_BE32 (len);
355 memcpy (&buf[1], &bl, sizeof (bl));
358 func->ucl_emitter_append_len (buf, blen, func->ud);
362 enum ucl_msgpack_format {
363 msgpack_positive_fixint = 0,
398 msgpack_negative_fixint,
402 typedef ssize_t (*ucl_msgpack_parse_function)(struct ucl_parser *parser,
403 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
404 const unsigned char *pos, size_t remain);
406 static ssize_t ucl_msgpack_parse_map (struct ucl_parser *parser,
407 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
408 const unsigned char *pos, size_t remain);
409 static ssize_t ucl_msgpack_parse_array (struct ucl_parser *parser,
410 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
411 const unsigned char *pos, size_t remain);
412 static ssize_t ucl_msgpack_parse_string (struct ucl_parser *parser,
413 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
414 const unsigned char *pos, size_t remain);
415 static ssize_t ucl_msgpack_parse_int (struct ucl_parser *parser,
416 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
417 const unsigned char *pos, size_t remain);
418 static ssize_t ucl_msgpack_parse_float (struct ucl_parser *parser,
419 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
420 const unsigned char *pos, size_t remain);
421 static ssize_t ucl_msgpack_parse_bool (struct ucl_parser *parser,
422 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
423 const unsigned char *pos, size_t remain);
424 static ssize_t ucl_msgpack_parse_null (struct ucl_parser *parser,
425 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
426 const unsigned char *pos, size_t remain);
427 static ssize_t ucl_msgpack_parse_ignore (struct ucl_parser *parser,
428 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
429 const unsigned char *pos, size_t remain);
431 #define MSGPACK_FLAG_FIXED (1 << 0)
432 #define MSGPACK_FLAG_CONTAINER (1 << 1)
433 #define MSGPACK_FLAG_TYPEVALUE (1 << 2)
434 #define MSGPACK_FLAG_EXT (1 << 3)
435 #define MSGPACK_FLAG_ASSOC (1 << 4)
436 #define MSGPACK_FLAG_KEY (1 << 5)
439 * Search tree packed in array
441 struct ucl_msgpack_parser {
442 uint8_t prefix; /* Prefix byte */
443 uint8_t prefixlen; /* Length of prefix in bits */
444 uint8_t fmt; /* The desired format */
445 uint8_t len; /* Length of the object
447 or length of value in case
449 uint8_t flags; /* Flags of the specified type */
450 ucl_msgpack_parse_function func; /* Parser function */
457 MSGPACK_FLAG_FIXED|MSGPACK_FLAG_KEY,
458 ucl_msgpack_parse_string
463 msgpack_positive_fixint,
465 MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
466 ucl_msgpack_parse_int
471 msgpack_negative_fixint,
473 MSGPACK_FLAG_FIXED|MSGPACK_FLAG_TYPEVALUE,
474 ucl_msgpack_parse_int
481 MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
482 ucl_msgpack_parse_map
489 MSGPACK_FLAG_FIXED|MSGPACK_FLAG_CONTAINER,
490 ucl_msgpack_parse_array
498 ucl_msgpack_parse_string
506 ucl_msgpack_parse_string
514 ucl_msgpack_parse_int
522 ucl_msgpack_parse_int
530 ucl_msgpack_parse_int
538 ucl_msgpack_parse_int
546 ucl_msgpack_parse_float
554 ucl_msgpack_parse_float
561 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
562 ucl_msgpack_parse_bool
569 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
570 ucl_msgpack_parse_bool
578 ucl_msgpack_parse_int
586 ucl_msgpack_parse_int
594 ucl_msgpack_parse_int
602 ucl_msgpack_parse_int
609 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_TYPEVALUE,
610 ucl_msgpack_parse_null
618 ucl_msgpack_parse_string
626 ucl_msgpack_parse_string
634 ucl_msgpack_parse_string
642 ucl_msgpack_parse_string
649 MSGPACK_FLAG_CONTAINER,
650 ucl_msgpack_parse_array
657 MSGPACK_FLAG_CONTAINER,
658 ucl_msgpack_parse_array
665 MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
666 ucl_msgpack_parse_map
673 MSGPACK_FLAG_CONTAINER|MSGPACK_FLAG_ASSOC,
674 ucl_msgpack_parse_map
682 ucl_msgpack_parse_ignore
690 ucl_msgpack_parse_ignore
698 ucl_msgpack_parse_ignore
705 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
706 ucl_msgpack_parse_ignore
713 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
714 ucl_msgpack_parse_ignore
721 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
722 ucl_msgpack_parse_ignore
729 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
730 ucl_msgpack_parse_ignore
737 MSGPACK_FLAG_FIXED | MSGPACK_FLAG_EXT,
738 ucl_msgpack_parse_ignore
742 #undef MSGPACK_DEBUG_PARSER
744 static inline struct ucl_msgpack_parser *
745 ucl_msgpack_get_parser_from_type (unsigned char t)
747 unsigned int i, shift, mask;
749 for (i = 0; i < sizeof (parsers) / sizeof (parsers[0]); i ++) {
750 shift = CHAR_BIT - parsers[i].prefixlen;
751 mask = parsers[i].prefix >> shift;
753 if (mask == (((unsigned int)t) >> shift)) {
761 static inline struct ucl_stack *
762 ucl_msgpack_get_container (struct ucl_parser *parser,
763 struct ucl_msgpack_parser *obj_parser, uint64_t len)
765 struct ucl_stack *stack;
767 assert (obj_parser != NULL);
769 if (obj_parser->flags & MSGPACK_FLAG_CONTAINER) {
771 * Insert new container to the stack
773 if (parser->stack == NULL) {
774 parser->stack = calloc (1, sizeof (struct ucl_stack));
776 if (parser->stack == NULL) {
777 ucl_create_err (&parser->err, "no memory");
781 parser->stack->chunk = parser->chunks;
784 stack = calloc (1, sizeof (struct ucl_stack));
787 ucl_create_err (&parser->err, "no memory");
791 stack->chunk = parser->chunks;
792 stack->next = parser->stack;
793 parser->stack = stack;
796 parser->stack->e.len = len;
798 #ifdef MSGPACK_DEBUG_PARSER
799 stack = parser->stack;
801 fprintf(stderr, "+");
805 fprintf(stderr, "%s -> %d\n", obj_parser->flags & MSGPACK_FLAG_ASSOC ? "object" : "array", (int)len);
810 * Get the current stack top
813 return parser->stack;
816 ucl_create_err (&parser->err, "bad top level object for msgpack");
821 return parser->stack;
825 ucl_msgpack_is_container_finished (struct ucl_stack *container)
827 assert (container != NULL);
830 if (container->e.len == 0) {
838 ucl_msgpack_insert_object (struct ucl_parser *parser,
839 const unsigned char *key,
840 size_t keylen, ucl_object_t *obj)
842 struct ucl_stack *container;
844 container = parser->stack;
845 assert (container != NULL);
846 assert (container->e.len > 0);
847 assert (obj != NULL);
848 assert (container->obj != NULL);
850 if (container->obj->type == UCL_ARRAY) {
851 ucl_array_append (container->obj, obj);
853 else if (container->obj->type == UCL_OBJECT) {
854 if (key == NULL || keylen == 0) {
855 ucl_create_err (&parser->err, "cannot insert object with no key");
860 obj->keylen = keylen;
862 if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
863 ucl_copy_key_trash (obj);
866 ucl_parser_process_object_element (parser, obj);
869 ucl_create_err (&parser->err, "bad container type");
878 static struct ucl_stack *
879 ucl_msgpack_get_next_container (struct ucl_parser *parser)
881 struct ucl_stack *cur = NULL;
893 /* We need to switch to the previous container */
894 parser->stack = cur->next;
895 parser->cur_obj = cur->obj;
898 #ifdef MSGPACK_DEBUG_PARSER
901 fprintf(stderr, "-");
904 fprintf(stderr, "-%s -> %d\n", parser->cur_obj->type == UCL_OBJECT ? "object" : "array", (int)parser->cur_obj->len);
907 return ucl_msgpack_get_next_container (parser);
911 * For UCL containers we don't know length, so we just insert the whole
912 * message pack blob into the top level container
915 assert (cur->obj != NULL);
920 #define CONSUME_RET do { \
925 assert (remain >= 0); \
928 ucl_create_err (&parser->err, \
929 "cannot parse type %d of len %u", \
930 (int)obj_parser->fmt, \
936 #define GET_NEXT_STATE do { \
937 container = ucl_msgpack_get_next_container (parser); \
938 if (container == NULL) { \
939 ucl_create_err (&parser->err, \
940 "empty container"); \
943 next_state = container->obj->type == UCL_OBJECT ? \
944 read_assoc_key : read_array_value; \
948 ucl_msgpack_consume (struct ucl_parser *parser)
950 const unsigned char *p, *end, *key = NULL;
951 struct ucl_stack *container;
952 enum e_msgpack_parser_state {
962 } state = read_type, next_state = error_state;
963 struct ucl_msgpack_parser *obj_parser = NULL;
965 ssize_t ret, remain, keylen = 0;
966 #ifdef MSGPACK_DEBUG_PARSER
968 enum e_msgpack_parser_state hist[256];
971 p = parser->chunks->begin;
972 remain = parser->chunks->remain;
977 #ifdef MSGPACK_DEBUG_PARSER
978 hist[i++ % 256] = state;
982 obj_parser = ucl_msgpack_get_parser_from_type (*p);
984 if (obj_parser == NULL) {
985 ucl_create_err (&parser->err, "unknown msgpack format: %x",
990 /* Now check length sanity */
991 if (obj_parser->flags & MSGPACK_FLAG_FIXED) {
992 if (obj_parser->len == 0) {
993 /* We have an embedded size */
994 len = *p & ~obj_parser->prefix;
997 if (remain < obj_parser->len) {
998 ucl_create_err (&parser->err, "not enough data remain to "
999 "read object's length: %u remain, %u needed",
1000 (unsigned)remain, obj_parser->len);
1005 len = obj_parser->len;
1008 if (!(obj_parser->flags & MSGPACK_FLAG_TYPEVALUE)) {
1009 /* We must pass value as the second byte */
1016 /* Len is irrelevant now */
1021 /* Length is not embedded */
1024 if (remain < obj_parser->len) {
1025 ucl_create_err (&parser->err, "not enough data remain to "
1026 "read object's length: %u remain, %u needed",
1027 (unsigned)remain, obj_parser->len);
1034 switch (obj_parser->len) {
1039 len = FROM_BE16 (*(uint16_t *)p);
1042 len = FROM_BE32 (*(uint32_t *)p);
1045 len = FROM_BE64 (*(uint64_t *)p);
1048 ucl_create_err (&parser->err, "invalid length of the length field: %u",
1049 (unsigned)obj_parser->len);
1054 p += obj_parser->len;
1055 remain -= obj_parser->len;
1058 if (obj_parser->flags & MSGPACK_FLAG_ASSOC) {
1059 /* We have just read the new associative map */
1060 state = start_assoc;
1062 else if (obj_parser->flags & MSGPACK_FLAG_CONTAINER){
1063 state = start_array;
1071 parser->cur_obj = ucl_object_new_full (UCL_OBJECT,
1072 parser->chunks->priority);
1073 /* Insert to the previous level container */
1074 if (parser->stack && !ucl_msgpack_insert_object (parser,
1075 key, keylen, parser->cur_obj)) {
1078 /* Get new container */
1079 container = ucl_msgpack_get_container (parser, obj_parser, len);
1081 if (container == NULL) {
1085 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1093 next_state = read_assoc_key;
1097 state = finish_assoc_value;
1102 parser->cur_obj = ucl_object_new_full (UCL_ARRAY,
1103 parser->chunks->priority);
1104 /* Insert to the previous level container */
1105 if (parser->stack && !ucl_msgpack_insert_object (parser,
1106 key, keylen, parser->cur_obj)) {
1109 /* Get new container */
1110 container = ucl_msgpack_get_container (parser, obj_parser, len);
1112 if (container == NULL) {
1116 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1122 next_state = read_array_value;
1126 state = finish_array_value;
1130 case read_array_value:
1132 * p is now at the value start, len now contains length read and
1133 * obj_parser contains the corresponding specific parser
1135 container = parser->stack;
1137 if (parser->stack == NULL) {
1138 ucl_create_err (&parser->err,
1139 "read assoc value when no container represented");
1143 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1148 /* Insert value to the container and check if we have finished array */
1149 if (!ucl_msgpack_insert_object (parser, NULL, 0,
1154 if (ucl_msgpack_is_container_finished (container)) {
1155 state = finish_array_value;
1158 /* Read more elements */
1160 next_state = read_array_value;
1165 case read_assoc_key:
1167 * Keys must have string type for ucl msgpack
1169 if (!(obj_parser->flags & MSGPACK_FLAG_KEY)) {
1170 ucl_create_err (&parser->err, "bad type for key: %u, expected "
1171 "string", (unsigned)obj_parser->fmt);
1179 if (keylen > remain || keylen == 0) {
1180 ucl_create_err (&parser->err, "too long or empty key");
1188 next_state = read_assoc_value;
1191 case read_assoc_value:
1193 * p is now at the value start, len now contains length read and
1194 * obj_parser contains the corresponding specific parser
1196 container = parser->stack;
1198 if (container == NULL) {
1199 ucl_create_err (&parser->err,
1200 "read assoc value when no container represented");
1204 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1208 assert (key != NULL && keylen > 0);
1210 if (!ucl_msgpack_insert_object (parser, key, keylen,
1219 if (ucl_msgpack_is_container_finished (container)) {
1220 state = finish_assoc_value;
1223 /* Read more elements */
1225 next_state = read_assoc_key;
1229 case finish_array_value:
1230 case finish_assoc_value:
1236 ucl_create_err (&parser->err, "invalid state machine state");
1242 /* Check the finishing state */
1246 /* Empty container at the end */
1248 ucl_create_err (&parser->err,
1249 "invalid non-empty container at the end; len=%zu",
1255 parser->cur_obj = ucl_object_new_full (
1256 state == start_array ? UCL_ARRAY : UCL_OBJECT,
1257 parser->chunks->priority);
1259 if (parser->stack == NULL) {
1260 ucl_create_err (&parser->err,
1261 "read assoc value when no container represented");
1264 /* Insert to the previous level container */
1265 if (!ucl_msgpack_insert_object (parser,
1266 key, keylen, parser->cur_obj)) {
1269 /* Get new container */
1270 container = ucl_msgpack_get_container (parser, obj_parser, len);
1272 if (container == NULL) {
1276 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1280 case read_array_value:
1281 case read_assoc_value:
1283 ucl_create_err (&parser->err, "unfinished value at the end");
1288 container = parser->stack;
1290 if (parser->stack == NULL) {
1291 ucl_create_err (&parser->err,
1292 "read assoc value when no container represented");
1296 ret = obj_parser->func (parser, container, len, obj_parser->fmt,
1301 /* Insert value to the container and check if we have finished array */
1302 if (!ucl_msgpack_insert_object (parser, NULL, 0,
1307 case finish_array_value:
1308 case finish_assoc_value:
1310 /* Valid finishing state */
1313 /* Invalid finishing state */
1314 ucl_create_err (&parser->err, "invalid state machine finishing state: %d",
1320 /* Rewind to the top level container */
1321 ucl_msgpack_get_next_container (parser);
1323 if (parser->stack != NULL) {
1324 ucl_create_err (&parser->err, "incomplete container");
1333 ucl_parse_msgpack (struct ucl_parser *parser)
1335 ucl_object_t *container = NULL;
1336 const unsigned char *p;
1339 assert (parser != NULL);
1340 assert (parser->chunks != NULL);
1341 assert (parser->chunks->begin != NULL);
1342 assert (parser->chunks->remain != 0);
1344 p = parser->chunks->begin;
1346 if (parser->stack) {
1347 container = parser->stack->obj;
1351 * When we start parsing message pack chunk, we must ensure that we
1352 * have either a valid container or the top object inside message pack is
1355 if (container == NULL) {
1356 if ((*p & 0x80) != 0x80 && !(*p >= 0xdc && *p <= 0xdf)) {
1357 ucl_create_err (&parser->err, "bad top level object for msgpack");
1362 ret = ucl_msgpack_consume (parser);
1364 if (ret && parser->top_obj == NULL) {
1365 parser->top_obj = parser->cur_obj;
1372 ucl_msgpack_parse_map (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)
1376 container->obj = parser->cur_obj;
1382 ucl_msgpack_parse_array (struct ucl_parser *parser,
1383 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1384 const unsigned char *pos, size_t remain)
1386 container->obj = parser->cur_obj;
1392 ucl_msgpack_parse_string (struct ucl_parser *parser,
1393 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1394 const unsigned char *pos, size_t remain)
1402 obj = ucl_object_new_full (UCL_STRING, parser->chunks->priority);
1403 obj->value.sv = pos;
1406 if (fmt >= msgpack_bin8 && fmt <= msgpack_bin32) {
1407 obj->flags |= UCL_OBJECT_BINARY;
1410 if (!(parser->flags & UCL_PARSER_ZEROCOPY)) {
1411 if (obj->flags & UCL_OBJECT_BINARY) {
1412 obj->trash_stack[UCL_TRASH_VALUE] = malloc (len);
1414 if (obj->trash_stack[UCL_TRASH_VALUE] != NULL) {
1415 memcpy (obj->trash_stack[UCL_TRASH_VALUE], pos, len);
1419 ucl_copy_value_trash (obj);
1423 parser->cur_obj = obj;
1429 ucl_msgpack_parse_int (struct ucl_parser *parser,
1430 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1431 const unsigned char *pos, size_t remain)
1447 obj = ucl_object_new_full (UCL_INT, parser->chunks->priority);
1450 case msgpack_positive_fixint:
1451 obj->value.iv = (*pos & 0x7f);
1454 case msgpack_negative_fixint:
1455 obj->value.iv = - (*pos & 0x1f);
1459 obj->value.iv = (unsigned char)*pos;
1463 memcpy (&iv8, pos, sizeof (iv8));
1464 obj->value.iv = iv8;
1468 memcpy (&iv16, pos, sizeof (iv16));
1469 iv16 = FROM_BE16 (iv16);
1470 obj->value.iv = iv16;
1473 case msgpack_uint16:
1474 memcpy (&uiv16, pos, sizeof (uiv16));
1475 uiv16 = FROM_BE16 (uiv16);
1476 obj->value.iv = uiv16;
1480 memcpy (&iv32, pos, sizeof (iv32));
1481 iv32 = FROM_BE32 (iv32);
1482 obj->value.iv = iv32;
1485 case msgpack_uint32:
1486 memcpy(&uiv32, pos, sizeof(uiv32));
1487 uiv32 = FROM_BE32(uiv32);
1488 obj->value.iv = uiv32;
1492 memcpy (&iv64, pos, sizeof (iv64));
1493 iv64 = FROM_BE64 (iv64);
1494 obj->value.iv = iv64;
1497 case msgpack_uint64:
1498 memcpy(&uiv64, pos, sizeof(uiv64));
1499 uiv64 = FROM_BE64(uiv64);
1500 obj->value.iv = uiv64;
1508 parser->cur_obj = obj;
1514 ucl_msgpack_parse_float (struct ucl_parser *parser,
1515 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1516 const unsigned char *pos, size_t remain)
1529 obj = ucl_object_new_full (UCL_FLOAT, parser->chunks->priority);
1532 case msgpack_float32:
1533 memcpy(&d.i, pos, sizeof(d.i));
1534 d.i = FROM_BE32(d.i);
1535 /* XXX: can be slow */
1536 obj->value.dv = d.f;
1539 case msgpack_float64:
1540 memcpy(&uiv64, pos, sizeof(uiv64));
1541 uiv64 = FROM_BE64(uiv64);
1542 obj->value.iv = uiv64;
1550 parser->cur_obj = obj;
1556 ucl_msgpack_parse_bool (struct ucl_parser *parser,
1557 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1558 const unsigned char *pos, size_t remain)
1566 obj = ucl_object_new_full (UCL_BOOLEAN, parser->chunks->priority);
1570 obj->value.iv = true;
1573 obj->value.iv = false;
1580 parser->cur_obj = obj;
1586 ucl_msgpack_parse_null (struct ucl_parser *parser,
1587 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1588 const unsigned char *pos, size_t remain)
1596 obj = ucl_object_new_full (UCL_NULL, parser->chunks->priority);
1597 parser->cur_obj = obj;
1603 ucl_msgpack_parse_ignore (struct ucl_parser *parser,
1604 struct ucl_stack *container, size_t len, enum ucl_msgpack_format fmt,
1605 const unsigned char *pos, size_t remain)
1612 case msgpack_fixext1:
1615 case msgpack_fixext2:
1618 case msgpack_fixext4:
1621 case msgpack_fixext8:
1624 case msgpack_fixext16:
1633 ucl_create_err (&parser->err, "bad type: %x", (unsigned)fmt);