Lines Matching full:parser
31 * The implementation of ucl parser
43 * @param parser
61 ucl_set_err (struct ucl_parser *parser, int code, const char *str, UT_string **err) in ucl_set_err() argument
64 struct ucl_chunk *chunk = parser->chunks; in ucl_set_err()
66 if (parser->cur_file) { in ucl_set_err()
67 filename = parser->cur_file; in ucl_set_err()
91 parser->err_code = code; in ucl_set_err()
92 parser->state = UCL_STATE_ERROR; in ucl_set_err()
96 ucl_save_comment (struct ucl_parser *parser, const char *begin, size_t len) in ucl_save_comment() argument
103 if (parser->last_comment) { in ucl_save_comment()
105 DL_APPEND (parser->last_comment, nobj); in ucl_save_comment()
108 parser->last_comment = nobj; in ucl_save_comment()
114 ucl_attach_comment (struct ucl_parser *parser, ucl_object_t *obj, bool before) in ucl_attach_comment() argument
116 if (parser->last_comment) { in ucl_attach_comment()
117 ucl_object_insert_key (parser->comments, parser->last_comment, in ucl_attach_comment()
121 parser->last_comment->flags |= UCL_OBJECT_INHERITED; in ucl_attach_comment()
124 parser->last_comment = NULL; in ucl_attach_comment()
130 * @param parser
134 ucl_skip_comments (struct ucl_parser *parser) in ucl_skip_comments() argument
136 struct ucl_chunk *chunk = parser->chunks; in ucl_skip_comments()
145 if (parser->state != UCL_STATE_SCOMMENT && in ucl_skip_comments()
146 parser->state != UCL_STATE_MCOMMENT) { in ucl_skip_comments()
151 if (parser->flags & UCL_PARSER_SAVE_COMMENTS) { in ucl_skip_comments()
152 ucl_save_comment (parser, beg, p - beg); in ucl_skip_comments()
182 if (parser->flags & UCL_PARSER_SAVE_COMMENTS) { in ucl_skip_comments()
183 ucl_save_comment (parser, beg, p - beg + 1); in ucl_skip_comments()
204 ucl_set_err (parser, UCL_ENESTED, in ucl_skip_comments()
205 "unfinished multiline comment", &parser->err); in ucl_skip_comments()
211 if (beg && p > beg && (parser->flags & UCL_PARSER_SAVE_COMMENTS)) { in ucl_skip_comments()
212 ucl_save_comment (parser, beg, p - beg); in ucl_skip_comments()
305 * @param parser
314 ucl_check_variable_safe (struct ucl_parser *parser, const char *ptr, size_t remain, in ucl_check_variable_safe() argument
322 LL_FOREACH (parser->variables, var) { in ucl_check_variable_safe()
344 if (!(*found) && parser->var_handler != NULL && strict) { in ucl_check_variable_safe()
346 if (parser->var_handler (ptr, remain, &dst, &dstlen, &need_free, in ucl_check_variable_safe()
347 parser->var_data)) { in ucl_check_variable_safe()
362 * @param parser
370 ucl_check_variable (struct ucl_parser *parser, const char *ptr, in ucl_check_variable() argument
382 ret = ucl_check_variable_safe (parser, ptr + 1, p - ptr - 1, in ucl_check_variable()
401 ret = ucl_check_variable_safe (parser, ptr, remain, out_len, false, &found); in ucl_check_variable()
419 * @param parser
426 ucl_expand_single_variable (struct ucl_parser *parser, const char *ptr, in ucl_expand_single_variable() argument
452 LL_FOREACH (parser->variables, var) { in ucl_expand_single_variable()
464 if (strict && parser->var_handler != NULL) { in ucl_expand_single_variable()
465 if (parser->var_handler (p, remain, &dst, &dstlen, &need_free, in ucl_expand_single_variable()
466 parser->var_data)) { in ucl_expand_single_variable()
498 * @param parser
505 ucl_expand_variable (struct ucl_parser *parser, unsigned char **dst, in ucl_expand_variable() argument
513 if (parser->flags & UCL_PARSER_DISABLE_MACRO) { in ucl_expand_variable()
521 p = ucl_check_variable (parser, p + 1, end - p - 1, &out_len, &vars_found); in ucl_expand_variable()
544 p = ucl_expand_single_variable (parser, p, end - p, &d); in ucl_expand_variable()
558 * @param parser parser object
570 ucl_copy_or_store_ptr (struct ucl_parser *parser, in ucl_copy_or_store_ptr() argument
580 (need_expand && parser->variables != NULL) || in ucl_copy_or_store_ptr()
581 !(parser->flags & UCL_PARSER_ZEROCOPY)) { in ucl_copy_or_store_ptr()
585 ucl_set_err (parser, UCL_EINTERNAL, "cannot allocate memory for a string", in ucl_copy_or_store_ptr()
586 &parser->err); in ucl_copy_or_store_ptr()
608 ret = ucl_expand_variable (parser, dst, tmp, ret); in ucl_copy_or_store_ptr()
631 * @param parser
637 ucl_parser_add_container (ucl_object_t *obj, struct ucl_parser *parser, in ucl_parser_add_container() argument
644 nobj = ucl_object_new_full (is_array ? UCL_ARRAY : UCL_OBJECT, parser->chunks->priority); in ucl_parser_add_container()
651 ucl_set_err (parser, UCL_EMERGE, in ucl_parser_add_container()
653 &parser->err); in ucl_parser_add_container()
663 nobj->value.ov = ucl_hash_create (parser->flags & UCL_PARSER_KEY_LOWERCASE); in ucl_parser_add_container()
668 parser->state = UCL_STATE_KEY; in ucl_parser_add_container()
670 parser->state = UCL_STATE_VALUE; in ucl_parser_add_container()
682 ucl_set_err (parser, UCL_ENESTED, in ucl_parser_add_container()
684 &parser->err); in ucl_parser_add_container()
694 st->e.params.line = parser->chunks->line; in ucl_parser_add_container()
695 st->chunk = parser->chunks; in ucl_parser_add_container()
704 LL_PREPEND (parser->stack, st); in ucl_parser_add_container()
705 parser->cur_obj = nobj; in ucl_parser_add_container()
712 ucl_set_err (parser, UCL_EINTERNAL, "cannot allocate memory for an object", in ucl_parser_add_container()
713 &parser->err); in ucl_parser_add_container()
975 * @param parser
981 ucl_lex_number (struct ucl_parser *parser, in ucl_lex_number() argument
988 true, false, ((parser->flags & UCL_PARSER_NO_TIME) == 0)); in ucl_lex_number()
997 ucl_set_err (parser, UCL_ESYNTAX, "numeric value out of range", in ucl_lex_number()
998 &parser->err); in ucl_lex_number()
1006 * @param parser
1014 ucl_lex_json_string (struct ucl_parser *parser, in ucl_lex_json_string() argument
1029 ucl_set_err (parser, UCL_ESYNTAX, "unexpected newline", in ucl_lex_json_string()
1030 &parser->err); in ucl_lex_json_string()
1033 ucl_set_err (parser, UCL_ESYNTAX, "unexpected control character", in ucl_lex_json_string()
1034 &parser->err); in ucl_lex_json_string()
1042 ucl_set_err (parser, UCL_ESYNTAX, "unfinished escape character", in ucl_lex_json_string()
1043 &parser->err); in ucl_lex_json_string()
1051 ucl_set_err (parser, UCL_ESYNTAX, "invalid utf escape", in ucl_lex_json_string()
1052 &parser->err); in ucl_lex_json_string()
1058 ucl_set_err (parser, UCL_ESYNTAX, in ucl_lex_json_string()
1060 &parser->err); in ucl_lex_json_string()
1085 ucl_set_err (parser, UCL_ESYNTAX, in ucl_lex_json_string()
1087 &parser->err); in ucl_lex_json_string()
1093 * @param parser
1099 ucl_lex_squoted_string (struct ucl_parser *parser, in ucl_lex_squoted_string() argument
1111 ucl_set_err (parser, UCL_ESYNTAX, in ucl_lex_squoted_string()
1113 &parser->err); in ucl_lex_squoted_string()
1131 ucl_set_err (parser, UCL_ESYNTAX, in ucl_lex_squoted_string()
1133 &parser->err); in ucl_lex_squoted_string()
1138 ucl_parser_append_elt (struct ucl_parser *parser, ucl_hash_t *cont, in ucl_parser_append_elt() argument
1144 if ((parser->flags & UCL_PARSER_NO_IMPLICIT_ARRAYS) == 0) { in ucl_parser_append_elt()
1148 parser->stack->obj->len ++; in ucl_parser_append_elt()
1169 ucl_parser_process_object_element (struct ucl_parser *parser, ucl_object_t *nobj) in ucl_parser_process_object_element() argument
1175 container = parser->stack->obj->value.ov; in ucl_parser_process_object_element()
1177 DL_FOREACH (parser->stack->obj, cur) { in ucl_parser_process_object_element()
1188 parser->flags & UCL_PARSER_KEY_LOWERCASE); in ucl_parser_process_object_element()
1194 parser->stack->obj->len ++; in ucl_parser_process_object_element()
1199 switch (parser->chunks->strategy) { in ucl_parser_process_object_element()
1216 ucl_parser_append_elt (parser, container, tobj, nobj); in ucl_parser_process_object_element()
1224 DL_APPEND (parser->trash_objs, nobj); in ucl_parser_process_object_element()
1244 ucl_set_err (parser, UCL_EMERGE, errmsg, &parser->err); in ucl_parser_process_object_element()
1257 ucl_parser_append_elt (parser, container, tobj, nobj); in ucl_parser_process_object_element()
1265 DL_APPEND (parser->trash_objs, nobj); in ucl_parser_process_object_element()
1275 parser->stack->obj->value.ov = container; in ucl_parser_process_object_element()
1276 parser->cur_obj = nobj; in ucl_parser_process_object_element()
1277 ucl_attach_comment (parser, nobj, false); in ucl_parser_process_object_element()
1284 * @param parser
1291 ucl_parse_key (struct ucl_parser *parser, struct ucl_chunk *chunk, in ucl_parse_key() argument
1306 if (!(parser->flags & UCL_PARSER_DISABLE_MACRO)) { in ucl_parse_key()
1310 parser->prev_state = parser->state; in ucl_parse_key()
1311 parser->state = UCL_STATE_MACRO_NAME; in ucl_parse_key()
1321 if (!ucl_skip_comments (parser)) { in ucl_parse_key()
1349 parser->prev_state = parser->state; in ucl_parse_key()
1350 parser->state = UCL_STATE_MACRO_NAME; in ucl_parse_key()
1355 ucl_set_err (parser, UCL_ESYNTAX, "key must begin with a letter", in ucl_parse_key()
1356 &parser->err); in ucl_parse_key()
1372 ucl_set_err (parser, UCL_ESYNTAX, "invalid character in a key", in ucl_parse_key()
1373 &parser->err); in ucl_parse_key()
1379 if (!ucl_lex_json_string (parser, chunk, &need_unescape, &ucl_escape, &var_expand)) { in ucl_parse_key()
1391 ucl_set_err (parser, UCL_ESYNTAX, "unfinished key", &parser->err); in ucl_parse_key()
1409 ucl_set_err (parser, UCL_ESYNTAX, "unexpected '=' character", in ucl_parse_key()
1410 &parser->err); in ucl_parse_key()
1420 ucl_set_err (parser, UCL_ESYNTAX, "unexpected ':' character", in ucl_parse_key()
1421 &parser->err); in ucl_parse_key()
1427 if (!ucl_skip_comments (parser)) { in ucl_parse_key()
1439 ucl_set_err (parser, UCL_ESYNTAX, "unfinished key", &parser->err); in ucl_parse_key()
1474 nobj = ucl_object_new_full (UCL_NULL, parser->chunks->priority); in ucl_parse_key()
1478 keylen = ucl_copy_or_store_ptr (parser, c, &nobj->trash_stack[UCL_TRASH_KEY], in ucl_parse_key()
1479 &key, end - c, need_unescape, parser->flags & UCL_PARSER_KEY_LOWERCASE, in ucl_parse_key()
1486 ucl_set_err (parser, UCL_ESYNTAX, "empty keys are not allowed", &parser->err); in ucl_parse_key()
1494 if (!ucl_parser_process_object_element (parser, nobj)) { in ucl_parse_key()
1508 * @param parser
1515 ucl_parse_string_value (struct ucl_parser *parser, in ucl_parse_string_value() argument
1577 * @param parser
1586 ucl_parse_multiline_string (struct ucl_parser *parser, in ucl_parse_multiline_string() argument
1635 ucl_parser_get_container (struct ucl_parser *parser) in ucl_parser_get_container() argument
1639 if (parser == NULL || parser->stack == NULL || parser->stack->obj == NULL) { in ucl_parser_get_container()
1643 if (parser->stack->obj->type == UCL_ARRAY) { in ucl_parser_get_container()
1645 obj = ucl_object_new_full (UCL_NULL, parser->chunks->priority); in ucl_parser_get_container()
1646 t = parser->stack->obj; in ucl_parser_get_container()
1653 parser->cur_obj = obj; in ucl_parser_get_container()
1654 ucl_attach_comment (parser, obj, false); in ucl_parser_get_container()
1658 obj = parser->cur_obj; in ucl_parser_get_container()
1666 * @param parser
1671 ucl_parse_value (struct ucl_parser *parser, struct ucl_chunk *chunk) in ucl_parse_value() argument
1687 if (!ucl_skip_comments (parser)) { in ucl_parse_value()
1699 if (!ucl_lex_json_string (parser, chunk, &need_unescape, &ucl_escape, in ucl_parse_value()
1704 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1711 if ((str_len = ucl_copy_or_store_ptr (parser, c + 1, in ucl_parse_value()
1719 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1726 if (!ucl_lex_squoted_string (parser, chunk, &need_unescape)) { in ucl_parse_value()
1730 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1739 if ((str_len = ucl_copy_or_store_ptr (parser, c + 1, in ucl_parse_value()
1748 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1753 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1758 if (parser->stack) { in ucl_parse_value()
1759 obj = ucl_parser_add_container (obj, parser, false, in ucl_parse_value()
1760 parser->stack->e.params.level, true); in ucl_parse_value()
1774 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1779 if (parser->stack) { in ucl_parse_value()
1780 obj = ucl_parser_add_container (obj, parser, true, in ucl_parse_value()
1781 parser->stack->e.params.level, true); in ucl_parse_value()
1797 if (parser->stack && parser->stack->obj->type == UCL_ARRAY) { in ucl_parse_value()
1798 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1806 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1822 if ((str_len = ucl_parse_multiline_string (parser, chunk, c, in ucl_parse_value()
1824 ucl_set_err (parser, UCL_ESYNTAX, in ucl_parse_value()
1825 "unterminated multiline value", &parser->err); in ucl_parse_value()
1831 if ((str_len = ucl_copy_or_store_ptr (parser, c, in ucl_parse_value()
1839 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1850 obj = ucl_parser_get_container (parser); in ucl_parse_value()
1855 if (!ucl_lex_number (parser, chunk, obj)) { in ucl_parse_value()
1856 if (parser->state == UCL_STATE_ERROR) { in ucl_parse_value()
1861 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1867 if (!ucl_parse_string_value (parser, chunk, &var_expand, in ucl_parse_value()
1879 ucl_set_err (parser, UCL_ESYNTAX, "string value must not be empty", in ucl_parse_value()
1880 &parser->err); in ucl_parse_value()
1899 if ((str_len = ucl_copy_or_store_ptr (parser, c, in ucl_parse_value()
1908 parser->state = UCL_STATE_AFTER_VALUE; in ucl_parse_value()
1920 * @param parser
1925 ucl_parse_after_value (struct ucl_parser *parser, struct ucl_chunk *chunk) in ucl_parse_after_value() argument
1940 if (!ucl_skip_comments (parser)) { in ucl_parse_after_value()
1949 if (parser->stack == NULL) { in ucl_parse_after_value()
1950 ucl_set_err (parser, UCL_ESYNTAX, in ucl_parse_after_value()
1952 &parser->err); in ucl_parse_after_value()
1955 if ((*p == '}' && parser->stack->obj->type == UCL_OBJECT) || in ucl_parse_after_value()
1956 (*p == ']' && parser->stack->obj->type == UCL_ARRAY)) { in ucl_parse_after_value()
1959 st = parser->stack; in ucl_parse_after_value()
1962 parser->err_code = UCL_EUNPAIRED; in ucl_parse_after_value()
1963 ucl_create_err (&parser->err, in ucl_parse_after_value()
1966 parser->chunks->line, st->e.params.line); in ucl_parse_after_value()
1971 parser->stack = st->next; in ucl_parse_after_value()
1974 if (parser->cur_obj) { in ucl_parse_after_value()
1975 ucl_attach_comment (parser, parser->cur_obj, true); in ucl_parse_after_value()
1978 while (parser->stack != NULL) { in ucl_parse_after_value()
1979 st = parser->stack; in ucl_parse_after_value()
1989 parser->stack = st->next; in ucl_parse_after_value()
1990 parser->cur_obj = st->obj; in ucl_parse_after_value()
1995 ucl_set_err (parser, UCL_ESYNTAX, in ucl_parse_after_value()
1997 &parser->err); in ucl_parse_after_value()
2001 if (parser->stack == NULL) { in ucl_parse_after_value()
2019 ucl_set_err (parser, UCL_ESYNTAX, "delimiter is missing", in ucl_parse_after_value()
2020 &parser->err); in ucl_parse_after_value()
2031 ucl_skip_macro_as_comment (struct ucl_parser *parser, in ucl_skip_macro_as_comment() argument
2122 if (parser->flags & UCL_PARSER_SAVE_COMMENTS) { in ucl_skip_macro_as_comment()
2123 ucl_save_comment (parser, c, p - c); in ucl_skip_macro_as_comment()
2135 * @param parser
2143 ucl_parse_macro_value (struct ucl_parser *parser, in ucl_parse_macro_value() argument
2157 if (!ucl_lex_json_string (parser, chunk, &need_unescape, &ucl_escape, &var_expand)) { in ucl_parse_macro_value()
2215 * @param parser parser structure
2220 ucl_parse_macro_arguments (struct ucl_parser *parser, in ucl_parse_macro_arguments() argument
2286 params_parser = ucl_parser_new (parser->flags); in ucl_parse_macro_arguments()
2288 ucl_set_err (parser, UCL_ESYNTAX, "macro arguments parsing error", in ucl_parse_macro_arguments()
2289 &parser->err); in ucl_parse_macro_arguments()
2313 #define SKIP_SPACES_COMMENTS(parser, chunk, p) do { \ argument
2317 if (!ucl_skip_comments (parser)) { \
2329 * Handle the main states of rcl parser
2330 * @param parser parser structure
2334 ucl_state_machine (struct ucl_parser *parser) in ucl_state_machine() argument
2337 struct ucl_chunk *chunk = parser->chunks; in ucl_state_machine()
2344 if (parser->top_obj == NULL) { in ucl_state_machine()
2345 parser->state = UCL_STATE_INIT; in ucl_state_machine()
2350 switch (parser->state) { in ucl_state_machine()
2357 if (!ucl_skip_comments (parser)) { in ucl_state_machine()
2358 parser->prev_state = parser->state; in ucl_state_machine()
2359 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2375 parser->state = UCL_STATE_VALUE; in ucl_state_machine()
2383 parser->state = UCL_STATE_KEY_OBRACE; in ucl_state_machine()
2387 parser->state = UCL_STATE_KEY; in ucl_state_machine()
2392 if (parser->top_obj == NULL) { in ucl_state_machine()
2393 if (parser->state == UCL_STATE_VALUE) { in ucl_state_machine()
2394 obj = ucl_parser_add_container (NULL, parser, true, 0, in ucl_state_machine()
2398 obj = ucl_parser_add_container (NULL, parser, false, 0, in ucl_state_machine()
2406 parser->top_obj = obj; in ucl_state_machine()
2407 parser->cur_obj = obj; in ucl_state_machine()
2420 parser->state = UCL_STATE_AFTER_VALUE; in ucl_state_machine()
2423 if (parser->stack == NULL) { in ucl_state_machine()
2425 ucl_set_err (parser, UCL_ESYNTAX, "top object is finished but the parser " in ucl_state_machine()
2426 "expects a key", &parser->err); in ucl_state_machine()
2427 parser->prev_state = parser->state; in ucl_state_machine()
2428 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2431 if (!ucl_parse_key (parser, chunk, &next_key, &end_of_object)) { in ucl_state_machine()
2432 parser->prev_state = parser->state; in ucl_state_machine()
2433 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2439 parser->state = UCL_STATE_AFTER_VALUE; in ucl_state_machine()
2442 else if (parser->state != UCL_STATE_MACRO_NAME) { in ucl_state_machine()
2443 if (next_key && parser->stack->obj->type == UCL_OBJECT) { in ucl_state_machine()
2445 obj = ucl_parser_add_container (parser->cur_obj, in ucl_state_machine()
2446 parser, in ucl_state_machine()
2448 parser->stack->e.params.level + 1, in ucl_state_machine()
2449 parser->state == UCL_STATE_KEY_OBRACE); in ucl_state_machine()
2455 parser->state = UCL_STATE_VALUE; in ucl_state_machine()
2465 if (!parser->cur_obj || !ucl_parse_value (parser, chunk)) { in ucl_state_machine()
2466 parser->prev_state = parser->state; in ucl_state_machine()
2467 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2474 if (!ucl_parse_after_value (parser, chunk)) { in ucl_state_machine()
2475 parser->prev_state = parser->state; in ucl_state_machine()
2476 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2480 if (parser->stack != NULL) { in ucl_state_machine()
2481 if (parser->stack->obj->type == UCL_OBJECT) { in ucl_state_machine()
2482 parser->state = UCL_STATE_KEY; in ucl_state_machine()
2486 parser->state = UCL_STATE_VALUE; in ucl_state_machine()
2497 if (parser->flags & UCL_PARSER_DISABLE_MACRO) { in ucl_state_machine()
2498 if (!ucl_skip_macro_as_comment (parser, chunk)) { in ucl_state_machine()
2500 ucl_create_err (&parser->err, in ucl_state_machine()
2505 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2510 parser->state = parser->prev_state; in ucl_state_machine()
2522 HASH_FIND (hh, parser->macroes, c, macro_len, macro); in ucl_state_machine()
2524 ucl_create_err (&parser->err, in ucl_state_machine()
2533 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2537 SKIP_SPACES_COMMENTS(parser, chunk, p); in ucl_state_machine()
2538 parser->state = UCL_STATE_MACRO; in ucl_state_machine()
2542 ucl_create_err (&parser->err, in ucl_state_machine()
2547 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2555 macro_args = ucl_parse_macro_arguments (parser, chunk); in ucl_state_machine()
2558 SKIP_SPACES_COMMENTS(parser, chunk, p); in ucl_state_machine()
2564 if (!ucl_parse_macro_value (parser, chunk, macro, in ucl_state_machine()
2566 parser->prev_state = parser->state; in ucl_state_machine()
2567 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2570 macro_len = ucl_expand_variable (parser, ¯o_escaped, in ucl_state_machine()
2572 parser->state = parser->prev_state; in ucl_state_machine()
2578 parser->top_obj, in ucl_state_machine()
2590 parser->top_obj, in ucl_state_machine()
2602 ucl_set_err (parser, UCL_EINTERNAL, in ucl_state_machine()
2603 "internal error: parser has macro undefined", &parser->err); in ucl_state_machine()
2609 chunk = parser->chunks; in ucl_state_machine()
2621 ucl_set_err (parser, UCL_EINTERNAL, in ucl_state_machine()
2622 "internal error: parser is in an unknown state", &parser->err); in ucl_state_machine()
2623 parser->state = UCL_STATE_ERROR; in ucl_state_machine()
2628 if (parser->last_comment) { in ucl_state_machine()
2629 if (parser->cur_obj) { in ucl_state_machine()
2630 ucl_attach_comment (parser, parser->cur_obj, true); in ucl_state_machine()
2632 else if (parser->stack && parser->stack->obj) { in ucl_state_machine()
2633 ucl_attach_comment (parser, parser->stack->obj, true); in ucl_state_machine()
2635 else if (parser->top_obj) { in ucl_state_machine()
2636 ucl_attach_comment (parser, parser->top_obj, true); in ucl_state_machine()
2639 ucl_object_unref (parser->last_comment); in ucl_state_machine()
2643 if (parser->stack != NULL && parser->state != UCL_STATE_ERROR) { in ucl_state_machine()
2647 LL_FOREACH (parser->stack, st) { in ucl_state_machine()
2648 if (st->chunk != parser->chunks) { in ucl_state_machine()
2652 if (parser->err == NULL) { in ucl_state_machine()
2653 utstring_new (parser->err); in ucl_state_machine()
2656 utstring_printf (parser->err, "%s:%d unmatched open brace at %d; ", in ucl_state_machine()
2658 parser->chunks->line, in ucl_state_machine()
2666 parser->err_code = UCL_EUNPAIRED; in ucl_state_machine()
2683 struct ucl_parser *parser; in ucl_parser_new() local
2685 parser = UCL_ALLOC (sizeof (struct ucl_parser)); in ucl_parser_new()
2686 if (parser == NULL) { in ucl_parser_new()
2690 memset (parser, 0, sizeof (struct ucl_parser)); in ucl_parser_new()
2692 UPRM_SAFE(ucl_parser_register_macro, parser, "include", ucl_include_handler, e0); in ucl_parser_new()
2693 UPRM_SAFE(ucl_parser_register_macro, parser, "try_include", ucl_try_include_handler, e0); in ucl_parser_new()
2694 UPRM_SAFE(ucl_parser_register_macro, parser, "includes", ucl_includes_handler, e0); in ucl_parser_new()
2695 UPRM_SAFE(ucl_parser_register_macro, parser, "priority", ucl_priority_handler, e0); in ucl_parser_new()
2696 UPRM_SAFE(ucl_parser_register_macro, parser, "load", ucl_load_handler, e0); in ucl_parser_new()
2697 UPRM_SAFE(ucl_parser_register_context_macro, parser, "inherit", ucl_inherit_handler, e0); in ucl_parser_new()
2699 parser->flags = flags; in ucl_parser_new()
2700 parser->includepaths = NULL; in ucl_parser_new()
2703 parser->comments = ucl_object_typed_new (UCL_OBJECT); in ucl_parser_new()
2708 ucl_parser_set_filevars (parser, NULL, false); in ucl_parser_new()
2711 return parser; in ucl_parser_new()
2713 ucl_parser_free(parser); in ucl_parser_new()
2718 ucl_parser_set_default_priority (struct ucl_parser *parser, unsigned prio) in ucl_parser_set_default_priority() argument
2720 if (parser == NULL) { in ucl_parser_set_default_priority()
2724 parser->default_priority = prio; in ucl_parser_set_default_priority()
2730 ucl_parser_get_default_priority (struct ucl_parser *parser) in ucl_parser_get_default_priority() argument
2732 if (parser == NULL) { in ucl_parser_get_default_priority()
2736 return parser->default_priority; in ucl_parser_get_default_priority()
2740 ucl_parser_register_macro (struct ucl_parser *parser, const char *macro, in ucl_parser_register_macro() argument
2762 HASH_ADD_KEYPTR (hh, parser->macroes, new->name, strlen (new->name), new); in ucl_parser_register_macro()
2767 ucl_parser_register_context_macro (struct ucl_parser *parser, const char *macro, in ucl_parser_register_context_macro() argument
2790 HASH_ADD_KEYPTR (hh, parser->macroes, new->name, strlen (new->name), new); in ucl_parser_register_context_macro()
2795 ucl_parser_register_variable (struct ucl_parser *parser, const char *var, in ucl_parser_register_variable() argument
2805 LL_FOREACH (parser->variables, cur) { in ucl_parser_register_variable()
2816 DL_DELETE (parser->variables, new); in ucl_parser_register_variable()
2838 DL_APPEND (parser->variables, new); in ucl_parser_register_variable()
2849 ucl_parser_set_variables_handler (struct ucl_parser *parser, in ucl_parser_set_variables_handler() argument
2852 parser->var_handler = handler; in ucl_parser_set_variables_handler()
2853 parser->var_data = ud; in ucl_parser_set_variables_handler()
2857 ucl_parser_add_chunk_full (struct ucl_parser *parser, const unsigned char *data, in ucl_parser_add_chunk_full() argument
2864 if (parser == NULL) { in ucl_parser_add_chunk_full()
2869 ucl_create_err (&parser->err, "invalid chunk added"); in ucl_parser_add_chunk_full()
2873 if (parser->state != UCL_STATE_ERROR) { in ucl_parser_add_chunk_full()
2876 ucl_create_err (&parser->err, "cannot allocate chunk structure"); in ucl_parser_add_chunk_full()
2883 LL_FOREACH (parser->special_handlers, special_handler) { in ucl_parser_add_chunk_full()
2890 if (!special_handler->handler (parser, data, len, &ndata, &nlen, in ucl_parser_add_chunk_full()
2892 ucl_create_err (&parser->err, "call for external handler failed"); in ucl_parser_add_chunk_full()
2933 if (parser->cur_file) { in ucl_parser_add_chunk_full()
2934 chunk->fname = strdup (parser->cur_file); in ucl_parser_add_chunk_full()
2937 LL_PREPEND (parser->chunks, chunk); in ucl_parser_add_chunk_full()
2938 parser->recursion ++; in ucl_parser_add_chunk_full()
2940 if (parser->recursion > UCL_MAX_RECURSION) { in ucl_parser_add_chunk_full()
2941 ucl_create_err (&parser->err, "maximum include nesting limit is reached: %d", in ucl_parser_add_chunk_full()
2942 parser->recursion); in ucl_parser_add_chunk_full()
2951 return ucl_state_machine (parser); in ucl_parser_add_chunk_full()
2953 return ucl_parse_msgpack (parser); in ucl_parser_add_chunk_full()
2955 return ucl_parse_csexp (parser); in ucl_parser_add_chunk_full()
2960 if (parser->top_obj == NULL) { in ucl_parser_add_chunk_full()
2965 parser->top_obj = ucl_object_new_full (UCL_OBJECT, priority); in ucl_parser_add_chunk_full()
2972 ucl_create_err (&parser->err, "a parser is in an invalid state"); in ucl_parser_add_chunk_full()
2978 ucl_parser_add_chunk_priority (struct ucl_parser *parser, in ucl_parser_add_chunk_priority() argument
2981 /* We dereference parser, so this check is essential */ in ucl_parser_add_chunk_priority()
2982 if (parser == NULL) { in ucl_parser_add_chunk_priority()
2986 return ucl_parser_add_chunk_full (parser, data, len, in ucl_parser_add_chunk_priority()
2991 ucl_parser_add_chunk (struct ucl_parser *parser, const unsigned char *data, in ucl_parser_add_chunk() argument
2994 if (parser == NULL) { in ucl_parser_add_chunk()
2998 return ucl_parser_add_chunk_full (parser, data, len, in ucl_parser_add_chunk()
2999 parser->default_priority, UCL_DUPLICATE_APPEND, UCL_PARSE_UCL); in ucl_parser_add_chunk()
3003 ucl_parser_insert_chunk (struct ucl_parser *parser, const unsigned char *data, in ucl_parser_insert_chunk() argument
3006 if (parser == NULL || parser->top_obj == NULL) { in ucl_parser_insert_chunk()
3013 int state = parser->state; in ucl_parser_insert_chunk()
3014 parser->state = UCL_STATE_INIT; in ucl_parser_insert_chunk()
3017 if (parser->stack != NULL && parser->stack->next != NULL) { in ucl_parser_insert_chunk()
3018 parser->stack->e.params.level = parser->stack->next->e.params.level; in ucl_parser_insert_chunk()
3021 res = ucl_parser_add_chunk_full (parser, data, len, parser->chunks->priority, in ucl_parser_insert_chunk()
3022 parser->chunks->strategy, parser->chunks->parse_type); in ucl_parser_insert_chunk()
3025 chunk = parser->chunks; in ucl_parser_insert_chunk()
3027 parser->chunks = chunk->next; in ucl_parser_insert_chunk()
3029 parser->recursion --; in ucl_parser_insert_chunk()
3032 parser->state = state; in ucl_parser_insert_chunk()
3038 ucl_parser_add_string_priority (struct ucl_parser *parser, const char *data, in ucl_parser_add_string_priority() argument
3042 ucl_create_err (&parser->err, "invalid string added"); in ucl_parser_add_string_priority()
3049 return ucl_parser_add_chunk_priority (parser, in ucl_parser_add_string_priority()
3054 ucl_parser_add_string (struct ucl_parser *parser, const char *data, in ucl_parser_add_string() argument
3057 if (parser == NULL) { in ucl_parser_add_string()
3061 return ucl_parser_add_string_priority (parser, in ucl_parser_add_string()
3062 (const unsigned char *)data, len, parser->default_priority); in ucl_parser_add_string()
3066 ucl_set_include_path (struct ucl_parser *parser, ucl_object_t *paths) in ucl_set_include_path() argument
3068 if (parser == NULL || paths == NULL) { in ucl_set_include_path()
3072 if (parser->includepaths == NULL) { in ucl_set_include_path()
3073 parser->includepaths = ucl_object_copy (paths); in ucl_set_include_path()
3076 ucl_object_unref (parser->includepaths); in ucl_set_include_path()
3077 parser->includepaths = ucl_object_copy (paths); in ucl_set_include_path()
3080 if (parser->includepaths == NULL) { in ucl_set_include_path()
3087 unsigned char ucl_parser_chunk_peek (struct ucl_parser *parser) in ucl_parser_chunk_peek() argument
3089 …if (parser == NULL || parser->chunks == NULL || parser->chunks->pos == NULL || parser->chunks->end… in ucl_parser_chunk_peek()
3090 parser->chunks->pos == parser->chunks->end) { in ucl_parser_chunk_peek()
3094 return( *parser->chunks->pos ); in ucl_parser_chunk_peek()
3097 bool ucl_parser_chunk_skip (struct ucl_parser *parser) in ucl_parser_chunk_skip() argument
3099 …if (parser == NULL || parser->chunks == NULL || parser->chunks->pos == NULL || parser->chunks->end… in ucl_parser_chunk_skip()
3100 parser->chunks->pos == parser->chunks->end) { in ucl_parser_chunk_skip()
3104 const unsigned char *p = parser->chunks->pos; in ucl_parser_chunk_skip()
3105 ucl_chunk_skipc( parser->chunks, p ); in ucl_parser_chunk_skip()
3106 if( parser->chunks->pos != NULL ) return true; in ucl_parser_chunk_skip()
3111 ucl_parser_get_current_stack_object (struct ucl_parser *parser, unsigned int depth) in ucl_parser_get_current_stack_object() argument
3115 if (parser == NULL || parser->stack == NULL) { in ucl_parser_get_current_stack_object()
3119 struct ucl_stack *stack = parser->stack; in ucl_parser_get_current_stack_object()