annotate yaml/src/loader.c @ 45:6179fdcc550a

duktape: upgrade to 2.0.0, closes #610
author David Demelier <markand@malikania.fr>
date Tue, 10 Jan 2017 14:02:56 +0100
parents 4d89bd8a3f7f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
1
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 #include "yaml_private.h"
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
3
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 * API functions.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 YAML_DECLARE(int)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
10
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * Error handling.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
14
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 yaml_parser_set_composer_error(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 const char *problem, yaml_mark_t problem_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 yaml_parser_set_composer_error_context(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 const char *context, yaml_mark_t context_mark,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 const char *problem, yaml_mark_t problem_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 * Alias handling.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 yaml_parser_register_anchor(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 int index, yaml_char_t *anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * Clean up functions.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 static void
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 yaml_parser_delete_aliases(yaml_parser_t *parser);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * Composer functions.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 * Load the next document of the stream.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 YAML_DECLARE(int)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 yaml_event_t event;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 assert(parser); /* Non-NULL parser object is expected. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 assert(document); /* Non-NULL document object is expected. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 memset(document, 0, sizeof(yaml_document_t));
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 if (!STACK_INIT(parser, document->nodes, INITIAL_STACK_SIZE))
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 if (!parser->stream_start_produced) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 if (!yaml_parser_parse(parser, &event)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 assert(event.type == YAML_STREAM_START_EVENT);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 /* STREAM-START is expected. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 if (parser->stream_end_produced) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 if (!yaml_parser_parse(parser, &event)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 if (event.type == YAML_STREAM_END_EVENT) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 if (!STACK_INIT(parser, parser->aliases, INITIAL_STACK_SIZE))
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 parser->document = document;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 if (!yaml_parser_load_document(parser, &event)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 yaml_parser_delete_aliases(parser);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 parser->document = NULL;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 error:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 yaml_parser_delete_aliases(parser);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 yaml_document_delete(document);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 parser->document = NULL;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 * Set composer error.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 yaml_parser_set_composer_error(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 const char *problem, yaml_mark_t problem_mark)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 parser->error = YAML_COMPOSER_ERROR;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 parser->problem = problem;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 parser->problem_mark = problem_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 * Set composer error with context.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 yaml_parser_set_composer_error_context(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 const char *context, yaml_mark_t context_mark,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 const char *problem, yaml_mark_t problem_mark)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 parser->error = YAML_COMPOSER_ERROR;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 parser->context = context;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 parser->context_mark = context_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 parser->problem = problem;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 parser->problem_mark = problem_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 * Delete the stack of aliases.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 static void
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 yaml_parser_delete_aliases(yaml_parser_t *parser)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 while (!STACK_EMPTY(parser, parser->aliases)) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 yaml_free(POP(parser, parser->aliases).anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 STACK_DEL(parser, parser->aliases);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 * Compose a document object.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 yaml_event_t event;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 assert(first_event->type == YAML_DOCUMENT_START_EVENT);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 /* DOCUMENT-START is expected. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 parser->document->version_directive
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 = first_event->data.document_start.version_directive;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 parser->document->tag_directives.start
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 = first_event->data.document_start.tag_directives.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 parser->document->tag_directives.end
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 = first_event->data.document_start.tag_directives.end;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 parser->document->start_implicit
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 = first_event->data.document_start.implicit;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 parser->document->start_mark = first_event->start_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 if (!yaml_parser_load_node(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 assert(event.type == YAML_DOCUMENT_END_EVENT);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 /* DOCUMENT-END is expected. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 parser->document->end_implicit = event.data.document_end.implicit;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 parser->document->end_mark = event.end_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 * Compose a node.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 switch (first_event->type) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 case YAML_ALIAS_EVENT:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 return yaml_parser_load_alias(parser, first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 case YAML_SCALAR_EVENT:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 return yaml_parser_load_scalar(parser, first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 case YAML_SEQUENCE_START_EVENT:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 return yaml_parser_load_sequence(parser, first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 case YAML_MAPPING_START_EVENT:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 return yaml_parser_load_mapping(parser, first_event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 default:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 assert(0); /* Could not happen. */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 * Add an anchor.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 yaml_parser_register_anchor(yaml_parser_t *parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 int index, yaml_char_t *anchor)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 yaml_alias_data_t data;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 yaml_alias_data_t *alias_data;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 if (!anchor) return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 data.anchor = anchor;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 data.index = index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 data.mark = parser->document->nodes.start[index-1].start_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 for (alias_data = parser->aliases.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 alias_data != parser->aliases.top; alias_data ++) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 if (strcmp((char *)alias_data->anchor, (char *)anchor) == 0) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 yaml_free(anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 return yaml_parser_set_composer_error_context(parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 "found duplicate anchor; first occurence",
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 alias_data->mark, "second occurence", data.mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 if (!PUSH(parser, parser->aliases, data)) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 yaml_free(anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 return 1;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 * Compose a node corresponding to an alias.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
258
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 yaml_char_t *anchor = first_event->data.alias.anchor;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 yaml_alias_data_t *alias_data;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
264
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 for (alias_data = parser->aliases.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 alias_data != parser->aliases.top; alias_data ++) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 if (strcmp((char *)alias_data->anchor, (char *)anchor) == 0) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 yaml_free(anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 return alias_data->index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 yaml_free(anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 return yaml_parser_set_composer_error(parser, "found undefined alias",
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 first_event->start_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
277
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 * Compose a scalar node.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
281
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 yaml_node_t node;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 int index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 yaml_char_t *tag = first_event->data.scalar.tag;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
288
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
290
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 if (!tag || strcmp((char *)tag, "!") == 0) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 if (!tag) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
296
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 SCALAR_NODE_INIT(node, tag, first_event->data.scalar.value,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 first_event->data.scalar.length, first_event->data.scalar.style,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 first_event->start_mark, first_event->end_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
300
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 if (!PUSH(parser, parser->document->nodes, node)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
302
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 index = parser->document->nodes.top - parser->document->nodes.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 if (!yaml_parser_register_anchor(parser, index,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 first_event->data.scalar.anchor)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
307
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 return index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
309
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 error:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 yaml_free(first_event->data.scalar.anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 yaml_free(first_event->data.scalar.value);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
316
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 * Compose a sequence node.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 yaml_event_t event;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 yaml_node_t node;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 struct {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 yaml_node_item_t *start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 yaml_node_item_t *end;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 yaml_node_item_t *top;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 } items = { NULL, NULL, NULL };
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 int index, item_index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 yaml_char_t *tag = first_event->data.sequence_start.tag;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
333
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
335
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 if (!tag || strcmp((char *)tag, "!") == 0) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 if (!tag) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 if (!STACK_INIT(parser, items, INITIAL_STACK_SIZE)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
343
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 SEQUENCE_NODE_INIT(node, tag, items.start, items.end,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 first_event->data.sequence_start.style,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 first_event->start_mark, first_event->end_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 if (!PUSH(parser, parser->document->nodes, node)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 index = parser->document->nodes.top - parser->document->nodes.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
351
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 if (!yaml_parser_register_anchor(parser, index,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 first_event->data.sequence_start.anchor)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
356
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 while (event.type != YAML_SEQUENCE_END_EVENT) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 if (!STACK_LIMIT(parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 parser->document->nodes.start[index-1].data.sequence.items,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 INT_MAX-1)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 item_index = yaml_parser_load_node(parser, &event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 if (!item_index) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 if (!PUSH(parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 parser->document->nodes.start[index-1].data.sequence.items,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 item_index)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
368
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 parser->document->nodes.start[index-1].end_mark = event.end_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
370
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 return index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
372
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 error:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 yaml_free(first_event->data.sequence_start.anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 /*
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 * Compose a mapping node.
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 */
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 static int
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
386 yaml_event_t event;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 yaml_node_t node;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 struct {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 yaml_node_pair_t *start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 yaml_node_pair_t *end;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 yaml_node_pair_t *top;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 } pairs = { NULL, NULL, NULL };
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 int index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 yaml_node_pair_t pair;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 yaml_char_t *tag = first_event->data.mapping_start.tag;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
396
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
398
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 if (!tag || strcmp((char *)tag, "!") == 0) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 if (!tag) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
404
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 if (!STACK_INIT(parser, pairs, INITIAL_STACK_SIZE)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
406
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 MAPPING_NODE_INIT(node, tag, pairs.start, pairs.end,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 first_event->data.mapping_start.style,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 first_event->start_mark, first_event->end_mark);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
410
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 if (!PUSH(parser, parser->document->nodes, node)) goto error;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
412
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 index = parser->document->nodes.top - parser->document->nodes.start;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
414
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 if (!yaml_parser_register_anchor(parser, index,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 first_event->data.mapping_start.anchor)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
417
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
419
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 while (event.type != YAML_MAPPING_END_EVENT) {
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 if (!STACK_LIMIT(parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 parser->document->nodes.start[index-1].data.mapping.pairs,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 INT_MAX-1)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 pair.key = yaml_parser_load_node(parser, &event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 if (!pair.key) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
427 pair.value = yaml_parser_load_node(parser, &event);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 if (!pair.value) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 if (!PUSH(parser,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 parser->document->nodes.start[index-1].data.mapping.pairs,
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 pair)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 if (!yaml_parser_parse(parser, &event)) return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 parser->document->nodes.start[index-1].end_mark = event.end_mark;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
436
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
437 return index;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
438
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 error:
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
440 yaml_free(tag);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 yaml_free(first_event->data.mapping_start.anchor);
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 return 0;
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 }
4d89bd8a3f7f yaml: import 0.1.5
David Demelier <markand@malikania.fr>
parents:
diff changeset
444