Coverage Report

Created: 2025-07-12 06:26

/rust/registry/src/index.crates.io-6f17d22bba15001f/unsafe-libyaml-0.2.11/src/loader.rs
Line
Count
Source (jump to first uncovered line)
1
use crate::api::{yaml_free, yaml_malloc, yaml_stack_extend, yaml_strdup};
2
use crate::externs::{memset, strcmp};
3
use crate::success::{Success, FAIL, OK};
4
use crate::yaml::yaml_char_t;
5
use crate::{
6
    libc, yaml_alias_data_t, yaml_document_delete, yaml_document_t, yaml_event_t, yaml_mark_t,
7
    yaml_node_item_t, yaml_node_pair_t, yaml_node_t, yaml_parser_parse, yaml_parser_t, PointerExt,
8
    YAML_ALIAS_EVENT, YAML_COMPOSER_ERROR, YAML_DOCUMENT_END_EVENT, YAML_DOCUMENT_START_EVENT,
9
    YAML_MAPPING_END_EVENT, YAML_MAPPING_NODE, YAML_MAPPING_START_EVENT, YAML_MEMORY_ERROR,
10
    YAML_SCALAR_EVENT, YAML_SCALAR_NODE, YAML_SEQUENCE_END_EVENT, YAML_SEQUENCE_NODE,
11
    YAML_SEQUENCE_START_EVENT, YAML_STREAM_END_EVENT, YAML_STREAM_START_EVENT,
12
};
13
use core::mem::{size_of, MaybeUninit};
14
use core::ptr::{self, addr_of_mut};
15
16
#[repr(C)]
17
struct loader_ctx {
18
    start: *mut libc::c_int,
19
    end: *mut libc::c_int,
20
    top: *mut libc::c_int,
21
}
22
23
/// Parse the input stream and produce the next YAML document.
24
///
25
/// Call this function subsequently to produce a sequence of documents
26
/// constituting the input stream.
27
///
28
/// If the produced document has no root node, it means that the document end
29
/// has been reached.
30
///
31
/// An application is responsible for freeing any data associated with the
32
/// produced document object using the yaml_document_delete() function.
33
///
34
/// An application must not alternate the calls of yaml_parser_load() with the
35
/// calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break
36
/// the parser.
37
0
pub unsafe fn yaml_parser_load(
38
0
    parser: *mut yaml_parser_t,
39
0
    document: *mut yaml_document_t,
40
0
) -> Success {
41
0
    let current_block: u64;
42
0
    let mut event = MaybeUninit::<yaml_event_t>::uninit();
43
0
    let event = event.as_mut_ptr();
44
0
    __assert!(!parser.is_null());
45
0
    __assert!(!document.is_null());
46
0
    memset(
47
0
        document as *mut libc::c_void,
48
0
        0,
49
0
        size_of::<yaml_document_t>() as libc::c_ulong,
50
0
    );
51
0
    STACK_INIT!((*document).nodes, yaml_node_t);
52
0
    if !(*parser).stream_start_produced {
53
0
        if yaml_parser_parse(parser, event).fail {
54
0
            current_block = 6234624449317607669;
55
0
        } else {
56
0
            __assert!((*event).type_ == YAML_STREAM_START_EVENT);
57
0
            current_block = 7815301370352969686;
58
        }
59
0
    } else {
60
0
        current_block = 7815301370352969686;
61
0
    }
62
0
    if current_block != 6234624449317607669 {
63
0
        if (*parser).stream_end_produced {
64
0
            return OK;
65
0
        }
66
0
        if yaml_parser_parse(parser, event).ok {
67
0
            if (*event).type_ == YAML_STREAM_END_EVENT {
68
0
                return OK;
69
0
            }
70
0
            STACK_INIT!((*parser).aliases, yaml_alias_data_t);
71
0
            let fresh6 = addr_of_mut!((*parser).document);
72
0
            *fresh6 = document;
73
0
            if yaml_parser_load_document(parser, event).ok {
74
0
                yaml_parser_delete_aliases(parser);
75
0
                let fresh7 = addr_of_mut!((*parser).document);
76
0
                *fresh7 = ptr::null_mut::<yaml_document_t>();
77
0
                return OK;
78
0
            }
79
0
        }
80
0
    }
81
0
    yaml_parser_delete_aliases(parser);
82
0
    yaml_document_delete(document);
83
0
    let fresh8 = addr_of_mut!((*parser).document);
84
0
    *fresh8 = ptr::null_mut::<yaml_document_t>();
85
0
    FAIL
86
0
}
87
88
0
unsafe fn yaml_parser_set_composer_error(
89
0
    parser: *mut yaml_parser_t,
90
0
    problem: *const libc::c_char,
91
0
    problem_mark: yaml_mark_t,
92
0
) -> Success {
93
0
    (*parser).error = YAML_COMPOSER_ERROR;
94
0
    let fresh9 = addr_of_mut!((*parser).problem);
95
0
    *fresh9 = problem;
96
0
    (*parser).problem_mark = problem_mark;
97
0
    FAIL
98
0
}
99
100
0
unsafe fn yaml_parser_set_composer_error_context(
101
0
    parser: *mut yaml_parser_t,
102
0
    context: *const libc::c_char,
103
0
    context_mark: yaml_mark_t,
104
0
    problem: *const libc::c_char,
105
0
    problem_mark: yaml_mark_t,
106
0
) -> Success {
107
0
    (*parser).error = YAML_COMPOSER_ERROR;
108
0
    let fresh10 = addr_of_mut!((*parser).context);
109
0
    *fresh10 = context;
110
0
    (*parser).context_mark = context_mark;
111
0
    let fresh11 = addr_of_mut!((*parser).problem);
112
0
    *fresh11 = problem;
113
0
    (*parser).problem_mark = problem_mark;
114
0
    FAIL
115
0
}
116
117
0
unsafe fn yaml_parser_delete_aliases(parser: *mut yaml_parser_t) {
118
0
    while !STACK_EMPTY!((*parser).aliases) {
119
0
        yaml_free(POP!((*parser).aliases).anchor as *mut libc::c_void);
120
0
    }
121
0
    STACK_DEL!((*parser).aliases);
122
0
}
123
124
0
unsafe fn yaml_parser_load_document(
125
0
    parser: *mut yaml_parser_t,
126
0
    event: *mut yaml_event_t,
127
0
) -> Success {
128
0
    let mut ctx = loader_ctx {
129
0
        start: ptr::null_mut::<libc::c_int>(),
130
0
        end: ptr::null_mut::<libc::c_int>(),
131
0
        top: ptr::null_mut::<libc::c_int>(),
132
0
    };
133
0
    __assert!((*event).type_ == YAML_DOCUMENT_START_EVENT);
134
0
    let fresh16 = addr_of_mut!((*(*parser).document).version_directive);
135
0
    *fresh16 = (*event).data.document_start.version_directive;
136
0
    let fresh17 = addr_of_mut!((*(*parser).document).tag_directives.start);
137
0
    *fresh17 = (*event).data.document_start.tag_directives.start;
138
0
    let fresh18 = addr_of_mut!((*(*parser).document).tag_directives.end);
139
0
    *fresh18 = (*event).data.document_start.tag_directives.end;
140
0
    (*(*parser).document).start_implicit = (*event).data.document_start.implicit;
141
0
    (*(*parser).document).start_mark = (*event).start_mark;
142
0
    STACK_INIT!(ctx, libc::c_int);
143
0
    if yaml_parser_load_nodes(parser, addr_of_mut!(ctx)).fail {
144
0
        STACK_DEL!(ctx);
145
0
        return FAIL;
146
0
    }
147
0
    STACK_DEL!(ctx);
148
0
    OK
149
0
}
150
151
0
unsafe fn yaml_parser_load_nodes(parser: *mut yaml_parser_t, ctx: *mut loader_ctx) -> Success {
152
0
    let mut event = MaybeUninit::<yaml_event_t>::uninit();
153
0
    let event = event.as_mut_ptr();
154
    loop {
155
0
        if yaml_parser_parse(parser, event).fail {
156
0
            return FAIL;
157
0
        }
158
0
        match (*event).type_ {
159
            YAML_ALIAS_EVENT => {
160
0
                if yaml_parser_load_alias(parser, event, ctx).fail {
161
0
                    return FAIL;
162
0
                }
163
            }
164
            YAML_SCALAR_EVENT => {
165
0
                if yaml_parser_load_scalar(parser, event, ctx).fail {
166
0
                    return FAIL;
167
0
                }
168
            }
169
            YAML_SEQUENCE_START_EVENT => {
170
0
                if yaml_parser_load_sequence(parser, event, ctx).fail {
171
0
                    return FAIL;
172
0
                }
173
            }
174
            YAML_SEQUENCE_END_EVENT => {
175
0
                if yaml_parser_load_sequence_end(parser, event, ctx).fail {
176
0
                    return FAIL;
177
0
                }
178
            }
179
            YAML_MAPPING_START_EVENT => {
180
0
                if yaml_parser_load_mapping(parser, event, ctx).fail {
181
0
                    return FAIL;
182
0
                }
183
            }
184
            YAML_MAPPING_END_EVENT => {
185
0
                if yaml_parser_load_mapping_end(parser, event, ctx).fail {
186
0
                    return FAIL;
187
0
                }
188
            }
189
0
            YAML_DOCUMENT_END_EVENT => {}
190
            _ => {
191
0
                __assert!(false);
192
            }
193
        }
194
0
        if (*event).type_ == YAML_DOCUMENT_END_EVENT {
195
0
            break;
196
0
        }
197
    }
198
0
    (*(*parser).document).end_implicit = (*event).data.document_end.implicit;
199
0
    (*(*parser).document).end_mark = (*event).end_mark;
200
0
    OK
201
0
}
202
203
0
unsafe fn yaml_parser_register_anchor(
204
0
    parser: *mut yaml_parser_t,
205
0
    index: libc::c_int,
206
0
    anchor: *mut yaml_char_t,
207
0
) -> Success {
208
0
    let mut data = MaybeUninit::<yaml_alias_data_t>::uninit();
209
0
    let data = data.as_mut_ptr();
210
0
    let mut alias_data: *mut yaml_alias_data_t;
211
0
    if anchor.is_null() {
212
0
        return OK;
213
0
    }
214
0
    (*data).anchor = anchor;
215
0
    (*data).index = index;
216
0
    (*data).mark = (*(*(*parser).document)
217
0
        .nodes
218
0
        .start
219
0
        .wrapping_offset((index - 1) as isize))
220
0
    .start_mark;
221
0
    alias_data = (*parser).aliases.start;
222
0
    while alias_data != (*parser).aliases.top {
223
0
        if strcmp(
224
0
            (*alias_data).anchor as *mut libc::c_char,
225
0
            anchor as *mut libc::c_char,
226
0
        ) == 0
227
        {
228
0
            yaml_free(anchor as *mut libc::c_void);
229
0
            return yaml_parser_set_composer_error_context(
230
0
                parser,
231
0
                b"found duplicate anchor; first occurrence\0" as *const u8 as *const libc::c_char,
232
0
                (*alias_data).mark,
233
0
                b"second occurrence\0" as *const u8 as *const libc::c_char,
234
0
                (*data).mark,
235
0
            );
236
0
        }
237
0
        alias_data = alias_data.wrapping_offset(1);
238
    }
239
0
    PUSH!((*parser).aliases, *data);
240
0
    OK
241
0
}
242
243
0
unsafe fn yaml_parser_load_node_add(
244
0
    parser: *mut yaml_parser_t,
245
0
    ctx: *mut loader_ctx,
246
0
    index: libc::c_int,
247
0
) -> Success {
248
0
    if STACK_EMPTY!(*ctx) {
249
0
        return OK;
250
0
    }
251
0
    let parent_index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
252
0
    let parent: *mut yaml_node_t = addr_of_mut!(
253
0
        *((*(*parser).document).nodes.start).wrapping_offset((parent_index - 1) as isize)
254
0
    );
255
0
    let current_block_17: u64;
256
0
    match (*parent).type_ {
257
        YAML_SEQUENCE_NODE => {
258
0
            if STACK_LIMIT!(parser, (*parent).data.sequence.items).fail {
259
0
                return FAIL;
260
0
            }
261
0
            PUSH!((*parent).data.sequence.items, index);
262
        }
263
        YAML_MAPPING_NODE => {
264
0
            let mut pair = MaybeUninit::<yaml_node_pair_t>::uninit();
265
0
            let pair = pair.as_mut_ptr();
266
0
            if !STACK_EMPTY!((*parent).data.mapping.pairs) {
267
0
                let p: *mut yaml_node_pair_t =
268
0
                    (*parent).data.mapping.pairs.top.wrapping_offset(-1_isize);
269
0
                if (*p).key != 0 && (*p).value == 0 {
270
0
                    (*p).value = index;
271
0
                    current_block_17 = 11307063007268554308;
272
0
                } else {
273
0
                    current_block_17 = 17407779659766490442;
274
0
                }
275
0
            } else {
276
0
                current_block_17 = 17407779659766490442;
277
0
            }
278
0
            match current_block_17 {
279
0
                11307063007268554308 => {}
280
                _ => {
281
0
                    (*pair).key = index;
282
0
                    (*pair).value = 0;
283
0
                    if STACK_LIMIT!(parser, (*parent).data.mapping.pairs).fail {
284
0
                        return FAIL;
285
0
                    }
286
0
                    PUSH!((*parent).data.mapping.pairs, *pair);
287
                }
288
            }
289
        }
290
        _ => {
291
0
            __assert!(false);
292
        }
293
    }
294
0
    OK
295
0
}
296
297
0
unsafe fn yaml_parser_load_alias(
298
0
    parser: *mut yaml_parser_t,
299
0
    event: *mut yaml_event_t,
300
0
    ctx: *mut loader_ctx,
301
0
) -> Success {
302
0
    let anchor: *mut yaml_char_t = (*event).data.alias.anchor;
303
0
    let mut alias_data: *mut yaml_alias_data_t;
304
0
    alias_data = (*parser).aliases.start;
305
0
    while alias_data != (*parser).aliases.top {
306
0
        if strcmp(
307
0
            (*alias_data).anchor as *mut libc::c_char,
308
0
            anchor as *mut libc::c_char,
309
0
        ) == 0
310
        {
311
0
            yaml_free(anchor as *mut libc::c_void);
312
0
            return yaml_parser_load_node_add(parser, ctx, (*alias_data).index);
313
0
        }
314
0
        alias_data = alias_data.wrapping_offset(1);
315
    }
316
0
    yaml_free(anchor as *mut libc::c_void);
317
0
    yaml_parser_set_composer_error(
318
0
        parser,
319
0
        b"found undefined alias\0" as *const u8 as *const libc::c_char,
320
0
        (*event).start_mark,
321
0
    )
322
0
}
323
324
0
unsafe fn yaml_parser_load_scalar(
325
0
    parser: *mut yaml_parser_t,
326
0
    event: *mut yaml_event_t,
327
0
    ctx: *mut loader_ctx,
328
0
) -> Success {
329
0
    let current_block: u64;
330
0
    let mut node = MaybeUninit::<yaml_node_t>::uninit();
331
0
    let node = node.as_mut_ptr();
332
0
    let index: libc::c_int;
333
0
    let mut tag: *mut yaml_char_t = (*event).data.scalar.tag;
334
0
    if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
335
0
        if tag.is_null()
336
0
            || strcmp(
337
0
                tag as *mut libc::c_char,
338
0
                b"!\0" as *const u8 as *const libc::c_char,
339
0
            ) == 0
340
        {
341
0
            yaml_free(tag as *mut libc::c_void);
342
0
            tag = yaml_strdup(
343
0
                b"tag:yaml.org,2002:str\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
344
0
            );
345
0
            if tag.is_null() {
346
0
                current_block = 10579931339944277179;
347
0
            } else {
348
0
                current_block = 11006700562992250127;
349
0
            }
350
0
        } else {
351
0
            current_block = 11006700562992250127;
352
0
        }
353
0
        if current_block != 10579931339944277179 {
354
0
            memset(
355
0
                node as *mut libc::c_void,
356
0
                0,
357
0
                size_of::<yaml_node_t>() as libc::c_ulong,
358
0
            );
359
0
            (*node).type_ = YAML_SCALAR_NODE;
360
0
            (*node).tag = tag;
361
0
            (*node).start_mark = (*event).start_mark;
362
0
            (*node).end_mark = (*event).end_mark;
363
0
            (*node).data.scalar.value = (*event).data.scalar.value;
364
0
            (*node).data.scalar.length = (*event).data.scalar.length;
365
0
            (*node).data.scalar.style = (*event).data.scalar.style;
366
0
            PUSH!((*(*parser).document).nodes, *node);
367
0
            index = (*(*parser).document)
368
0
                .nodes
369
0
                .top
370
0
                .c_offset_from((*(*parser).document).nodes.start)
371
0
                as libc::c_int;
372
0
            if yaml_parser_register_anchor(parser, index, (*event).data.scalar.anchor).fail {
373
0
                return FAIL;
374
0
            }
375
0
            return yaml_parser_load_node_add(parser, ctx, index);
376
0
        }
377
0
    }
378
0
    yaml_free(tag as *mut libc::c_void);
379
0
    yaml_free((*event).data.scalar.anchor as *mut libc::c_void);
380
0
    yaml_free((*event).data.scalar.value as *mut libc::c_void);
381
0
    FAIL
382
0
}
383
384
0
unsafe fn yaml_parser_load_sequence(
385
0
    parser: *mut yaml_parser_t,
386
0
    event: *mut yaml_event_t,
387
0
    ctx: *mut loader_ctx,
388
0
) -> Success {
389
0
    let current_block: u64;
390
0
    let mut node = MaybeUninit::<yaml_node_t>::uninit();
391
0
    let node = node.as_mut_ptr();
392
    struct Items {
393
        start: *mut yaml_node_item_t,
394
        end: *mut yaml_node_item_t,
395
        top: *mut yaml_node_item_t,
396
    }
397
0
    let mut items = Items {
398
0
        start: ptr::null_mut::<yaml_node_item_t>(),
399
0
        end: ptr::null_mut::<yaml_node_item_t>(),
400
0
        top: ptr::null_mut::<yaml_node_item_t>(),
401
0
    };
402
0
    let index: libc::c_int;
403
0
    let mut tag: *mut yaml_char_t = (*event).data.sequence_start.tag;
404
0
    if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
405
0
        if tag.is_null()
406
0
            || strcmp(
407
0
                tag as *mut libc::c_char,
408
0
                b"!\0" as *const u8 as *const libc::c_char,
409
0
            ) == 0
410
        {
411
0
            yaml_free(tag as *mut libc::c_void);
412
0
            tag = yaml_strdup(
413
0
                b"tag:yaml.org,2002:seq\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
414
0
            );
415
0
            if tag.is_null() {
416
0
                current_block = 13474536459355229096;
417
0
            } else {
418
0
                current_block = 6937071982253665452;
419
0
            }
420
0
        } else {
421
0
            current_block = 6937071982253665452;
422
0
        }
423
0
        if current_block != 13474536459355229096 {
424
0
            STACK_INIT!(items, yaml_node_item_t);
425
0
            memset(
426
0
                node as *mut libc::c_void,
427
0
                0,
428
0
                size_of::<yaml_node_t>() as libc::c_ulong,
429
0
            );
430
0
            (*node).type_ = YAML_SEQUENCE_NODE;
431
0
            (*node).tag = tag;
432
0
            (*node).start_mark = (*event).start_mark;
433
0
            (*node).end_mark = (*event).end_mark;
434
0
            (*node).data.sequence.items.start = items.start;
435
0
            (*node).data.sequence.items.end = items.end;
436
0
            (*node).data.sequence.items.top = items.start;
437
0
            (*node).data.sequence.style = (*event).data.sequence_start.style;
438
0
            PUSH!((*(*parser).document).nodes, *node);
439
0
            index = (*(*parser).document)
440
0
                .nodes
441
0
                .top
442
0
                .c_offset_from((*(*parser).document).nodes.start)
443
0
                as libc::c_int;
444
0
            if yaml_parser_register_anchor(parser, index, (*event).data.sequence_start.anchor).fail
445
            {
446
0
                return FAIL;
447
0
            }
448
0
            if yaml_parser_load_node_add(parser, ctx, index).fail {
449
0
                return FAIL;
450
0
            }
451
0
            if STACK_LIMIT!(parser, *ctx).fail {
452
0
                return FAIL;
453
0
            }
454
0
            PUSH!(*ctx, index);
455
0
            return OK;
456
0
        }
457
0
    }
458
0
    yaml_free(tag as *mut libc::c_void);
459
0
    yaml_free((*event).data.sequence_start.anchor as *mut libc::c_void);
460
0
    FAIL
461
0
}
462
463
0
unsafe fn yaml_parser_load_sequence_end(
464
0
    parser: *mut yaml_parser_t,
465
0
    event: *mut yaml_event_t,
466
0
    ctx: *mut loader_ctx,
467
0
) -> Success {
468
0
    __assert!(((*ctx).top).c_offset_from((*ctx).start) as libc::c_long > 0_i64);
469
0
    let index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
470
0
    __assert!(
471
0
        (*((*(*parser).document).nodes.start).wrapping_offset((index - 1) as isize)).type_
472
0
            == YAML_SEQUENCE_NODE
473
0
    );
474
0
    (*(*(*parser).document)
475
0
        .nodes
476
0
        .start
477
0
        .wrapping_offset((index - 1) as isize))
478
0
    .end_mark = (*event).end_mark;
479
0
    let _ = POP!(*ctx);
480
0
    OK
481
0
}
482
483
0
unsafe fn yaml_parser_load_mapping(
484
0
    parser: *mut yaml_parser_t,
485
0
    event: *mut yaml_event_t,
486
0
    ctx: *mut loader_ctx,
487
0
) -> Success {
488
0
    let current_block: u64;
489
0
    let mut node = MaybeUninit::<yaml_node_t>::uninit();
490
0
    let node = node.as_mut_ptr();
491
    struct Pairs {
492
        start: *mut yaml_node_pair_t,
493
        end: *mut yaml_node_pair_t,
494
        top: *mut yaml_node_pair_t,
495
    }
496
0
    let mut pairs = Pairs {
497
0
        start: ptr::null_mut::<yaml_node_pair_t>(),
498
0
        end: ptr::null_mut::<yaml_node_pair_t>(),
499
0
        top: ptr::null_mut::<yaml_node_pair_t>(),
500
0
    };
501
0
    let index: libc::c_int;
502
0
    let mut tag: *mut yaml_char_t = (*event).data.mapping_start.tag;
503
0
    if STACK_LIMIT!(parser, (*(*parser).document).nodes).ok {
504
0
        if tag.is_null()
505
0
            || strcmp(
506
0
                tag as *mut libc::c_char,
507
0
                b"!\0" as *const u8 as *const libc::c_char,
508
0
            ) == 0
509
        {
510
0
            yaml_free(tag as *mut libc::c_void);
511
0
            tag = yaml_strdup(
512
0
                b"tag:yaml.org,2002:map\0" as *const u8 as *const libc::c_char as *mut yaml_char_t,
513
0
            );
514
0
            if tag.is_null() {
515
0
                current_block = 13635467803606088781;
516
0
            } else {
517
0
                current_block = 6937071982253665452;
518
0
            }
519
0
        } else {
520
0
            current_block = 6937071982253665452;
521
0
        }
522
0
        if current_block != 13635467803606088781 {
523
0
            STACK_INIT!(pairs, yaml_node_pair_t);
524
0
            memset(
525
0
                node as *mut libc::c_void,
526
0
                0,
527
0
                size_of::<yaml_node_t>() as libc::c_ulong,
528
0
            );
529
0
            (*node).type_ = YAML_MAPPING_NODE;
530
0
            (*node).tag = tag;
531
0
            (*node).start_mark = (*event).start_mark;
532
0
            (*node).end_mark = (*event).end_mark;
533
0
            (*node).data.mapping.pairs.start = pairs.start;
534
0
            (*node).data.mapping.pairs.end = pairs.end;
535
0
            (*node).data.mapping.pairs.top = pairs.start;
536
0
            (*node).data.mapping.style = (*event).data.mapping_start.style;
537
0
            PUSH!((*(*parser).document).nodes, *node);
538
0
            index = (*(*parser).document)
539
0
                .nodes
540
0
                .top
541
0
                .c_offset_from((*(*parser).document).nodes.start)
542
0
                as libc::c_int;
543
0
            if yaml_parser_register_anchor(parser, index, (*event).data.mapping_start.anchor).fail {
544
0
                return FAIL;
545
0
            }
546
0
            if yaml_parser_load_node_add(parser, ctx, index).fail {
547
0
                return FAIL;
548
0
            }
549
0
            if STACK_LIMIT!(parser, *ctx).fail {
550
0
                return FAIL;
551
0
            }
552
0
            PUSH!(*ctx, index);
553
0
            return OK;
554
0
        }
555
0
    }
556
0
    yaml_free(tag as *mut libc::c_void);
557
0
    yaml_free((*event).data.mapping_start.anchor as *mut libc::c_void);
558
0
    FAIL
559
0
}
560
561
0
unsafe fn yaml_parser_load_mapping_end(
562
0
    parser: *mut yaml_parser_t,
563
0
    event: *mut yaml_event_t,
564
0
    ctx: *mut loader_ctx,
565
0
) -> Success {
566
0
    __assert!(((*ctx).top).c_offset_from((*ctx).start) as libc::c_long > 0_i64);
567
0
    let index: libc::c_int = *(*ctx).top.wrapping_offset(-1_isize);
568
0
    __assert!(
569
0
        (*((*(*parser).document).nodes.start).wrapping_offset((index - 1) as isize)).type_
570
0
            == YAML_MAPPING_NODE
571
0
    );
572
0
    (*(*(*parser).document)
573
0
        .nodes
574
0
        .start
575
0
        .wrapping_offset((index - 1) as isize))
576
0
    .end_mark = (*event).end_mark;
577
0
    let _ = POP!(*ctx);
578
0
    OK
579
0
}