unsafe_libyaml/
parser.rs

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