1*0f5c86ddSBaptiste Daroussin
2*0f5c86ddSBaptiste Daroussin #include "yaml_private.h"
3*0f5c86ddSBaptiste Daroussin
4*0f5c86ddSBaptiste Daroussin /*
5*0f5c86ddSBaptiste Daroussin * Get the library version.
6*0f5c86ddSBaptiste Daroussin */
7*0f5c86ddSBaptiste Daroussin
8*0f5c86ddSBaptiste Daroussin YAML_DECLARE(const char *)
yaml_get_version_string(void)9*0f5c86ddSBaptiste Daroussin yaml_get_version_string(void)
10*0f5c86ddSBaptiste Daroussin {
11*0f5c86ddSBaptiste Daroussin return YAML_VERSION_STRING;
12*0f5c86ddSBaptiste Daroussin }
13*0f5c86ddSBaptiste Daroussin
14*0f5c86ddSBaptiste Daroussin /*
15*0f5c86ddSBaptiste Daroussin * Get the library version numbers.
16*0f5c86ddSBaptiste Daroussin */
17*0f5c86ddSBaptiste Daroussin
18*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_get_version(int * major,int * minor,int * patch)19*0f5c86ddSBaptiste Daroussin yaml_get_version(int *major, int *minor, int *patch)
20*0f5c86ddSBaptiste Daroussin {
21*0f5c86ddSBaptiste Daroussin *major = YAML_VERSION_MAJOR;
22*0f5c86ddSBaptiste Daroussin *minor = YAML_VERSION_MINOR;
23*0f5c86ddSBaptiste Daroussin *patch = YAML_VERSION_PATCH;
24*0f5c86ddSBaptiste Daroussin }
25*0f5c86ddSBaptiste Daroussin
26*0f5c86ddSBaptiste Daroussin /*
27*0f5c86ddSBaptiste Daroussin * Allocate a dynamic memory block.
28*0f5c86ddSBaptiste Daroussin */
29*0f5c86ddSBaptiste Daroussin
30*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void *)
yaml_malloc(size_t size)31*0f5c86ddSBaptiste Daroussin yaml_malloc(size_t size)
32*0f5c86ddSBaptiste Daroussin {
33*0f5c86ddSBaptiste Daroussin return malloc(size ? size : 1);
34*0f5c86ddSBaptiste Daroussin }
35*0f5c86ddSBaptiste Daroussin
36*0f5c86ddSBaptiste Daroussin /*
37*0f5c86ddSBaptiste Daroussin * Reallocate a dynamic memory block.
38*0f5c86ddSBaptiste Daroussin */
39*0f5c86ddSBaptiste Daroussin
40*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void *)
yaml_realloc(void * ptr,size_t size)41*0f5c86ddSBaptiste Daroussin yaml_realloc(void *ptr, size_t size)
42*0f5c86ddSBaptiste Daroussin {
43*0f5c86ddSBaptiste Daroussin return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
44*0f5c86ddSBaptiste Daroussin }
45*0f5c86ddSBaptiste Daroussin
46*0f5c86ddSBaptiste Daroussin /*
47*0f5c86ddSBaptiste Daroussin * Free a dynamic memory block.
48*0f5c86ddSBaptiste Daroussin */
49*0f5c86ddSBaptiste Daroussin
50*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_free(void * ptr)51*0f5c86ddSBaptiste Daroussin yaml_free(void *ptr)
52*0f5c86ddSBaptiste Daroussin {
53*0f5c86ddSBaptiste Daroussin if (ptr) free(ptr);
54*0f5c86ddSBaptiste Daroussin }
55*0f5c86ddSBaptiste Daroussin
56*0f5c86ddSBaptiste Daroussin /*
57*0f5c86ddSBaptiste Daroussin * Duplicate a string.
58*0f5c86ddSBaptiste Daroussin */
59*0f5c86ddSBaptiste Daroussin
60*0f5c86ddSBaptiste Daroussin YAML_DECLARE(yaml_char_t *)
yaml_strdup(const yaml_char_t * str)61*0f5c86ddSBaptiste Daroussin yaml_strdup(const yaml_char_t *str)
62*0f5c86ddSBaptiste Daroussin {
63*0f5c86ddSBaptiste Daroussin if (!str)
64*0f5c86ddSBaptiste Daroussin return NULL;
65*0f5c86ddSBaptiste Daroussin
66*0f5c86ddSBaptiste Daroussin return (yaml_char_t *)strdup((char *)str);
67*0f5c86ddSBaptiste Daroussin }
68*0f5c86ddSBaptiste Daroussin
69*0f5c86ddSBaptiste Daroussin /*
70*0f5c86ddSBaptiste Daroussin * Extend a string.
71*0f5c86ddSBaptiste Daroussin */
72*0f5c86ddSBaptiste Daroussin
73*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_string_extend(yaml_char_t ** start,yaml_char_t ** pointer,yaml_char_t ** end)74*0f5c86ddSBaptiste Daroussin yaml_string_extend(yaml_char_t **start,
75*0f5c86ddSBaptiste Daroussin yaml_char_t **pointer, yaml_char_t **end)
76*0f5c86ddSBaptiste Daroussin {
77*0f5c86ddSBaptiste Daroussin yaml_char_t *new_start = (yaml_char_t *)yaml_realloc((void*)*start, (*end - *start)*2);
78*0f5c86ddSBaptiste Daroussin
79*0f5c86ddSBaptiste Daroussin if (!new_start) return 0;
80*0f5c86ddSBaptiste Daroussin
81*0f5c86ddSBaptiste Daroussin memset(new_start + (*end - *start), 0, *end - *start);
82*0f5c86ddSBaptiste Daroussin
83*0f5c86ddSBaptiste Daroussin *pointer = new_start + (*pointer - *start);
84*0f5c86ddSBaptiste Daroussin *end = new_start + (*end - *start)*2;
85*0f5c86ddSBaptiste Daroussin *start = new_start;
86*0f5c86ddSBaptiste Daroussin
87*0f5c86ddSBaptiste Daroussin return 1;
88*0f5c86ddSBaptiste Daroussin }
89*0f5c86ddSBaptiste Daroussin
90*0f5c86ddSBaptiste Daroussin /*
91*0f5c86ddSBaptiste Daroussin * Append a string B to a string A.
92*0f5c86ddSBaptiste Daroussin */
93*0f5c86ddSBaptiste Daroussin
94*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_string_join(yaml_char_t ** a_start,yaml_char_t ** a_pointer,yaml_char_t ** a_end,yaml_char_t ** b_start,yaml_char_t ** b_pointer,SHIM (yaml_char_t ** b_end))95*0f5c86ddSBaptiste Daroussin yaml_string_join(
96*0f5c86ddSBaptiste Daroussin yaml_char_t **a_start, yaml_char_t **a_pointer, yaml_char_t **a_end,
97*0f5c86ddSBaptiste Daroussin yaml_char_t **b_start, yaml_char_t **b_pointer, SHIM(yaml_char_t **b_end))
98*0f5c86ddSBaptiste Daroussin {
99*0f5c86ddSBaptiste Daroussin UNUSED_PARAM(b_end)
100*0f5c86ddSBaptiste Daroussin if (*b_start == *b_pointer)
101*0f5c86ddSBaptiste Daroussin return 1;
102*0f5c86ddSBaptiste Daroussin
103*0f5c86ddSBaptiste Daroussin while (*a_end - *a_pointer <= *b_pointer - *b_start) {
104*0f5c86ddSBaptiste Daroussin if (!yaml_string_extend(a_start, a_pointer, a_end))
105*0f5c86ddSBaptiste Daroussin return 0;
106*0f5c86ddSBaptiste Daroussin }
107*0f5c86ddSBaptiste Daroussin
108*0f5c86ddSBaptiste Daroussin memcpy(*a_pointer, *b_start, *b_pointer - *b_start);
109*0f5c86ddSBaptiste Daroussin *a_pointer += *b_pointer - *b_start;
110*0f5c86ddSBaptiste Daroussin
111*0f5c86ddSBaptiste Daroussin return 1;
112*0f5c86ddSBaptiste Daroussin }
113*0f5c86ddSBaptiste Daroussin
114*0f5c86ddSBaptiste Daroussin /*
115*0f5c86ddSBaptiste Daroussin * Extend a stack.
116*0f5c86ddSBaptiste Daroussin */
117*0f5c86ddSBaptiste Daroussin
118*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_stack_extend(void ** start,void ** top,void ** end)119*0f5c86ddSBaptiste Daroussin yaml_stack_extend(void **start, void **top, void **end)
120*0f5c86ddSBaptiste Daroussin {
121*0f5c86ddSBaptiste Daroussin void *new_start;
122*0f5c86ddSBaptiste Daroussin
123*0f5c86ddSBaptiste Daroussin if ((char *)*end - (char *)*start >= INT_MAX / 2)
124*0f5c86ddSBaptiste Daroussin return 0;
125*0f5c86ddSBaptiste Daroussin
126*0f5c86ddSBaptiste Daroussin new_start = yaml_realloc(*start, ((char *)*end - (char *)*start)*2);
127*0f5c86ddSBaptiste Daroussin
128*0f5c86ddSBaptiste Daroussin if (!new_start) return 0;
129*0f5c86ddSBaptiste Daroussin
130*0f5c86ddSBaptiste Daroussin *top = (char *)new_start + ((char *)*top - (char *)*start);
131*0f5c86ddSBaptiste Daroussin *end = (char *)new_start + ((char *)*end - (char *)*start)*2;
132*0f5c86ddSBaptiste Daroussin *start = new_start;
133*0f5c86ddSBaptiste Daroussin
134*0f5c86ddSBaptiste Daroussin return 1;
135*0f5c86ddSBaptiste Daroussin }
136*0f5c86ddSBaptiste Daroussin
137*0f5c86ddSBaptiste Daroussin /*
138*0f5c86ddSBaptiste Daroussin * Extend or move a queue.
139*0f5c86ddSBaptiste Daroussin */
140*0f5c86ddSBaptiste Daroussin
141*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_queue_extend(void ** start,void ** head,void ** tail,void ** end)142*0f5c86ddSBaptiste Daroussin yaml_queue_extend(void **start, void **head, void **tail, void **end)
143*0f5c86ddSBaptiste Daroussin {
144*0f5c86ddSBaptiste Daroussin /* Check if we need to resize the queue. */
145*0f5c86ddSBaptiste Daroussin
146*0f5c86ddSBaptiste Daroussin if (*start == *head && *tail == *end) {
147*0f5c86ddSBaptiste Daroussin void *new_start = yaml_realloc(*start,
148*0f5c86ddSBaptiste Daroussin ((char *)*end - (char *)*start)*2);
149*0f5c86ddSBaptiste Daroussin
150*0f5c86ddSBaptiste Daroussin if (!new_start) return 0;
151*0f5c86ddSBaptiste Daroussin
152*0f5c86ddSBaptiste Daroussin *head = (char *)new_start + ((char *)*head - (char *)*start);
153*0f5c86ddSBaptiste Daroussin *tail = (char *)new_start + ((char *)*tail - (char *)*start);
154*0f5c86ddSBaptiste Daroussin *end = (char *)new_start + ((char *)*end - (char *)*start)*2;
155*0f5c86ddSBaptiste Daroussin *start = new_start;
156*0f5c86ddSBaptiste Daroussin }
157*0f5c86ddSBaptiste Daroussin
158*0f5c86ddSBaptiste Daroussin /* Check if we need to move the queue at the beginning of the buffer. */
159*0f5c86ddSBaptiste Daroussin
160*0f5c86ddSBaptiste Daroussin if (*tail == *end) {
161*0f5c86ddSBaptiste Daroussin if (*head != *tail) {
162*0f5c86ddSBaptiste Daroussin memmove(*start, *head, (char *)*tail - (char *)*head);
163*0f5c86ddSBaptiste Daroussin }
164*0f5c86ddSBaptiste Daroussin *tail = (char *)*tail - (char *)*head + (char *)*start;
165*0f5c86ddSBaptiste Daroussin *head = *start;
166*0f5c86ddSBaptiste Daroussin }
167*0f5c86ddSBaptiste Daroussin
168*0f5c86ddSBaptiste Daroussin return 1;
169*0f5c86ddSBaptiste Daroussin }
170*0f5c86ddSBaptiste Daroussin
171*0f5c86ddSBaptiste Daroussin
172*0f5c86ddSBaptiste Daroussin /*
173*0f5c86ddSBaptiste Daroussin * Create a new parser object.
174*0f5c86ddSBaptiste Daroussin */
175*0f5c86ddSBaptiste Daroussin
176*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_parser_initialize(yaml_parser_t * parser)177*0f5c86ddSBaptiste Daroussin yaml_parser_initialize(yaml_parser_t *parser)
178*0f5c86ddSBaptiste Daroussin {
179*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
180*0f5c86ddSBaptiste Daroussin
181*0f5c86ddSBaptiste Daroussin memset(parser, 0, sizeof(yaml_parser_t));
182*0f5c86ddSBaptiste Daroussin if (!BUFFER_INIT(parser, parser->raw_buffer, INPUT_RAW_BUFFER_SIZE))
183*0f5c86ddSBaptiste Daroussin goto error;
184*0f5c86ddSBaptiste Daroussin if (!BUFFER_INIT(parser, parser->buffer, INPUT_BUFFER_SIZE))
185*0f5c86ddSBaptiste Daroussin goto error;
186*0f5c86ddSBaptiste Daroussin if (!QUEUE_INIT(parser, parser->tokens, INITIAL_QUEUE_SIZE, yaml_token_t*))
187*0f5c86ddSBaptiste Daroussin goto error;
188*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(parser, parser->indents, int*))
189*0f5c86ddSBaptiste Daroussin goto error;
190*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(parser, parser->simple_keys, yaml_simple_key_t*))
191*0f5c86ddSBaptiste Daroussin goto error;
192*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(parser, parser->states, yaml_parser_state_t*))
193*0f5c86ddSBaptiste Daroussin goto error;
194*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(parser, parser->marks, yaml_mark_t*))
195*0f5c86ddSBaptiste Daroussin goto error;
196*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(parser, parser->tag_directives, yaml_tag_directive_t*))
197*0f5c86ddSBaptiste Daroussin goto error;
198*0f5c86ddSBaptiste Daroussin
199*0f5c86ddSBaptiste Daroussin return 1;
200*0f5c86ddSBaptiste Daroussin
201*0f5c86ddSBaptiste Daroussin error:
202*0f5c86ddSBaptiste Daroussin
203*0f5c86ddSBaptiste Daroussin BUFFER_DEL(parser, parser->raw_buffer);
204*0f5c86ddSBaptiste Daroussin BUFFER_DEL(parser, parser->buffer);
205*0f5c86ddSBaptiste Daroussin QUEUE_DEL(parser, parser->tokens);
206*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->indents);
207*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->simple_keys);
208*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->states);
209*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->marks);
210*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->tag_directives);
211*0f5c86ddSBaptiste Daroussin
212*0f5c86ddSBaptiste Daroussin return 0;
213*0f5c86ddSBaptiste Daroussin }
214*0f5c86ddSBaptiste Daroussin
215*0f5c86ddSBaptiste Daroussin /*
216*0f5c86ddSBaptiste Daroussin * Destroy a parser object.
217*0f5c86ddSBaptiste Daroussin */
218*0f5c86ddSBaptiste Daroussin
219*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_parser_delete(yaml_parser_t * parser)220*0f5c86ddSBaptiste Daroussin yaml_parser_delete(yaml_parser_t *parser)
221*0f5c86ddSBaptiste Daroussin {
222*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
223*0f5c86ddSBaptiste Daroussin
224*0f5c86ddSBaptiste Daroussin BUFFER_DEL(parser, parser->raw_buffer);
225*0f5c86ddSBaptiste Daroussin BUFFER_DEL(parser, parser->buffer);
226*0f5c86ddSBaptiste Daroussin while (!QUEUE_EMPTY(parser, parser->tokens)) {
227*0f5c86ddSBaptiste Daroussin yaml_token_delete(&DEQUEUE(parser, parser->tokens));
228*0f5c86ddSBaptiste Daroussin }
229*0f5c86ddSBaptiste Daroussin QUEUE_DEL(parser, parser->tokens);
230*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->indents);
231*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->simple_keys);
232*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->states);
233*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->marks);
234*0f5c86ddSBaptiste Daroussin while (!STACK_EMPTY(parser, parser->tag_directives)) {
235*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
236*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive.handle);
237*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive.prefix);
238*0f5c86ddSBaptiste Daroussin }
239*0f5c86ddSBaptiste Daroussin STACK_DEL(parser, parser->tag_directives);
240*0f5c86ddSBaptiste Daroussin
241*0f5c86ddSBaptiste Daroussin memset(parser, 0, sizeof(yaml_parser_t));
242*0f5c86ddSBaptiste Daroussin }
243*0f5c86ddSBaptiste Daroussin
244*0f5c86ddSBaptiste Daroussin /*
245*0f5c86ddSBaptiste Daroussin * String read handler.
246*0f5c86ddSBaptiste Daroussin */
247*0f5c86ddSBaptiste Daroussin
248*0f5c86ddSBaptiste Daroussin static int
yaml_string_read_handler(void * data,unsigned char * buffer,size_t size,size_t * size_read)249*0f5c86ddSBaptiste Daroussin yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
250*0f5c86ddSBaptiste Daroussin size_t *size_read)
251*0f5c86ddSBaptiste Daroussin {
252*0f5c86ddSBaptiste Daroussin yaml_parser_t *parser = (yaml_parser_t *)data;
253*0f5c86ddSBaptiste Daroussin
254*0f5c86ddSBaptiste Daroussin if (parser->input.string.current == parser->input.string.end) {
255*0f5c86ddSBaptiste Daroussin *size_read = 0;
256*0f5c86ddSBaptiste Daroussin return 1;
257*0f5c86ddSBaptiste Daroussin }
258*0f5c86ddSBaptiste Daroussin
259*0f5c86ddSBaptiste Daroussin if (size > (size_t)(parser->input.string.end
260*0f5c86ddSBaptiste Daroussin - parser->input.string.current)) {
261*0f5c86ddSBaptiste Daroussin size = parser->input.string.end - parser->input.string.current;
262*0f5c86ddSBaptiste Daroussin }
263*0f5c86ddSBaptiste Daroussin
264*0f5c86ddSBaptiste Daroussin memcpy(buffer, parser->input.string.current, size);
265*0f5c86ddSBaptiste Daroussin parser->input.string.current += size;
266*0f5c86ddSBaptiste Daroussin *size_read = size;
267*0f5c86ddSBaptiste Daroussin return 1;
268*0f5c86ddSBaptiste Daroussin }
269*0f5c86ddSBaptiste Daroussin
270*0f5c86ddSBaptiste Daroussin /*
271*0f5c86ddSBaptiste Daroussin * File read handler.
272*0f5c86ddSBaptiste Daroussin */
273*0f5c86ddSBaptiste Daroussin
274*0f5c86ddSBaptiste Daroussin static int
yaml_file_read_handler(void * data,unsigned char * buffer,size_t size,size_t * size_read)275*0f5c86ddSBaptiste Daroussin yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
276*0f5c86ddSBaptiste Daroussin size_t *size_read)
277*0f5c86ddSBaptiste Daroussin {
278*0f5c86ddSBaptiste Daroussin yaml_parser_t *parser = (yaml_parser_t *)data;
279*0f5c86ddSBaptiste Daroussin
280*0f5c86ddSBaptiste Daroussin *size_read = fread(buffer, 1, size, parser->input.file);
281*0f5c86ddSBaptiste Daroussin return !ferror(parser->input.file);
282*0f5c86ddSBaptiste Daroussin }
283*0f5c86ddSBaptiste Daroussin
284*0f5c86ddSBaptiste Daroussin /*
285*0f5c86ddSBaptiste Daroussin * Set a string input.
286*0f5c86ddSBaptiste Daroussin */
287*0f5c86ddSBaptiste Daroussin
288*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_parser_set_input_string(yaml_parser_t * parser,const unsigned char * input,size_t size)289*0f5c86ddSBaptiste Daroussin yaml_parser_set_input_string(yaml_parser_t *parser,
290*0f5c86ddSBaptiste Daroussin const unsigned char *input, size_t size)
291*0f5c86ddSBaptiste Daroussin {
292*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
293*0f5c86ddSBaptiste Daroussin assert(!parser->read_handler); /* You can set the source only once. */
294*0f5c86ddSBaptiste Daroussin assert(input); /* Non-NULL input string expected. */
295*0f5c86ddSBaptiste Daroussin
296*0f5c86ddSBaptiste Daroussin parser->read_handler = yaml_string_read_handler;
297*0f5c86ddSBaptiste Daroussin parser->read_handler_data = parser;
298*0f5c86ddSBaptiste Daroussin
299*0f5c86ddSBaptiste Daroussin parser->input.string.start = input;
300*0f5c86ddSBaptiste Daroussin parser->input.string.current = input;
301*0f5c86ddSBaptiste Daroussin parser->input.string.end = input+size;
302*0f5c86ddSBaptiste Daroussin }
303*0f5c86ddSBaptiste Daroussin
304*0f5c86ddSBaptiste Daroussin /*
305*0f5c86ddSBaptiste Daroussin * Set a file input.
306*0f5c86ddSBaptiste Daroussin */
307*0f5c86ddSBaptiste Daroussin
308*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_parser_set_input_file(yaml_parser_t * parser,FILE * file)309*0f5c86ddSBaptiste Daroussin yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
310*0f5c86ddSBaptiste Daroussin {
311*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
312*0f5c86ddSBaptiste Daroussin assert(!parser->read_handler); /* You can set the source only once. */
313*0f5c86ddSBaptiste Daroussin assert(file); /* Non-NULL file object expected. */
314*0f5c86ddSBaptiste Daroussin
315*0f5c86ddSBaptiste Daroussin parser->read_handler = yaml_file_read_handler;
316*0f5c86ddSBaptiste Daroussin parser->read_handler_data = parser;
317*0f5c86ddSBaptiste Daroussin
318*0f5c86ddSBaptiste Daroussin parser->input.file = file;
319*0f5c86ddSBaptiste Daroussin }
320*0f5c86ddSBaptiste Daroussin
321*0f5c86ddSBaptiste Daroussin /*
322*0f5c86ddSBaptiste Daroussin * Set a generic input.
323*0f5c86ddSBaptiste Daroussin */
324*0f5c86ddSBaptiste Daroussin
325*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_parser_set_input(yaml_parser_t * parser,yaml_read_handler_t * handler,void * data)326*0f5c86ddSBaptiste Daroussin yaml_parser_set_input(yaml_parser_t *parser,
327*0f5c86ddSBaptiste Daroussin yaml_read_handler_t *handler, void *data)
328*0f5c86ddSBaptiste Daroussin {
329*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
330*0f5c86ddSBaptiste Daroussin assert(!parser->read_handler); /* You can set the source only once. */
331*0f5c86ddSBaptiste Daroussin assert(handler); /* Non-NULL read handler expected. */
332*0f5c86ddSBaptiste Daroussin
333*0f5c86ddSBaptiste Daroussin parser->read_handler = handler;
334*0f5c86ddSBaptiste Daroussin parser->read_handler_data = data;
335*0f5c86ddSBaptiste Daroussin }
336*0f5c86ddSBaptiste Daroussin
337*0f5c86ddSBaptiste Daroussin /*
338*0f5c86ddSBaptiste Daroussin * Set the source encoding.
339*0f5c86ddSBaptiste Daroussin */
340*0f5c86ddSBaptiste Daroussin
341*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_parser_set_encoding(yaml_parser_t * parser,yaml_encoding_t encoding)342*0f5c86ddSBaptiste Daroussin yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
343*0f5c86ddSBaptiste Daroussin {
344*0f5c86ddSBaptiste Daroussin assert(parser); /* Non-NULL parser object expected. */
345*0f5c86ddSBaptiste Daroussin assert(!parser->encoding); /* Encoding is already set or detected. */
346*0f5c86ddSBaptiste Daroussin
347*0f5c86ddSBaptiste Daroussin parser->encoding = encoding;
348*0f5c86ddSBaptiste Daroussin }
349*0f5c86ddSBaptiste Daroussin
350*0f5c86ddSBaptiste Daroussin /*
351*0f5c86ddSBaptiste Daroussin * Create a new emitter object.
352*0f5c86ddSBaptiste Daroussin */
353*0f5c86ddSBaptiste Daroussin
354*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_emitter_initialize(yaml_emitter_t * emitter)355*0f5c86ddSBaptiste Daroussin yaml_emitter_initialize(yaml_emitter_t *emitter)
356*0f5c86ddSBaptiste Daroussin {
357*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
358*0f5c86ddSBaptiste Daroussin
359*0f5c86ddSBaptiste Daroussin memset(emitter, 0, sizeof(yaml_emitter_t));
360*0f5c86ddSBaptiste Daroussin if (!BUFFER_INIT(emitter, emitter->buffer, OUTPUT_BUFFER_SIZE))
361*0f5c86ddSBaptiste Daroussin goto error;
362*0f5c86ddSBaptiste Daroussin if (!BUFFER_INIT(emitter, emitter->raw_buffer, OUTPUT_RAW_BUFFER_SIZE))
363*0f5c86ddSBaptiste Daroussin goto error;
364*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(emitter, emitter->states, yaml_emitter_state_t*))
365*0f5c86ddSBaptiste Daroussin goto error;
366*0f5c86ddSBaptiste Daroussin if (!QUEUE_INIT(emitter, emitter->events, INITIAL_QUEUE_SIZE, yaml_event_t*))
367*0f5c86ddSBaptiste Daroussin goto error;
368*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(emitter, emitter->indents, int*))
369*0f5c86ddSBaptiste Daroussin goto error;
370*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(emitter, emitter->tag_directives, yaml_tag_directive_t*))
371*0f5c86ddSBaptiste Daroussin goto error;
372*0f5c86ddSBaptiste Daroussin
373*0f5c86ddSBaptiste Daroussin return 1;
374*0f5c86ddSBaptiste Daroussin
375*0f5c86ddSBaptiste Daroussin error:
376*0f5c86ddSBaptiste Daroussin
377*0f5c86ddSBaptiste Daroussin BUFFER_DEL(emitter, emitter->buffer);
378*0f5c86ddSBaptiste Daroussin BUFFER_DEL(emitter, emitter->raw_buffer);
379*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->states);
380*0f5c86ddSBaptiste Daroussin QUEUE_DEL(emitter, emitter->events);
381*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->indents);
382*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->tag_directives);
383*0f5c86ddSBaptiste Daroussin
384*0f5c86ddSBaptiste Daroussin return 0;
385*0f5c86ddSBaptiste Daroussin }
386*0f5c86ddSBaptiste Daroussin
387*0f5c86ddSBaptiste Daroussin /*
388*0f5c86ddSBaptiste Daroussin * Destroy an emitter object.
389*0f5c86ddSBaptiste Daroussin */
390*0f5c86ddSBaptiste Daroussin
391*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_delete(yaml_emitter_t * emitter)392*0f5c86ddSBaptiste Daroussin yaml_emitter_delete(yaml_emitter_t *emitter)
393*0f5c86ddSBaptiste Daroussin {
394*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
395*0f5c86ddSBaptiste Daroussin
396*0f5c86ddSBaptiste Daroussin BUFFER_DEL(emitter, emitter->buffer);
397*0f5c86ddSBaptiste Daroussin BUFFER_DEL(emitter, emitter->raw_buffer);
398*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->states);
399*0f5c86ddSBaptiste Daroussin while (!QUEUE_EMPTY(emitter, emitter->events)) {
400*0f5c86ddSBaptiste Daroussin yaml_event_delete(&DEQUEUE(emitter, emitter->events));
401*0f5c86ddSBaptiste Daroussin }
402*0f5c86ddSBaptiste Daroussin QUEUE_DEL(emitter, emitter->events);
403*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->indents);
404*0f5c86ddSBaptiste Daroussin while (!STACK_EMPTY(empty, emitter->tag_directives)) {
405*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t tag_directive = POP(emitter, emitter->tag_directives);
406*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive.handle);
407*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive.prefix);
408*0f5c86ddSBaptiste Daroussin }
409*0f5c86ddSBaptiste Daroussin STACK_DEL(emitter, emitter->tag_directives);
410*0f5c86ddSBaptiste Daroussin yaml_free(emitter->anchors);
411*0f5c86ddSBaptiste Daroussin
412*0f5c86ddSBaptiste Daroussin memset(emitter, 0, sizeof(yaml_emitter_t));
413*0f5c86ddSBaptiste Daroussin }
414*0f5c86ddSBaptiste Daroussin
415*0f5c86ddSBaptiste Daroussin /*
416*0f5c86ddSBaptiste Daroussin * String write handler.
417*0f5c86ddSBaptiste Daroussin */
418*0f5c86ddSBaptiste Daroussin
419*0f5c86ddSBaptiste Daroussin static int
yaml_string_write_handler(void * data,unsigned char * buffer,size_t size)420*0f5c86ddSBaptiste Daroussin yaml_string_write_handler(void *data, unsigned char *buffer, size_t size)
421*0f5c86ddSBaptiste Daroussin {
422*0f5c86ddSBaptiste Daroussin yaml_emitter_t *emitter = (yaml_emitter_t *)data;
423*0f5c86ddSBaptiste Daroussin
424*0f5c86ddSBaptiste Daroussin if (emitter->output.string.size - *emitter->output.string.size_written
425*0f5c86ddSBaptiste Daroussin < size) {
426*0f5c86ddSBaptiste Daroussin memcpy(emitter->output.string.buffer
427*0f5c86ddSBaptiste Daroussin + *emitter->output.string.size_written,
428*0f5c86ddSBaptiste Daroussin buffer,
429*0f5c86ddSBaptiste Daroussin emitter->output.string.size
430*0f5c86ddSBaptiste Daroussin - *emitter->output.string.size_written);
431*0f5c86ddSBaptiste Daroussin *emitter->output.string.size_written = emitter->output.string.size;
432*0f5c86ddSBaptiste Daroussin return 0;
433*0f5c86ddSBaptiste Daroussin }
434*0f5c86ddSBaptiste Daroussin
435*0f5c86ddSBaptiste Daroussin memcpy(emitter->output.string.buffer
436*0f5c86ddSBaptiste Daroussin + *emitter->output.string.size_written, buffer, size);
437*0f5c86ddSBaptiste Daroussin *emitter->output.string.size_written += size;
438*0f5c86ddSBaptiste Daroussin return 1;
439*0f5c86ddSBaptiste Daroussin }
440*0f5c86ddSBaptiste Daroussin
441*0f5c86ddSBaptiste Daroussin /*
442*0f5c86ddSBaptiste Daroussin * File write handler.
443*0f5c86ddSBaptiste Daroussin */
444*0f5c86ddSBaptiste Daroussin
445*0f5c86ddSBaptiste Daroussin static int
yaml_file_write_handler(void * data,unsigned char * buffer,size_t size)446*0f5c86ddSBaptiste Daroussin yaml_file_write_handler(void *data, unsigned char *buffer, size_t size)
447*0f5c86ddSBaptiste Daroussin {
448*0f5c86ddSBaptiste Daroussin yaml_emitter_t *emitter = (yaml_emitter_t *)data;
449*0f5c86ddSBaptiste Daroussin
450*0f5c86ddSBaptiste Daroussin return (fwrite(buffer, 1, size, emitter->output.file) == size);
451*0f5c86ddSBaptiste Daroussin }
452*0f5c86ddSBaptiste Daroussin /*
453*0f5c86ddSBaptiste Daroussin * Set a string output.
454*0f5c86ddSBaptiste Daroussin */
455*0f5c86ddSBaptiste Daroussin
456*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_output_string(yaml_emitter_t * emitter,unsigned char * output,size_t size,size_t * size_written)457*0f5c86ddSBaptiste Daroussin yaml_emitter_set_output_string(yaml_emitter_t *emitter,
458*0f5c86ddSBaptiste Daroussin unsigned char *output, size_t size, size_t *size_written)
459*0f5c86ddSBaptiste Daroussin {
460*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
461*0f5c86ddSBaptiste Daroussin assert(!emitter->write_handler); /* You can set the output only once. */
462*0f5c86ddSBaptiste Daroussin assert(output); /* Non-NULL output string expected. */
463*0f5c86ddSBaptiste Daroussin
464*0f5c86ddSBaptiste Daroussin emitter->write_handler = yaml_string_write_handler;
465*0f5c86ddSBaptiste Daroussin emitter->write_handler_data = emitter;
466*0f5c86ddSBaptiste Daroussin
467*0f5c86ddSBaptiste Daroussin emitter->output.string.buffer = output;
468*0f5c86ddSBaptiste Daroussin emitter->output.string.size = size;
469*0f5c86ddSBaptiste Daroussin emitter->output.string.size_written = size_written;
470*0f5c86ddSBaptiste Daroussin *size_written = 0;
471*0f5c86ddSBaptiste Daroussin }
472*0f5c86ddSBaptiste Daroussin
473*0f5c86ddSBaptiste Daroussin /*
474*0f5c86ddSBaptiste Daroussin * Set a file output.
475*0f5c86ddSBaptiste Daroussin */
476*0f5c86ddSBaptiste Daroussin
477*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_output_file(yaml_emitter_t * emitter,FILE * file)478*0f5c86ddSBaptiste Daroussin yaml_emitter_set_output_file(yaml_emitter_t *emitter, FILE *file)
479*0f5c86ddSBaptiste Daroussin {
480*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
481*0f5c86ddSBaptiste Daroussin assert(!emitter->write_handler); /* You can set the output only once. */
482*0f5c86ddSBaptiste Daroussin assert(file); /* Non-NULL file object expected. */
483*0f5c86ddSBaptiste Daroussin
484*0f5c86ddSBaptiste Daroussin emitter->write_handler = yaml_file_write_handler;
485*0f5c86ddSBaptiste Daroussin emitter->write_handler_data = emitter;
486*0f5c86ddSBaptiste Daroussin
487*0f5c86ddSBaptiste Daroussin emitter->output.file = file;
488*0f5c86ddSBaptiste Daroussin }
489*0f5c86ddSBaptiste Daroussin
490*0f5c86ddSBaptiste Daroussin /*
491*0f5c86ddSBaptiste Daroussin * Set a generic output handler.
492*0f5c86ddSBaptiste Daroussin */
493*0f5c86ddSBaptiste Daroussin
494*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_output(yaml_emitter_t * emitter,yaml_write_handler_t * handler,void * data)495*0f5c86ddSBaptiste Daroussin yaml_emitter_set_output(yaml_emitter_t *emitter,
496*0f5c86ddSBaptiste Daroussin yaml_write_handler_t *handler, void *data)
497*0f5c86ddSBaptiste Daroussin {
498*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
499*0f5c86ddSBaptiste Daroussin assert(!emitter->write_handler); /* You can set the output only once. */
500*0f5c86ddSBaptiste Daroussin assert(handler); /* Non-NULL handler object expected. */
501*0f5c86ddSBaptiste Daroussin
502*0f5c86ddSBaptiste Daroussin emitter->write_handler = handler;
503*0f5c86ddSBaptiste Daroussin emitter->write_handler_data = data;
504*0f5c86ddSBaptiste Daroussin }
505*0f5c86ddSBaptiste Daroussin
506*0f5c86ddSBaptiste Daroussin /*
507*0f5c86ddSBaptiste Daroussin * Set the output encoding.
508*0f5c86ddSBaptiste Daroussin */
509*0f5c86ddSBaptiste Daroussin
510*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_encoding(yaml_emitter_t * emitter,yaml_encoding_t encoding)511*0f5c86ddSBaptiste Daroussin yaml_emitter_set_encoding(yaml_emitter_t *emitter, yaml_encoding_t encoding)
512*0f5c86ddSBaptiste Daroussin {
513*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
514*0f5c86ddSBaptiste Daroussin assert(!emitter->encoding); /* You can set encoding only once. */
515*0f5c86ddSBaptiste Daroussin
516*0f5c86ddSBaptiste Daroussin emitter->encoding = encoding;
517*0f5c86ddSBaptiste Daroussin }
518*0f5c86ddSBaptiste Daroussin
519*0f5c86ddSBaptiste Daroussin /*
520*0f5c86ddSBaptiste Daroussin * Set the canonical output style.
521*0f5c86ddSBaptiste Daroussin */
522*0f5c86ddSBaptiste Daroussin
523*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_canonical(yaml_emitter_t * emitter,int canonical)524*0f5c86ddSBaptiste Daroussin yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical)
525*0f5c86ddSBaptiste Daroussin {
526*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
527*0f5c86ddSBaptiste Daroussin
528*0f5c86ddSBaptiste Daroussin emitter->canonical = (canonical != 0);
529*0f5c86ddSBaptiste Daroussin }
530*0f5c86ddSBaptiste Daroussin
531*0f5c86ddSBaptiste Daroussin /*
532*0f5c86ddSBaptiste Daroussin * Set the indentation increment.
533*0f5c86ddSBaptiste Daroussin */
534*0f5c86ddSBaptiste Daroussin
535*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_indent(yaml_emitter_t * emitter,int indent)536*0f5c86ddSBaptiste Daroussin yaml_emitter_set_indent(yaml_emitter_t *emitter, int indent)
537*0f5c86ddSBaptiste Daroussin {
538*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
539*0f5c86ddSBaptiste Daroussin
540*0f5c86ddSBaptiste Daroussin emitter->best_indent = (1 < indent && indent < 10) ? indent : 2;
541*0f5c86ddSBaptiste Daroussin }
542*0f5c86ddSBaptiste Daroussin
543*0f5c86ddSBaptiste Daroussin /*
544*0f5c86ddSBaptiste Daroussin * Set the preferred line width.
545*0f5c86ddSBaptiste Daroussin */
546*0f5c86ddSBaptiste Daroussin
547*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_width(yaml_emitter_t * emitter,int width)548*0f5c86ddSBaptiste Daroussin yaml_emitter_set_width(yaml_emitter_t *emitter, int width)
549*0f5c86ddSBaptiste Daroussin {
550*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
551*0f5c86ddSBaptiste Daroussin
552*0f5c86ddSBaptiste Daroussin emitter->best_width = (width >= 0) ? width : -1;
553*0f5c86ddSBaptiste Daroussin }
554*0f5c86ddSBaptiste Daroussin
555*0f5c86ddSBaptiste Daroussin /*
556*0f5c86ddSBaptiste Daroussin * Set if unescaped non-ASCII characters are allowed.
557*0f5c86ddSBaptiste Daroussin */
558*0f5c86ddSBaptiste Daroussin
559*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_unicode(yaml_emitter_t * emitter,int unicode)560*0f5c86ddSBaptiste Daroussin yaml_emitter_set_unicode(yaml_emitter_t *emitter, int unicode)
561*0f5c86ddSBaptiste Daroussin {
562*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
563*0f5c86ddSBaptiste Daroussin
564*0f5c86ddSBaptiste Daroussin emitter->unicode = (unicode != 0);
565*0f5c86ddSBaptiste Daroussin }
566*0f5c86ddSBaptiste Daroussin
567*0f5c86ddSBaptiste Daroussin /*
568*0f5c86ddSBaptiste Daroussin * Set the preferred line break character.
569*0f5c86ddSBaptiste Daroussin */
570*0f5c86ddSBaptiste Daroussin
571*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_emitter_set_break(yaml_emitter_t * emitter,yaml_break_t line_break)572*0f5c86ddSBaptiste Daroussin yaml_emitter_set_break(yaml_emitter_t *emitter, yaml_break_t line_break)
573*0f5c86ddSBaptiste Daroussin {
574*0f5c86ddSBaptiste Daroussin assert(emitter); /* Non-NULL emitter object expected. */
575*0f5c86ddSBaptiste Daroussin
576*0f5c86ddSBaptiste Daroussin emitter->line_break = line_break;
577*0f5c86ddSBaptiste Daroussin }
578*0f5c86ddSBaptiste Daroussin
579*0f5c86ddSBaptiste Daroussin /*
580*0f5c86ddSBaptiste Daroussin * Destroy a token object.
581*0f5c86ddSBaptiste Daroussin */
582*0f5c86ddSBaptiste Daroussin
583*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_token_delete(yaml_token_t * token)584*0f5c86ddSBaptiste Daroussin yaml_token_delete(yaml_token_t *token)
585*0f5c86ddSBaptiste Daroussin {
586*0f5c86ddSBaptiste Daroussin assert(token); /* Non-NULL token object expected. */
587*0f5c86ddSBaptiste Daroussin
588*0f5c86ddSBaptiste Daroussin switch (token->type)
589*0f5c86ddSBaptiste Daroussin {
590*0f5c86ddSBaptiste Daroussin case YAML_TAG_DIRECTIVE_TOKEN:
591*0f5c86ddSBaptiste Daroussin yaml_free(token->data.tag_directive.handle);
592*0f5c86ddSBaptiste Daroussin yaml_free(token->data.tag_directive.prefix);
593*0f5c86ddSBaptiste Daroussin break;
594*0f5c86ddSBaptiste Daroussin
595*0f5c86ddSBaptiste Daroussin case YAML_ALIAS_TOKEN:
596*0f5c86ddSBaptiste Daroussin yaml_free(token->data.alias.value);
597*0f5c86ddSBaptiste Daroussin break;
598*0f5c86ddSBaptiste Daroussin
599*0f5c86ddSBaptiste Daroussin case YAML_ANCHOR_TOKEN:
600*0f5c86ddSBaptiste Daroussin yaml_free(token->data.anchor.value);
601*0f5c86ddSBaptiste Daroussin break;
602*0f5c86ddSBaptiste Daroussin
603*0f5c86ddSBaptiste Daroussin case YAML_TAG_TOKEN:
604*0f5c86ddSBaptiste Daroussin yaml_free(token->data.tag.handle);
605*0f5c86ddSBaptiste Daroussin yaml_free(token->data.tag.suffix);
606*0f5c86ddSBaptiste Daroussin break;
607*0f5c86ddSBaptiste Daroussin
608*0f5c86ddSBaptiste Daroussin case YAML_SCALAR_TOKEN:
609*0f5c86ddSBaptiste Daroussin yaml_free(token->data.scalar.value);
610*0f5c86ddSBaptiste Daroussin break;
611*0f5c86ddSBaptiste Daroussin
612*0f5c86ddSBaptiste Daroussin default:
613*0f5c86ddSBaptiste Daroussin break;
614*0f5c86ddSBaptiste Daroussin }
615*0f5c86ddSBaptiste Daroussin
616*0f5c86ddSBaptiste Daroussin memset(token, 0, sizeof(yaml_token_t));
617*0f5c86ddSBaptiste Daroussin }
618*0f5c86ddSBaptiste Daroussin
619*0f5c86ddSBaptiste Daroussin /*
620*0f5c86ddSBaptiste Daroussin * Check if a string is a valid UTF-8 sequence.
621*0f5c86ddSBaptiste Daroussin *
622*0f5c86ddSBaptiste Daroussin * Check 'reader.c' for more details on UTF-8 encoding.
623*0f5c86ddSBaptiste Daroussin */
624*0f5c86ddSBaptiste Daroussin
625*0f5c86ddSBaptiste Daroussin static int
yaml_check_utf8(const yaml_char_t * start,size_t length)626*0f5c86ddSBaptiste Daroussin yaml_check_utf8(const yaml_char_t *start, size_t length)
627*0f5c86ddSBaptiste Daroussin {
628*0f5c86ddSBaptiste Daroussin const yaml_char_t *end = start+length;
629*0f5c86ddSBaptiste Daroussin const yaml_char_t *pointer = start;
630*0f5c86ddSBaptiste Daroussin
631*0f5c86ddSBaptiste Daroussin while (pointer < end) {
632*0f5c86ddSBaptiste Daroussin unsigned char octet;
633*0f5c86ddSBaptiste Daroussin unsigned int width;
634*0f5c86ddSBaptiste Daroussin unsigned int value;
635*0f5c86ddSBaptiste Daroussin size_t k;
636*0f5c86ddSBaptiste Daroussin
637*0f5c86ddSBaptiste Daroussin octet = pointer[0];
638*0f5c86ddSBaptiste Daroussin width = (octet & 0x80) == 0x00 ? 1 :
639*0f5c86ddSBaptiste Daroussin (octet & 0xE0) == 0xC0 ? 2 :
640*0f5c86ddSBaptiste Daroussin (octet & 0xF0) == 0xE0 ? 3 :
641*0f5c86ddSBaptiste Daroussin (octet & 0xF8) == 0xF0 ? 4 : 0;
642*0f5c86ddSBaptiste Daroussin value = (octet & 0x80) == 0x00 ? octet & 0x7F :
643*0f5c86ddSBaptiste Daroussin (octet & 0xE0) == 0xC0 ? octet & 0x1F :
644*0f5c86ddSBaptiste Daroussin (octet & 0xF0) == 0xE0 ? octet & 0x0F :
645*0f5c86ddSBaptiste Daroussin (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
646*0f5c86ddSBaptiste Daroussin if (!width) return 0;
647*0f5c86ddSBaptiste Daroussin if (pointer+width > end) return 0;
648*0f5c86ddSBaptiste Daroussin for (k = 1; k < width; k ++) {
649*0f5c86ddSBaptiste Daroussin octet = pointer[k];
650*0f5c86ddSBaptiste Daroussin if ((octet & 0xC0) != 0x80) return 0;
651*0f5c86ddSBaptiste Daroussin value = (value << 6) + (octet & 0x3F);
652*0f5c86ddSBaptiste Daroussin }
653*0f5c86ddSBaptiste Daroussin if (!((width == 1) ||
654*0f5c86ddSBaptiste Daroussin (width == 2 && value >= 0x80) ||
655*0f5c86ddSBaptiste Daroussin (width == 3 && value >= 0x800) ||
656*0f5c86ddSBaptiste Daroussin (width == 4 && value >= 0x10000))) return 0;
657*0f5c86ddSBaptiste Daroussin
658*0f5c86ddSBaptiste Daroussin pointer += width;
659*0f5c86ddSBaptiste Daroussin }
660*0f5c86ddSBaptiste Daroussin
661*0f5c86ddSBaptiste Daroussin return 1;
662*0f5c86ddSBaptiste Daroussin }
663*0f5c86ddSBaptiste Daroussin
664*0f5c86ddSBaptiste Daroussin /*
665*0f5c86ddSBaptiste Daroussin * Create STREAM-START.
666*0f5c86ddSBaptiste Daroussin */
667*0f5c86ddSBaptiste Daroussin
668*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_stream_start_event_initialize(yaml_event_t * event,yaml_encoding_t encoding)669*0f5c86ddSBaptiste Daroussin yaml_stream_start_event_initialize(yaml_event_t *event,
670*0f5c86ddSBaptiste Daroussin yaml_encoding_t encoding)
671*0f5c86ddSBaptiste Daroussin {
672*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
673*0f5c86ddSBaptiste Daroussin
674*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
675*0f5c86ddSBaptiste Daroussin
676*0f5c86ddSBaptiste Daroussin STREAM_START_EVENT_INIT(*event, encoding, mark, mark);
677*0f5c86ddSBaptiste Daroussin
678*0f5c86ddSBaptiste Daroussin return 1;
679*0f5c86ddSBaptiste Daroussin }
680*0f5c86ddSBaptiste Daroussin
681*0f5c86ddSBaptiste Daroussin /*
682*0f5c86ddSBaptiste Daroussin * Create STREAM-END.
683*0f5c86ddSBaptiste Daroussin */
684*0f5c86ddSBaptiste Daroussin
685*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_stream_end_event_initialize(yaml_event_t * event)686*0f5c86ddSBaptiste Daroussin yaml_stream_end_event_initialize(yaml_event_t *event)
687*0f5c86ddSBaptiste Daroussin {
688*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
689*0f5c86ddSBaptiste Daroussin
690*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
691*0f5c86ddSBaptiste Daroussin
692*0f5c86ddSBaptiste Daroussin STREAM_END_EVENT_INIT(*event, mark, mark);
693*0f5c86ddSBaptiste Daroussin
694*0f5c86ddSBaptiste Daroussin return 1;
695*0f5c86ddSBaptiste Daroussin }
696*0f5c86ddSBaptiste Daroussin
697*0f5c86ddSBaptiste Daroussin /*
698*0f5c86ddSBaptiste Daroussin * Create DOCUMENT-START.
699*0f5c86ddSBaptiste Daroussin */
700*0f5c86ddSBaptiste Daroussin
701*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_start_event_initialize(yaml_event_t * event,yaml_version_directive_t * version_directive,yaml_tag_directive_t * tag_directives_start,yaml_tag_directive_t * tag_directives_end,int implicit)702*0f5c86ddSBaptiste Daroussin yaml_document_start_event_initialize(yaml_event_t *event,
703*0f5c86ddSBaptiste Daroussin yaml_version_directive_t *version_directive,
704*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directives_start,
705*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directives_end,
706*0f5c86ddSBaptiste Daroussin int implicit)
707*0f5c86ddSBaptiste Daroussin {
708*0f5c86ddSBaptiste Daroussin struct {
709*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
710*0f5c86ddSBaptiste Daroussin } context;
711*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
712*0f5c86ddSBaptiste Daroussin yaml_version_directive_t *version_directive_copy = NULL;
713*0f5c86ddSBaptiste Daroussin struct {
714*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *start;
715*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *end;
716*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *top;
717*0f5c86ddSBaptiste Daroussin } tag_directives_copy = { NULL, NULL, NULL };
718*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t value = { NULL, NULL };
719*0f5c86ddSBaptiste Daroussin
720*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
721*0f5c86ddSBaptiste Daroussin assert((tag_directives_start && tag_directives_end) ||
722*0f5c86ddSBaptiste Daroussin (tag_directives_start == tag_directives_end));
723*0f5c86ddSBaptiste Daroussin /* Valid tag directives are expected. */
724*0f5c86ddSBaptiste Daroussin
725*0f5c86ddSBaptiste Daroussin if (version_directive) {
726*0f5c86ddSBaptiste Daroussin version_directive_copy = YAML_MALLOC_STATIC(yaml_version_directive_t);
727*0f5c86ddSBaptiste Daroussin if (!version_directive_copy) goto error;
728*0f5c86ddSBaptiste Daroussin version_directive_copy->major = version_directive->major;
729*0f5c86ddSBaptiste Daroussin version_directive_copy->minor = version_directive->minor;
730*0f5c86ddSBaptiste Daroussin }
731*0f5c86ddSBaptiste Daroussin
732*0f5c86ddSBaptiste Daroussin if (tag_directives_start != tag_directives_end) {
733*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directive;
734*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(&context, tag_directives_copy, yaml_tag_directive_t*))
735*0f5c86ddSBaptiste Daroussin goto error;
736*0f5c86ddSBaptiste Daroussin for (tag_directive = tag_directives_start;
737*0f5c86ddSBaptiste Daroussin tag_directive != tag_directives_end; tag_directive ++) {
738*0f5c86ddSBaptiste Daroussin assert(tag_directive->handle);
739*0f5c86ddSBaptiste Daroussin assert(tag_directive->prefix);
740*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag_directive->handle,
741*0f5c86ddSBaptiste Daroussin strlen((char *)tag_directive->handle)))
742*0f5c86ddSBaptiste Daroussin goto error;
743*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag_directive->prefix,
744*0f5c86ddSBaptiste Daroussin strlen((char *)tag_directive->prefix)))
745*0f5c86ddSBaptiste Daroussin goto error;
746*0f5c86ddSBaptiste Daroussin value.handle = yaml_strdup(tag_directive->handle);
747*0f5c86ddSBaptiste Daroussin value.prefix = yaml_strdup(tag_directive->prefix);
748*0f5c86ddSBaptiste Daroussin if (!value.handle || !value.prefix) goto error;
749*0f5c86ddSBaptiste Daroussin if (!PUSH(&context, tag_directives_copy, value))
750*0f5c86ddSBaptiste Daroussin goto error;
751*0f5c86ddSBaptiste Daroussin value.handle = NULL;
752*0f5c86ddSBaptiste Daroussin value.prefix = NULL;
753*0f5c86ddSBaptiste Daroussin }
754*0f5c86ddSBaptiste Daroussin }
755*0f5c86ddSBaptiste Daroussin
756*0f5c86ddSBaptiste Daroussin DOCUMENT_START_EVENT_INIT(*event, version_directive_copy,
757*0f5c86ddSBaptiste Daroussin tag_directives_copy.start, tag_directives_copy.top,
758*0f5c86ddSBaptiste Daroussin implicit, mark, mark);
759*0f5c86ddSBaptiste Daroussin
760*0f5c86ddSBaptiste Daroussin return 1;
761*0f5c86ddSBaptiste Daroussin
762*0f5c86ddSBaptiste Daroussin error:
763*0f5c86ddSBaptiste Daroussin yaml_free(version_directive_copy);
764*0f5c86ddSBaptiste Daroussin while (!STACK_EMPTY(context, tag_directives_copy)) {
765*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t value = POP(context, tag_directives_copy);
766*0f5c86ddSBaptiste Daroussin yaml_free(value.handle);
767*0f5c86ddSBaptiste Daroussin yaml_free(value.prefix);
768*0f5c86ddSBaptiste Daroussin }
769*0f5c86ddSBaptiste Daroussin STACK_DEL(context, tag_directives_copy);
770*0f5c86ddSBaptiste Daroussin yaml_free(value.handle);
771*0f5c86ddSBaptiste Daroussin yaml_free(value.prefix);
772*0f5c86ddSBaptiste Daroussin
773*0f5c86ddSBaptiste Daroussin return 0;
774*0f5c86ddSBaptiste Daroussin }
775*0f5c86ddSBaptiste Daroussin
776*0f5c86ddSBaptiste Daroussin /*
777*0f5c86ddSBaptiste Daroussin * Create DOCUMENT-END.
778*0f5c86ddSBaptiste Daroussin */
779*0f5c86ddSBaptiste Daroussin
780*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_end_event_initialize(yaml_event_t * event,int implicit)781*0f5c86ddSBaptiste Daroussin yaml_document_end_event_initialize(yaml_event_t *event, int implicit)
782*0f5c86ddSBaptiste Daroussin {
783*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
784*0f5c86ddSBaptiste Daroussin
785*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL emitter object is expected. */
786*0f5c86ddSBaptiste Daroussin
787*0f5c86ddSBaptiste Daroussin DOCUMENT_END_EVENT_INIT(*event, implicit, mark, mark);
788*0f5c86ddSBaptiste Daroussin
789*0f5c86ddSBaptiste Daroussin return 1;
790*0f5c86ddSBaptiste Daroussin }
791*0f5c86ddSBaptiste Daroussin
792*0f5c86ddSBaptiste Daroussin /*
793*0f5c86ddSBaptiste Daroussin * Create ALIAS.
794*0f5c86ddSBaptiste Daroussin */
795*0f5c86ddSBaptiste Daroussin
796*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_alias_event_initialize(yaml_event_t * event,const yaml_char_t * anchor)797*0f5c86ddSBaptiste Daroussin yaml_alias_event_initialize(yaml_event_t *event, const yaml_char_t *anchor)
798*0f5c86ddSBaptiste Daroussin {
799*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
800*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor_copy = NULL;
801*0f5c86ddSBaptiste Daroussin
802*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
803*0f5c86ddSBaptiste Daroussin assert(anchor); /* Non-NULL anchor is expected. */
804*0f5c86ddSBaptiste Daroussin
805*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0;
806*0f5c86ddSBaptiste Daroussin
807*0f5c86ddSBaptiste Daroussin anchor_copy = yaml_strdup(anchor);
808*0f5c86ddSBaptiste Daroussin if (!anchor_copy)
809*0f5c86ddSBaptiste Daroussin return 0;
810*0f5c86ddSBaptiste Daroussin
811*0f5c86ddSBaptiste Daroussin ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark);
812*0f5c86ddSBaptiste Daroussin
813*0f5c86ddSBaptiste Daroussin return 1;
814*0f5c86ddSBaptiste Daroussin }
815*0f5c86ddSBaptiste Daroussin
816*0f5c86ddSBaptiste Daroussin /*
817*0f5c86ddSBaptiste Daroussin * Create SCALAR.
818*0f5c86ddSBaptiste Daroussin */
819*0f5c86ddSBaptiste Daroussin
820*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_scalar_event_initialize(yaml_event_t * event,const yaml_char_t * anchor,const yaml_char_t * tag,const yaml_char_t * value,int length,int plain_implicit,int quoted_implicit,yaml_scalar_style_t style)821*0f5c86ddSBaptiste Daroussin yaml_scalar_event_initialize(yaml_event_t *event,
822*0f5c86ddSBaptiste Daroussin const yaml_char_t *anchor, const yaml_char_t *tag,
823*0f5c86ddSBaptiste Daroussin const yaml_char_t *value, int length,
824*0f5c86ddSBaptiste Daroussin int plain_implicit, int quoted_implicit,
825*0f5c86ddSBaptiste Daroussin yaml_scalar_style_t style)
826*0f5c86ddSBaptiste Daroussin {
827*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
828*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor_copy = NULL;
829*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
830*0f5c86ddSBaptiste Daroussin yaml_char_t *value_copy = NULL;
831*0f5c86ddSBaptiste Daroussin
832*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
833*0f5c86ddSBaptiste Daroussin assert(value); /* Non-NULL anchor is expected. */
834*0f5c86ddSBaptiste Daroussin
835*0f5c86ddSBaptiste Daroussin if (anchor) {
836*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
837*0f5c86ddSBaptiste Daroussin anchor_copy = yaml_strdup(anchor);
838*0f5c86ddSBaptiste Daroussin if (!anchor_copy) goto error;
839*0f5c86ddSBaptiste Daroussin }
840*0f5c86ddSBaptiste Daroussin
841*0f5c86ddSBaptiste Daroussin if (tag) {
842*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
843*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
844*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
845*0f5c86ddSBaptiste Daroussin }
846*0f5c86ddSBaptiste Daroussin
847*0f5c86ddSBaptiste Daroussin if (length < 0) {
848*0f5c86ddSBaptiste Daroussin length = strlen((char *)value);
849*0f5c86ddSBaptiste Daroussin }
850*0f5c86ddSBaptiste Daroussin
851*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(value, length)) goto error;
852*0f5c86ddSBaptiste Daroussin value_copy = YAML_MALLOC(length+1);
853*0f5c86ddSBaptiste Daroussin if (!value_copy) goto error;
854*0f5c86ddSBaptiste Daroussin memcpy(value_copy, value, length);
855*0f5c86ddSBaptiste Daroussin value_copy[length] = '\0';
856*0f5c86ddSBaptiste Daroussin
857*0f5c86ddSBaptiste Daroussin SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
858*0f5c86ddSBaptiste Daroussin plain_implicit, quoted_implicit, style, mark, mark);
859*0f5c86ddSBaptiste Daroussin
860*0f5c86ddSBaptiste Daroussin return 1;
861*0f5c86ddSBaptiste Daroussin
862*0f5c86ddSBaptiste Daroussin error:
863*0f5c86ddSBaptiste Daroussin yaml_free(anchor_copy);
864*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
865*0f5c86ddSBaptiste Daroussin yaml_free(value_copy);
866*0f5c86ddSBaptiste Daroussin
867*0f5c86ddSBaptiste Daroussin return 0;
868*0f5c86ddSBaptiste Daroussin }
869*0f5c86ddSBaptiste Daroussin
870*0f5c86ddSBaptiste Daroussin /*
871*0f5c86ddSBaptiste Daroussin * Create SEQUENCE-START.
872*0f5c86ddSBaptiste Daroussin */
873*0f5c86ddSBaptiste Daroussin
874*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_sequence_start_event_initialize(yaml_event_t * event,const yaml_char_t * anchor,const yaml_char_t * tag,int implicit,yaml_sequence_style_t style)875*0f5c86ddSBaptiste Daroussin yaml_sequence_start_event_initialize(yaml_event_t *event,
876*0f5c86ddSBaptiste Daroussin const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
877*0f5c86ddSBaptiste Daroussin yaml_sequence_style_t style)
878*0f5c86ddSBaptiste Daroussin {
879*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
880*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor_copy = NULL;
881*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
882*0f5c86ddSBaptiste Daroussin
883*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
884*0f5c86ddSBaptiste Daroussin
885*0f5c86ddSBaptiste Daroussin if (anchor) {
886*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
887*0f5c86ddSBaptiste Daroussin anchor_copy = yaml_strdup(anchor);
888*0f5c86ddSBaptiste Daroussin if (!anchor_copy) goto error;
889*0f5c86ddSBaptiste Daroussin }
890*0f5c86ddSBaptiste Daroussin
891*0f5c86ddSBaptiste Daroussin if (tag) {
892*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
893*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
894*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
895*0f5c86ddSBaptiste Daroussin }
896*0f5c86ddSBaptiste Daroussin
897*0f5c86ddSBaptiste Daroussin SEQUENCE_START_EVENT_INIT(*event, anchor_copy, tag_copy,
898*0f5c86ddSBaptiste Daroussin implicit, style, mark, mark);
899*0f5c86ddSBaptiste Daroussin
900*0f5c86ddSBaptiste Daroussin return 1;
901*0f5c86ddSBaptiste Daroussin
902*0f5c86ddSBaptiste Daroussin error:
903*0f5c86ddSBaptiste Daroussin yaml_free(anchor_copy);
904*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
905*0f5c86ddSBaptiste Daroussin
906*0f5c86ddSBaptiste Daroussin return 0;
907*0f5c86ddSBaptiste Daroussin }
908*0f5c86ddSBaptiste Daroussin
909*0f5c86ddSBaptiste Daroussin /*
910*0f5c86ddSBaptiste Daroussin * Create SEQUENCE-END.
911*0f5c86ddSBaptiste Daroussin */
912*0f5c86ddSBaptiste Daroussin
913*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_sequence_end_event_initialize(yaml_event_t * event)914*0f5c86ddSBaptiste Daroussin yaml_sequence_end_event_initialize(yaml_event_t *event)
915*0f5c86ddSBaptiste Daroussin {
916*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
917*0f5c86ddSBaptiste Daroussin
918*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
919*0f5c86ddSBaptiste Daroussin
920*0f5c86ddSBaptiste Daroussin SEQUENCE_END_EVENT_INIT(*event, mark, mark);
921*0f5c86ddSBaptiste Daroussin
922*0f5c86ddSBaptiste Daroussin return 1;
923*0f5c86ddSBaptiste Daroussin }
924*0f5c86ddSBaptiste Daroussin
925*0f5c86ddSBaptiste Daroussin /*
926*0f5c86ddSBaptiste Daroussin * Create MAPPING-START.
927*0f5c86ddSBaptiste Daroussin */
928*0f5c86ddSBaptiste Daroussin
929*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_mapping_start_event_initialize(yaml_event_t * event,const yaml_char_t * anchor,const yaml_char_t * tag,int implicit,yaml_mapping_style_t style)930*0f5c86ddSBaptiste Daroussin yaml_mapping_start_event_initialize(yaml_event_t *event,
931*0f5c86ddSBaptiste Daroussin const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
932*0f5c86ddSBaptiste Daroussin yaml_mapping_style_t style)
933*0f5c86ddSBaptiste Daroussin {
934*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
935*0f5c86ddSBaptiste Daroussin yaml_char_t *anchor_copy = NULL;
936*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
937*0f5c86ddSBaptiste Daroussin
938*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
939*0f5c86ddSBaptiste Daroussin
940*0f5c86ddSBaptiste Daroussin if (anchor) {
941*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
942*0f5c86ddSBaptiste Daroussin anchor_copy = yaml_strdup(anchor);
943*0f5c86ddSBaptiste Daroussin if (!anchor_copy) goto error;
944*0f5c86ddSBaptiste Daroussin }
945*0f5c86ddSBaptiste Daroussin
946*0f5c86ddSBaptiste Daroussin if (tag) {
947*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
948*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
949*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
950*0f5c86ddSBaptiste Daroussin }
951*0f5c86ddSBaptiste Daroussin
952*0f5c86ddSBaptiste Daroussin MAPPING_START_EVENT_INIT(*event, anchor_copy, tag_copy,
953*0f5c86ddSBaptiste Daroussin implicit, style, mark, mark);
954*0f5c86ddSBaptiste Daroussin
955*0f5c86ddSBaptiste Daroussin return 1;
956*0f5c86ddSBaptiste Daroussin
957*0f5c86ddSBaptiste Daroussin error:
958*0f5c86ddSBaptiste Daroussin yaml_free(anchor_copy);
959*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
960*0f5c86ddSBaptiste Daroussin
961*0f5c86ddSBaptiste Daroussin return 0;
962*0f5c86ddSBaptiste Daroussin }
963*0f5c86ddSBaptiste Daroussin
964*0f5c86ddSBaptiste Daroussin /*
965*0f5c86ddSBaptiste Daroussin * Create MAPPING-END.
966*0f5c86ddSBaptiste Daroussin */
967*0f5c86ddSBaptiste Daroussin
968*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_mapping_end_event_initialize(yaml_event_t * event)969*0f5c86ddSBaptiste Daroussin yaml_mapping_end_event_initialize(yaml_event_t *event)
970*0f5c86ddSBaptiste Daroussin {
971*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
972*0f5c86ddSBaptiste Daroussin
973*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object is expected. */
974*0f5c86ddSBaptiste Daroussin
975*0f5c86ddSBaptiste Daroussin MAPPING_END_EVENT_INIT(*event, mark, mark);
976*0f5c86ddSBaptiste Daroussin
977*0f5c86ddSBaptiste Daroussin return 1;
978*0f5c86ddSBaptiste Daroussin }
979*0f5c86ddSBaptiste Daroussin
980*0f5c86ddSBaptiste Daroussin /*
981*0f5c86ddSBaptiste Daroussin * Destroy an event object.
982*0f5c86ddSBaptiste Daroussin */
983*0f5c86ddSBaptiste Daroussin
984*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_event_delete(yaml_event_t * event)985*0f5c86ddSBaptiste Daroussin yaml_event_delete(yaml_event_t *event)
986*0f5c86ddSBaptiste Daroussin {
987*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directive;
988*0f5c86ddSBaptiste Daroussin
989*0f5c86ddSBaptiste Daroussin assert(event); /* Non-NULL event object expected. */
990*0f5c86ddSBaptiste Daroussin
991*0f5c86ddSBaptiste Daroussin switch (event->type)
992*0f5c86ddSBaptiste Daroussin {
993*0f5c86ddSBaptiste Daroussin case YAML_DOCUMENT_START_EVENT:
994*0f5c86ddSBaptiste Daroussin yaml_free(event->data.document_start.version_directive);
995*0f5c86ddSBaptiste Daroussin for (tag_directive = event->data.document_start.tag_directives.start;
996*0f5c86ddSBaptiste Daroussin tag_directive != event->data.document_start.tag_directives.end;
997*0f5c86ddSBaptiste Daroussin tag_directive++) {
998*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive->handle);
999*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive->prefix);
1000*0f5c86ddSBaptiste Daroussin }
1001*0f5c86ddSBaptiste Daroussin yaml_free(event->data.document_start.tag_directives.start);
1002*0f5c86ddSBaptiste Daroussin break;
1003*0f5c86ddSBaptiste Daroussin
1004*0f5c86ddSBaptiste Daroussin case YAML_ALIAS_EVENT:
1005*0f5c86ddSBaptiste Daroussin yaml_free(event->data.alias.anchor);
1006*0f5c86ddSBaptiste Daroussin break;
1007*0f5c86ddSBaptiste Daroussin
1008*0f5c86ddSBaptiste Daroussin case YAML_SCALAR_EVENT:
1009*0f5c86ddSBaptiste Daroussin yaml_free(event->data.scalar.anchor);
1010*0f5c86ddSBaptiste Daroussin yaml_free(event->data.scalar.tag);
1011*0f5c86ddSBaptiste Daroussin yaml_free(event->data.scalar.value);
1012*0f5c86ddSBaptiste Daroussin break;
1013*0f5c86ddSBaptiste Daroussin
1014*0f5c86ddSBaptiste Daroussin case YAML_SEQUENCE_START_EVENT:
1015*0f5c86ddSBaptiste Daroussin yaml_free(event->data.sequence_start.anchor);
1016*0f5c86ddSBaptiste Daroussin yaml_free(event->data.sequence_start.tag);
1017*0f5c86ddSBaptiste Daroussin break;
1018*0f5c86ddSBaptiste Daroussin
1019*0f5c86ddSBaptiste Daroussin case YAML_MAPPING_START_EVENT:
1020*0f5c86ddSBaptiste Daroussin yaml_free(event->data.mapping_start.anchor);
1021*0f5c86ddSBaptiste Daroussin yaml_free(event->data.mapping_start.tag);
1022*0f5c86ddSBaptiste Daroussin break;
1023*0f5c86ddSBaptiste Daroussin
1024*0f5c86ddSBaptiste Daroussin default:
1025*0f5c86ddSBaptiste Daroussin break;
1026*0f5c86ddSBaptiste Daroussin }
1027*0f5c86ddSBaptiste Daroussin
1028*0f5c86ddSBaptiste Daroussin memset(event, 0, sizeof(yaml_event_t));
1029*0f5c86ddSBaptiste Daroussin }
1030*0f5c86ddSBaptiste Daroussin
1031*0f5c86ddSBaptiste Daroussin /*
1032*0f5c86ddSBaptiste Daroussin * Create a document object.
1033*0f5c86ddSBaptiste Daroussin */
1034*0f5c86ddSBaptiste Daroussin
1035*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_initialize(yaml_document_t * document,yaml_version_directive_t * version_directive,yaml_tag_directive_t * tag_directives_start,yaml_tag_directive_t * tag_directives_end,int start_implicit,int end_implicit)1036*0f5c86ddSBaptiste Daroussin yaml_document_initialize(yaml_document_t *document,
1037*0f5c86ddSBaptiste Daroussin yaml_version_directive_t *version_directive,
1038*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directives_start,
1039*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directives_end,
1040*0f5c86ddSBaptiste Daroussin int start_implicit, int end_implicit)
1041*0f5c86ddSBaptiste Daroussin {
1042*0f5c86ddSBaptiste Daroussin struct {
1043*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1044*0f5c86ddSBaptiste Daroussin } context;
1045*0f5c86ddSBaptiste Daroussin struct {
1046*0f5c86ddSBaptiste Daroussin yaml_node_t *start;
1047*0f5c86ddSBaptiste Daroussin yaml_node_t *end;
1048*0f5c86ddSBaptiste Daroussin yaml_node_t *top;
1049*0f5c86ddSBaptiste Daroussin } nodes = { NULL, NULL, NULL };
1050*0f5c86ddSBaptiste Daroussin yaml_version_directive_t *version_directive_copy = NULL;
1051*0f5c86ddSBaptiste Daroussin struct {
1052*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *start;
1053*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *end;
1054*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *top;
1055*0f5c86ddSBaptiste Daroussin } tag_directives_copy = { NULL, NULL, NULL };
1056*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t value = { NULL, NULL };
1057*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
1058*0f5c86ddSBaptiste Daroussin
1059*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1060*0f5c86ddSBaptiste Daroussin assert((tag_directives_start && tag_directives_end) ||
1061*0f5c86ddSBaptiste Daroussin (tag_directives_start == tag_directives_end));
1062*0f5c86ddSBaptiste Daroussin /* Valid tag directives are expected. */
1063*0f5c86ddSBaptiste Daroussin
1064*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(&context, nodes, yaml_node_t*)) goto error;
1065*0f5c86ddSBaptiste Daroussin
1066*0f5c86ddSBaptiste Daroussin if (version_directive) {
1067*0f5c86ddSBaptiste Daroussin version_directive_copy = YAML_MALLOC_STATIC(yaml_version_directive_t);
1068*0f5c86ddSBaptiste Daroussin if (!version_directive_copy) goto error;
1069*0f5c86ddSBaptiste Daroussin version_directive_copy->major = version_directive->major;
1070*0f5c86ddSBaptiste Daroussin version_directive_copy->minor = version_directive->minor;
1071*0f5c86ddSBaptiste Daroussin }
1072*0f5c86ddSBaptiste Daroussin
1073*0f5c86ddSBaptiste Daroussin if (tag_directives_start != tag_directives_end) {
1074*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directive;
1075*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(&context, tag_directives_copy, yaml_tag_directive_t*))
1076*0f5c86ddSBaptiste Daroussin goto error;
1077*0f5c86ddSBaptiste Daroussin for (tag_directive = tag_directives_start;
1078*0f5c86ddSBaptiste Daroussin tag_directive != tag_directives_end; tag_directive ++) {
1079*0f5c86ddSBaptiste Daroussin assert(tag_directive->handle);
1080*0f5c86ddSBaptiste Daroussin assert(tag_directive->prefix);
1081*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag_directive->handle,
1082*0f5c86ddSBaptiste Daroussin strlen((char *)tag_directive->handle)))
1083*0f5c86ddSBaptiste Daroussin goto error;
1084*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag_directive->prefix,
1085*0f5c86ddSBaptiste Daroussin strlen((char *)tag_directive->prefix)))
1086*0f5c86ddSBaptiste Daroussin goto error;
1087*0f5c86ddSBaptiste Daroussin value.handle = yaml_strdup(tag_directive->handle);
1088*0f5c86ddSBaptiste Daroussin value.prefix = yaml_strdup(tag_directive->prefix);
1089*0f5c86ddSBaptiste Daroussin if (!value.handle || !value.prefix) goto error;
1090*0f5c86ddSBaptiste Daroussin if (!PUSH(&context, tag_directives_copy, value))
1091*0f5c86ddSBaptiste Daroussin goto error;
1092*0f5c86ddSBaptiste Daroussin value.handle = NULL;
1093*0f5c86ddSBaptiste Daroussin value.prefix = NULL;
1094*0f5c86ddSBaptiste Daroussin }
1095*0f5c86ddSBaptiste Daroussin }
1096*0f5c86ddSBaptiste Daroussin
1097*0f5c86ddSBaptiste Daroussin DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
1098*0f5c86ddSBaptiste Daroussin tag_directives_copy.start, tag_directives_copy.top,
1099*0f5c86ddSBaptiste Daroussin start_implicit, end_implicit, mark, mark);
1100*0f5c86ddSBaptiste Daroussin
1101*0f5c86ddSBaptiste Daroussin return 1;
1102*0f5c86ddSBaptiste Daroussin
1103*0f5c86ddSBaptiste Daroussin error:
1104*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, nodes);
1105*0f5c86ddSBaptiste Daroussin yaml_free(version_directive_copy);
1106*0f5c86ddSBaptiste Daroussin while (!STACK_EMPTY(&context, tag_directives_copy)) {
1107*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t value = POP(&context, tag_directives_copy);
1108*0f5c86ddSBaptiste Daroussin yaml_free(value.handle);
1109*0f5c86ddSBaptiste Daroussin yaml_free(value.prefix);
1110*0f5c86ddSBaptiste Daroussin }
1111*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, tag_directives_copy);
1112*0f5c86ddSBaptiste Daroussin yaml_free(value.handle);
1113*0f5c86ddSBaptiste Daroussin yaml_free(value.prefix);
1114*0f5c86ddSBaptiste Daroussin
1115*0f5c86ddSBaptiste Daroussin return 0;
1116*0f5c86ddSBaptiste Daroussin }
1117*0f5c86ddSBaptiste Daroussin
1118*0f5c86ddSBaptiste Daroussin /*
1119*0f5c86ddSBaptiste Daroussin * Destroy a document object.
1120*0f5c86ddSBaptiste Daroussin */
1121*0f5c86ddSBaptiste Daroussin
1122*0f5c86ddSBaptiste Daroussin YAML_DECLARE(void)
yaml_document_delete(yaml_document_t * document)1123*0f5c86ddSBaptiste Daroussin yaml_document_delete(yaml_document_t *document)
1124*0f5c86ddSBaptiste Daroussin {
1125*0f5c86ddSBaptiste Daroussin yaml_tag_directive_t *tag_directive;
1126*0f5c86ddSBaptiste Daroussin
1127*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1128*0f5c86ddSBaptiste Daroussin
1129*0f5c86ddSBaptiste Daroussin while (!STACK_EMPTY(&context, document->nodes)) {
1130*0f5c86ddSBaptiste Daroussin yaml_node_t node = POP(&context, document->nodes);
1131*0f5c86ddSBaptiste Daroussin yaml_free(node.tag);
1132*0f5c86ddSBaptiste Daroussin switch (node.type) {
1133*0f5c86ddSBaptiste Daroussin case YAML_SCALAR_NODE:
1134*0f5c86ddSBaptiste Daroussin yaml_free(node.data.scalar.value);
1135*0f5c86ddSBaptiste Daroussin break;
1136*0f5c86ddSBaptiste Daroussin case YAML_SEQUENCE_NODE:
1137*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, node.data.sequence.items);
1138*0f5c86ddSBaptiste Daroussin break;
1139*0f5c86ddSBaptiste Daroussin case YAML_MAPPING_NODE:
1140*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, node.data.mapping.pairs);
1141*0f5c86ddSBaptiste Daroussin break;
1142*0f5c86ddSBaptiste Daroussin default:
1143*0f5c86ddSBaptiste Daroussin assert(0); /* Should not happen. */
1144*0f5c86ddSBaptiste Daroussin }
1145*0f5c86ddSBaptiste Daroussin }
1146*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, document->nodes);
1147*0f5c86ddSBaptiste Daroussin
1148*0f5c86ddSBaptiste Daroussin yaml_free(document->version_directive);
1149*0f5c86ddSBaptiste Daroussin for (tag_directive = document->tag_directives.start;
1150*0f5c86ddSBaptiste Daroussin tag_directive != document->tag_directives.end;
1151*0f5c86ddSBaptiste Daroussin tag_directive++) {
1152*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive->handle);
1153*0f5c86ddSBaptiste Daroussin yaml_free(tag_directive->prefix);
1154*0f5c86ddSBaptiste Daroussin }
1155*0f5c86ddSBaptiste Daroussin yaml_free(document->tag_directives.start);
1156*0f5c86ddSBaptiste Daroussin
1157*0f5c86ddSBaptiste Daroussin memset(document, 0, sizeof(yaml_document_t));
1158*0f5c86ddSBaptiste Daroussin }
1159*0f5c86ddSBaptiste Daroussin
1160*0f5c86ddSBaptiste Daroussin /**
1161*0f5c86ddSBaptiste Daroussin * Get a document node.
1162*0f5c86ddSBaptiste Daroussin */
1163*0f5c86ddSBaptiste Daroussin
1164*0f5c86ddSBaptiste Daroussin YAML_DECLARE(yaml_node_t *)
yaml_document_get_node(yaml_document_t * document,int index)1165*0f5c86ddSBaptiste Daroussin yaml_document_get_node(yaml_document_t *document, int index)
1166*0f5c86ddSBaptiste Daroussin {
1167*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1168*0f5c86ddSBaptiste Daroussin
1169*0f5c86ddSBaptiste Daroussin if (index > 0 && document->nodes.start + index <= document->nodes.top) {
1170*0f5c86ddSBaptiste Daroussin return document->nodes.start + index - 1;
1171*0f5c86ddSBaptiste Daroussin }
1172*0f5c86ddSBaptiste Daroussin return NULL;
1173*0f5c86ddSBaptiste Daroussin }
1174*0f5c86ddSBaptiste Daroussin
1175*0f5c86ddSBaptiste Daroussin /**
1176*0f5c86ddSBaptiste Daroussin * Get the root object.
1177*0f5c86ddSBaptiste Daroussin */
1178*0f5c86ddSBaptiste Daroussin
1179*0f5c86ddSBaptiste Daroussin YAML_DECLARE(yaml_node_t *)
yaml_document_get_root_node(yaml_document_t * document)1180*0f5c86ddSBaptiste Daroussin yaml_document_get_root_node(yaml_document_t *document)
1181*0f5c86ddSBaptiste Daroussin {
1182*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1183*0f5c86ddSBaptiste Daroussin
1184*0f5c86ddSBaptiste Daroussin if (document->nodes.top != document->nodes.start) {
1185*0f5c86ddSBaptiste Daroussin return document->nodes.start;
1186*0f5c86ddSBaptiste Daroussin }
1187*0f5c86ddSBaptiste Daroussin return NULL;
1188*0f5c86ddSBaptiste Daroussin }
1189*0f5c86ddSBaptiste Daroussin
1190*0f5c86ddSBaptiste Daroussin /*
1191*0f5c86ddSBaptiste Daroussin * Add a scalar node to a document.
1192*0f5c86ddSBaptiste Daroussin */
1193*0f5c86ddSBaptiste Daroussin
1194*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_add_scalar(yaml_document_t * document,const yaml_char_t * tag,const yaml_char_t * value,int length,yaml_scalar_style_t style)1195*0f5c86ddSBaptiste Daroussin yaml_document_add_scalar(yaml_document_t *document,
1196*0f5c86ddSBaptiste Daroussin const yaml_char_t *tag, const yaml_char_t *value, int length,
1197*0f5c86ddSBaptiste Daroussin yaml_scalar_style_t style)
1198*0f5c86ddSBaptiste Daroussin {
1199*0f5c86ddSBaptiste Daroussin struct {
1200*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1201*0f5c86ddSBaptiste Daroussin } context;
1202*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
1203*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
1204*0f5c86ddSBaptiste Daroussin yaml_char_t *value_copy = NULL;
1205*0f5c86ddSBaptiste Daroussin yaml_node_t node;
1206*0f5c86ddSBaptiste Daroussin
1207*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1208*0f5c86ddSBaptiste Daroussin assert(value); /* Non-NULL value is expected. */
1209*0f5c86ddSBaptiste Daroussin
1210*0f5c86ddSBaptiste Daroussin if (!tag) {
1211*0f5c86ddSBaptiste Daroussin tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG;
1212*0f5c86ddSBaptiste Daroussin }
1213*0f5c86ddSBaptiste Daroussin
1214*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
1215*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
1216*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
1217*0f5c86ddSBaptiste Daroussin
1218*0f5c86ddSBaptiste Daroussin if (length < 0) {
1219*0f5c86ddSBaptiste Daroussin length = strlen((char *)value);
1220*0f5c86ddSBaptiste Daroussin }
1221*0f5c86ddSBaptiste Daroussin
1222*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(value, length)) goto error;
1223*0f5c86ddSBaptiste Daroussin value_copy = YAML_MALLOC(length+1);
1224*0f5c86ddSBaptiste Daroussin if (!value_copy) goto error;
1225*0f5c86ddSBaptiste Daroussin memcpy(value_copy, value, length);
1226*0f5c86ddSBaptiste Daroussin value_copy[length] = '\0';
1227*0f5c86ddSBaptiste Daroussin
1228*0f5c86ddSBaptiste Daroussin SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
1229*0f5c86ddSBaptiste Daroussin if (!PUSH(&context, document->nodes, node)) goto error;
1230*0f5c86ddSBaptiste Daroussin
1231*0f5c86ddSBaptiste Daroussin return document->nodes.top - document->nodes.start;
1232*0f5c86ddSBaptiste Daroussin
1233*0f5c86ddSBaptiste Daroussin error:
1234*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
1235*0f5c86ddSBaptiste Daroussin yaml_free(value_copy);
1236*0f5c86ddSBaptiste Daroussin
1237*0f5c86ddSBaptiste Daroussin return 0;
1238*0f5c86ddSBaptiste Daroussin }
1239*0f5c86ddSBaptiste Daroussin
1240*0f5c86ddSBaptiste Daroussin /*
1241*0f5c86ddSBaptiste Daroussin * Add a sequence node to a document.
1242*0f5c86ddSBaptiste Daroussin */
1243*0f5c86ddSBaptiste Daroussin
1244*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_add_sequence(yaml_document_t * document,const yaml_char_t * tag,yaml_sequence_style_t style)1245*0f5c86ddSBaptiste Daroussin yaml_document_add_sequence(yaml_document_t *document,
1246*0f5c86ddSBaptiste Daroussin const yaml_char_t *tag, yaml_sequence_style_t style)
1247*0f5c86ddSBaptiste Daroussin {
1248*0f5c86ddSBaptiste Daroussin struct {
1249*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1250*0f5c86ddSBaptiste Daroussin } context;
1251*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
1252*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
1253*0f5c86ddSBaptiste Daroussin struct {
1254*0f5c86ddSBaptiste Daroussin yaml_node_item_t *start;
1255*0f5c86ddSBaptiste Daroussin yaml_node_item_t *end;
1256*0f5c86ddSBaptiste Daroussin yaml_node_item_t *top;
1257*0f5c86ddSBaptiste Daroussin } items = { NULL, NULL, NULL };
1258*0f5c86ddSBaptiste Daroussin yaml_node_t node;
1259*0f5c86ddSBaptiste Daroussin
1260*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1261*0f5c86ddSBaptiste Daroussin
1262*0f5c86ddSBaptiste Daroussin if (!tag) {
1263*0f5c86ddSBaptiste Daroussin tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG;
1264*0f5c86ddSBaptiste Daroussin }
1265*0f5c86ddSBaptiste Daroussin
1266*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
1267*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
1268*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
1269*0f5c86ddSBaptiste Daroussin
1270*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(&context, items, yaml_node_item_t*)) goto error;
1271*0f5c86ddSBaptiste Daroussin
1272*0f5c86ddSBaptiste Daroussin SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
1273*0f5c86ddSBaptiste Daroussin style, mark, mark);
1274*0f5c86ddSBaptiste Daroussin if (!PUSH(&context, document->nodes, node)) goto error;
1275*0f5c86ddSBaptiste Daroussin
1276*0f5c86ddSBaptiste Daroussin return document->nodes.top - document->nodes.start;
1277*0f5c86ddSBaptiste Daroussin
1278*0f5c86ddSBaptiste Daroussin error:
1279*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, items);
1280*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
1281*0f5c86ddSBaptiste Daroussin
1282*0f5c86ddSBaptiste Daroussin return 0;
1283*0f5c86ddSBaptiste Daroussin }
1284*0f5c86ddSBaptiste Daroussin
1285*0f5c86ddSBaptiste Daroussin /*
1286*0f5c86ddSBaptiste Daroussin * Add a mapping node to a document.
1287*0f5c86ddSBaptiste Daroussin */
1288*0f5c86ddSBaptiste Daroussin
1289*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_add_mapping(yaml_document_t * document,const yaml_char_t * tag,yaml_mapping_style_t style)1290*0f5c86ddSBaptiste Daroussin yaml_document_add_mapping(yaml_document_t *document,
1291*0f5c86ddSBaptiste Daroussin const yaml_char_t *tag, yaml_mapping_style_t style)
1292*0f5c86ddSBaptiste Daroussin {
1293*0f5c86ddSBaptiste Daroussin struct {
1294*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1295*0f5c86ddSBaptiste Daroussin } context;
1296*0f5c86ddSBaptiste Daroussin yaml_mark_t mark = { 0, 0, 0 };
1297*0f5c86ddSBaptiste Daroussin yaml_char_t *tag_copy = NULL;
1298*0f5c86ddSBaptiste Daroussin struct {
1299*0f5c86ddSBaptiste Daroussin yaml_node_pair_t *start;
1300*0f5c86ddSBaptiste Daroussin yaml_node_pair_t *end;
1301*0f5c86ddSBaptiste Daroussin yaml_node_pair_t *top;
1302*0f5c86ddSBaptiste Daroussin } pairs = { NULL, NULL, NULL };
1303*0f5c86ddSBaptiste Daroussin yaml_node_t node;
1304*0f5c86ddSBaptiste Daroussin
1305*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document object is expected. */
1306*0f5c86ddSBaptiste Daroussin
1307*0f5c86ddSBaptiste Daroussin if (!tag) {
1308*0f5c86ddSBaptiste Daroussin tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG;
1309*0f5c86ddSBaptiste Daroussin }
1310*0f5c86ddSBaptiste Daroussin
1311*0f5c86ddSBaptiste Daroussin if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
1312*0f5c86ddSBaptiste Daroussin tag_copy = yaml_strdup(tag);
1313*0f5c86ddSBaptiste Daroussin if (!tag_copy) goto error;
1314*0f5c86ddSBaptiste Daroussin
1315*0f5c86ddSBaptiste Daroussin if (!STACK_INIT(&context, pairs, yaml_node_pair_t*)) goto error;
1316*0f5c86ddSBaptiste Daroussin
1317*0f5c86ddSBaptiste Daroussin MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
1318*0f5c86ddSBaptiste Daroussin style, mark, mark);
1319*0f5c86ddSBaptiste Daroussin if (!PUSH(&context, document->nodes, node)) goto error;
1320*0f5c86ddSBaptiste Daroussin
1321*0f5c86ddSBaptiste Daroussin return document->nodes.top - document->nodes.start;
1322*0f5c86ddSBaptiste Daroussin
1323*0f5c86ddSBaptiste Daroussin error:
1324*0f5c86ddSBaptiste Daroussin STACK_DEL(&context, pairs);
1325*0f5c86ddSBaptiste Daroussin yaml_free(tag_copy);
1326*0f5c86ddSBaptiste Daroussin
1327*0f5c86ddSBaptiste Daroussin return 0;
1328*0f5c86ddSBaptiste Daroussin }
1329*0f5c86ddSBaptiste Daroussin
1330*0f5c86ddSBaptiste Daroussin /*
1331*0f5c86ddSBaptiste Daroussin * Append an item to a sequence node.
1332*0f5c86ddSBaptiste Daroussin */
1333*0f5c86ddSBaptiste Daroussin
1334*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_append_sequence_item(yaml_document_t * document,int sequence,int item)1335*0f5c86ddSBaptiste Daroussin yaml_document_append_sequence_item(yaml_document_t *document,
1336*0f5c86ddSBaptiste Daroussin int sequence, int item)
1337*0f5c86ddSBaptiste Daroussin {
1338*0f5c86ddSBaptiste Daroussin struct {
1339*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1340*0f5c86ddSBaptiste Daroussin } context;
1341*0f5c86ddSBaptiste Daroussin
1342*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document is required. */
1343*0f5c86ddSBaptiste Daroussin assert(sequence > 0
1344*0f5c86ddSBaptiste Daroussin && document->nodes.start + sequence <= document->nodes.top);
1345*0f5c86ddSBaptiste Daroussin /* Valid sequence id is required. */
1346*0f5c86ddSBaptiste Daroussin assert(document->nodes.start[sequence-1].type == YAML_SEQUENCE_NODE);
1347*0f5c86ddSBaptiste Daroussin /* A sequence node is required. */
1348*0f5c86ddSBaptiste Daroussin assert(item > 0 && document->nodes.start + item <= document->nodes.top);
1349*0f5c86ddSBaptiste Daroussin /* Valid item id is required. */
1350*0f5c86ddSBaptiste Daroussin
1351*0f5c86ddSBaptiste Daroussin if (!PUSH(&context,
1352*0f5c86ddSBaptiste Daroussin document->nodes.start[sequence-1].data.sequence.items, item))
1353*0f5c86ddSBaptiste Daroussin return 0;
1354*0f5c86ddSBaptiste Daroussin
1355*0f5c86ddSBaptiste Daroussin return 1;
1356*0f5c86ddSBaptiste Daroussin }
1357*0f5c86ddSBaptiste Daroussin
1358*0f5c86ddSBaptiste Daroussin /*
1359*0f5c86ddSBaptiste Daroussin * Append a pair of a key and a value to a mapping node.
1360*0f5c86ddSBaptiste Daroussin */
1361*0f5c86ddSBaptiste Daroussin
1362*0f5c86ddSBaptiste Daroussin YAML_DECLARE(int)
yaml_document_append_mapping_pair(yaml_document_t * document,int mapping,int key,int value)1363*0f5c86ddSBaptiste Daroussin yaml_document_append_mapping_pair(yaml_document_t *document,
1364*0f5c86ddSBaptiste Daroussin int mapping, int key, int value)
1365*0f5c86ddSBaptiste Daroussin {
1366*0f5c86ddSBaptiste Daroussin struct {
1367*0f5c86ddSBaptiste Daroussin yaml_error_type_t error;
1368*0f5c86ddSBaptiste Daroussin } context;
1369*0f5c86ddSBaptiste Daroussin
1370*0f5c86ddSBaptiste Daroussin yaml_node_pair_t pair;
1371*0f5c86ddSBaptiste Daroussin
1372*0f5c86ddSBaptiste Daroussin assert(document); /* Non-NULL document is required. */
1373*0f5c86ddSBaptiste Daroussin assert(mapping > 0
1374*0f5c86ddSBaptiste Daroussin && document->nodes.start + mapping <= document->nodes.top);
1375*0f5c86ddSBaptiste Daroussin /* Valid mapping id is required. */
1376*0f5c86ddSBaptiste Daroussin assert(document->nodes.start[mapping-1].type == YAML_MAPPING_NODE);
1377*0f5c86ddSBaptiste Daroussin /* A mapping node is required. */
1378*0f5c86ddSBaptiste Daroussin assert(key > 0 && document->nodes.start + key <= document->nodes.top);
1379*0f5c86ddSBaptiste Daroussin /* Valid key id is required. */
1380*0f5c86ddSBaptiste Daroussin assert(value > 0 && document->nodes.start + value <= document->nodes.top);
1381*0f5c86ddSBaptiste Daroussin /* Valid value id is required. */
1382*0f5c86ddSBaptiste Daroussin
1383*0f5c86ddSBaptiste Daroussin pair.key = key;
1384*0f5c86ddSBaptiste Daroussin pair.value = value;
1385*0f5c86ddSBaptiste Daroussin
1386*0f5c86ddSBaptiste Daroussin if (!PUSH(&context,
1387*0f5c86ddSBaptiste Daroussin document->nodes.start[mapping-1].data.mapping.pairs, pair))
1388*0f5c86ddSBaptiste Daroussin return 0;
1389*0f5c86ddSBaptiste Daroussin
1390*0f5c86ddSBaptiste Daroussin return 1;
1391*0f5c86ddSBaptiste Daroussin }
1392*0f5c86ddSBaptiste Daroussin
1393*0f5c86ddSBaptiste Daroussin
1394