psych 3.3.2 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,1375 +0,0 @@
1
-
2
- /*
3
- * The parser implements the following grammar:
4
- *
5
- * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
6
- * implicit_document ::= block_node DOCUMENT-END*
7
- * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
8
- * block_node_or_indentless_sequence ::=
9
- * ALIAS
10
- * | properties (block_content | indentless_block_sequence)?
11
- * | block_content
12
- * | indentless_block_sequence
13
- * block_node ::= ALIAS
14
- * | properties block_content?
15
- * | block_content
16
- * flow_node ::= ALIAS
17
- * | properties flow_content?
18
- * | flow_content
19
- * properties ::= TAG ANCHOR? | ANCHOR TAG?
20
- * block_content ::= block_collection | flow_collection | SCALAR
21
- * flow_content ::= flow_collection | SCALAR
22
- * block_collection ::= block_sequence | block_mapping
23
- * flow_collection ::= flow_sequence | flow_mapping
24
- * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
25
- * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
26
- * block_mapping ::= BLOCK-MAPPING_START
27
- * ((KEY block_node_or_indentless_sequence?)?
28
- * (VALUE block_node_or_indentless_sequence?)?)*
29
- * BLOCK-END
30
- * flow_sequence ::= FLOW-SEQUENCE-START
31
- * (flow_sequence_entry FLOW-ENTRY)*
32
- * flow_sequence_entry?
33
- * FLOW-SEQUENCE-END
34
- * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
35
- * flow_mapping ::= FLOW-MAPPING-START
36
- * (flow_mapping_entry FLOW-ENTRY)*
37
- * flow_mapping_entry?
38
- * FLOW-MAPPING-END
39
- * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
40
- */
41
-
42
- #include "yaml_private.h"
43
-
44
- /*
45
- * Peek the next token in the token queue.
46
- */
47
-
48
- #define PEEK_TOKEN(parser) \
49
- ((parser->token_available || yaml_parser_fetch_more_tokens(parser)) ? \
50
- parser->tokens.head : NULL)
51
-
52
- /*
53
- * Remove the next token from the queue (must be called after PEEK_TOKEN).
54
- */
55
-
56
- #define SKIP_TOKEN(parser) \
57
- (parser->token_available = 0, \
58
- parser->tokens_parsed ++, \
59
- parser->stream_end_produced = \
60
- (parser->tokens.head->type == YAML_STREAM_END_TOKEN), \
61
- parser->tokens.head ++)
62
-
63
- /*
64
- * Public API declarations.
65
- */
66
-
67
- YAML_DECLARE(int)
68
- yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
69
-
70
- /*
71
- * Error handling.
72
- */
73
-
74
- static int
75
- yaml_parser_set_parser_error(yaml_parser_t *parser,
76
- const char *problem, yaml_mark_t problem_mark);
77
-
78
- static int
79
- yaml_parser_set_parser_error_context(yaml_parser_t *parser,
80
- const char *context, yaml_mark_t context_mark,
81
- const char *problem, yaml_mark_t problem_mark);
82
-
83
- /*
84
- * State functions.
85
- */
86
-
87
- static int
88
- yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event);
89
-
90
- static int
91
- yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event);
92
-
93
- static int
94
- yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
95
- int implicit);
96
-
97
- static int
98
- yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event);
99
-
100
- static int
101
- yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event);
102
-
103
- static int
104
- yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
105
- int block, int indentless_sequence);
106
-
107
- static int
108
- yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
109
- yaml_event_t *event, int first);
110
-
111
- static int
112
- yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
113
- yaml_event_t *event);
114
-
115
- static int
116
- yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
117
- yaml_event_t *event, int first);
118
-
119
- static int
120
- yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
121
- yaml_event_t *event);
122
-
123
- static int
124
- yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
125
- yaml_event_t *event, int first);
126
-
127
- static int
128
- yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
129
- yaml_event_t *event);
130
-
131
- static int
132
- yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
133
- yaml_event_t *event);
134
-
135
- static int
136
- yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
137
- yaml_event_t *event);
138
-
139
- static int
140
- yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
141
- yaml_event_t *event, int first);
142
-
143
- static int
144
- yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
145
- yaml_event_t *event, int empty);
146
-
147
- /*
148
- * Utility functions.
149
- */
150
-
151
- static int
152
- yaml_parser_process_empty_scalar(yaml_parser_t *parser,
153
- yaml_event_t *event, yaml_mark_t mark);
154
-
155
- static int
156
- yaml_parser_process_directives(yaml_parser_t *parser,
157
- yaml_version_directive_t **version_directive_ref,
158
- yaml_tag_directive_t **tag_directives_start_ref,
159
- yaml_tag_directive_t **tag_directives_end_ref);
160
-
161
- static int
162
- yaml_parser_append_tag_directive(yaml_parser_t *parser,
163
- yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark);
164
-
165
- /*
166
- * Get the next event.
167
- */
168
-
169
- YAML_DECLARE(int)
170
- yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event)
171
- {
172
- assert(parser); /* Non-NULL parser object is expected. */
173
- assert(event); /* Non-NULL event object is expected. */
174
-
175
- /* Erase the event object. */
176
-
177
- memset(event, 0, sizeof(yaml_event_t));
178
-
179
- /* No events after the end of the stream or error. */
180
-
181
- if (parser->stream_end_produced || parser->error ||
182
- parser->state == YAML_PARSE_END_STATE) {
183
- return 1;
184
- }
185
-
186
- /* Generate the next event. */
187
-
188
- return yaml_parser_state_machine(parser, event);
189
- }
190
-
191
- /*
192
- * Set parser error.
193
- */
194
-
195
- static int
196
- yaml_parser_set_parser_error(yaml_parser_t *parser,
197
- const char *problem, yaml_mark_t problem_mark)
198
- {
199
- parser->error = YAML_PARSER_ERROR;
200
- parser->problem = problem;
201
- parser->problem_mark = problem_mark;
202
-
203
- return 0;
204
- }
205
-
206
- static int
207
- yaml_parser_set_parser_error_context(yaml_parser_t *parser,
208
- const char *context, yaml_mark_t context_mark,
209
- const char *problem, yaml_mark_t problem_mark)
210
- {
211
- parser->error = YAML_PARSER_ERROR;
212
- parser->context = context;
213
- parser->context_mark = context_mark;
214
- parser->problem = problem;
215
- parser->problem_mark = problem_mark;
216
-
217
- return 0;
218
- }
219
-
220
-
221
- /*
222
- * State dispatcher.
223
- */
224
-
225
- static int
226
- yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event)
227
- {
228
- switch (parser->state)
229
- {
230
- case YAML_PARSE_STREAM_START_STATE:
231
- return yaml_parser_parse_stream_start(parser, event);
232
-
233
- case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
234
- return yaml_parser_parse_document_start(parser, event, 1);
235
-
236
- case YAML_PARSE_DOCUMENT_START_STATE:
237
- return yaml_parser_parse_document_start(parser, event, 0);
238
-
239
- case YAML_PARSE_DOCUMENT_CONTENT_STATE:
240
- return yaml_parser_parse_document_content(parser, event);
241
-
242
- case YAML_PARSE_DOCUMENT_END_STATE:
243
- return yaml_parser_parse_document_end(parser, event);
244
-
245
- case YAML_PARSE_BLOCK_NODE_STATE:
246
- return yaml_parser_parse_node(parser, event, 1, 0);
247
-
248
- case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
249
- return yaml_parser_parse_node(parser, event, 1, 1);
250
-
251
- case YAML_PARSE_FLOW_NODE_STATE:
252
- return yaml_parser_parse_node(parser, event, 0, 0);
253
-
254
- case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
255
- return yaml_parser_parse_block_sequence_entry(parser, event, 1);
256
-
257
- case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
258
- return yaml_parser_parse_block_sequence_entry(parser, event, 0);
259
-
260
- case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
261
- return yaml_parser_parse_indentless_sequence_entry(parser, event);
262
-
263
- case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
264
- return yaml_parser_parse_block_mapping_key(parser, event, 1);
265
-
266
- case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
267
- return yaml_parser_parse_block_mapping_key(parser, event, 0);
268
-
269
- case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
270
- return yaml_parser_parse_block_mapping_value(parser, event);
271
-
272
- case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
273
- return yaml_parser_parse_flow_sequence_entry(parser, event, 1);
274
-
275
- case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
276
- return yaml_parser_parse_flow_sequence_entry(parser, event, 0);
277
-
278
- case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
279
- return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event);
280
-
281
- case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
282
- return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event);
283
-
284
- case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
285
- return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event);
286
-
287
- case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
288
- return yaml_parser_parse_flow_mapping_key(parser, event, 1);
289
-
290
- case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
291
- return yaml_parser_parse_flow_mapping_key(parser, event, 0);
292
-
293
- case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
294
- return yaml_parser_parse_flow_mapping_value(parser, event, 0);
295
-
296
- case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
297
- return yaml_parser_parse_flow_mapping_value(parser, event, 1);
298
-
299
- default:
300
- assert(1); /* Invalid state. */
301
- }
302
-
303
- return 0;
304
- }
305
-
306
- /*
307
- * Parse the production:
308
- * stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
309
- * ************
310
- */
311
-
312
- static int
313
- yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event)
314
- {
315
- yaml_token_t *token;
316
-
317
- token = PEEK_TOKEN(parser);
318
- if (!token) return 0;
319
-
320
- if (token->type != YAML_STREAM_START_TOKEN) {
321
- return yaml_parser_set_parser_error(parser,
322
- "did not find expected <stream-start>", token->start_mark);
323
- }
324
-
325
- parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
326
- STREAM_START_EVENT_INIT(*event, token->data.stream_start.encoding,
327
- token->start_mark, token->start_mark);
328
- SKIP_TOKEN(parser);
329
-
330
- return 1;
331
- }
332
-
333
- /*
334
- * Parse the productions:
335
- * implicit_document ::= block_node DOCUMENT-END*
336
- * *
337
- * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
338
- * *************************
339
- */
340
-
341
- static int
342
- yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
343
- int implicit)
344
- {
345
- yaml_token_t *token;
346
- yaml_version_directive_t *version_directive = NULL;
347
- struct {
348
- yaml_tag_directive_t *start;
349
- yaml_tag_directive_t *end;
350
- } tag_directives = { NULL, NULL };
351
-
352
- token = PEEK_TOKEN(parser);
353
- if (!token) return 0;
354
-
355
- /* Parse extra document end indicators. */
356
-
357
- if (!implicit)
358
- {
359
- while (token->type == YAML_DOCUMENT_END_TOKEN) {
360
- SKIP_TOKEN(parser);
361
- token = PEEK_TOKEN(parser);
362
- if (!token) return 0;
363
- }
364
- }
365
-
366
- /* Parse an implicit document. */
367
-
368
- if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
369
- token->type != YAML_TAG_DIRECTIVE_TOKEN &&
370
- token->type != YAML_DOCUMENT_START_TOKEN &&
371
- token->type != YAML_STREAM_END_TOKEN)
372
- {
373
- if (!yaml_parser_process_directives(parser, NULL, NULL, NULL))
374
- return 0;
375
- if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
376
- return 0;
377
- parser->state = YAML_PARSE_BLOCK_NODE_STATE;
378
- DOCUMENT_START_EVENT_INIT(*event, NULL, NULL, NULL, 1,
379
- token->start_mark, token->start_mark);
380
- return 1;
381
- }
382
-
383
- /* Parse an explicit document. */
384
-
385
- else if (token->type != YAML_STREAM_END_TOKEN)
386
- {
387
- yaml_mark_t start_mark, end_mark;
388
- start_mark = token->start_mark;
389
- if (!yaml_parser_process_directives(parser, &version_directive,
390
- &tag_directives.start, &tag_directives.end))
391
- return 0;
392
- token = PEEK_TOKEN(parser);
393
- if (!token) goto error;
394
- if (token->type != YAML_DOCUMENT_START_TOKEN) {
395
- yaml_parser_set_parser_error(parser,
396
- "did not find expected <document start>", token->start_mark);
397
- goto error;
398
- }
399
- if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
400
- goto error;
401
- parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
402
- end_mark = token->end_mark;
403
- DOCUMENT_START_EVENT_INIT(*event, version_directive,
404
- tag_directives.start, tag_directives.end, 0,
405
- start_mark, end_mark);
406
- SKIP_TOKEN(parser);
407
- version_directive = NULL;
408
- tag_directives.start = tag_directives.end = NULL;
409
- return 1;
410
- }
411
-
412
- /* Parse the stream end. */
413
-
414
- else
415
- {
416
- parser->state = YAML_PARSE_END_STATE;
417
- STREAM_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
418
- SKIP_TOKEN(parser);
419
- return 1;
420
- }
421
-
422
- error:
423
- yaml_free(version_directive);
424
- while (tag_directives.start != tag_directives.end) {
425
- yaml_free(tag_directives.end[-1].handle);
426
- yaml_free(tag_directives.end[-1].prefix);
427
- tag_directives.end --;
428
- }
429
- yaml_free(tag_directives.start);
430
- return 0;
431
- }
432
-
433
- /*
434
- * Parse the productions:
435
- * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
436
- * ***********
437
- */
438
-
439
- static int
440
- yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event)
441
- {
442
- yaml_token_t *token;
443
-
444
- token = PEEK_TOKEN(parser);
445
- if (!token) return 0;
446
-
447
- if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
448
- token->type == YAML_TAG_DIRECTIVE_TOKEN ||
449
- token->type == YAML_DOCUMENT_START_TOKEN ||
450
- token->type == YAML_DOCUMENT_END_TOKEN ||
451
- token->type == YAML_STREAM_END_TOKEN) {
452
- parser->state = POP(parser, parser->states);
453
- return yaml_parser_process_empty_scalar(parser, event,
454
- token->start_mark);
455
- }
456
- else {
457
- return yaml_parser_parse_node(parser, event, 1, 0);
458
- }
459
- }
460
-
461
- /*
462
- * Parse the productions:
463
- * implicit_document ::= block_node DOCUMENT-END*
464
- * *************
465
- * explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
466
- * *************
467
- */
468
-
469
- static int
470
- yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event)
471
- {
472
- yaml_token_t *token;
473
- yaml_mark_t start_mark, end_mark;
474
- int implicit = 1;
475
-
476
- token = PEEK_TOKEN(parser);
477
- if (!token) return 0;
478
-
479
- start_mark = end_mark = token->start_mark;
480
-
481
- if (token->type == YAML_DOCUMENT_END_TOKEN) {
482
- end_mark = token->end_mark;
483
- SKIP_TOKEN(parser);
484
- implicit = 0;
485
- }
486
-
487
- while (!STACK_EMPTY(parser, parser->tag_directives)) {
488
- yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
489
- yaml_free(tag_directive.handle);
490
- yaml_free(tag_directive.prefix);
491
- }
492
-
493
- parser->state = YAML_PARSE_DOCUMENT_START_STATE;
494
- DOCUMENT_END_EVENT_INIT(*event, implicit, start_mark, end_mark);
495
-
496
- return 1;
497
- }
498
-
499
- /*
500
- * Parse the productions:
501
- * block_node_or_indentless_sequence ::=
502
- * ALIAS
503
- * *****
504
- * | properties (block_content | indentless_block_sequence)?
505
- * ********** *
506
- * | block_content | indentless_block_sequence
507
- * *
508
- * block_node ::= ALIAS
509
- * *****
510
- * | properties block_content?
511
- * ********** *
512
- * | block_content
513
- * *
514
- * flow_node ::= ALIAS
515
- * *****
516
- * | properties flow_content?
517
- * ********** *
518
- * | flow_content
519
- * *
520
- * properties ::= TAG ANCHOR? | ANCHOR TAG?
521
- * *************************
522
- * block_content ::= block_collection | flow_collection | SCALAR
523
- * ******
524
- * flow_content ::= flow_collection | SCALAR
525
- * ******
526
- */
527
-
528
- static int
529
- yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
530
- int block, int indentless_sequence)
531
- {
532
- yaml_token_t *token;
533
- yaml_char_t *anchor = NULL;
534
- yaml_char_t *tag_handle = NULL;
535
- yaml_char_t *tag_suffix = NULL;
536
- yaml_char_t *tag = NULL;
537
- yaml_mark_t start_mark, end_mark, tag_mark;
538
- int implicit;
539
-
540
- token = PEEK_TOKEN(parser);
541
- if (!token) return 0;
542
-
543
- if (token->type == YAML_ALIAS_TOKEN)
544
- {
545
- parser->state = POP(parser, parser->states);
546
- ALIAS_EVENT_INIT(*event, token->data.alias.value,
547
- token->start_mark, token->end_mark);
548
- SKIP_TOKEN(parser);
549
- return 1;
550
- }
551
-
552
- else
553
- {
554
- start_mark = end_mark = token->start_mark;
555
-
556
- if (token->type == YAML_ANCHOR_TOKEN)
557
- {
558
- anchor = token->data.anchor.value;
559
- start_mark = token->start_mark;
560
- end_mark = token->end_mark;
561
- SKIP_TOKEN(parser);
562
- token = PEEK_TOKEN(parser);
563
- if (!token) goto error;
564
- if (token->type == YAML_TAG_TOKEN)
565
- {
566
- tag_handle = token->data.tag.handle;
567
- tag_suffix = token->data.tag.suffix;
568
- tag_mark = token->start_mark;
569
- end_mark = token->end_mark;
570
- SKIP_TOKEN(parser);
571
- token = PEEK_TOKEN(parser);
572
- if (!token) goto error;
573
- }
574
- }
575
- else if (token->type == YAML_TAG_TOKEN)
576
- {
577
- tag_handle = token->data.tag.handle;
578
- tag_suffix = token->data.tag.suffix;
579
- start_mark = tag_mark = token->start_mark;
580
- end_mark = token->end_mark;
581
- SKIP_TOKEN(parser);
582
- token = PEEK_TOKEN(parser);
583
- if (!token) goto error;
584
- if (token->type == YAML_ANCHOR_TOKEN)
585
- {
586
- anchor = token->data.anchor.value;
587
- end_mark = token->end_mark;
588
- SKIP_TOKEN(parser);
589
- token = PEEK_TOKEN(parser);
590
- if (!token) goto error;
591
- }
592
- }
593
-
594
- if (tag_handle) {
595
- if (!*tag_handle) {
596
- tag = tag_suffix;
597
- yaml_free(tag_handle);
598
- tag_handle = tag_suffix = NULL;
599
- }
600
- else {
601
- yaml_tag_directive_t *tag_directive;
602
- for (tag_directive = parser->tag_directives.start;
603
- tag_directive != parser->tag_directives.top;
604
- tag_directive ++) {
605
- if (strcmp((char *)tag_directive->handle, (char *)tag_handle) == 0) {
606
- size_t prefix_len = strlen((char *)tag_directive->prefix);
607
- size_t suffix_len = strlen((char *)tag_suffix);
608
- tag = YAML_MALLOC(prefix_len+suffix_len+1);
609
- if (!tag) {
610
- parser->error = YAML_MEMORY_ERROR;
611
- goto error;
612
- }
613
- memcpy(tag, tag_directive->prefix, prefix_len);
614
- memcpy(tag+prefix_len, tag_suffix, suffix_len);
615
- tag[prefix_len+suffix_len] = '\0';
616
- yaml_free(tag_handle);
617
- yaml_free(tag_suffix);
618
- tag_handle = tag_suffix = NULL;
619
- break;
620
- }
621
- }
622
- if (!tag) {
623
- yaml_parser_set_parser_error_context(parser,
624
- "while parsing a node", start_mark,
625
- "found undefined tag handle", tag_mark);
626
- goto error;
627
- }
628
- }
629
- }
630
-
631
- implicit = (!tag || !*tag);
632
- if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
633
- end_mark = token->end_mark;
634
- parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
635
- SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
636
- YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
637
- return 1;
638
- }
639
- else {
640
- if (token->type == YAML_SCALAR_TOKEN) {
641
- int plain_implicit = 0;
642
- int quoted_implicit = 0;
643
- end_mark = token->end_mark;
644
- if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
645
- || (tag && strcmp((char *)tag, "!") == 0)) {
646
- plain_implicit = 1;
647
- }
648
- else if (!tag) {
649
- quoted_implicit = 1;
650
- }
651
- parser->state = POP(parser, parser->states);
652
- SCALAR_EVENT_INIT(*event, anchor, tag,
653
- token->data.scalar.value, token->data.scalar.length,
654
- plain_implicit, quoted_implicit,
655
- token->data.scalar.style, start_mark, end_mark);
656
- SKIP_TOKEN(parser);
657
- return 1;
658
- }
659
- else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
660
- end_mark = token->end_mark;
661
- parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
662
- SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
663
- YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
664
- return 1;
665
- }
666
- else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
667
- end_mark = token->end_mark;
668
- parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
669
- MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
670
- YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
671
- return 1;
672
- }
673
- else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
674
- end_mark = token->end_mark;
675
- parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
676
- SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
677
- YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
678
- return 1;
679
- }
680
- else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
681
- end_mark = token->end_mark;
682
- parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
683
- MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
684
- YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
685
- return 1;
686
- }
687
- else if (anchor || tag) {
688
- yaml_char_t *value = YAML_MALLOC(1);
689
- if (!value) {
690
- parser->error = YAML_MEMORY_ERROR;
691
- goto error;
692
- }
693
- value[0] = '\0';
694
- parser->state = POP(parser, parser->states);
695
- SCALAR_EVENT_INIT(*event, anchor, tag, value, 0,
696
- implicit, 0, YAML_PLAIN_SCALAR_STYLE,
697
- start_mark, end_mark);
698
- return 1;
699
- }
700
- else {
701
- yaml_parser_set_parser_error_context(parser,
702
- (block ? "while parsing a block node"
703
- : "while parsing a flow node"), start_mark,
704
- "did not find expected node content", token->start_mark);
705
- goto error;
706
- }
707
- }
708
- }
709
-
710
- error:
711
- yaml_free(anchor);
712
- yaml_free(tag_handle);
713
- yaml_free(tag_suffix);
714
- yaml_free(tag);
715
-
716
- return 0;
717
- }
718
-
719
- /*
720
- * Parse the productions:
721
- * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
722
- * ******************** *********** * *********
723
- */
724
-
725
- static int
726
- yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
727
- yaml_event_t *event, int first)
728
- {
729
- yaml_token_t *token;
730
-
731
- if (first) {
732
- token = PEEK_TOKEN(parser);
733
- if (!PUSH(parser, parser->marks, token->start_mark))
734
- return 0;
735
- SKIP_TOKEN(parser);
736
- }
737
-
738
- token = PEEK_TOKEN(parser);
739
- if (!token) return 0;
740
-
741
- if (token->type == YAML_BLOCK_ENTRY_TOKEN)
742
- {
743
- yaml_mark_t mark = token->end_mark;
744
- SKIP_TOKEN(parser);
745
- token = PEEK_TOKEN(parser);
746
- if (!token) return 0;
747
- if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
748
- token->type != YAML_BLOCK_END_TOKEN) {
749
- if (!PUSH(parser, parser->states,
750
- YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
751
- return 0;
752
- return yaml_parser_parse_node(parser, event, 1, 0);
753
- }
754
- else {
755
- parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
756
- return yaml_parser_process_empty_scalar(parser, event, mark);
757
- }
758
- }
759
-
760
- else if (token->type == YAML_BLOCK_END_TOKEN)
761
- {
762
- parser->state = POP(parser, parser->states);
763
- (void)POP(parser, parser->marks);
764
- SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
765
- SKIP_TOKEN(parser);
766
- return 1;
767
- }
768
-
769
- else
770
- {
771
- return yaml_parser_set_parser_error_context(parser,
772
- "while parsing a block collection", POP(parser, parser->marks),
773
- "did not find expected '-' indicator", token->start_mark);
774
- }
775
- }
776
-
777
- /*
778
- * Parse the productions:
779
- * indentless_sequence ::= (BLOCK-ENTRY block_node?)+
780
- * *********** *
781
- */
782
-
783
- static int
784
- yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
785
- yaml_event_t *event)
786
- {
787
- yaml_token_t *token;
788
-
789
- token = PEEK_TOKEN(parser);
790
- if (!token) return 0;
791
-
792
- if (token->type == YAML_BLOCK_ENTRY_TOKEN)
793
- {
794
- yaml_mark_t mark = token->end_mark;
795
- SKIP_TOKEN(parser);
796
- token = PEEK_TOKEN(parser);
797
- if (!token) return 0;
798
- if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
799
- token->type != YAML_KEY_TOKEN &&
800
- token->type != YAML_VALUE_TOKEN &&
801
- token->type != YAML_BLOCK_END_TOKEN) {
802
- if (!PUSH(parser, parser->states,
803
- YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
804
- return 0;
805
- return yaml_parser_parse_node(parser, event, 1, 0);
806
- }
807
- else {
808
- parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
809
- return yaml_parser_process_empty_scalar(parser, event, mark);
810
- }
811
- }
812
-
813
- else
814
- {
815
- parser->state = POP(parser, parser->states);
816
- SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
817
- return 1;
818
- }
819
- }
820
-
821
- /*
822
- * Parse the productions:
823
- * block_mapping ::= BLOCK-MAPPING_START
824
- * *******************
825
- * ((KEY block_node_or_indentless_sequence?)?
826
- * *** *
827
- * (VALUE block_node_or_indentless_sequence?)?)*
828
- *
829
- * BLOCK-END
830
- * *********
831
- */
832
-
833
- static int
834
- yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
835
- yaml_event_t *event, int first)
836
- {
837
- yaml_token_t *token;
838
-
839
- if (first) {
840
- token = PEEK_TOKEN(parser);
841
- if (!PUSH(parser, parser->marks, token->start_mark))
842
- return 0;
843
- SKIP_TOKEN(parser);
844
- }
845
-
846
- token = PEEK_TOKEN(parser);
847
- if (!token) return 0;
848
-
849
- if (token->type == YAML_KEY_TOKEN)
850
- {
851
- yaml_mark_t mark = token->end_mark;
852
- SKIP_TOKEN(parser);
853
- token = PEEK_TOKEN(parser);
854
- if (!token) return 0;
855
- if (token->type != YAML_KEY_TOKEN &&
856
- token->type != YAML_VALUE_TOKEN &&
857
- token->type != YAML_BLOCK_END_TOKEN) {
858
- if (!PUSH(parser, parser->states,
859
- YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
860
- return 0;
861
- return yaml_parser_parse_node(parser, event, 1, 1);
862
- }
863
- else {
864
- parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
865
- return yaml_parser_process_empty_scalar(parser, event, mark);
866
- }
867
- }
868
-
869
- else if (token->type == YAML_BLOCK_END_TOKEN)
870
- {
871
- parser->state = POP(parser, parser->states);
872
- (void)POP(parser, parser->marks);
873
- MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
874
- SKIP_TOKEN(parser);
875
- return 1;
876
- }
877
-
878
- else
879
- {
880
- return yaml_parser_set_parser_error_context(parser,
881
- "while parsing a block mapping", POP(parser, parser->marks),
882
- "did not find expected key", token->start_mark);
883
- }
884
- }
885
-
886
- /*
887
- * Parse the productions:
888
- * block_mapping ::= BLOCK-MAPPING_START
889
- *
890
- * ((KEY block_node_or_indentless_sequence?)?
891
- *
892
- * (VALUE block_node_or_indentless_sequence?)?)*
893
- * ***** *
894
- * BLOCK-END
895
- *
896
- */
897
-
898
- static int
899
- yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
900
- yaml_event_t *event)
901
- {
902
- yaml_token_t *token;
903
-
904
- token = PEEK_TOKEN(parser);
905
- if (!token) return 0;
906
-
907
- if (token->type == YAML_VALUE_TOKEN)
908
- {
909
- yaml_mark_t mark = token->end_mark;
910
- SKIP_TOKEN(parser);
911
- token = PEEK_TOKEN(parser);
912
- if (!token) return 0;
913
- if (token->type != YAML_KEY_TOKEN &&
914
- token->type != YAML_VALUE_TOKEN &&
915
- token->type != YAML_BLOCK_END_TOKEN) {
916
- if (!PUSH(parser, parser->states,
917
- YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
918
- return 0;
919
- return yaml_parser_parse_node(parser, event, 1, 1);
920
- }
921
- else {
922
- parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
923
- return yaml_parser_process_empty_scalar(parser, event, mark);
924
- }
925
- }
926
-
927
- else
928
- {
929
- parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
930
- return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
931
- }
932
- }
933
-
934
- /*
935
- * Parse the productions:
936
- * flow_sequence ::= FLOW-SEQUENCE-START
937
- * *******************
938
- * (flow_sequence_entry FLOW-ENTRY)*
939
- * * **********
940
- * flow_sequence_entry?
941
- * *
942
- * FLOW-SEQUENCE-END
943
- * *****************
944
- * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
945
- * *
946
- */
947
-
948
- static int
949
- yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
950
- yaml_event_t *event, int first)
951
- {
952
- yaml_token_t *token;
953
-
954
- if (first) {
955
- token = PEEK_TOKEN(parser);
956
- if (!PUSH(parser, parser->marks, token->start_mark))
957
- return 0;
958
- SKIP_TOKEN(parser);
959
- }
960
-
961
- token = PEEK_TOKEN(parser);
962
- if (!token) return 0;
963
-
964
- if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
965
- {
966
- if (!first) {
967
- if (token->type == YAML_FLOW_ENTRY_TOKEN) {
968
- SKIP_TOKEN(parser);
969
- token = PEEK_TOKEN(parser);
970
- if (!token) return 0;
971
- }
972
- else {
973
- return yaml_parser_set_parser_error_context(parser,
974
- "while parsing a flow sequence", POP(parser, parser->marks),
975
- "did not find expected ',' or ']'", token->start_mark);
976
- }
977
- }
978
-
979
- if (token->type == YAML_KEY_TOKEN) {
980
- parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
981
- MAPPING_START_EVENT_INIT(*event, NULL, NULL,
982
- 1, YAML_FLOW_MAPPING_STYLE,
983
- token->start_mark, token->end_mark);
984
- SKIP_TOKEN(parser);
985
- return 1;
986
- }
987
-
988
- else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
989
- if (!PUSH(parser, parser->states,
990
- YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
991
- return 0;
992
- return yaml_parser_parse_node(parser, event, 0, 0);
993
- }
994
- }
995
-
996
- parser->state = POP(parser, parser->states);
997
- (void)POP(parser, parser->marks);
998
- SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
999
- SKIP_TOKEN(parser);
1000
- return 1;
1001
- }
1002
-
1003
- /*
1004
- * Parse the productions:
1005
- * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1006
- * *** *
1007
- */
1008
-
1009
- static int
1010
- yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
1011
- yaml_event_t *event)
1012
- {
1013
- yaml_token_t *token;
1014
-
1015
- token = PEEK_TOKEN(parser);
1016
- if (!token) return 0;
1017
-
1018
- if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
1019
- && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1020
- if (!PUSH(parser, parser->states,
1021
- YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
1022
- return 0;
1023
- return yaml_parser_parse_node(parser, event, 0, 0);
1024
- }
1025
- else {
1026
- yaml_mark_t mark = token->end_mark;
1027
- SKIP_TOKEN(parser);
1028
- parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
1029
- return yaml_parser_process_empty_scalar(parser, event, mark);
1030
- }
1031
- }
1032
-
1033
- /*
1034
- * Parse the productions:
1035
- * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1036
- * ***** *
1037
- */
1038
-
1039
- static int
1040
- yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
1041
- yaml_event_t *event)
1042
- {
1043
- yaml_token_t *token;
1044
-
1045
- token = PEEK_TOKEN(parser);
1046
- if (!token) return 0;
1047
-
1048
- if (token->type == YAML_VALUE_TOKEN) {
1049
- SKIP_TOKEN(parser);
1050
- token = PEEK_TOKEN(parser);
1051
- if (!token) return 0;
1052
- if (token->type != YAML_FLOW_ENTRY_TOKEN
1053
- && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1054
- if (!PUSH(parser, parser->states,
1055
- YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
1056
- return 0;
1057
- return yaml_parser_parse_node(parser, event, 0, 0);
1058
- }
1059
- }
1060
- parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
1061
- return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1062
- }
1063
-
1064
- /*
1065
- * Parse the productions:
1066
- * flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1067
- * *
1068
- */
1069
-
1070
- static int
1071
- yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
1072
- yaml_event_t *event)
1073
- {
1074
- yaml_token_t *token;
1075
-
1076
- token = PEEK_TOKEN(parser);
1077
- if (!token) return 0;
1078
-
1079
- parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
1080
-
1081
- MAPPING_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
1082
- return 1;
1083
- }
1084
-
1085
- /*
1086
- * Parse the productions:
1087
- * flow_mapping ::= FLOW-MAPPING-START
1088
- * ******************
1089
- * (flow_mapping_entry FLOW-ENTRY)*
1090
- * * **********
1091
- * flow_mapping_entry?
1092
- * ******************
1093
- * FLOW-MAPPING-END
1094
- * ****************
1095
- * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1096
- * * *** *
1097
- */
1098
-
1099
- static int
1100
- yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
1101
- yaml_event_t *event, int first)
1102
- {
1103
- yaml_token_t *token;
1104
-
1105
- if (first) {
1106
- token = PEEK_TOKEN(parser);
1107
- if (!PUSH(parser, parser->marks, token->start_mark))
1108
- return 0;
1109
- SKIP_TOKEN(parser);
1110
- }
1111
-
1112
- token = PEEK_TOKEN(parser);
1113
- if (!token) return 0;
1114
-
1115
- if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
1116
- {
1117
- if (!first) {
1118
- if (token->type == YAML_FLOW_ENTRY_TOKEN) {
1119
- SKIP_TOKEN(parser);
1120
- token = PEEK_TOKEN(parser);
1121
- if (!token) return 0;
1122
- }
1123
- else {
1124
- return yaml_parser_set_parser_error_context(parser,
1125
- "while parsing a flow mapping", POP(parser, parser->marks),
1126
- "did not find expected ',' or '}'", token->start_mark);
1127
- }
1128
- }
1129
-
1130
- if (token->type == YAML_KEY_TOKEN) {
1131
- SKIP_TOKEN(parser);
1132
- token = PEEK_TOKEN(parser);
1133
- if (!token) return 0;
1134
- if (token->type != YAML_VALUE_TOKEN
1135
- && token->type != YAML_FLOW_ENTRY_TOKEN
1136
- && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1137
- if (!PUSH(parser, parser->states,
1138
- YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
1139
- return 0;
1140
- return yaml_parser_parse_node(parser, event, 0, 0);
1141
- }
1142
- else {
1143
- parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
1144
- return yaml_parser_process_empty_scalar(parser, event,
1145
- token->start_mark);
1146
- }
1147
- }
1148
- else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1149
- if (!PUSH(parser, parser->states,
1150
- YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
1151
- return 0;
1152
- return yaml_parser_parse_node(parser, event, 0, 0);
1153
- }
1154
- }
1155
-
1156
- parser->state = POP(parser, parser->states);
1157
- (void)POP(parser, parser->marks);
1158
- MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
1159
- SKIP_TOKEN(parser);
1160
- return 1;
1161
- }
1162
-
1163
- /*
1164
- * Parse the productions:
1165
- * flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
1166
- * * ***** *
1167
- */
1168
-
1169
- static int
1170
- yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
1171
- yaml_event_t *event, int empty)
1172
- {
1173
- yaml_token_t *token;
1174
-
1175
- token = PEEK_TOKEN(parser);
1176
- if (!token) return 0;
1177
-
1178
- if (empty) {
1179
- parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1180
- return yaml_parser_process_empty_scalar(parser, event,
1181
- token->start_mark);
1182
- }
1183
-
1184
- if (token->type == YAML_VALUE_TOKEN) {
1185
- SKIP_TOKEN(parser);
1186
- token = PEEK_TOKEN(parser);
1187
- if (!token) return 0;
1188
- if (token->type != YAML_FLOW_ENTRY_TOKEN
1189
- && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1190
- if (!PUSH(parser, parser->states,
1191
- YAML_PARSE_FLOW_MAPPING_KEY_STATE))
1192
- return 0;
1193
- return yaml_parser_parse_node(parser, event, 0, 0);
1194
- }
1195
- }
1196
-
1197
- parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1198
- return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1199
- }
1200
-
1201
- /*
1202
- * Generate an empty scalar event.
1203
- */
1204
-
1205
- static int
1206
- yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_event_t *event,
1207
- yaml_mark_t mark)
1208
- {
1209
- yaml_char_t *value;
1210
-
1211
- value = YAML_MALLOC(1);
1212
- if (!value) {
1213
- parser->error = YAML_MEMORY_ERROR;
1214
- return 0;
1215
- }
1216
- value[0] = '\0';
1217
-
1218
- SCALAR_EVENT_INIT(*event, NULL, NULL, value, 0,
1219
- 1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
1220
-
1221
- return 1;
1222
- }
1223
-
1224
- /*
1225
- * Parse directives.
1226
- */
1227
-
1228
- static int
1229
- yaml_parser_process_directives(yaml_parser_t *parser,
1230
- yaml_version_directive_t **version_directive_ref,
1231
- yaml_tag_directive_t **tag_directives_start_ref,
1232
- yaml_tag_directive_t **tag_directives_end_ref)
1233
- {
1234
- yaml_tag_directive_t default_tag_directives[] = {
1235
- {(yaml_char_t *)"!", (yaml_char_t *)"!"},
1236
- {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
1237
- {NULL, NULL}
1238
- };
1239
- yaml_tag_directive_t *default_tag_directive;
1240
- yaml_version_directive_t *version_directive = NULL;
1241
- struct {
1242
- yaml_tag_directive_t *start;
1243
- yaml_tag_directive_t *end;
1244
- yaml_tag_directive_t *top;
1245
- } tag_directives = { NULL, NULL, NULL };
1246
- yaml_token_t *token;
1247
-
1248
- if (!STACK_INIT(parser, tag_directives, yaml_tag_directive_t*))
1249
- goto error;
1250
-
1251
- token = PEEK_TOKEN(parser);
1252
- if (!token) goto error;
1253
-
1254
- while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
1255
- token->type == YAML_TAG_DIRECTIVE_TOKEN)
1256
- {
1257
- if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
1258
- if (version_directive) {
1259
- yaml_parser_set_parser_error(parser,
1260
- "found duplicate %YAML directive", token->start_mark);
1261
- goto error;
1262
- }
1263
- if (token->data.version_directive.major != 1
1264
- || (
1265
- token->data.version_directive.minor != 1
1266
- && token->data.version_directive.minor != 2
1267
- )) {
1268
- yaml_parser_set_parser_error(parser,
1269
- "found incompatible YAML document", token->start_mark);
1270
- goto error;
1271
- }
1272
- version_directive = YAML_MALLOC_STATIC(yaml_version_directive_t);
1273
- if (!version_directive) {
1274
- parser->error = YAML_MEMORY_ERROR;
1275
- goto error;
1276
- }
1277
- version_directive->major = token->data.version_directive.major;
1278
- version_directive->minor = token->data.version_directive.minor;
1279
- }
1280
-
1281
- else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
1282
- yaml_tag_directive_t value;
1283
- value.handle = token->data.tag_directive.handle;
1284
- value.prefix = token->data.tag_directive.prefix;
1285
-
1286
- if (!yaml_parser_append_tag_directive(parser, value, 0,
1287
- token->start_mark))
1288
- goto error;
1289
- if (!PUSH(parser, tag_directives, value))
1290
- goto error;
1291
- }
1292
-
1293
- SKIP_TOKEN(parser);
1294
- token = PEEK_TOKEN(parser);
1295
- if (!token) goto error;
1296
- }
1297
-
1298
- for (default_tag_directive = default_tag_directives;
1299
- default_tag_directive->handle; default_tag_directive++) {
1300
- if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
1301
- token->start_mark))
1302
- goto error;
1303
- }
1304
-
1305
- if (version_directive_ref) {
1306
- *version_directive_ref = version_directive;
1307
- }
1308
- if (tag_directives_start_ref) {
1309
- if (STACK_EMPTY(parser, tag_directives)) {
1310
- *tag_directives_start_ref = *tag_directives_end_ref = NULL;
1311
- STACK_DEL(parser, tag_directives);
1312
- }
1313
- else {
1314
- *tag_directives_start_ref = tag_directives.start;
1315
- *tag_directives_end_ref = tag_directives.top;
1316
- }
1317
- }
1318
- else {
1319
- STACK_DEL(parser, tag_directives);
1320
- }
1321
-
1322
- if (!version_directive_ref)
1323
- yaml_free(version_directive);
1324
- return 1;
1325
-
1326
- error:
1327
- yaml_free(version_directive);
1328
- while (!STACK_EMPTY(parser, tag_directives)) {
1329
- yaml_tag_directive_t tag_directive = POP(parser, tag_directives);
1330
- yaml_free(tag_directive.handle);
1331
- yaml_free(tag_directive.prefix);
1332
- }
1333
- STACK_DEL(parser, tag_directives);
1334
- return 0;
1335
- }
1336
-
1337
- /*
1338
- * Append a tag directive to the directives stack.
1339
- */
1340
-
1341
- static int
1342
- yaml_parser_append_tag_directive(yaml_parser_t *parser,
1343
- yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark)
1344
- {
1345
- yaml_tag_directive_t *tag_directive;
1346
- yaml_tag_directive_t copy = { NULL, NULL };
1347
-
1348
- for (tag_directive = parser->tag_directives.start;
1349
- tag_directive != parser->tag_directives.top; tag_directive ++) {
1350
- if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
1351
- if (allow_duplicates)
1352
- return 1;
1353
- return yaml_parser_set_parser_error(parser,
1354
- "found duplicate %TAG directive", mark);
1355
- }
1356
- }
1357
-
1358
- copy.handle = yaml_strdup(value.handle);
1359
- copy.prefix = yaml_strdup(value.prefix);
1360
- if (!copy.handle || !copy.prefix) {
1361
- parser->error = YAML_MEMORY_ERROR;
1362
- goto error;
1363
- }
1364
-
1365
- if (!PUSH(parser, parser->tag_directives, copy))
1366
- goto error;
1367
-
1368
- return 1;
1369
-
1370
- error:
1371
- yaml_free(copy.handle);
1372
- yaml_free(copy.prefix);
1373
- return 0;
1374
- }
1375
-