1247738Sbapt
2247738Sbapt#include <yaml.h>
3247738Sbapt
4247738Sbapt#include <stdlib.h>
5247738Sbapt#include <stdio.h>
6247738Sbapt
7247738Sbaptint
8247738Sbaptmain(int argc, char *argv[])
9247738Sbapt{
10247738Sbapt    int help = 0;
11247738Sbapt    int canonical = 0;
12247738Sbapt    int unicode = 0;
13247738Sbapt    int k;
14247738Sbapt    int done = 0;
15247738Sbapt
16247738Sbapt    yaml_parser_t parser;
17247738Sbapt    yaml_emitter_t emitter;
18247738Sbapt    yaml_event_t input_event;
19247738Sbapt    yaml_document_t output_document;
20247738Sbapt
21247738Sbapt    int root;
22247738Sbapt
23247738Sbapt    /* Clear the objects. */
24247738Sbapt
25247738Sbapt    memset(&parser, 0, sizeof(parser));
26247738Sbapt    memset(&emitter, 0, sizeof(emitter));
27247738Sbapt    memset(&input_event, 0, sizeof(input_event));
28247738Sbapt    memset(&output_document, 0, sizeof(output_document));
29247738Sbapt
30247738Sbapt    /* Analyze command line options. */
31247738Sbapt
32247738Sbapt    for (k = 1; k < argc; k ++)
33247738Sbapt    {
34247738Sbapt        if (strcmp(argv[k], "-h") == 0
35247738Sbapt                || strcmp(argv[k], "--help") == 0) {
36247738Sbapt            help = 1;
37247738Sbapt        }
38247738Sbapt
39247738Sbapt        else if (strcmp(argv[k], "-c") == 0
40247738Sbapt                || strcmp(argv[k], "--canonical") == 0) {
41247738Sbapt            canonical = 1;
42247738Sbapt        }
43247738Sbapt
44247738Sbapt        else if (strcmp(argv[k], "-u") == 0
45247738Sbapt                || strcmp(argv[k], "--unicode") == 0) {
46247738Sbapt            unicode = 1;
47247738Sbapt        }
48247738Sbapt
49247738Sbapt        else {
50247738Sbapt            fprintf(stderr, "Unrecognized option: %s\n"
51247738Sbapt                    "Try `%s --help` for more information.\n",
52247738Sbapt                    argv[k], argv[0]);
53247738Sbapt            return 1;
54247738Sbapt        }
55247738Sbapt    }
56247738Sbapt
57247738Sbapt    /* Display the help string. */
58247738Sbapt
59247738Sbapt    if (help)
60247738Sbapt    {
61247738Sbapt        printf("%s <input\n"
62247738Sbapt                "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n"
63247738Sbapt                "-h, --help\t\tdisplay this help and exit\n"
64247738Sbapt                "-c, --canonical\t\toutput in the canonical YAML format\n"
65247738Sbapt                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
66247738Sbapt                argv[0], argv[0]);
67247738Sbapt        return 0;
68247738Sbapt    }
69247738Sbapt
70247738Sbapt    /* Initialize the parser and emitter objects. */
71247738Sbapt
72247738Sbapt    if (!yaml_parser_initialize(&parser)) {
73247738Sbapt        fprintf(stderr, "Could not initialize the parser object\n");
74247738Sbapt        return 1;
75247738Sbapt    }
76247738Sbapt
77247738Sbapt    if (!yaml_emitter_initialize(&emitter)) {
78247738Sbapt        yaml_parser_delete(&parser);
79247738Sbapt        fprintf(stderr, "Could not inialize the emitter object\n");
80247738Sbapt        return 1;
81247738Sbapt    }
82247738Sbapt
83247738Sbapt    /* Set the parser parameters. */
84247738Sbapt
85247738Sbapt    yaml_parser_set_input_file(&parser, stdin);
86247738Sbapt
87247738Sbapt    /* Set the emitter parameters. */
88247738Sbapt
89247738Sbapt    yaml_emitter_set_output_file(&emitter, stdout);
90247738Sbapt
91247738Sbapt    yaml_emitter_set_canonical(&emitter, canonical);
92247738Sbapt    yaml_emitter_set_unicode(&emitter, unicode);
93247738Sbapt
94247738Sbapt    /* Create and emit the STREAM-START event. */
95247738Sbapt
96247738Sbapt    if (!yaml_emitter_open(&emitter))
97247738Sbapt        goto emitter_error;
98247738Sbapt
99247738Sbapt    /* Create a output_document object. */
100247738Sbapt
101247738Sbapt    if (!yaml_document_initialize(&output_document, NULL, NULL, NULL, 0, 0))
102247738Sbapt        goto document_error;
103247738Sbapt
104247738Sbapt    /* Create the root sequence. */
105247738Sbapt
106247738Sbapt    root = yaml_document_add_sequence(&output_document, NULL,
107247738Sbapt            YAML_BLOCK_SEQUENCE_STYLE);
108247738Sbapt    if (!root) goto document_error;
109247738Sbapt
110247738Sbapt    /* Loop through the input events. */
111247738Sbapt
112247738Sbapt    while (!done)
113247738Sbapt    {
114247738Sbapt        int properties, key, value, map, seq;
115247738Sbapt
116247738Sbapt        /* Get the next event. */
117247738Sbapt
118247738Sbapt        if (!yaml_parser_parse(&parser, &input_event))
119247738Sbapt            goto parser_error;
120247738Sbapt
121247738Sbapt        /* Check if this is the stream end. */
122247738Sbapt
123247738Sbapt        if (input_event.type == YAML_STREAM_END_EVENT) {
124247738Sbapt            done = 1;
125247738Sbapt        }
126247738Sbapt
127247738Sbapt        /* Create a mapping node and attach it to the root sequence. */
128247738Sbapt
129247738Sbapt        properties = yaml_document_add_mapping(&output_document, NULL,
130247738Sbapt                YAML_BLOCK_MAPPING_STYLE);
131247738Sbapt        if (!properties) goto document_error;
132247738Sbapt        if (!yaml_document_append_sequence_item(&output_document,
133247738Sbapt                    root, properties)) goto document_error;
134247738Sbapt
135247738Sbapt        /* Analyze the event. */
136247738Sbapt
137247738Sbapt        switch (input_event.type)
138247738Sbapt        {
139247738Sbapt            case YAML_STREAM_START_EVENT:
140247738Sbapt
141247738Sbapt                /* Add 'type': 'STREAM-START'. */
142247738Sbapt
143247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
144247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
145247738Sbapt                if (!key) goto document_error;
146247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
147247738Sbapt                    "STREAM-START", -1, YAML_PLAIN_SCALAR_STYLE);
148247738Sbapt                if (!value) goto document_error;
149247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
150247738Sbapt                            properties, key, value)) goto document_error;
151247738Sbapt
152247738Sbapt                /* Add 'encoding': <encoding>. */
153247738Sbapt
154247738Sbapt                if (input_event.data.stream_start.encoding)
155247738Sbapt                {
156247738Sbapt                    yaml_encoding_t encoding
157247738Sbapt                        = input_event.data.stream_start.encoding;
158247738Sbapt
159247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
160247738Sbapt                        "encoding", -1, YAML_PLAIN_SCALAR_STYLE);
161247738Sbapt                    if (!key) goto document_error;
162247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
163247738Sbapt                            (encoding == YAML_UTF8_ENCODING ? "utf-8" :
164247738Sbapt                             encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" :
165247738Sbapt                             encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" :
166247738Sbapt                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
167247738Sbapt                    if (!value) goto document_error;
168247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
169247738Sbapt                                properties, key, value)) goto document_error;
170247738Sbapt                }
171247738Sbapt
172247738Sbapt                break;
173247738Sbapt
174247738Sbapt            case YAML_STREAM_END_EVENT:
175247738Sbapt
176247738Sbapt                /* Add 'type': 'STREAM-END'. */
177247738Sbapt
178247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
179247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
180247738Sbapt                if (!key) goto document_error;
181247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
182247738Sbapt                    "STREAM-END", -1, YAML_PLAIN_SCALAR_STYLE);
183247738Sbapt                if (!value) goto document_error;
184247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
185247738Sbapt                            properties, key, value)) goto document_error;
186247738Sbapt
187247738Sbapt                break;
188247738Sbapt
189247738Sbapt            case YAML_DOCUMENT_START_EVENT:
190247738Sbapt
191247738Sbapt                /* Add 'type': 'DOCUMENT-START'. */
192247738Sbapt
193247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
194247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
195247738Sbapt                if (!key) goto document_error;
196247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
197247738Sbapt                    "DOCUMENT-START", -1, YAML_PLAIN_SCALAR_STYLE);
198247738Sbapt                if (!value) goto document_error;
199247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
200247738Sbapt                            properties, key, value)) goto document_error;
201247738Sbapt
202247738Sbapt                /* Display the output_document version numbers. */
203247738Sbapt
204247738Sbapt                if (input_event.data.document_start.version_directive)
205247738Sbapt                {
206247738Sbapt                    yaml_version_directive_t *version
207247738Sbapt                        = input_event.data.document_start.version_directive;
208247738Sbapt                    char number[64];
209247738Sbapt
210247738Sbapt                    /* Add 'version': {}. */
211247738Sbapt
212247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
213247738Sbapt                        "version", -1, YAML_PLAIN_SCALAR_STYLE);
214247738Sbapt                    if (!key) goto document_error;
215247738Sbapt                    map = yaml_document_add_mapping(&output_document, NULL,
216247738Sbapt                            YAML_FLOW_MAPPING_STYLE);
217247738Sbapt                    if (!map) goto document_error;
218247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
219247738Sbapt                                properties, key, map)) goto document_error;
220247738Sbapt
221247738Sbapt                    /* Add 'major': <number>. */
222247738Sbapt
223247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
224247738Sbapt                        "major", -1, YAML_PLAIN_SCALAR_STYLE);
225247738Sbapt                    if (!key) goto document_error;
226247738Sbapt                    sprintf(number, "%d", version->major);
227247738Sbapt                    value = yaml_document_add_scalar(&output_document, YAML_INT_TAG,
228247738Sbapt                        number, -1, YAML_PLAIN_SCALAR_STYLE);
229247738Sbapt                    if (!value) goto document_error;
230247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
231247738Sbapt                                map, key, value)) goto document_error;
232247738Sbapt
233247738Sbapt                    /* Add 'minor': <number>. */
234247738Sbapt
235247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
236247738Sbapt                        "minor", -1, YAML_PLAIN_SCALAR_STYLE);
237247738Sbapt                    if (!key) goto document_error;
238247738Sbapt                    sprintf(number, "%d", version->minor);
239247738Sbapt                    value = yaml_document_add_scalar(&output_document, YAML_INT_TAG,
240247738Sbapt                        number, -1, YAML_PLAIN_SCALAR_STYLE);
241247738Sbapt                    if (!value) goto document_error;
242247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
243247738Sbapt                                map, key, value)) goto document_error;
244247738Sbapt                }
245247738Sbapt
246247738Sbapt                /* Display the output_document tag directives. */
247247738Sbapt
248247738Sbapt                if (input_event.data.document_start.tag_directives.start
249247738Sbapt                        != input_event.data.document_start.tag_directives.end)
250247738Sbapt                {
251247738Sbapt                    yaml_tag_directive_t *tag;
252247738Sbapt
253247738Sbapt                    /* Add 'tags': []. */
254247738Sbapt
255247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
256247738Sbapt                        "tags", -1, YAML_PLAIN_SCALAR_STYLE);
257247738Sbapt                    if (!key) goto document_error;
258247738Sbapt                    seq = yaml_document_add_sequence(&output_document, NULL,
259247738Sbapt                            YAML_BLOCK_SEQUENCE_STYLE);
260247738Sbapt                    if (!seq) goto document_error;
261247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
262247738Sbapt                                properties, key, seq)) goto document_error;
263247738Sbapt
264247738Sbapt                    for (tag = input_event.data.document_start.tag_directives.start;
265247738Sbapt                            tag != input_event.data.document_start.tag_directives.end;
266247738Sbapt                            tag ++)
267247738Sbapt                    {
268247738Sbapt                        /* Add {}. */
269247738Sbapt
270247738Sbapt                        map = yaml_document_add_mapping(&output_document, NULL,
271247738Sbapt                                YAML_FLOW_MAPPING_STYLE);
272247738Sbapt                        if (!map) goto document_error;
273247738Sbapt                        if (!yaml_document_append_sequence_item(&output_document,
274247738Sbapt                                    seq, map)) goto document_error;
275247738Sbapt
276247738Sbapt                        /* Add 'handle': <handle>. */
277247738Sbapt
278247738Sbapt                        key = yaml_document_add_scalar(&output_document, NULL,
279247738Sbapt                            "handle", -1, YAML_PLAIN_SCALAR_STYLE);
280247738Sbapt                        if (!key) goto document_error;
281247738Sbapt                        value = yaml_document_add_scalar(&output_document, NULL,
282247738Sbapt                            tag->handle, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
283247738Sbapt                        if (!value) goto document_error;
284247738Sbapt                        if (!yaml_document_append_mapping_pair(&output_document,
285247738Sbapt                                    map, key, value)) goto document_error;
286247738Sbapt
287247738Sbapt                        /* Add 'prefix': <prefix>. */
288247738Sbapt
289247738Sbapt                        key = yaml_document_add_scalar(&output_document, NULL,
290247738Sbapt                            "prefix", -1, YAML_PLAIN_SCALAR_STYLE);
291247738Sbapt                        if (!key) goto document_error;
292247738Sbapt                        value = yaml_document_add_scalar(&output_document, NULL,
293247738Sbapt                            tag->prefix, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
294247738Sbapt                        if (!value) goto document_error;
295247738Sbapt                        if (!yaml_document_append_mapping_pair(&output_document,
296247738Sbapt                                    map, key, value)) goto document_error;
297247738Sbapt                    }
298247738Sbapt                }
299247738Sbapt
300247738Sbapt                /* Add 'implicit': <flag>. */
301247738Sbapt
302247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
303247738Sbapt                    "implicit", -1, YAML_PLAIN_SCALAR_STYLE);
304247738Sbapt                if (!key) goto document_error;
305247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
306247738Sbapt                        (input_event.data.document_start.implicit ?
307247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
308247738Sbapt                if (!value) goto document_error;
309247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
310247738Sbapt                            properties, key, value)) goto document_error;
311247738Sbapt
312247738Sbapt                break;
313247738Sbapt
314247738Sbapt            case YAML_DOCUMENT_END_EVENT:
315247738Sbapt
316247738Sbapt                /* Add 'type': 'DOCUMENT-END'. */
317247738Sbapt
318247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
319247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
320247738Sbapt                if (!key) goto document_error;
321247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
322247738Sbapt                    "DOCUMENT-END", -1, YAML_PLAIN_SCALAR_STYLE);
323247738Sbapt                if (!value) goto document_error;
324247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
325247738Sbapt                            properties, key, value)) goto document_error;
326247738Sbapt
327247738Sbapt                /* Add 'implicit': <flag>. */
328247738Sbapt
329247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
330247738Sbapt                    "implicit", -1, YAML_PLAIN_SCALAR_STYLE);
331247738Sbapt                if (!key) goto document_error;
332247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
333247738Sbapt                        (input_event.data.document_end.implicit ?
334247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
335247738Sbapt                if (!value) goto document_error;
336247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
337247738Sbapt                            properties, key, value)) goto document_error;
338247738Sbapt
339247738Sbapt                break;
340247738Sbapt
341247738Sbapt            case YAML_ALIAS_EVENT:
342247738Sbapt
343247738Sbapt                /* Add 'type': 'ALIAS'. */
344247738Sbapt
345247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
346247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
347247738Sbapt                if (!key) goto document_error;
348247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
349247738Sbapt                    "ALIAS", -1, YAML_PLAIN_SCALAR_STYLE);
350247738Sbapt                if (!value) goto document_error;
351247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
352247738Sbapt                            properties, key, value)) goto document_error;
353247738Sbapt
354247738Sbapt                /* Add 'anchor': <anchor>. */
355247738Sbapt
356247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
357247738Sbapt                    "anchor", -1, YAML_PLAIN_SCALAR_STYLE);
358247738Sbapt                if (!key) goto document_error;
359247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
360247738Sbapt                        input_event.data.alias.anchor, -1,
361247738Sbapt                        YAML_DOUBLE_QUOTED_SCALAR_STYLE);
362247738Sbapt                if (!value) goto document_error;
363247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
364247738Sbapt                            properties, key, value)) goto document_error;
365247738Sbapt
366247738Sbapt                break;
367247738Sbapt
368247738Sbapt            case YAML_SCALAR_EVENT:
369247738Sbapt
370247738Sbapt                /* Add 'type': 'SCALAR'. */
371247738Sbapt
372247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
373247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
374247738Sbapt                if (!key) goto document_error;
375247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
376247738Sbapt                    "SCALAR", -1, YAML_PLAIN_SCALAR_STYLE);
377247738Sbapt                if (!value) goto document_error;
378247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
379247738Sbapt                            properties, key, value)) goto document_error;
380247738Sbapt
381247738Sbapt                /* Add 'anchor': <anchor>. */
382247738Sbapt
383247738Sbapt                if (input_event.data.scalar.anchor)
384247738Sbapt                {
385247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
386247738Sbapt                        "anchor", -1, YAML_PLAIN_SCALAR_STYLE);
387247738Sbapt                    if (!key) goto document_error;
388247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
389247738Sbapt                            input_event.data.scalar.anchor, -1,
390247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
391247738Sbapt                    if (!value) goto document_error;
392247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
393247738Sbapt                                properties, key, value)) goto document_error;
394247738Sbapt                }
395247738Sbapt
396247738Sbapt                /* Add 'tag': <tag>. */
397247738Sbapt
398247738Sbapt                if (input_event.data.scalar.tag)
399247738Sbapt                {
400247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
401247738Sbapt                        "tag", -1, YAML_PLAIN_SCALAR_STYLE);
402247738Sbapt                    if (!key) goto document_error;
403247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
404247738Sbapt                            input_event.data.scalar.tag, -1,
405247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
406247738Sbapt                    if (!value) goto document_error;
407247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
408247738Sbapt                                properties, key, value)) goto document_error;
409247738Sbapt                }
410247738Sbapt
411247738Sbapt                /* Add 'value': <value>. */
412247738Sbapt
413247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
414247738Sbapt                    "value", -1, YAML_PLAIN_SCALAR_STYLE);
415247738Sbapt                if (!key) goto document_error;
416247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
417247738Sbapt                        input_event.data.scalar.value,
418247738Sbapt                        input_event.data.scalar.length,
419247738Sbapt                        YAML_DOUBLE_QUOTED_SCALAR_STYLE);
420247738Sbapt                if (!value) goto document_error;
421247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
422247738Sbapt                            properties, key, value)) goto document_error;
423247738Sbapt
424247738Sbapt                /* Display if the scalar tag is implicit. */
425247738Sbapt
426247738Sbapt                /* Add 'implicit': {} */
427247738Sbapt
428247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
429247738Sbapt                    "version", -1, YAML_PLAIN_SCALAR_STYLE);
430247738Sbapt                if (!key) goto document_error;
431247738Sbapt                map = yaml_document_add_mapping(&output_document, NULL,
432247738Sbapt                        YAML_FLOW_MAPPING_STYLE);
433247738Sbapt                if (!map) goto document_error;
434247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
435247738Sbapt                            properties, key, map)) goto document_error;
436247738Sbapt
437247738Sbapt                /* Add 'plain': <flag>. */
438247738Sbapt
439247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
440247738Sbapt                    "plain", -1, YAML_PLAIN_SCALAR_STYLE);
441247738Sbapt                if (!key) goto document_error;
442247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
443247738Sbapt                        (input_event.data.scalar.plain_implicit ?
444247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
445247738Sbapt                if (!value) goto document_error;
446247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
447247738Sbapt                            map, key, value)) goto document_error;
448247738Sbapt
449247738Sbapt                /* Add 'quoted': <flag>. */
450247738Sbapt
451247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
452247738Sbapt                    "quoted", -1, YAML_PLAIN_SCALAR_STYLE);
453247738Sbapt                if (!key) goto document_error;
454247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
455247738Sbapt                        (input_event.data.scalar.quoted_implicit ?
456247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
457247738Sbapt                if (!value) goto document_error;
458247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
459247738Sbapt                            map, key, value)) goto document_error;
460247738Sbapt
461247738Sbapt                /* Display the style information. */
462247738Sbapt
463247738Sbapt                if (input_event.data.scalar.style)
464247738Sbapt                {
465247738Sbapt                    yaml_scalar_style_t style = input_event.data.scalar.style;
466247738Sbapt
467247738Sbapt                    /* Add 'style': <style>. */
468247738Sbapt
469247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
470247738Sbapt                        "style", -1, YAML_PLAIN_SCALAR_STYLE);
471247738Sbapt                    if (!key) goto document_error;
472247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
473247738Sbapt                            (style == YAML_PLAIN_SCALAR_STYLE ? "plain" :
474247738Sbapt                             style == YAML_SINGLE_QUOTED_SCALAR_STYLE ?
475247738Sbapt                                    "single-quoted" :
476247738Sbapt                             style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ?
477247738Sbapt                                    "double-quoted" :
478247738Sbapt                             style == YAML_LITERAL_SCALAR_STYLE ? "literal" :
479247738Sbapt                             style == YAML_FOLDED_SCALAR_STYLE ? "folded" :
480247738Sbapt                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
481247738Sbapt                    if (!value) goto document_error;
482247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
483247738Sbapt                                properties, key, value)) goto document_error;
484247738Sbapt                }
485247738Sbapt
486247738Sbapt                break;
487247738Sbapt
488247738Sbapt            case YAML_SEQUENCE_START_EVENT:
489247738Sbapt
490247738Sbapt                /* Add 'type': 'SEQUENCE-START'. */
491247738Sbapt
492247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
493247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
494247738Sbapt                if (!key) goto document_error;
495247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
496247738Sbapt                    "SEQUENCE-START", -1, YAML_PLAIN_SCALAR_STYLE);
497247738Sbapt                if (!value) goto document_error;
498247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
499247738Sbapt                            properties, key, value)) goto document_error;
500247738Sbapt
501247738Sbapt                /* Add 'anchor': <anchor>. */
502247738Sbapt
503247738Sbapt                if (input_event.data.sequence_start.anchor)
504247738Sbapt                {
505247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
506247738Sbapt                        "anchor", -1, YAML_PLAIN_SCALAR_STYLE);
507247738Sbapt                    if (!key) goto document_error;
508247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
509247738Sbapt                            input_event.data.sequence_start.anchor, -1,
510247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
511247738Sbapt                    if (!value) goto document_error;
512247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
513247738Sbapt                                properties, key, value)) goto document_error;
514247738Sbapt                }
515247738Sbapt
516247738Sbapt                /* Add 'tag': <tag>. */
517247738Sbapt
518247738Sbapt                if (input_event.data.sequence_start.tag)
519247738Sbapt                {
520247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
521247738Sbapt                        "tag", -1, YAML_PLAIN_SCALAR_STYLE);
522247738Sbapt                    if (!key) goto document_error;
523247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
524247738Sbapt                            input_event.data.sequence_start.tag, -1,
525247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
526247738Sbapt                    if (!value) goto document_error;
527247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
528247738Sbapt                                properties, key, value)) goto document_error;
529247738Sbapt                }
530247738Sbapt
531247738Sbapt                /* Add 'implicit': <flag>. */
532247738Sbapt
533247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
534247738Sbapt                    "implicit", -1, YAML_PLAIN_SCALAR_STYLE);
535247738Sbapt                if (!key) goto document_error;
536247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
537247738Sbapt                        (input_event.data.sequence_start.implicit ?
538247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
539247738Sbapt                if (!value) goto document_error;
540247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
541247738Sbapt                            properties, key, value)) goto document_error;
542247738Sbapt
543247738Sbapt                /* Display the style information. */
544247738Sbapt
545247738Sbapt                if (input_event.data.sequence_start.style)
546247738Sbapt                {
547247738Sbapt                    yaml_sequence_style_t style
548247738Sbapt                        = input_event.data.sequence_start.style;
549247738Sbapt
550247738Sbapt                    /* Add 'style': <style>. */
551247738Sbapt
552247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
553247738Sbapt                        "style", -1, YAML_PLAIN_SCALAR_STYLE);
554247738Sbapt                    if (!key) goto document_error;
555247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
556247738Sbapt                            (style == YAML_BLOCK_SEQUENCE_STYLE ? "block" :
557247738Sbapt                             style == YAML_FLOW_SEQUENCE_STYLE ? "flow" :
558247738Sbapt                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
559247738Sbapt                    if (!value) goto document_error;
560247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
561247738Sbapt                                properties, key, value)) goto document_error;
562247738Sbapt                }
563247738Sbapt
564247738Sbapt                break;
565247738Sbapt
566247738Sbapt            case YAML_SEQUENCE_END_EVENT:
567247738Sbapt
568247738Sbapt                /* Add 'type': 'SEQUENCE-END'. */
569247738Sbapt
570247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
571247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
572247738Sbapt                if (!key) goto document_error;
573247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
574247738Sbapt                    "SEQUENCE-END", -1, YAML_PLAIN_SCALAR_STYLE);
575247738Sbapt                if (!value) goto document_error;
576247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
577247738Sbapt                            properties, key, value)) goto document_error;
578247738Sbapt
579247738Sbapt                break;
580247738Sbapt
581247738Sbapt            case YAML_MAPPING_START_EVENT:
582247738Sbapt
583247738Sbapt                /* Add 'type': 'MAPPING-START'. */
584247738Sbapt
585247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
586247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
587247738Sbapt                if (!key) goto document_error;
588247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
589247738Sbapt                    "MAPPING-START", -1, YAML_PLAIN_SCALAR_STYLE);
590247738Sbapt                if (!value) goto document_error;
591247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
592247738Sbapt                            properties, key, value)) goto document_error;
593247738Sbapt
594247738Sbapt                /* Add 'anchor': <anchor>. */
595247738Sbapt
596247738Sbapt                if (input_event.data.mapping_start.anchor)
597247738Sbapt                {
598247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
599247738Sbapt                        "anchor", -1, YAML_PLAIN_SCALAR_STYLE);
600247738Sbapt                    if (!key) goto document_error;
601247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
602247738Sbapt                            input_event.data.mapping_start.anchor, -1,
603247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
604247738Sbapt                    if (!value) goto document_error;
605247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
606247738Sbapt                                properties, key, value)) goto document_error;
607247738Sbapt                }
608247738Sbapt
609247738Sbapt                /* Add 'tag': <tag>. */
610247738Sbapt
611247738Sbapt                if (input_event.data.mapping_start.tag)
612247738Sbapt                {
613247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
614247738Sbapt                        "tag", -1, YAML_PLAIN_SCALAR_STYLE);
615247738Sbapt                    if (!key) goto document_error;
616247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
617247738Sbapt                            input_event.data.mapping_start.tag, -1,
618247738Sbapt                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
619247738Sbapt                    if (!value) goto document_error;
620247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
621247738Sbapt                                properties, key, value)) goto document_error;
622247738Sbapt                }
623247738Sbapt
624247738Sbapt                /* Add 'implicit': <flag>. */
625247738Sbapt
626247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
627247738Sbapt                    "implicit", -1, YAML_PLAIN_SCALAR_STYLE);
628247738Sbapt                if (!key) goto document_error;
629247738Sbapt                value = yaml_document_add_scalar(&output_document, YAML_BOOL_TAG,
630247738Sbapt                        (input_event.data.mapping_start.implicit ?
631247738Sbapt                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
632247738Sbapt                if (!value) goto document_error;
633247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
634247738Sbapt                            properties, key, value)) goto document_error;
635247738Sbapt
636247738Sbapt                /* Display the style information. */
637247738Sbapt
638247738Sbapt                if (input_event.data.sequence_start.style)
639247738Sbapt                {
640247738Sbapt                    yaml_sequence_style_t style
641247738Sbapt                        = input_event.data.mapping_start.style;
642247738Sbapt
643247738Sbapt                    /* Add 'style': <style>. */
644247738Sbapt
645247738Sbapt                    key = yaml_document_add_scalar(&output_document, NULL,
646247738Sbapt                        "style", -1, YAML_PLAIN_SCALAR_STYLE);
647247738Sbapt                    if (!key) goto document_error;
648247738Sbapt                    value = yaml_document_add_scalar(&output_document, NULL,
649247738Sbapt                            (style == YAML_BLOCK_MAPPING_STYLE ? "block" :
650247738Sbapt                             style == YAML_FLOW_MAPPING_STYLE ? "flow" :
651247738Sbapt                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
652247738Sbapt                    if (!value) goto document_error;
653247738Sbapt                    if (!yaml_document_append_mapping_pair(&output_document,
654247738Sbapt                                properties, key, value)) goto document_error;
655247738Sbapt                }
656247738Sbapt
657247738Sbapt                break;
658247738Sbapt
659247738Sbapt            case YAML_MAPPING_END_EVENT:
660247738Sbapt
661247738Sbapt                /* Add 'type': 'MAPPING-END'. */
662247738Sbapt
663247738Sbapt                key = yaml_document_add_scalar(&output_document, NULL,
664247738Sbapt                    "type", -1, YAML_PLAIN_SCALAR_STYLE);
665247738Sbapt                if (!key) goto document_error;
666247738Sbapt                value = yaml_document_add_scalar(&output_document, NULL,
667247738Sbapt                    "MAPPING-END", -1, YAML_PLAIN_SCALAR_STYLE);
668247738Sbapt                if (!value) goto document_error;
669247738Sbapt                if (!yaml_document_append_mapping_pair(&output_document,
670247738Sbapt                            properties, key, value)) goto document_error;
671247738Sbapt
672247738Sbapt                break;
673247738Sbapt
674247738Sbapt            default:
675247738Sbapt                /* It couldn't really happen. */
676247738Sbapt                break;
677247738Sbapt        }
678247738Sbapt
679247738Sbapt        /* Delete the event object. */
680247738Sbapt
681247738Sbapt        yaml_event_delete(&input_event);
682247738Sbapt    }
683247738Sbapt
684247738Sbapt    if (!yaml_emitter_dump(&emitter, &output_document))
685247738Sbapt        goto emitter_error;
686247738Sbapt    if (!yaml_emitter_close(&emitter))
687247738Sbapt        goto emitter_error;
688247738Sbapt
689247738Sbapt    yaml_parser_delete(&parser);
690247738Sbapt    yaml_emitter_delete(&emitter);
691247738Sbapt
692247738Sbapt    return 0;
693247738Sbapt
694247738Sbaptparser_error:
695247738Sbapt
696247738Sbapt    /* Display a parser error message. */
697247738Sbapt
698247738Sbapt    switch (parser.error)
699247738Sbapt    {
700247738Sbapt        case YAML_MEMORY_ERROR:
701247738Sbapt            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
702247738Sbapt            break;
703247738Sbapt
704247738Sbapt        case YAML_READER_ERROR:
705247738Sbapt            if (parser.problem_value != -1) {
706247738Sbapt                fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem,
707247738Sbapt                        parser.problem_value, parser.problem_offset);
708247738Sbapt            }
709247738Sbapt            else {
710247738Sbapt                fprintf(stderr, "Reader error: %s at %d\n", parser.problem,
711247738Sbapt                        parser.problem_offset);
712247738Sbapt            }
713247738Sbapt            break;
714247738Sbapt
715247738Sbapt        case YAML_SCANNER_ERROR:
716247738Sbapt            if (parser.context) {
717247738Sbapt                fprintf(stderr, "Scanner error: %s at line %d, column %d\n"
718247738Sbapt                        "%s at line %d, column %d\n", parser.context,
719247738Sbapt                        parser.context_mark.line+1, parser.context_mark.column+1,
720247738Sbapt                        parser.problem, parser.problem_mark.line+1,
721247738Sbapt                        parser.problem_mark.column+1);
722247738Sbapt            }
723247738Sbapt            else {
724247738Sbapt                fprintf(stderr, "Scanner error: %s at line %d, column %d\n",
725247738Sbapt                        parser.problem, parser.problem_mark.line+1,
726247738Sbapt                        parser.problem_mark.column+1);
727247738Sbapt            }
728247738Sbapt            break;
729247738Sbapt
730247738Sbapt        case YAML_PARSER_ERROR:
731247738Sbapt            if (parser.context) {
732247738Sbapt                fprintf(stderr, "Parser error: %s at line %d, column %d\n"
733247738Sbapt                        "%s at line %d, column %d\n", parser.context,
734247738Sbapt                        parser.context_mark.line+1, parser.context_mark.column+1,
735247738Sbapt                        parser.problem, parser.problem_mark.line+1,
736247738Sbapt                        parser.problem_mark.column+1);
737247738Sbapt            }
738247738Sbapt            else {
739247738Sbapt                fprintf(stderr, "Parser error: %s at line %d, column %d\n",
740247738Sbapt                        parser.problem, parser.problem_mark.line+1,
741247738Sbapt                        parser.problem_mark.column+1);
742247738Sbapt            }
743247738Sbapt            break;
744247738Sbapt
745247738Sbapt        default:
746247738Sbapt            /* Couldn't happen. */
747247738Sbapt            fprintf(stderr, "Internal error\n");
748247738Sbapt            break;
749247738Sbapt    }
750247738Sbapt
751247738Sbapt    yaml_event_delete(&input_event);
752247738Sbapt    yaml_document_delete(&output_document);
753247738Sbapt    yaml_parser_delete(&parser);
754247738Sbapt    yaml_emitter_delete(&emitter);
755247738Sbapt
756247738Sbapt    return 1;
757247738Sbapt
758247738Sbaptemitter_error:
759247738Sbapt
760247738Sbapt    /* Display an emitter error message. */
761247738Sbapt
762247738Sbapt    switch (emitter.error)
763247738Sbapt    {
764247738Sbapt        case YAML_MEMORY_ERROR:
765247738Sbapt            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
766247738Sbapt            break;
767247738Sbapt
768247738Sbapt        case YAML_WRITER_ERROR:
769247738Sbapt            fprintf(stderr, "Writer error: %s\n", emitter.problem);
770247738Sbapt            break;
771247738Sbapt
772247738Sbapt        case YAML_EMITTER_ERROR:
773247738Sbapt            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
774247738Sbapt            break;
775247738Sbapt
776247738Sbapt        default:
777247738Sbapt            /* Couldn't happen. */
778247738Sbapt            fprintf(stderr, "Internal error\n");
779247738Sbapt            break;
780247738Sbapt    }
781247738Sbapt
782247738Sbapt    yaml_event_delete(&input_event);
783247738Sbapt    yaml_document_delete(&output_document);
784247738Sbapt    yaml_parser_delete(&parser);
785247738Sbapt    yaml_emitter_delete(&emitter);
786247738Sbapt
787247738Sbapt    return 1;
788247738Sbapt
789247738Sbaptdocument_error:
790247738Sbapt
791247738Sbapt    fprintf(stderr, "Memory error: Not enough memory for creating a document\n");
792247738Sbapt
793247738Sbapt    yaml_event_delete(&input_event);
794247738Sbapt    yaml_document_delete(&output_document);
795247738Sbapt    yaml_parser_delete(&parser);
796247738Sbapt    yaml_emitter_delete(&emitter);
797247738Sbapt
798247738Sbapt    return 1;
799247738Sbapt}
800247738Sbapt
801