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;
 | |
| }
 |