e51c53f366
LibYAML is a YAML 1.1 parser and emitter under MIT license which will soon be used by the pkg boostrap (usr.bin/pkg) and bhyve Reviewed by: roberto, antoine
1131 lines
43 KiB
C
1131 lines
43 KiB
C
|
|
#include <yaml.h>
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
int help = 0;
|
|
int canonical = 0;
|
|
int unicode = 0;
|
|
int k;
|
|
int done = 0;
|
|
|
|
yaml_parser_t parser;
|
|
yaml_emitter_t emitter;
|
|
yaml_event_t input_event;
|
|
yaml_event_t output_event;
|
|
|
|
/* Clear the objects. */
|
|
|
|
memset(&parser, 0, sizeof(parser));
|
|
memset(&emitter, 0, sizeof(emitter));
|
|
memset(&input_event, 0, sizeof(input_event));
|
|
memset(&output_event, 0, sizeof(output_event));
|
|
|
|
/* Analyze command line options. */
|
|
|
|
for (k = 1; k < argc; k ++)
|
|
{
|
|
if (strcmp(argv[k], "-h") == 0
|
|
|| strcmp(argv[k], "--help") == 0) {
|
|
help = 1;
|
|
}
|
|
|
|
else if (strcmp(argv[k], "-c") == 0
|
|
|| strcmp(argv[k], "--canonical") == 0) {
|
|
canonical = 1;
|
|
}
|
|
|
|
else if (strcmp(argv[k], "-u") == 0
|
|
|| strcmp(argv[k], "--unicode") == 0) {
|
|
unicode = 1;
|
|
}
|
|
|
|
else {
|
|
fprintf(stderr, "Unrecognized option: %s\n"
|
|
"Try `%s --help` for more information.\n",
|
|
argv[k], argv[0]);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
/* Display the help string. */
|
|
|
|
if (help)
|
|
{
|
|
printf("%s <input\n"
|
|
"or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n"
|
|
"-h, --help\t\tdisplay this help and exit\n"
|
|
"-c, --canonical\t\toutput in the canonical YAML format\n"
|
|
"-u, --unicode\t\toutput unescaped non-ASCII characters\n",
|
|
argv[0], argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
/* Initialize the parser and emitter objects. */
|
|
|
|
if (!yaml_parser_initialize(&parser)) {
|
|
fprintf(stderr, "Could not initialize the parser object\n");
|
|
return 1;
|
|
}
|
|
|
|
if (!yaml_emitter_initialize(&emitter)) {
|
|
yaml_parser_delete(&parser);
|
|
fprintf(stderr, "Could not inialize the emitter object\n");
|
|
return 1;
|
|
}
|
|
|
|
/* Set the parser parameters. */
|
|
|
|
yaml_parser_set_input_file(&parser, stdin);
|
|
|
|
/* Set the emitter parameters. */
|
|
|
|
yaml_emitter_set_output_file(&emitter, stdout);
|
|
|
|
yaml_emitter_set_canonical(&emitter, canonical);
|
|
yaml_emitter_set_unicode(&emitter, unicode);
|
|
|
|
/* Create and emit the STREAM-START event. */
|
|
|
|
if (!yaml_stream_start_event_initialize(&output_event, YAML_UTF8_ENCODING))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Create and emit the DOCUMENT-START event. */
|
|
|
|
if (!yaml_document_start_event_initialize(&output_event,
|
|
NULL, NULL, NULL, 0))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Create and emit the SEQUENCE-START event. */
|
|
|
|
if (!yaml_sequence_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:seq", 1,
|
|
YAML_BLOCK_SEQUENCE_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Loop through the input events. */
|
|
|
|
while (!done)
|
|
{
|
|
/* Get the next event. */
|
|
|
|
if (!yaml_parser_parse(&parser, &input_event))
|
|
goto parser_error;
|
|
|
|
/* Check if this is the stream end. */
|
|
|
|
if (input_event.type == YAML_STREAM_END_EVENT) {
|
|
done = 1;
|
|
}
|
|
|
|
/* Create and emit a MAPPING-START event. */
|
|
|
|
if (!yaml_mapping_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:map", 1,
|
|
YAML_BLOCK_MAPPING_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Analyze the event. */
|
|
|
|
switch (input_event.type)
|
|
{
|
|
case YAML_STREAM_START_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'STREAM-START'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "STREAM-START", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display encoding information. */
|
|
|
|
if (input_event.data.stream_start.encoding)
|
|
{
|
|
yaml_encoding_t encoding
|
|
= input_event.data.stream_start.encoding;
|
|
|
|
/* Write 'encoding'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "encoding", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the stream encoding. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
(encoding == YAML_UTF8_ENCODING ? "utf-8" :
|
|
encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" :
|
|
encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" :
|
|
"unknown"), -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_STREAM_END_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'STREAM-END'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "STREAM-END", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
case YAML_DOCUMENT_START_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'DOCUMENT-START'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "DOCUMENT-START", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the 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];
|
|
|
|
/* Write 'version'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "version", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write '{'. */
|
|
|
|
if (!yaml_mapping_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:map", 1,
|
|
YAML_FLOW_MAPPING_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'major'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "major", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write a number. */
|
|
|
|
sprintf(number, "%d", version->major);
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:int", number, -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'minor'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "minor", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write a number. */
|
|
|
|
sprintf(number, "%d", version->minor);
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:int", number, -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write '}'. */
|
|
|
|
if (!yaml_mapping_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Display the 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;
|
|
|
|
/* Write 'tags'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "tags", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Start a block sequence. */
|
|
|
|
if (!yaml_sequence_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:seq", 1,
|
|
YAML_BLOCK_SEQUENCE_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
for (tag = input_event.data.document_start.tag_directives.start;
|
|
tag != input_event.data.document_start.tag_directives.end;
|
|
tag ++)
|
|
{
|
|
/* Write '{'. */
|
|
|
|
if (!yaml_mapping_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:map", 1,
|
|
YAML_FLOW_MAPPING_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'handle'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "handle", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the tag directive handle. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
tag->handle, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'prefix'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "prefix", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the tag directive prefix. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
tag->prefix, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write '}'. */
|
|
|
|
if (!yaml_mapping_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* End a block sequence. */
|
|
|
|
if (!yaml_sequence_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Write 'implicit'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "implicit", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the document is implicit. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.document_start.implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
case YAML_DOCUMENT_END_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'DOCUMENT-END'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "DOCUMENT-END", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'implicit'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "implicit", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the document is implicit. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.document_end.implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
case YAML_ALIAS_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'ALIAS'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "ALIAS", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'anchor'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "anchor", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the alias anchor. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.alias.anchor, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
case YAML_SCALAR_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'SCALAR'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "SCALAR", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the scalar anchor. */
|
|
|
|
if (input_event.data.scalar.anchor)
|
|
{
|
|
/* Write 'anchor'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "anchor", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar anchor. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.scalar.anchor, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Display the scalar tag. */
|
|
|
|
if (input_event.data.scalar.tag)
|
|
{
|
|
/* Write 'tag'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "tag", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar tag. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.scalar.tag, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Display the scalar value. */
|
|
|
|
/* Write 'value'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "value", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar value. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.scalar.value,
|
|
input_event.data.scalar.length,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display if the scalar tag is implicit. */
|
|
|
|
/* Write 'implicit'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "implicit", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write '{'. */
|
|
|
|
if (!yaml_mapping_start_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:map", 1,
|
|
YAML_FLOW_MAPPING_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'plain'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "plain", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the scalar is implicit in the plain style. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.scalar.plain_implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'quoted'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "non-plain", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the scalar is implicit in a non-plain style. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.scalar.quoted_implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write '}'. */
|
|
|
|
if (!yaml_mapping_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.scalar.style)
|
|
{
|
|
yaml_scalar_style_t style = input_event.data.scalar.style;
|
|
|
|
/* Write 'style'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "style", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar style. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
(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,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_SEQUENCE_START_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'SEQUENCE-START'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "SEQUENCE-START", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the sequence anchor. */
|
|
|
|
if (input_event.data.sequence_start.anchor)
|
|
{
|
|
/* Write 'anchor'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "anchor", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the sequence anchor. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.sequence_start.anchor, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Display the sequence tag. */
|
|
|
|
if (input_event.data.sequence_start.tag)
|
|
{
|
|
/* Write 'tag'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "tag", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the sequence tag. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.sequence_start.tag, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Write 'implicit'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "implicit", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the sequence tag is implicit. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.sequence_start.implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.sequence_start.style)
|
|
{
|
|
yaml_sequence_style_t style
|
|
= input_event.data.sequence_start.style;
|
|
|
|
/* Write 'style'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "style", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar style. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
(style == YAML_BLOCK_SEQUENCE_STYLE ? "block" :
|
|
style == YAML_FLOW_SEQUENCE_STYLE ? "flow" :
|
|
"unknown"), -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_SEQUENCE_END_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'SEQUENCE-END'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "SEQUENCE-END", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
case YAML_MAPPING_START_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'MAPPING-START'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "MAPPING-START", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the mapping anchor. */
|
|
|
|
if (input_event.data.mapping_start.anchor)
|
|
{
|
|
/* Write 'anchor'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "anchor", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the mapping anchor. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.mapping_start.anchor, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Display the mapping tag. */
|
|
|
|
if (input_event.data.mapping_start.tag)
|
|
{
|
|
/* Write 'tag'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "tag", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the mapping tag. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
input_event.data.mapping_start.tag, -1,
|
|
0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Write 'implicit'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "implicit", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write if the mapping tag is implicit. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:bool",
|
|
(input_event.data.mapping_start.implicit ?
|
|
"true" : "false"), -1,
|
|
1, 0, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Display the style information. */
|
|
|
|
if (input_event.data.mapping_start.style)
|
|
{
|
|
yaml_mapping_style_t style
|
|
= input_event.data.mapping_start.style;
|
|
|
|
/* Write 'style'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "style", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write the scalar style. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str",
|
|
(style == YAML_BLOCK_MAPPING_STYLE ? "block" :
|
|
style == YAML_FLOW_MAPPING_STYLE ? "flow" :
|
|
"unknown"), -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
break;
|
|
|
|
case YAML_MAPPING_END_EVENT:
|
|
|
|
/* Write 'type'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "type", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Write 'MAPPING-END'. */
|
|
|
|
if (!yaml_scalar_event_initialize(&output_event,
|
|
NULL, "tag:yaml.org,2002:str", "MAPPING-END", -1,
|
|
1, 1, YAML_PLAIN_SCALAR_STYLE))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
break;
|
|
|
|
default:
|
|
/* It couldn't really happen. */
|
|
break;
|
|
}
|
|
|
|
/* Delete the event object. */
|
|
|
|
yaml_event_delete(&input_event);
|
|
|
|
/* Create and emit a MAPPING-END event. */
|
|
|
|
if (!yaml_mapping_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
}
|
|
|
|
/* Create and emit the SEQUENCE-END event. */
|
|
|
|
if (!yaml_sequence_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Create and emit the DOCUMENT-END event. */
|
|
|
|
if (!yaml_document_end_event_initialize(&output_event, 0))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
/* Create and emit the STREAM-END event. */
|
|
|
|
if (!yaml_stream_end_event_initialize(&output_event))
|
|
goto event_error;
|
|
if (!yaml_emitter_emit(&emitter, &output_event))
|
|
goto emitter_error;
|
|
|
|
yaml_parser_delete(&parser);
|
|
yaml_emitter_delete(&emitter);
|
|
|
|
return 0;
|
|
|
|
parser_error:
|
|
|
|
/* Display a parser error message. */
|
|
|
|
switch (parser.error)
|
|
{
|
|
case YAML_MEMORY_ERROR:
|
|
fprintf(stderr, "Memory error: Not enough memory for parsing\n");
|
|
break;
|
|
|
|
case YAML_READER_ERROR:
|
|
if (parser.problem_value != -1) {
|
|
fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem,
|
|
parser.problem_value, parser.problem_offset);
|
|
}
|
|
else {
|
|
fprintf(stderr, "Reader error: %s at %d\n", parser.problem,
|
|
parser.problem_offset);
|
|
}
|
|
break;
|
|
|
|
case YAML_SCANNER_ERROR:
|
|
if (parser.context) {
|
|
fprintf(stderr, "Scanner error: %s at line %d, column %d\n"
|
|
"%s at line %d, column %d\n", parser.context,
|
|
parser.context_mark.line+1, parser.context_mark.column+1,
|
|
parser.problem, parser.problem_mark.line+1,
|
|
parser.problem_mark.column+1);
|
|
}
|
|
else {
|
|
fprintf(stderr, "Scanner error: %s at line %d, column %d\n",
|
|
parser.problem, parser.problem_mark.line+1,
|
|
parser.problem_mark.column+1);
|
|
}
|
|
break;
|
|
|
|
case YAML_PARSER_ERROR:
|
|
if (parser.context) {
|
|
fprintf(stderr, "Parser error: %s at line %d, column %d\n"
|
|
"%s at line %d, column %d\n", parser.context,
|
|
parser.context_mark.line+1, parser.context_mark.column+1,
|
|
parser.problem, parser.problem_mark.line+1,
|
|
parser.problem_mark.column+1);
|
|
}
|
|
else {
|
|
fprintf(stderr, "Parser error: %s at line %d, column %d\n",
|
|
parser.problem, parser.problem_mark.line+1,
|
|
parser.problem_mark.column+1);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
/* Couldn't happen. */
|
|
fprintf(stderr, "Internal error\n");
|
|
break;
|
|
}
|
|
|
|
yaml_event_delete(&input_event);
|
|
yaml_event_delete(&output_event);
|
|
yaml_parser_delete(&parser);
|
|
yaml_emitter_delete(&emitter);
|
|
|
|
return 1;
|
|
|
|
emitter_error:
|
|
|
|
/* Display an emitter error message. */
|
|
|
|
switch (emitter.error)
|
|
{
|
|
case YAML_MEMORY_ERROR:
|
|
fprintf(stderr, "Memory error: Not enough memory for emitting\n");
|
|
break;
|
|
|
|
case YAML_WRITER_ERROR:
|
|
fprintf(stderr, "Writer error: %s\n", emitter.problem);
|
|
break;
|
|
|
|
case YAML_EMITTER_ERROR:
|
|
fprintf(stderr, "Emitter error: %s\n", emitter.problem);
|
|
break;
|
|
|
|
default:
|
|
/* Couldn't happen. */
|
|
fprintf(stderr, "Internal error\n");
|
|
break;
|
|
}
|
|
|
|
yaml_event_delete(&input_event);
|
|
yaml_event_delete(&output_event);
|
|
yaml_parser_delete(&parser);
|
|
yaml_emitter_delete(&emitter);
|
|
|
|
return 1;
|
|
|
|
event_error:
|
|
|
|
fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
|
|
|
|
yaml_event_delete(&input_event);
|
|
yaml_event_delete(&output_event);
|
|
yaml_parser_delete(&parser);
|
|
yaml_emitter_delete(&emitter);
|
|
|
|
return 1;
|
|
}
|
|
|