mirror of https://github.com/google/oss-fuzz.git
834 lines
30 KiB
C
834 lines
30 KiB
C
// Copyright 2020 Google LLC
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "yaml.h"
|
|
#include "yaml_write_handler.h"
|
|
#include <assert.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#ifdef NDEBUG
|
|
#undef NDEBUG
|
|
#endif
|
|
|
|
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
if (size < 2)
|
|
return 0;
|
|
|
|
bool done = false;
|
|
bool is_canonical = data[0] & 1;
|
|
bool is_unicode = data[1] & 1;
|
|
data += 2;
|
|
size -= 2;
|
|
|
|
yaml_parser_t parser;
|
|
yaml_emitter_t emitter;
|
|
yaml_event_t input_event;
|
|
yaml_document_t output_document;
|
|
|
|
int root;
|
|
|
|
/* Initialize the parser and emitter objects. */
|
|
|
|
if (!yaml_parser_initialize(&parser)) {
|
|
return 1;
|
|
}
|
|
|
|
if (!yaml_emitter_initialize(&emitter)) {
|
|
yaml_parser_delete(&parser);
|
|
return 1;
|
|
}
|
|
|
|
/* Set the parser parameters. */
|
|
|
|
yaml_parser_set_input_string(&parser, data, size);
|
|
|
|
/* Set the emitter parameters. */
|
|
yaml_output_buffer_t out = {/*buf=*/NULL, /*size=*/0};
|
|
yaml_emitter_set_output(&emitter, yaml_write_handler, &out);
|
|
|
|
yaml_emitter_set_canonical(&emitter, is_canonical);
|
|
yaml_emitter_set_unicode(&emitter, is_unicode);
|
|
|
|
/* Create and emit the STREAM-START event. */
|
|
|
|
if (!yaml_emitter_open(&emitter))
|
|
goto error;
|
|
|
|
/* Create a output_document object. */
|
|
|
|
if (!yaml_document_initialize(&output_document, NULL, NULL, NULL, 0, 0))
|
|
goto error;
|
|
|
|
/* Create the root sequence. */
|
|
|
|
root = yaml_document_add_sequence(&output_document, NULL,
|
|
YAML_BLOCK_SEQUENCE_STYLE);
|
|
if (!root)
|
|
goto error;
|
|
|
|
/* Loop through the input events. */
|
|
|
|
while (!done) {
|
|
int properties, key, value, map, seq;
|
|
|
|
/* Get the next event. */
|
|
|
|
if (!yaml_parser_parse(&parser, &input_event))
|
|
goto error;
|
|
|
|
/* Check if this is the stream end. */
|
|
|
|
done = (input_event.type == YAML_STREAM_END_EVENT);
|
|
|
|
/* Create a mapping node and attach it to the root sequence. */
|
|
|
|
properties = yaml_document_add_mapping(&output_document, NULL,
|
|
YAML_BLOCK_MAPPING_STYLE);
|
|
if (!properties)
|
|
goto error;
|
|
if (!yaml_document_append_sequence_item(&output_document, root, properties))
|
|
goto error;
|
|
|
|
/* Analyze the event. */
|
|
|
|
switch (input_event.type) {
|
|
case YAML_STREAM_START_EVENT:
|
|
|
|
/* Add 'type': 'STREAM-START'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"STREAM-START", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'encoding': <encoding>. */
|
|
|
|
if (input_event.data.stream_start.encoding) {
|
|
yaml_encoding_t encoding = input_event.data.stream_start.encoding;
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"encoding", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, NULL,
|
|
(encoding == YAML_UTF8_ENCODING
|
|
? (yaml_char_t *)"utf-8"
|
|
: encoding == YAML_UTF16LE_ENCODING
|
|
? (yaml_char_t *)"utf-16-le"
|
|
: encoding == YAML_UTF16BE_ENCODING
|
|
? (yaml_char_t *)"utf-16-be"
|
|
: (yaml_char_t *)"unknown"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_STREAM_END_EVENT:
|
|
|
|
/* Add 'type': 'STREAM-END'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"STREAM-END", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
case YAML_DOCUMENT_START_EVENT:
|
|
|
|
/* Add 'type': 'DOCUMENT-START'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"DOCUMENT-START", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Display the output_document version numbers. */
|
|
|
|
if (input_event.data.document_start.version_directive) {
|
|
yaml_version_directive_t *version =
|
|
input_event.data.document_start.version_directive;
|
|
char number[64];
|
|
|
|
/* Add 'version': {}. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"version", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
map = yaml_document_add_mapping(&output_document, NULL,
|
|
YAML_FLOW_MAPPING_STYLE);
|
|
if (!map)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, map))
|
|
goto error;
|
|
|
|
/* Add 'major': <number>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"major", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
sprintf(number, "%d", version->major);
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_INT_TAG,
|
|
(yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'minor': <number>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"minor", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
sprintf(number, "%d", version->minor);
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_INT_TAG,
|
|
(yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key,
|
|
value))
|
|
goto error;
|
|
}
|
|
|
|
/* Display the output_document tag directives. */
|
|
|
|
if (input_event.data.document_start.tag_directives.start !=
|
|
input_event.data.document_start.tag_directives.end) {
|
|
yaml_tag_directive_t *tag;
|
|
|
|
/* Add 'tags': []. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"tags", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
seq = yaml_document_add_sequence(&output_document, NULL,
|
|
YAML_BLOCK_SEQUENCE_STYLE);
|
|
if (!seq)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, seq))
|
|
goto error;
|
|
|
|
for (tag = input_event.data.document_start.tag_directives.start;
|
|
tag != input_event.data.document_start.tag_directives.end; tag++) {
|
|
/* Add {}. */
|
|
|
|
map = yaml_document_add_mapping(&output_document, NULL,
|
|
YAML_FLOW_MAPPING_STYLE);
|
|
if (!map)
|
|
goto error;
|
|
if (!yaml_document_append_sequence_item(&output_document, seq, map))
|
|
goto error;
|
|
|
|
/* Add 'handle': <handle>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"handle", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL, tag->handle,
|
|
-1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'prefix': <prefix>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"prefix", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL, tag->prefix,
|
|
-1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key,
|
|
value))
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
/* Add 'implicit': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"implicit", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(input_event.data.document_start.implicit ? (yaml_char_t *)"true"
|
|
: (yaml_char_t *)"false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
case YAML_DOCUMENT_END_EVENT:
|
|
|
|
/* Add 'type': 'DOCUMENT-END'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"DOCUMENT-END", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'implicit': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"implicit", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(input_event.data.document_end.implicit ? (yaml_char_t *)"true"
|
|
: (yaml_char_t *)"false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
case YAML_ALIAS_EVENT:
|
|
|
|
/* Add 'type': 'ALIAS'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"ALIAS", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'anchor': <anchor>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"anchor", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.alias.anchor, -1,
|
|
YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
case YAML_SCALAR_EVENT:
|
|
|
|
/* Add 'type': 'SCALAR'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"SCALAR", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'anchor': <anchor>. */
|
|
|
|
if (input_event.data.scalar.anchor) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"anchor", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.scalar.anchor, -1,
|
|
YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'tag': <tag>. */
|
|
|
|
if (input_event.data.scalar.tag) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"tag", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.scalar.tag, -1,
|
|
YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'value': <value>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"value", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, NULL, input_event.data.scalar.value,
|
|
input_event.data.scalar.length, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Display if the scalar tag is implicit. */
|
|
|
|
/* Add 'implicit': {} */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"version", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
map = yaml_document_add_mapping(&output_document, NULL,
|
|
YAML_FLOW_MAPPING_STYLE);
|
|
if (!map)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
map))
|
|
goto error;
|
|
|
|
/* Add 'plain': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"plain", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(input_event.data.scalar.plain_implicit ? (yaml_char_t *)"true"
|
|
: (yaml_char_t *)"false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key, value))
|
|
goto error;
|
|
|
|
/* Add 'quoted': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"quoted", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(input_event.data.scalar.quoted_implicit ? (yaml_char_t *)"true"
|
|
: (yaml_char_t *)"false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, map, key, value))
|
|
goto error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.scalar.style) {
|
|
yaml_scalar_style_t style = input_event.data.scalar.style;
|
|
|
|
/* Add 'style': <style>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"style", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, NULL,
|
|
(yaml_char_t
|
|
*)(style == YAML_PLAIN_SCALAR_STYLE
|
|
? "plain"
|
|
: style == YAML_SINGLE_QUOTED_SCALAR_STYLE
|
|
? "single-quoted"
|
|
: style == YAML_DOUBLE_QUOTED_SCALAR_STYLE
|
|
? "double-quoted"
|
|
: style == YAML_LITERAL_SCALAR_STYLE
|
|
? "literal"
|
|
: style == YAML_FOLDED_SCALAR_STYLE
|
|
? "folded"
|
|
: "unknown"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_SEQUENCE_START_EVENT:
|
|
|
|
/* Add 'type': 'SEQUENCE-START'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"SEQUENCE-START", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'anchor': <anchor>. */
|
|
|
|
if (input_event.data.sequence_start.anchor) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"anchor", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.sequence_start.anchor,
|
|
-1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'tag': <tag>. */
|
|
|
|
if (input_event.data.sequence_start.tag) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"tag", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.sequence_start.tag,
|
|
-1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'implicit': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"implicit", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(input_event.data.sequence_start.implicit ? (yaml_char_t *)"true"
|
|
: (yaml_char_t *)"false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.sequence_start.style) {
|
|
yaml_sequence_style_t style = input_event.data.sequence_start.style;
|
|
|
|
/* Add 'style': <style>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"style", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, NULL,
|
|
(yaml_char_t *)(style == YAML_BLOCK_SEQUENCE_STYLE
|
|
? "block"
|
|
: style == YAML_FLOW_SEQUENCE_STYLE
|
|
? "flow"
|
|
: "unknown"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_SEQUENCE_END_EVENT:
|
|
|
|
/* Add 'type': 'SEQUENCE-END'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"SEQUENCE-END", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
case YAML_MAPPING_START_EVENT:
|
|
|
|
/* Add 'type': 'MAPPING-START'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"MAPPING-START", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Add 'anchor': <anchor>. */
|
|
|
|
if (input_event.data.mapping_start.anchor) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"anchor", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.mapping_start.anchor,
|
|
-1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'tag': <tag>. */
|
|
|
|
if (input_event.data.mapping_start.tag) {
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"tag", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
input_event.data.mapping_start.tag, -1,
|
|
YAML_DOUBLE_QUOTED_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
/* Add 'implicit': <flag>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"implicit", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, (yaml_char_t *)YAML_BOOL_TAG,
|
|
(yaml_char_t *)(input_event.data.mapping_start.implicit ? "true"
|
|
: "false"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.sequence_start.style) {
|
|
yaml_sequence_style_t style = input_event.data.sequence_start.style;
|
|
|
|
/* Add 'style': <style>. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"style", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(
|
|
&output_document, NULL,
|
|
(yaml_char_t *)(style == YAML_BLOCK_MAPPING_STYLE
|
|
? "block"
|
|
: style == YAML_FLOW_MAPPING_STYLE ? "flow"
|
|
: "unknown"),
|
|
-1, YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties,
|
|
key, value))
|
|
goto error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_MAPPING_END_EVENT:
|
|
|
|
/* Add 'type': 'MAPPING-END'. */
|
|
|
|
key = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"type", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!key)
|
|
goto error;
|
|
value = yaml_document_add_scalar(&output_document, NULL,
|
|
(yaml_char_t *)"MAPPING-END", -1,
|
|
YAML_PLAIN_SCALAR_STYLE);
|
|
if (!value)
|
|
goto error;
|
|
if (!yaml_document_append_mapping_pair(&output_document, properties, key,
|
|
value))
|
|
goto error;
|
|
|
|
break;
|
|
|
|
default:
|
|
/* It couldn't really happen. */
|
|
break;
|
|
}
|
|
|
|
/* Delete the event object. */
|
|
|
|
yaml_event_delete(&input_event);
|
|
}
|
|
|
|
if (!yaml_emitter_dump(&emitter, &output_document))
|
|
goto error;
|
|
|
|
yaml_emitter_close(&emitter);
|
|
|
|
error:
|
|
|
|
free(out.buf);
|
|
|
|
yaml_event_delete(&input_event);
|
|
yaml_document_delete(&output_document);
|
|
yaml_parser_delete(&parser);
|
|
yaml_emitter_delete(&emitter);
|
|
|
|
return 0;
|
|
}
|