]> andersk Git - libyaml.git/blob - src/yaml_private.h
ac1295b7d3331b8c95fe640d41cab9214d887784
[libyaml.git] / src / yaml_private.h
1 #if HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4
5 #include <yaml.h>
6
7 #include <assert.h>
8 #include <limits.h>
9 #include <stddef.h>
10
11 #ifndef _MSC_VER
12 #include <stdint.h>
13 #ifndef PTRDIFF_MAX /* gcc on HP-UX sucks */
14 #ifdef _LP64
15 #define PTRDIFF_MAX 0x7FFFFFFFFFFFFFFFLL
16 #else
17 #define PTRDIFF_MAX 0x7FFFFFFFL
18 #endif
19 #endif
20 #else
21 #ifdef _WIN64
22 #define PTRDIFF_MAX _I64_MAX
23 #else
24 #define PTRDIFF_MAX INT_MAX
25 #endif
26 #endif
27
28 /*
29  * Memory management.
30  */
31
32 YAML_DECLARE(void *)
33 yaml_malloc(size_t size);
34
35 YAML_DECLARE(void *)
36 yaml_realloc(void *ptr, size_t size);
37
38 YAML_DECLARE(void)
39 yaml_free(void *ptr);
40
41 YAML_DECLARE(yaml_char_t *)
42 yaml_strdup(const yaml_char_t *);
43
44 /*
45  * Reader: Ensure that the buffer contains at least `length` characters.
46  */
47
48 YAML_DECLARE(int)
49 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
50
51 /*
52  * Scanner: Ensure that the token stack contains at least one token ready.
53  */
54
55 YAML_DECLARE(int)
56 yaml_parser_fetch_more_tokens(yaml_parser_t *parser);
57
58 /*
59  * The size of the input raw buffer.
60  */
61
62 #define INPUT_RAW_BUFFER_SIZE   16384
63
64 /*
65  * The size of the input buffer.
66  *
67  * It should be possible to decode the whole raw buffer.
68  */
69
70 #define INPUT_BUFFER_SIZE       (INPUT_RAW_BUFFER_SIZE*3)
71
72 /*
73  * The size of the output buffer.
74  */
75
76 #define OUTPUT_BUFFER_SIZE      16384
77
78 /*
79  * The size of the output raw buffer.
80  *
81  * It should be possible to encode the whole output buffer.
82  */
83
84 #define OUTPUT_RAW_BUFFER_SIZE  (OUTPUT_BUFFER_SIZE*2+2)
85
86 /*
87  * The size of other stacks and queues.
88  */
89
90 #define INITIAL_STACK_SIZE  16
91 #define INITIAL_QUEUE_SIZE  16
92 #define INITIAL_STRING_SIZE 16
93
94 /*
95  * Buffer management.
96  */
97
98 #define BUFFER_INIT(context,buffer,size)                                        \
99     (((buffer).start = yaml_malloc(size)) ?                                     \
100         ((buffer).last = (buffer).pointer = (buffer).start,                     \
101          (buffer).end = (buffer).start+(size),                                  \
102          1) :                                                                   \
103         ((context)->error = YAML_MEMORY_ERROR,                                  \
104          0))
105
106 #define BUFFER_DEL(context,buffer)                                              \
107     (yaml_free((buffer).start),                                                 \
108      (buffer).start = (buffer).pointer = (buffer).end = 0)
109
110 /*
111  * String management.
112  */
113
114 typedef struct {
115     yaml_char_t *start;
116     yaml_char_t *end;
117     yaml_char_t *pointer;
118 } yaml_string_t;
119
120 YAML_DECLARE(int)
121 yaml_string_extend(yaml_char_t **start,
122         yaml_char_t **pointer, yaml_char_t **end);
123
124 YAML_DECLARE(int)
125 yaml_string_join(
126         yaml_char_t **a_start, yaml_char_t **a_pointer, yaml_char_t **a_end,
127         yaml_char_t **b_start, yaml_char_t **b_pointer, yaml_char_t **b_end);
128
129 #define NULL_STRING { NULL, NULL, NULL }
130
131 #define STRING(string,length)   { (string), (string)+(length), (string) }
132
133 #define STRING_ASSIGN(value,string,length)                                      \
134     ((value).start = (string),                                                  \
135      (value).end = (string)+(length),                                           \
136      (value).pointer = (string))
137
138 #define STRING_INIT(context,string,size)                                        \
139     (((string).start = yaml_malloc(size)) ?                                     \
140         ((string).pointer = (string).start,                                     \
141          (string).end = (string).start+(size),                                  \
142          memset((string).start, 0, (size)),                                     \
143          1) :                                                                   \
144         ((context)->error = YAML_MEMORY_ERROR,                                  \
145          0))
146
147 #define STRING_DEL(context,string)                                              \
148     (yaml_free((string).start),                                                 \
149      (string).start = (string).pointer = (string).end = 0)
150
151 #define STRING_EXTEND(context,string)                                           \
152     ((((string).pointer+5 < (string).end)                                       \
153         || yaml_string_extend(&(string).start,                                  \
154             &(string).pointer, &(string).end)) ?                                \
155          1 :                                                                    \
156         ((context)->error = YAML_MEMORY_ERROR,                                  \
157          0))
158
159 #define CLEAR(context,string)                                                   \
160     ((string).pointer = (string).start,                                         \
161      memset((string).start, 0, (string).end-(string).start))
162
163 #define JOIN(context,string_a,string_b)                                         \
164     ((yaml_string_join(&(string_a).start, &(string_a).pointer,                  \
165                        &(string_a).end, &(string_b).start,                      \
166                        &(string_b).pointer, &(string_b).end)) ?                 \
167         ((string_b).pointer = (string_b).start,                                 \
168          1) :                                                                   \
169         ((context)->error = YAML_MEMORY_ERROR,                                  \
170          0))
171
172 /*
173  * String check operations.
174  */
175
176 /*
177  * Check the octet at the specified position.
178  */
179
180 #define CHECK_AT(string,octet,offset)                                           \
181     ((string).pointer[offset] == (yaml_char_t)(octet))
182
183 /*
184  * Check the current octet in the buffer.
185  */
186
187 #define CHECK(string,octet) CHECK_AT((string),(octet),0)
188
189 /*
190  * Check if the character at the specified position is an alphabetical
191  * character, a digit, '_', or '-'.
192  */
193
194 #define IS_ALPHA_AT(string,offset)                                              \
195      (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
196        (string).pointer[offset] <= (yaml_char_t) '9') ||                        \
197       ((string).pointer[offset] >= (yaml_char_t) 'A' &&                         \
198        (string).pointer[offset] <= (yaml_char_t) 'Z') ||                        \
199       ((string).pointer[offset] >= (yaml_char_t) 'a' &&                         \
200        (string).pointer[offset] <= (yaml_char_t) 'z') ||                        \
201       (string).pointer[offset] == '_' ||                                        \
202       (string).pointer[offset] == '-')
203
204 #define IS_ALPHA(string)    IS_ALPHA_AT((string),0)
205
206 /*
207  * Check if the character at the specified position is a digit.
208  */
209
210 #define IS_DIGIT_AT(string,offset)                                              \
211      (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
212        (string).pointer[offset] <= (yaml_char_t) '9'))
213
214 #define IS_DIGIT(string)    IS_DIGIT_AT((string),0)
215
216 /*
217  * Get the value of a digit.
218  */
219
220 #define AS_DIGIT_AT(string,offset)                                              \
221      ((string).pointer[offset] - (yaml_char_t) '0')
222
223 #define AS_DIGIT(string)    AS_DIGIT_AT((string),0)
224
225 /*
226  * Check if the character at the specified position is a hex-digit.
227  */
228
229 #define IS_HEX_AT(string,offset)                                                \
230      (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
231        (string).pointer[offset] <= (yaml_char_t) '9') ||                        \
232       ((string).pointer[offset] >= (yaml_char_t) 'A' &&                         \
233        (string).pointer[offset] <= (yaml_char_t) 'F') ||                        \
234       ((string).pointer[offset] >= (yaml_char_t) 'a' &&                         \
235        (string).pointer[offset] <= (yaml_char_t) 'f'))
236
237 #define IS_HEX(string)    IS_HEX_AT((string),0)
238
239 /*
240  * Get the value of a hex-digit.
241  */
242
243 #define AS_HEX_AT(string,offset)                                                \
244       (((string).pointer[offset] >= (yaml_char_t) 'A' &&                        \
245         (string).pointer[offset] <= (yaml_char_t) 'F') ?                        \
246        ((string).pointer[offset] - (yaml_char_t) 'A' + 10) :                    \
247        ((string).pointer[offset] >= (yaml_char_t) 'a' &&                        \
248         (string).pointer[offset] <= (yaml_char_t) 'f') ?                        \
249        ((string).pointer[offset] - (yaml_char_t) 'a' + 10) :                    \
250        ((string).pointer[offset] - (yaml_char_t) '0'))
251
252 #define AS_HEX(string)  AS_HEX_AT((string),0)
253
254 /*
255  * Check if the character is ASCII.
256  */
257
258 #define IS_ASCII_AT(string,offset)                                              \
259     ((string).pointer[offset] <= (yaml_char_t) '\x7F')
260
261 #define IS_ASCII(string)    IS_ASCII_AT((string),0)
262
263 /*
264  * Check if the character can be printed unescaped.
265  */
266
267 #define IS_PRINTABLE_AT(string,offset)                                          \
268     (((string).pointer[offset] == 0x0A)         /* . == #x0A */                 \
269      || ((string).pointer[offset] >= 0x20       /* #x20 <= . <= #x7E */         \
270          && (string).pointer[offset] <= 0x7E)                                   \
271      || ((string).pointer[offset] == 0xC2       /* #0xA0 <= . <= #xD7FF */      \
272          && (string).pointer[offset+1] >= 0xA0)                                 \
273      || ((string).pointer[offset] > 0xC2                                        \
274          && (string).pointer[offset] < 0xED)                                    \
275      || ((string).pointer[offset] == 0xED                                       \
276          && (string).pointer[offset+1] < 0xA0)                                  \
277      || ((string).pointer[offset] == 0xEE)                                      \
278      || ((string).pointer[offset] == 0xEF      /* #xE000 <= . <= #xFFFD */      \
279          && !((string).pointer[offset+1] == 0xBB        /* && . != #xFEFF */    \
280              && (string).pointer[offset+2] == 0xBF)                             \
281          && !((string).pointer[offset+1] == 0xBF                                \
282              && ((string).pointer[offset+2] == 0xBE                             \
283                  || (string).pointer[offset+2] == 0xBF))))
284
285 #define IS_PRINTABLE(string)    IS_PRINTABLE_AT((string),0)
286
287 /*
288  * Check if the character at the specified position is NUL.
289  */
290
291 #define IS_Z_AT(string,offset)    CHECK_AT((string),'\0',(offset))
292
293 #define IS_Z(string)    IS_Z_AT((string),0)
294
295 /*
296  * Check if the character at the specified position is BOM.
297  */
298
299 #define IS_BOM_AT(string,offset)                                                \
300      (CHECK_AT((string),'\xEF',(offset))                                        \
301       && CHECK_AT((string),'\xBB',(offset)+1)                                   \
302       && CHECK_AT((string),'\xBF',(offset)+2))  /* BOM (#xFEFF) */
303
304 #define IS_BOM(string)  IS_BOM_AT(string,0)
305
306 /*
307  * Check if the character at the specified position is space.
308  */
309
310 #define IS_SPACE_AT(string,offset)  CHECK_AT((string),' ',(offset))
311
312 #define IS_SPACE(string)    IS_SPACE_AT((string),0)
313
314 /*
315  * Check if the character at the specified position is tab.
316  */
317
318 #define IS_TAB_AT(string,offset)    CHECK_AT((string),'\t',(offset))
319
320 #define IS_TAB(string)  IS_TAB_AT((string),0)
321
322 /*
323  * Check if the character at the specified position is blank (space or tab).
324  */
325
326 #define IS_BLANK_AT(string,offset)                                              \
327     (IS_SPACE_AT((string),(offset)) || IS_TAB_AT((string),(offset)))
328
329 #define IS_BLANK(string)    IS_BLANK_AT((string),0)
330
331 /*
332  * Check if the character at the specified position is a line break.
333  */
334
335 #define IS_BREAK_AT(string,offset)                                              \
336     (CHECK_AT((string),'\r',(offset))               /* CR (#xD)*/               \
337      || CHECK_AT((string),'\n',(offset))            /* LF (#xA) */              \
338      || (CHECK_AT((string),'\xC2',(offset))                                     \
339          && CHECK_AT((string),'\x85',(offset)+1))   /* NEL (#x85) */            \
340      || (CHECK_AT((string),'\xE2',(offset))                                     \
341          && CHECK_AT((string),'\x80',(offset)+1)                                \
342          && CHECK_AT((string),'\xA8',(offset)+2))   /* LS (#x2028) */           \
343      || (CHECK_AT((string),'\xE2',(offset))                                     \
344          && CHECK_AT((string),'\x80',(offset)+1)                                \
345          && CHECK_AT((string),'\xA9',(offset)+2)))  /* PS (#x2029) */
346
347 #define IS_BREAK(string)    IS_BREAK_AT((string),0)
348
349 #define IS_CRLF_AT(string,offset)                                               \
350      (CHECK_AT((string),'\r',(offset)) && CHECK_AT((string),'\n',(offset)+1))
351
352 #define IS_CRLF(string) IS_CRLF_AT((string),0)
353
354 /*
355  * Check if the character is a line break or NUL.
356  */
357
358 #define IS_BREAKZ_AT(string,offset)                                             \
359     (IS_BREAK_AT((string),(offset)) || IS_Z_AT((string),(offset)))
360
361 #define IS_BREAKZ(string)   IS_BREAKZ_AT((string),0)
362
363 /*
364  * Check if the character is a line break, space, or NUL.
365  */
366
367 #define IS_SPACEZ_AT(string,offset)                                             \
368     (IS_SPACE_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset)))
369
370 #define IS_SPACEZ(string)   IS_SPACEZ_AT((string),0)
371
372 /*
373  * Check if the character is a line break, space, tab, or NUL.
374  */
375
376 #define IS_BLANKZ_AT(string,offset)                                             \
377     (IS_BLANK_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset)))
378
379 #define IS_BLANKZ(string)   IS_BLANKZ_AT((string),0)
380
381 /*
382  * Determine the width of the character.
383  */
384
385 #define WIDTH_AT(string,offset)                                                 \
386      (((string).pointer[offset] & 0x80) == 0x00 ? 1 :                           \
387       ((string).pointer[offset] & 0xE0) == 0xC0 ? 2 :                           \
388       ((string).pointer[offset] & 0xF0) == 0xE0 ? 3 :                           \
389       ((string).pointer[offset] & 0xF8) == 0xF0 ? 4 : 0)
390
391 #define WIDTH(string)   WIDTH_AT((string),0)
392
393 /*
394  * Move the string pointer to the next character.
395  */
396
397 #define MOVE(string)    ((string).pointer += WIDTH((string)))
398
399 /*
400  * Copy a character and move the pointers of both strings.
401  */
402
403 #define COPY(string_a,string_b)                                                 \
404     ((*(string_b).pointer & 0x80) == 0x00 ?                                     \
405      (*((string_a).pointer++) = *((string_b).pointer++)) :                      \
406      (*(string_b).pointer & 0xE0) == 0xC0 ?                                     \
407      (*((string_a).pointer++) = *((string_b).pointer++),                        \
408       *((string_a).pointer++) = *((string_b).pointer++)) :                      \
409      (*(string_b).pointer & 0xF0) == 0xE0 ?                                     \
410      (*((string_a).pointer++) = *((string_b).pointer++),                        \
411       *((string_a).pointer++) = *((string_b).pointer++),                        \
412       *((string_a).pointer++) = *((string_b).pointer++)) :                      \
413      (*(string_b).pointer & 0xF8) == 0xF0 ?                                     \
414      (*((string_a).pointer++) = *((string_b).pointer++),                        \
415       *((string_a).pointer++) = *((string_b).pointer++),                        \
416       *((string_a).pointer++) = *((string_b).pointer++),                        \
417       *((string_a).pointer++) = *((string_b).pointer++)) : 0)
418
419 /*
420  * Stack and queue management.
421  */
422
423 YAML_DECLARE(int)
424 yaml_stack_extend(void **start, void **top, void **end);
425
426 YAML_DECLARE(int)
427 yaml_queue_extend(void **start, void **head, void **tail, void **end);
428
429 #define STACK_INIT(context,stack,size)                                          \
430     (((stack).start = yaml_malloc((size)*sizeof(*(stack).start))) ?             \
431         ((stack).top = (stack).start,                                           \
432          (stack).end = (stack).start+(size),                                    \
433          1) :                                                                   \
434         ((context)->error = YAML_MEMORY_ERROR,                                  \
435          0))
436
437 #define STACK_DEL(context,stack)                                                \
438     (yaml_free((stack).start),                                                  \
439      (stack).start = (stack).top = (stack).end = 0)
440
441 #define STACK_EMPTY(context,stack)                                              \
442     ((stack).start == (stack).top)
443
444 #define STACK_LIMIT(context,stack,size)                                         \
445     ((stack).top - (stack).start < (size) ?                                     \
446         1 :                                                                     \
447         ((context)->error = YAML_MEMORY_ERROR,                                  \
448          0))
449
450 #define PUSH(context,stack,value)                                               \
451     (((stack).top != (stack).end                                                \
452       || yaml_stack_extend((void **)&(stack).start,                             \
453               (void **)&(stack).top, (void **)&(stack).end)) ?                  \
454         (*((stack).top++) = value,                                              \
455          1) :                                                                   \
456         ((context)->error = YAML_MEMORY_ERROR,                                  \
457          0))
458
459 #define POP(context,stack)                                                      \
460     (*(--(stack).top))
461
462 #define QUEUE_INIT(context,queue,size)                                          \
463     (((queue).start = yaml_malloc((size)*sizeof(*(queue).start))) ?             \
464         ((queue).head = (queue).tail = (queue).start,                           \
465          (queue).end = (queue).start+(size),                                    \
466          1) :                                                                   \
467         ((context)->error = YAML_MEMORY_ERROR,                                  \
468          0))
469
470 #define QUEUE_DEL(context,queue)                                                \
471     (yaml_free((queue).start),                                                  \
472      (queue).start = (queue).head = (queue).tail = (queue).end = 0)
473
474 #define QUEUE_EMPTY(context,queue)                                              \
475     ((queue).head == (queue).tail)
476
477 #define ENQUEUE(context,queue,value)                                            \
478     (((queue).tail != (queue).end                                               \
479       || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head,     \
480             (void **)&(queue).tail, (void **)&(queue).end)) ?                   \
481         (*((queue).tail++) = value,                                             \
482          1) :                                                                   \
483         ((context)->error = YAML_MEMORY_ERROR,                                  \
484          0))
485
486 #define DEQUEUE(context,queue)                                                  \
487     (*((queue).head++))
488
489 #define QUEUE_INSERT(context,queue,index,value)                                 \
490     (((queue).tail != (queue).end                                               \
491       || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head,     \
492             (void **)&(queue).tail, (void **)&(queue).end)) ?                   \
493         (memmove((queue).head+(index)+1,(queue).head+(index),                   \
494             ((queue).tail-(queue).head-(index))*sizeof(*(queue).start)),        \
495          *((queue).head+(index)) = value,                                       \
496          (queue).tail++,                                                        \
497          1) :                                                                   \
498         ((context)->error = YAML_MEMORY_ERROR,                                  \
499          0))
500
501 /*
502  * Token initializers.
503  */
504
505 #define TOKEN_INIT(token,token_type,token_start_mark,token_end_mark)            \
506     (memset(&(token), 0, sizeof(yaml_token_t)),                                 \
507      (token).type = (token_type),                                               \
508      (token).start_mark = (token_start_mark),                                   \
509      (token).end_mark = (token_end_mark))
510
511 #define STREAM_START_TOKEN_INIT(token,token_encoding,start_mark,end_mark)       \
512     (TOKEN_INIT((token),YAML_STREAM_START_TOKEN,(start_mark),(end_mark)),       \
513      (token).data.stream_start.encoding = (token_encoding))
514
515 #define STREAM_END_TOKEN_INIT(token,start_mark,end_mark)                        \
516     (TOKEN_INIT((token),YAML_STREAM_END_TOKEN,(start_mark),(end_mark)))
517
518 #define ALIAS_TOKEN_INIT(token,token_value,start_mark,end_mark)                 \
519     (TOKEN_INIT((token),YAML_ALIAS_TOKEN,(start_mark),(end_mark)),              \
520      (token).data.alias.value = (token_value))
521
522 #define ANCHOR_TOKEN_INIT(token,token_value,start_mark,end_mark)                \
523     (TOKEN_INIT((token),YAML_ANCHOR_TOKEN,(start_mark),(end_mark)),             \
524      (token).data.anchor.value = (token_value))
525
526 #define TAG_TOKEN_INIT(token,token_handle,token_suffix,start_mark,end_mark)     \
527     (TOKEN_INIT((token),YAML_TAG_TOKEN,(start_mark),(end_mark)),                \
528      (token).data.tag.handle = (token_handle),                                  \
529      (token).data.tag.suffix = (token_suffix))
530
531 #define SCALAR_TOKEN_INIT(token,token_value,token_length,token_style,start_mark,end_mark)   \
532     (TOKEN_INIT((token),YAML_SCALAR_TOKEN,(start_mark),(end_mark)),             \
533      (token).data.scalar.value = (token_value),                                 \
534      (token).data.scalar.length = (token_length),                               \
535      (token).data.scalar.style = (token_style))
536
537 #define VERSION_DIRECTIVE_TOKEN_INIT(token,token_major,token_minor,start_mark,end_mark)     \
538     (TOKEN_INIT((token),YAML_VERSION_DIRECTIVE_TOKEN,(start_mark),(end_mark)),  \
539      (token).data.version_directive.major = (token_major),                      \
540      (token).data.version_directive.minor = (token_minor))
541
542 #define TAG_DIRECTIVE_TOKEN_INIT(token,token_handle,token_prefix,start_mark,end_mark)       \
543     (TOKEN_INIT((token),YAML_TAG_DIRECTIVE_TOKEN,(start_mark),(end_mark)),      \
544      (token).data.tag_directive.handle = (token_handle),                        \
545      (token).data.tag_directive.prefix = (token_prefix))
546
547 /*
548  * Event initializers.
549  */
550
551 #define EVENT_INIT(event,event_type,event_start_mark,event_end_mark)            \
552     (memset(&(event), 0, sizeof(yaml_event_t)),                                 \
553      (event).type = (event_type),                                               \
554      (event).start_mark = (event_start_mark),                                   \
555      (event).end_mark = (event_end_mark))
556
557 #define STREAM_START_EVENT_INIT(event,event_encoding,start_mark,end_mark)       \
558     (EVENT_INIT((event),YAML_STREAM_START_EVENT,(start_mark),(end_mark)),       \
559      (event).data.stream_start.encoding = (event_encoding))
560
561 #define STREAM_END_EVENT_INIT(event,start_mark,end_mark)                        \
562     (EVENT_INIT((event),YAML_STREAM_END_EVENT,(start_mark),(end_mark)))
563
564 #define DOCUMENT_START_EVENT_INIT(event,event_version_directive,                \
565         event_tag_directives_start,event_tag_directives_end,event_implicit,start_mark,end_mark) \
566     (EVENT_INIT((event),YAML_DOCUMENT_START_EVENT,(start_mark),(end_mark)),     \
567      (event).data.document_start.version_directive = (event_version_directive), \
568      (event).data.document_start.tag_directives.start = (event_tag_directives_start),   \
569      (event).data.document_start.tag_directives.end = (event_tag_directives_end),   \
570      (event).data.document_start.implicit = (event_implicit))
571
572 #define DOCUMENT_END_EVENT_INIT(event,event_implicit,start_mark,end_mark)       \
573     (EVENT_INIT((event),YAML_DOCUMENT_END_EVENT,(start_mark),(end_mark)),       \
574      (event).data.document_end.implicit = (event_implicit))
575
576 #define ALIAS_EVENT_INIT(event,event_anchor,start_mark,end_mark)                \
577     (EVENT_INIT((event),YAML_ALIAS_EVENT,(start_mark),(end_mark)),              \
578      (event).data.alias.anchor = (event_anchor))
579
580 #define SCALAR_EVENT_INIT(event,event_anchor,event_tag,event_value,event_length,    \
581         event_plain_implicit, event_quoted_implicit,event_style,start_mark,end_mark)    \
582     (EVENT_INIT((event),YAML_SCALAR_EVENT,(start_mark),(end_mark)),             \
583      (event).data.scalar.anchor = (event_anchor),                               \
584      (event).data.scalar.tag = (event_tag),                                     \
585      (event).data.scalar.value = (event_value),                                 \
586      (event).data.scalar.length = (event_length),                               \
587      (event).data.scalar.plain_implicit = (event_plain_implicit),               \
588      (event).data.scalar.quoted_implicit = (event_quoted_implicit),             \
589      (event).data.scalar.style = (event_style))
590
591 #define SEQUENCE_START_EVENT_INIT(event,event_anchor,event_tag,                 \
592         event_implicit,event_style,start_mark,end_mark)                         \
593     (EVENT_INIT((event),YAML_SEQUENCE_START_EVENT,(start_mark),(end_mark)),     \
594      (event).data.sequence_start.anchor = (event_anchor),                       \
595      (event).data.sequence_start.tag = (event_tag),                             \
596      (event).data.sequence_start.implicit = (event_implicit),                   \
597      (event).data.sequence_start.style = (event_style))
598
599 #define SEQUENCE_END_EVENT_INIT(event,start_mark,end_mark)                      \
600     (EVENT_INIT((event),YAML_SEQUENCE_END_EVENT,(start_mark),(end_mark)))
601
602 #define MAPPING_START_EVENT_INIT(event,event_anchor,event_tag,                  \
603         event_implicit,event_style,start_mark,end_mark)                         \
604     (EVENT_INIT((event),YAML_MAPPING_START_EVENT,(start_mark),(end_mark)),      \
605      (event).data.mapping_start.anchor = (event_anchor),                        \
606      (event).data.mapping_start.tag = (event_tag),                              \
607      (event).data.mapping_start.implicit = (event_implicit),                    \
608      (event).data.mapping_start.style = (event_style))
609
610 #define MAPPING_END_EVENT_INIT(event,start_mark,end_mark)                       \
611     (EVENT_INIT((event),YAML_MAPPING_END_EVENT,(start_mark),(end_mark)))
612
613 /*
614  * Document initializer.
615  */
616
617 #define DOCUMENT_INIT(document,document_nodes_start,document_nodes_end,         \
618         document_version_directive,document_tag_directives_start,               \
619         document_tag_directives_end,document_start_implicit,                    \
620         document_end_implicit,document_start_mark,document_end_mark)            \
621     (memset(&(document), 0, sizeof(yaml_document_t)),                           \
622      (document).nodes.start = (document_nodes_start),                           \
623      (document).nodes.end = (document_nodes_end),                               \
624      (document).nodes.top = (document_nodes_start),                             \
625      (document).version_directive = (document_version_directive),               \
626      (document).tag_directives.start = (document_tag_directives_start),         \
627      (document).tag_directives.end = (document_tag_directives_end),             \
628      (document).start_implicit = (document_start_implicit),                     \
629      (document).end_implicit = (document_end_implicit),                         \
630      (document).start_mark = (document_start_mark),                             \
631      (document).end_mark = (document_end_mark))
632
633 /*
634  * Node initializers.
635  */
636
637 #define NODE_INIT(node,node_type,node_tag,node_start_mark,node_end_mark)        \
638     (memset(&(node), 0, sizeof(yaml_node_t)),                                   \
639      (node).type = (node_type),                                                 \
640      (node).tag = (node_tag),                                                   \
641      (node).start_mark = (node_start_mark),                                     \
642      (node).end_mark = (node_end_mark))
643
644 #define SCALAR_NODE_INIT(node,node_tag,node_value,node_length,                  \
645         node_style,start_mark,end_mark)                                         \
646     (NODE_INIT((node),YAML_SCALAR_NODE,(node_tag),(start_mark),(end_mark)),     \
647      (node).data.scalar.value = (node_value),                                   \
648      (node).data.scalar.length = (node_length),                                 \
649      (node).data.scalar.style = (node_style))
650
651 #define SEQUENCE_NODE_INIT(node,node_tag,node_items_start,node_items_end,       \
652         node_style,start_mark,end_mark)                                         \
653     (NODE_INIT((node),YAML_SEQUENCE_NODE,(node_tag),(start_mark),(end_mark)),   \
654      (node).data.sequence.items.start = (node_items_start),                     \
655      (node).data.sequence.items.end = (node_items_end),                         \
656      (node).data.sequence.items.top = (node_items_start),                       \
657      (node).data.sequence.style = (node_style))
658
659 #define MAPPING_NODE_INIT(node,node_tag,node_pairs_start,node_pairs_end,        \
660         node_style,start_mark,end_mark)                                         \
661     (NODE_INIT((node),YAML_MAPPING_NODE,(node_tag),(start_mark),(end_mark)),    \
662      (node).data.mapping.pairs.start = (node_pairs_start),                      \
663      (node).data.mapping.pairs.end = (node_pairs_end),                          \
664      (node).data.mapping.pairs.top = (node_pairs_start),                        \
665      (node).data.mapping.style = (node_style))
This page took 0.078178 seconds and 3 git commands to generate.