Coverage Report

Created: 2023-11-19 06:15

/src/h2o/deps/yaml/src/parser.c
Line
Count
Source (jump to first uncovered line)
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
0
    ((parser->token_available || yaml_parser_fetch_more_tokens(parser)) ?       \
50
0
        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
0
    (parser->token_available = 0,                                               \
58
0
     parser->tokens_parsed ++,                                                  \
59
0
     parser->stream_end_produced =                                              \
60
0
        (parser->tokens.head->type == YAML_STREAM_END_TOKEN),                   \
61
0
     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
0
{
172
0
    assert(parser);     /* Non-NULL parser object is expected. */
173
0
    assert(event);      /* Non-NULL event object is expected. */
174
175
    /* Erase the event object. */
176
177
0
    memset(event, 0, sizeof(yaml_event_t));
178
179
    /* No events after the end of the stream or error. */
180
181
0
    if (parser->stream_end_produced || parser->error ||
182
0
            parser->state == YAML_PARSE_END_STATE) {
183
0
        return 1;
184
0
    }
185
186
    /* Generate the next event. */
187
188
0
    return yaml_parser_state_machine(parser, event);
189
0
}
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
0
{
199
0
    parser->error = YAML_PARSER_ERROR;
200
0
    parser->problem = problem;
201
0
    parser->problem_mark = problem_mark;
202
203
0
    return 0;
204
0
}
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
0
{
211
0
    parser->error = YAML_PARSER_ERROR;
212
0
    parser->context = context;
213
0
    parser->context_mark = context_mark;
214
0
    parser->problem = problem;
215
0
    parser->problem_mark = problem_mark;
216
217
0
    return 0;
218
0
}
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
0
{
228
0
    switch (parser->state)
229
0
    {
230
0
        case YAML_PARSE_STREAM_START_STATE:
231
0
            return yaml_parser_parse_stream_start(parser, event);
232
233
0
        case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
234
0
            return yaml_parser_parse_document_start(parser, event, 1);
235
236
0
        case YAML_PARSE_DOCUMENT_START_STATE:
237
0
            return yaml_parser_parse_document_start(parser, event, 0);
238
239
0
        case YAML_PARSE_DOCUMENT_CONTENT_STATE:
240
0
            return yaml_parser_parse_document_content(parser, event);
241
242
0
        case YAML_PARSE_DOCUMENT_END_STATE:
243
0
            return yaml_parser_parse_document_end(parser, event);
244
245
0
        case YAML_PARSE_BLOCK_NODE_STATE:
246
0
            return yaml_parser_parse_node(parser, event, 1, 0);
247
248
0
        case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
249
0
            return yaml_parser_parse_node(parser, event, 1, 1);
250
251
0
        case YAML_PARSE_FLOW_NODE_STATE:
252
0
            return yaml_parser_parse_node(parser, event, 0, 0);
253
254
0
        case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
255
0
            return yaml_parser_parse_block_sequence_entry(parser, event, 1);
256
257
0
        case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
258
0
            return yaml_parser_parse_block_sequence_entry(parser, event, 0);
259
260
0
        case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
261
0
            return yaml_parser_parse_indentless_sequence_entry(parser, event);
262
263
0
        case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
264
0
            return yaml_parser_parse_block_mapping_key(parser, event, 1);
265
266
0
        case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
267
0
            return yaml_parser_parse_block_mapping_key(parser, event, 0);
268
269
0
        case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
270
0
            return yaml_parser_parse_block_mapping_value(parser, event);
271
272
0
        case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
273
0
            return yaml_parser_parse_flow_sequence_entry(parser, event, 1);
274
275
0
        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
276
0
            return yaml_parser_parse_flow_sequence_entry(parser, event, 0);
277
278
0
        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
279
0
            return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event);
280
281
0
        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
282
0
            return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event);
283
284
0
        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
285
0
            return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event);
286
287
0
        case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
288
0
            return yaml_parser_parse_flow_mapping_key(parser, event, 1);
289
290
0
        case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
291
0
            return yaml_parser_parse_flow_mapping_key(parser, event, 0);
292
293
0
        case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
294
0
            return yaml_parser_parse_flow_mapping_value(parser, event, 0);
295
296
0
        case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
297
0
            return yaml_parser_parse_flow_mapping_value(parser, event, 1);
298
299
0
        default:
300
0
            assert(1);      /* Invalid state. */
301
0
    }
302
303
0
    return 0;
304
0
}
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
0
{
315
0
    yaml_token_t *token;
316
317
0
    token = PEEK_TOKEN(parser);
318
0
    if (!token) return 0;
319
320
0
    if (token->type != YAML_STREAM_START_TOKEN) {
321
0
        return yaml_parser_set_parser_error(parser,
322
0
                "did not find expected <stream-start>", token->start_mark);
323
0
    }
324
325
0
    parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
326
0
    STREAM_START_EVENT_INIT(*event, token->data.stream_start.encoding,
327
0
            token->start_mark, token->start_mark);
328
0
    SKIP_TOKEN(parser);
329
330
0
    return 1;
331
0
}
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
0
{
345
0
    yaml_token_t *token;
346
0
    yaml_version_directive_t *version_directive = NULL;
347
0
    struct {
348
0
        yaml_tag_directive_t *start;
349
0
        yaml_tag_directive_t *end;
350
0
    } tag_directives = { NULL, NULL };
351
352
0
    token = PEEK_TOKEN(parser);
353
0
    if (!token) return 0;
354
355
    /* Parse extra document end indicators. */
356
357
0
    if (!implicit)
358
0
    {
359
0
        while (token->type == YAML_DOCUMENT_END_TOKEN) {
360
0
            SKIP_TOKEN(parser);
361
0
            token = PEEK_TOKEN(parser);
362
0
            if (!token) return 0;
363
0
        }
364
0
    }
365
366
    /* Parse an implicit document. */
367
368
0
    if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
369
0
            token->type != YAML_TAG_DIRECTIVE_TOKEN &&
370
0
            token->type != YAML_DOCUMENT_START_TOKEN &&
371
0
            token->type != YAML_STREAM_END_TOKEN)
372
0
    {
373
0
        if (!yaml_parser_process_directives(parser, NULL, NULL, NULL))
374
0
            return 0;
375
0
        if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
376
0
            return 0;
377
0
        parser->state = YAML_PARSE_BLOCK_NODE_STATE;
378
0
        DOCUMENT_START_EVENT_INIT(*event, NULL, NULL, NULL, 1,
379
0
                token->start_mark, token->start_mark);
380
0
        return 1;
381
0
    }
382
383
    /* Parse an explicit document. */
384
385
0
    else if (token->type != YAML_STREAM_END_TOKEN)
386
0
    {
387
0
        yaml_mark_t start_mark, end_mark;
388
0
        start_mark = token->start_mark;
389
0
        if (!yaml_parser_process_directives(parser, &version_directive,
390
0
                    &tag_directives.start, &tag_directives.end))
391
0
            return 0;
392
0
        token = PEEK_TOKEN(parser);
393
0
        if (!token) goto error;
394
0
        if (token->type != YAML_DOCUMENT_START_TOKEN) {
395
0
            yaml_parser_set_parser_error(parser,
396
0
                    "did not find expected <document start>", token->start_mark);
397
0
            goto error;
398
0
        }
399
0
        if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
400
0
            goto error;
401
0
        parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
402
0
        end_mark = token->end_mark;
403
0
        DOCUMENT_START_EVENT_INIT(*event, version_directive,
404
0
                tag_directives.start, tag_directives.end, 0,
405
0
                start_mark, end_mark);
406
0
        SKIP_TOKEN(parser);
407
0
        version_directive = NULL;
408
0
        tag_directives.start = tag_directives.end = NULL;
409
0
        return 1;
410
0
    }
411
412
    /* Parse the stream end. */
413
414
0
    else
415
0
    {
416
0
        parser->state = YAML_PARSE_END_STATE;
417
0
        STREAM_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
418
0
        SKIP_TOKEN(parser);
419
0
        return 1;
420
0
    }
421
422
0
error:
423
0
    yaml_free(version_directive);
424
0
    while (tag_directives.start != tag_directives.end) {
425
0
        yaml_free(tag_directives.end[-1].handle);
426
0
        yaml_free(tag_directives.end[-1].prefix);
427
0
        tag_directives.end --;
428
0
    }
429
0
    yaml_free(tag_directives.start);
430
0
    return 0;
431
0
}
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
0
{
442
0
    yaml_token_t *token;
443
444
0
    token = PEEK_TOKEN(parser);
445
0
    if (!token) return 0;
446
447
0
    if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
448
0
            token->type == YAML_TAG_DIRECTIVE_TOKEN ||
449
0
            token->type == YAML_DOCUMENT_START_TOKEN ||
450
0
            token->type == YAML_DOCUMENT_END_TOKEN ||
451
0
            token->type == YAML_STREAM_END_TOKEN) {
452
0
        parser->state = POP(parser, parser->states);
453
0
        return yaml_parser_process_empty_scalar(parser, event,
454
0
                token->start_mark);
455
0
    }
456
0
    else {
457
0
        return yaml_parser_parse_node(parser, event, 1, 0);
458
0
    }
459
0
}
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
0
{
472
0
    yaml_token_t *token;
473
0
    yaml_mark_t start_mark, end_mark;
474
0
    int implicit = 1;
475
476
0
    token = PEEK_TOKEN(parser);
477
0
    if (!token) return 0;
478
479
0
    start_mark = end_mark = token->start_mark;
480
481
0
    if (token->type == YAML_DOCUMENT_END_TOKEN) {
482
0
        end_mark = token->end_mark;
483
0
        SKIP_TOKEN(parser);
484
0
        implicit = 0;
485
0
    }
486
487
0
    while (!STACK_EMPTY(parser, parser->tag_directives)) {
488
0
        yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
489
0
        yaml_free(tag_directive.handle);
490
0
        yaml_free(tag_directive.prefix);
491
0
    }
492
493
0
    parser->state = YAML_PARSE_DOCUMENT_START_STATE;
494
0
    DOCUMENT_END_EVENT_INIT(*event, implicit, start_mark, end_mark);
495
496
0
    return 1;
497
0
}
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
0
{
532
0
    yaml_token_t *token;
533
0
    yaml_char_t *anchor = NULL;
534
0
    yaml_char_t *tag_handle = NULL;
535
0
    yaml_char_t *tag_suffix = NULL;
536
0
    yaml_char_t *tag = NULL;
537
0
    yaml_mark_t start_mark, end_mark, tag_mark;
538
0
    int implicit;
539
540
0
    token = PEEK_TOKEN(parser);
541
0
    if (!token) return 0;
542
543
0
    if (token->type == YAML_ALIAS_TOKEN)
544
0
    {
545
0
        parser->state = POP(parser, parser->states);
546
0
        ALIAS_EVENT_INIT(*event, token->data.alias.value,
547
0
                token->start_mark, token->end_mark);
548
0
        SKIP_TOKEN(parser);
549
0
        return 1;
550
0
    }
551
552
0
    else
553
0
    {
554
0
        start_mark = end_mark = token->start_mark;
555
556
0
        if (token->type == YAML_ANCHOR_TOKEN)
557
0
        {
558
0
            anchor = token->data.anchor.value;
559
0
            start_mark = token->start_mark;
560
0
            end_mark = token->end_mark;
561
0
            SKIP_TOKEN(parser);
562
0
            token = PEEK_TOKEN(parser);
563
0
            if (!token) goto error;
564
0
            if (token->type == YAML_TAG_TOKEN)
565
0
            {
566
0
                tag_handle = token->data.tag.handle;
567
0
                tag_suffix = token->data.tag.suffix;
568
0
                tag_mark = token->start_mark;
569
0
                end_mark = token->end_mark;
570
0
                SKIP_TOKEN(parser);
571
0
                token = PEEK_TOKEN(parser);
572
0
                if (!token) goto error;
573
0
            }
574
0
        }
575
0
        else if (token->type == YAML_TAG_TOKEN)
576
0
        {
577
0
            tag_handle = token->data.tag.handle;
578
0
            tag_suffix = token->data.tag.suffix;
579
0
            start_mark = tag_mark = token->start_mark;
580
0
            end_mark = token->end_mark;
581
0
            SKIP_TOKEN(parser);
582
0
            token = PEEK_TOKEN(parser);
583
0
            if (!token) goto error;
584
0
            if (token->type == YAML_ANCHOR_TOKEN)
585
0
            {
586
0
                anchor = token->data.anchor.value;
587
0
                end_mark = token->end_mark;
588
0
                SKIP_TOKEN(parser);
589
0
                token = PEEK_TOKEN(parser);
590
0
                if (!token) goto error;
591
0
            }
592
0
        }
593
594
0
        if (tag_handle) {
595
0
            if (!*tag_handle) {
596
0
                tag = tag_suffix;
597
0
                yaml_free(tag_handle);
598
0
                tag_handle = tag_suffix = NULL;
599
0
            }
600
0
            else {
601
0
                yaml_tag_directive_t *tag_directive;
602
0
                for (tag_directive = parser->tag_directives.start;
603
0
                        tag_directive != parser->tag_directives.top;
604
0
                        tag_directive ++) {
605
0
                    if (strcmp((char *)tag_directive->handle, (char *)tag_handle) == 0) {
606
0
                        size_t prefix_len = strlen((char *)tag_directive->prefix);
607
0
                        size_t suffix_len = strlen((char *)tag_suffix);
608
0
                        tag = YAML_MALLOC(prefix_len+suffix_len+1);
609
0
                        if (!tag) {
610
0
                            parser->error = YAML_MEMORY_ERROR;
611
0
                            goto error;
612
0
                        }
613
0
                        memcpy(tag, tag_directive->prefix, prefix_len);
614
0
                        memcpy(tag+prefix_len, tag_suffix, suffix_len);
615
0
                        tag[prefix_len+suffix_len] = '\0';
616
0
                        yaml_free(tag_handle);
617
0
                        yaml_free(tag_suffix);
618
0
                        tag_handle = tag_suffix = NULL;
619
0
                        break;
620
0
                    }
621
0
                }
622
0
                if (!tag) {
623
0
                    yaml_parser_set_parser_error_context(parser,
624
0
                            "while parsing a node", start_mark,
625
0
                            "found undefined tag handle", tag_mark);
626
0
                    goto error;
627
0
                }
628
0
            }
629
0
        }
630
631
0
        implicit = (!tag || !*tag);
632
0
        if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
633
0
            end_mark = token->end_mark;
634
0
            parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
635
0
            SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
636
0
                    YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
637
0
            return 1;
638
0
        }
639
0
        else {
640
0
            if (token->type == YAML_SCALAR_TOKEN) {
641
0
                int plain_implicit = 0;
642
0
                int quoted_implicit = 0;
643
0
                end_mark = token->end_mark;
644
0
                if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
645
0
                        || (tag && strcmp((char *)tag, "!") == 0)) {
646
0
                    plain_implicit = 1;
647
0
                }
648
0
                else if (!tag) {
649
0
                    quoted_implicit = 1;
650
0
                }
651
0
                parser->state = POP(parser, parser->states);
652
0
                SCALAR_EVENT_INIT(*event, anchor, tag,
653
0
                        token->data.scalar.value, token->data.scalar.length,
654
0
                        plain_implicit, quoted_implicit,
655
0
                        token->data.scalar.style, start_mark, end_mark);
656
0
                SKIP_TOKEN(parser);
657
0
                return 1;
658
0
            }
659
0
            else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
660
0
                end_mark = token->end_mark;
661
0
                parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
662
0
                SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
663
0
                        YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
664
0
                return 1;
665
0
            }
666
0
            else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
667
0
                end_mark = token->end_mark;
668
0
                parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
669
0
                MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
670
0
                        YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
671
0
                return 1;
672
0
            }
673
0
            else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
674
0
                end_mark = token->end_mark;
675
0
                parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
676
0
                SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
677
0
                        YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
678
0
                return 1;
679
0
            }
680
0
            else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
681
0
                end_mark = token->end_mark;
682
0
                parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
683
0
                MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
684
0
                        YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
685
0
                return 1;
686
0
            }
687
0
            else if (anchor || tag) {
688
0
                yaml_char_t *value = YAML_MALLOC(1);
689
0
                if (!value) {
690
0
                    parser->error = YAML_MEMORY_ERROR;
691
0
                    goto error;
692
0
                }
693
0
                value[0] = '\0';
694
0
                parser->state = POP(parser, parser->states);
695
0
                SCALAR_EVENT_INIT(*event, anchor, tag, value, 0,
696
0
                        implicit, 0, YAML_PLAIN_SCALAR_STYLE,
697
0
                        start_mark, end_mark);
698
0
                return 1;
699
0
            }
700
0
            else {
701
0
                yaml_parser_set_parser_error_context(parser,
702
0
                        (block ? "while parsing a block node"
703
0
                         : "while parsing a flow node"), start_mark,
704
0
                        "did not find expected node content", token->start_mark);
705
0
                goto error;
706
0
            }
707
0
        }
708
0
    }
709
710
0
error:
711
0
    yaml_free(anchor);
712
0
    yaml_free(tag_handle);
713
0
    yaml_free(tag_suffix);
714
0
    yaml_free(tag);
715
716
0
    return 0;
717
0
}
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
0
{
729
0
    yaml_token_t *token;
730
731
0
    if (first) {
732
0
        token = PEEK_TOKEN(parser);
733
0
        if (!PUSH(parser, parser->marks, token->start_mark))
734
0
            return 0;
735
0
        SKIP_TOKEN(parser);
736
0
    }
737
738
0
    token = PEEK_TOKEN(parser);
739
0
    if (!token) return 0;
740
741
0
    if (token->type == YAML_BLOCK_ENTRY_TOKEN)
742
0
    {
743
0
        yaml_mark_t mark = token->end_mark;
744
0
        SKIP_TOKEN(parser);
745
0
        token = PEEK_TOKEN(parser);
746
0
        if (!token) return 0;
747
0
        if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
748
0
                token->type != YAML_BLOCK_END_TOKEN) {
749
0
            if (!PUSH(parser, parser->states,
750
0
                        YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
751
0
                return 0;
752
0
            return yaml_parser_parse_node(parser, event, 1, 0);
753
0
        }
754
0
        else {
755
0
            parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
756
0
            return yaml_parser_process_empty_scalar(parser, event, mark);
757
0
        }
758
0
    }
759
760
0
    else if (token->type == YAML_BLOCK_END_TOKEN)
761
0
    {
762
0
        parser->state = POP(parser, parser->states);
763
0
        (void)POP(parser, parser->marks);
764
0
        SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
765
0
        SKIP_TOKEN(parser);
766
0
        return 1;
767
0
    }
768
769
0
    else
770
0
    {
771
0
        return yaml_parser_set_parser_error_context(parser,
772
0
                "while parsing a block collection", POP(parser, parser->marks),
773
0
                "did not find expected '-' indicator", token->start_mark);
774
0
    }
775
0
}
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
0
{
787
0
    yaml_token_t *token;
788
789
0
    token = PEEK_TOKEN(parser);
790
0
    if (!token) return 0;
791
792
0
    if (token->type == YAML_BLOCK_ENTRY_TOKEN)
793
0
    {
794
0
        yaml_mark_t mark = token->end_mark;
795
0
        SKIP_TOKEN(parser);
796
0
        token = PEEK_TOKEN(parser);
797
0
        if (!token) return 0;
798
0
        if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
799
0
                token->type != YAML_KEY_TOKEN &&
800
0
                token->type != YAML_VALUE_TOKEN &&
801
0
                token->type != YAML_BLOCK_END_TOKEN) {
802
0
            if (!PUSH(parser, parser->states,
803
0
                        YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
804
0
                return 0;
805
0
            return yaml_parser_parse_node(parser, event, 1, 0);
806
0
        }
807
0
        else {
808
0
            parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
809
0
            return yaml_parser_process_empty_scalar(parser, event, mark);
810
0
        }
811
0
    }
812
813
0
    else
814
0
    {
815
0
        parser->state = POP(parser, parser->states);
816
0
        SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
817
0
        return 1;
818
0
    }
819
0
}
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
0
{
837
0
    yaml_token_t *token;
838
839
0
    if (first) {
840
0
        token = PEEK_TOKEN(parser);
841
0
        if (!PUSH(parser, parser->marks, token->start_mark))
842
0
            return 0;
843
0
        SKIP_TOKEN(parser);
844
0
    }
845
846
0
    token = PEEK_TOKEN(parser);
847
0
    if (!token) return 0;
848
849
0
    if (token->type == YAML_KEY_TOKEN)
850
0
    {
851
0
        yaml_mark_t mark = token->end_mark;
852
0
        SKIP_TOKEN(parser);
853
0
        token = PEEK_TOKEN(parser);
854
0
        if (!token) return 0;
855
0
        if (token->type != YAML_KEY_TOKEN &&
856
0
                token->type != YAML_VALUE_TOKEN &&
857
0
                token->type != YAML_BLOCK_END_TOKEN) {
858
0
            if (!PUSH(parser, parser->states,
859
0
                        YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
860
0
                return 0;
861
0
            return yaml_parser_parse_node(parser, event, 1, 1);
862
0
        }
863
0
        else {
864
0
            parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
865
0
            return yaml_parser_process_empty_scalar(parser, event, mark);
866
0
        }
867
0
    }
868
869
0
    else if (token->type == YAML_BLOCK_END_TOKEN)
870
0
    {
871
0
        parser->state = POP(parser, parser->states);
872
0
        (void)POP(parser, parser->marks);
873
0
        MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
874
0
        SKIP_TOKEN(parser);
875
0
        return 1;
876
0
    }
877
878
0
    else
879
0
    {
880
0
        return yaml_parser_set_parser_error_context(parser,
881
0
                "while parsing a block mapping", POP(parser, parser->marks),
882
0
                "did not find expected key", token->start_mark);
883
0
    }
884
0
}
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
0
{
902
0
    yaml_token_t *token;
903
904
0
    token = PEEK_TOKEN(parser);
905
0
    if (!token) return 0;
906
907
0
    if (token->type == YAML_VALUE_TOKEN)
908
0
    {
909
0
        yaml_mark_t mark = token->end_mark;
910
0
        SKIP_TOKEN(parser);
911
0
        token = PEEK_TOKEN(parser);
912
0
        if (!token) return 0;
913
0
        if (token->type != YAML_KEY_TOKEN &&
914
0
                token->type != YAML_VALUE_TOKEN &&
915
0
                token->type != YAML_BLOCK_END_TOKEN) {
916
0
            if (!PUSH(parser, parser->states,
917
0
                        YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
918
0
                return 0;
919
0
            return yaml_parser_parse_node(parser, event, 1, 1);
920
0
        }
921
0
        else {
922
0
            parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
923
0
            return yaml_parser_process_empty_scalar(parser, event, mark);
924
0
        }
925
0
    }
926
927
0
    else
928
0
    {
929
0
        parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
930
0
        return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
931
0
    }
932
0
}
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
0
{
952
0
    yaml_token_t *token;
953
954
0
    if (first) {
955
0
        token = PEEK_TOKEN(parser);
956
0
        if (!PUSH(parser, parser->marks, token->start_mark))
957
0
            return 0;
958
0
        SKIP_TOKEN(parser);
959
0
    }
960
961
0
    token = PEEK_TOKEN(parser);
962
0
    if (!token) return 0;
963
964
0
    if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
965
0
    {
966
0
        if (!first) {
967
0
            if (token->type == YAML_FLOW_ENTRY_TOKEN) {
968
0
                SKIP_TOKEN(parser);
969
0
                token = PEEK_TOKEN(parser);
970
0
                if (!token) return 0;
971
0
            }
972
0
            else {
973
0
                return yaml_parser_set_parser_error_context(parser,
974
0
                        "while parsing a flow sequence", POP(parser, parser->marks),
975
0
                        "did not find expected ',' or ']'", token->start_mark);
976
0
            }
977
0
        }
978
979
0
        if (token->type == YAML_KEY_TOKEN) {
980
0
            parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
981
0
            MAPPING_START_EVENT_INIT(*event, NULL, NULL,
982
0
                    1, YAML_FLOW_MAPPING_STYLE,
983
0
                    token->start_mark, token->end_mark);
984
0
            SKIP_TOKEN(parser);
985
0
            return 1;
986
0
        }
987
988
0
        else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
989
0
            if (!PUSH(parser, parser->states,
990
0
                        YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
991
0
                return 0;
992
0
            return yaml_parser_parse_node(parser, event, 0, 0);
993
0
        }
994
0
    }
995
996
0
    parser->state = POP(parser, parser->states);
997
0
    (void)POP(parser, parser->marks);
998
0
    SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
999
0
    SKIP_TOKEN(parser);
1000
0
    return 1;
1001
0
}
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
0
{
1013
0
    yaml_token_t *token;
1014
1015
0
    token = PEEK_TOKEN(parser);
1016
0
    if (!token) return 0;
1017
1018
0
    if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
1019
0
            && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1020
0
        if (!PUSH(parser, parser->states,
1021
0
                    YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
1022
0
            return 0;
1023
0
        return yaml_parser_parse_node(parser, event, 0, 0);
1024
0
    }
1025
0
    else {
1026
0
        yaml_mark_t mark = token->end_mark;
1027
0
        SKIP_TOKEN(parser);
1028
0
        parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
1029
0
        return yaml_parser_process_empty_scalar(parser, event, mark);
1030
0
    }
1031
0
}
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
0
{
1043
0
    yaml_token_t *token;
1044
1045
0
    token = PEEK_TOKEN(parser);
1046
0
    if (!token) return 0;
1047
1048
0
    if (token->type == YAML_VALUE_TOKEN) {
1049
0
        SKIP_TOKEN(parser);
1050
0
        token = PEEK_TOKEN(parser);
1051
0
        if (!token) return 0;
1052
0
        if (token->type != YAML_FLOW_ENTRY_TOKEN
1053
0
                && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
1054
0
            if (!PUSH(parser, parser->states,
1055
0
                        YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
1056
0
                return 0;
1057
0
            return yaml_parser_parse_node(parser, event, 0, 0);
1058
0
        }
1059
0
    }
1060
0
    parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
1061
0
    return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1062
0
}
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
0
{
1074
0
    yaml_token_t *token;
1075
1076
0
    token = PEEK_TOKEN(parser);
1077
0
    if (!token) return 0;
1078
1079
0
    parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
1080
1081
0
    MAPPING_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
1082
0
    return 1;
1083
0
}
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
0
{
1103
0
    yaml_token_t *token;
1104
1105
0
    if (first) {
1106
0
        token = PEEK_TOKEN(parser);
1107
0
        if (!PUSH(parser, parser->marks, token->start_mark))
1108
0
            return 0;
1109
0
        SKIP_TOKEN(parser);
1110
0
    }
1111
1112
0
    token = PEEK_TOKEN(parser);
1113
0
    if (!token) return 0;
1114
1115
0
    if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
1116
0
    {
1117
0
        if (!first) {
1118
0
            if (token->type == YAML_FLOW_ENTRY_TOKEN) {
1119
0
                SKIP_TOKEN(parser);
1120
0
                token = PEEK_TOKEN(parser);
1121
0
                if (!token) return 0;
1122
0
            }
1123
0
            else {
1124
0
                return yaml_parser_set_parser_error_context(parser,
1125
0
                        "while parsing a flow mapping", POP(parser, parser->marks),
1126
0
                        "did not find expected ',' or '}'", token->start_mark);
1127
0
            }
1128
0
        }
1129
1130
0
        if (token->type == YAML_KEY_TOKEN) {
1131
0
            SKIP_TOKEN(parser);
1132
0
            token = PEEK_TOKEN(parser);
1133
0
            if (!token) return 0;
1134
0
            if (token->type != YAML_VALUE_TOKEN
1135
0
                    && token->type != YAML_FLOW_ENTRY_TOKEN
1136
0
                    && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1137
0
                if (!PUSH(parser, parser->states,
1138
0
                            YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
1139
0
                    return 0;
1140
0
                return yaml_parser_parse_node(parser, event, 0, 0);
1141
0
            }
1142
0
            else {
1143
0
                parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
1144
0
                return yaml_parser_process_empty_scalar(parser, event,
1145
0
                        token->start_mark);
1146
0
            }
1147
0
        }
1148
0
        else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1149
0
            if (!PUSH(parser, parser->states,
1150
0
                        YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
1151
0
                return 0;
1152
0
            return yaml_parser_parse_node(parser, event, 0, 0);
1153
0
        }
1154
0
    }
1155
1156
0
    parser->state = POP(parser, parser->states);
1157
0
    (void)POP(parser, parser->marks);
1158
0
    MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
1159
0
    SKIP_TOKEN(parser);
1160
0
    return 1;
1161
0
}
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
0
{
1173
0
    yaml_token_t *token;
1174
1175
0
    token = PEEK_TOKEN(parser);
1176
0
    if (!token) return 0;
1177
1178
0
    if (empty) {
1179
0
        parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1180
0
        return yaml_parser_process_empty_scalar(parser, event,
1181
0
                token->start_mark);
1182
0
    }
1183
1184
0
    if (token->type == YAML_VALUE_TOKEN) {
1185
0
        SKIP_TOKEN(parser);
1186
0
        token = PEEK_TOKEN(parser);
1187
0
        if (!token) return 0;
1188
0
        if (token->type != YAML_FLOW_ENTRY_TOKEN
1189
0
                && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
1190
0
            if (!PUSH(parser, parser->states,
1191
0
                        YAML_PARSE_FLOW_MAPPING_KEY_STATE))
1192
0
                return 0;
1193
0
            return yaml_parser_parse_node(parser, event, 0, 0);
1194
0
        }
1195
0
    }
1196
1197
0
    parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
1198
0
    return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
1199
0
}
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
0
{
1209
0
    yaml_char_t *value;
1210
1211
0
    value = YAML_MALLOC(1);
1212
0
    if (!value) {
1213
0
        parser->error = YAML_MEMORY_ERROR;
1214
0
        return 0;
1215
0
    }
1216
0
    value[0] = '\0';
1217
1218
0
    SCALAR_EVENT_INIT(*event, NULL, NULL, value, 0,
1219
0
            1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
1220
1221
0
    return 1;
1222
0
}
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
0
{
1234
0
    yaml_tag_directive_t default_tag_directives[] = {
1235
0
        {(yaml_char_t *)"!", (yaml_char_t *)"!"},
1236
0
        {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
1237
0
        {NULL, NULL}
1238
0
    };
1239
0
    yaml_tag_directive_t *default_tag_directive;
1240
0
    yaml_version_directive_t *version_directive = NULL;
1241
0
    struct {
1242
0
        yaml_tag_directive_t *start;
1243
0
        yaml_tag_directive_t *end;
1244
0
        yaml_tag_directive_t *top;
1245
0
    } tag_directives = { NULL, NULL, NULL };
1246
0
    yaml_token_t *token;
1247
1248
0
    if (!STACK_INIT(parser, tag_directives, yaml_tag_directive_t*))
1249
0
        goto error;
1250
1251
0
    token = PEEK_TOKEN(parser);
1252
0
    if (!token) goto error;
1253
1254
0
    while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
1255
0
            token->type == YAML_TAG_DIRECTIVE_TOKEN)
1256
0
    {
1257
0
        if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
1258
0
            if (version_directive) {
1259
0
                yaml_parser_set_parser_error(parser,
1260
0
                        "found duplicate %YAML directive", token->start_mark);
1261
0
                goto error;
1262
0
            }
1263
0
            if (token->data.version_directive.major != 1
1264
0
                    || (
1265
0
                        token->data.version_directive.minor != 1
1266
0
                        && token->data.version_directive.minor != 2
1267
0
                    )) {
1268
0
                yaml_parser_set_parser_error(parser,
1269
0
                        "found incompatible YAML document", token->start_mark);
1270
0
                goto error;
1271
0
            }
1272
0
            version_directive = YAML_MALLOC_STATIC(yaml_version_directive_t);
1273
0
            if (!version_directive) {
1274
0
                parser->error = YAML_MEMORY_ERROR;
1275
0
                goto error;
1276
0
            }
1277
0
            version_directive->major = token->data.version_directive.major;
1278
0
            version_directive->minor = token->data.version_directive.minor;
1279
0
        }
1280
1281
0
        else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
1282
0
            yaml_tag_directive_t value;
1283
0
            value.handle = token->data.tag_directive.handle;
1284
0
            value.prefix = token->data.tag_directive.prefix;
1285
1286
0
            if (!yaml_parser_append_tag_directive(parser, value, 0,
1287
0
                        token->start_mark))
1288
0
                goto error;
1289
0
            if (!PUSH(parser, tag_directives, value))
1290
0
                goto error;
1291
0
        }
1292
1293
0
        SKIP_TOKEN(parser);
1294
0
        token = PEEK_TOKEN(parser);
1295
0
        if (!token) goto error;
1296
0
    }
1297
1298
0
    for (default_tag_directive = default_tag_directives;
1299
0
            default_tag_directive->handle; default_tag_directive++) {
1300
0
        if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
1301
0
                    token->start_mark))
1302
0
            goto error;
1303
0
    }
1304
1305
0
    if (version_directive_ref) {
1306
0
        *version_directive_ref = version_directive;
1307
0
    }
1308
0
    if (tag_directives_start_ref) {
1309
0
        if (STACK_EMPTY(parser, tag_directives)) {
1310
0
            *tag_directives_start_ref = *tag_directives_end_ref = NULL;
1311
0
            STACK_DEL(parser, tag_directives);
1312
0
        }
1313
0
        else {
1314
0
            *tag_directives_start_ref = tag_directives.start;
1315
0
            *tag_directives_end_ref = tag_directives.top;
1316
0
        }
1317
0
    }
1318
0
    else {
1319
0
        STACK_DEL(parser, tag_directives);
1320
0
    }
1321
1322
0
    if (!version_directive_ref)
1323
0
        yaml_free(version_directive);
1324
0
    return 1;
1325
1326
0
error:
1327
0
    yaml_free(version_directive);
1328
0
    while (!STACK_EMPTY(parser, tag_directives)) {
1329
0
        yaml_tag_directive_t tag_directive = POP(parser, tag_directives);
1330
0
        yaml_free(tag_directive.handle);
1331
0
        yaml_free(tag_directive.prefix);
1332
0
    }
1333
0
    STACK_DEL(parser, tag_directives);
1334
0
    return 0;
1335
0
}
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
0
{
1345
0
    yaml_tag_directive_t *tag_directive;
1346
0
    yaml_tag_directive_t copy = { NULL, NULL };
1347
1348
0
    for (tag_directive = parser->tag_directives.start;
1349
0
            tag_directive != parser->tag_directives.top; tag_directive ++) {
1350
0
        if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
1351
0
            if (allow_duplicates)
1352
0
                return 1;
1353
0
            return yaml_parser_set_parser_error(parser,
1354
0
                    "found duplicate %TAG directive", mark);
1355
0
        }
1356
0
    }
1357
1358
0
    copy.handle = yaml_strdup(value.handle);
1359
0
    copy.prefix = yaml_strdup(value.prefix);
1360
0
    if (!copy.handle || !copy.prefix) {
1361
0
        parser->error = YAML_MEMORY_ERROR;
1362
0
        goto error;
1363
0
    }
1364
1365
0
    if (!PUSH(parser, parser->tag_directives, copy))
1366
0
        goto error;
1367
1368
0
    return 1;
1369
1370
0
error:
1371
0
    yaml_free(copy.handle);
1372
0
    yaml_free(copy.prefix);
1373
0
    return 0;
1374
0
}
1375