1
2#include <yaml.h>
3
4#include <stdlib.h>
5#include <stdio.h>
6
7int
8main(int argc, char *argv[])
9{
10    int help = 0;
11    int canonical = 0;
12    int unicode = 0;
13    int k;
14    int done = 0;
15
16    yaml_parser_t parser;
17    yaml_emitter_t emitter;
18    yaml_event_t input_event;
19    yaml_event_t output_event;
20
21    /* Clear the objects. */
22
23    memset(&parser, 0, sizeof(parser));
24    memset(&emitter, 0, sizeof(emitter));
25    memset(&input_event, 0, sizeof(input_event));
26    memset(&output_event, 0, sizeof(output_event));
27
28    /* Analyze command line options. */
29
30    for (k = 1; k < argc; k ++)
31    {
32        if (strcmp(argv[k], "-h") == 0
33                || strcmp(argv[k], "--help") == 0) {
34            help = 1;
35        }
36
37        else if (strcmp(argv[k], "-c") == 0
38                || strcmp(argv[k], "--canonical") == 0) {
39            canonical = 1;
40        }
41
42        else if (strcmp(argv[k], "-u") == 0
43                || strcmp(argv[k], "--unicode") == 0) {
44            unicode = 1;
45        }
46
47        else {
48            fprintf(stderr, "Unrecognized option: %s\n"
49                    "Try `%s --help` for more information.\n",
50                    argv[k], argv[0]);
51            return 1;
52        }
53    }
54
55    /* Display the help string. */
56
57    if (help)
58    {
59        printf("%s <input\n"
60                "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n"
61                "-h, --help\t\tdisplay this help and exit\n"
62                "-c, --canonical\t\toutput in the canonical YAML format\n"
63                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
64                argv[0], argv[0]);
65        return 0;
66    }
67
68    /* Initialize the parser and emitter objects. */
69
70    if (!yaml_parser_initialize(&parser)) {
71        fprintf(stderr, "Could not initialize the parser object\n");
72        return 1;
73    }
74
75    if (!yaml_emitter_initialize(&emitter)) {
76        yaml_parser_delete(&parser);
77        fprintf(stderr, "Could not inialize the emitter object\n");
78        return 1;
79    }
80
81    /* Set the parser parameters. */
82
83    yaml_parser_set_input_file(&parser, stdin);
84
85    /* Set the emitter parameters. */
86
87    yaml_emitter_set_output_file(&emitter, stdout);
88
89    yaml_emitter_set_canonical(&emitter, canonical);
90    yaml_emitter_set_unicode(&emitter, unicode);
91
92    /* Create and emit the STREAM-START event. */
93
94    if (!yaml_stream_start_event_initialize(&output_event, YAML_UTF8_ENCODING))
95        goto event_error;
96    if (!yaml_emitter_emit(&emitter, &output_event))
97        goto emitter_error;
98
99    /* Create and emit the DOCUMENT-START event. */
100
101    if (!yaml_document_start_event_initialize(&output_event,
102                NULL, NULL, NULL, 0))
103        goto event_error;
104    if (!yaml_emitter_emit(&emitter, &output_event))
105        goto emitter_error;
106
107    /* Create and emit the SEQUENCE-START event. */
108
109    if (!yaml_sequence_start_event_initialize(&output_event,
110                NULL, "tag:yaml.org,2002:seq", 1,
111                YAML_BLOCK_SEQUENCE_STYLE))
112        goto event_error;
113    if (!yaml_emitter_emit(&emitter, &output_event))
114        goto emitter_error;
115
116    /* Loop through the input events. */
117
118    while (!done)
119    {
120        /* Get the next event. */
121
122        if (!yaml_parser_parse(&parser, &input_event))
123            goto parser_error;
124
125        /* Check if this is the stream end. */
126
127        if (input_event.type == YAML_STREAM_END_EVENT) {
128            done = 1;
129        }
130
131        /* Create and emit a MAPPING-START event. */
132
133        if (!yaml_mapping_start_event_initialize(&output_event,
134                    NULL, "tag:yaml.org,2002:map", 1,
135                    YAML_BLOCK_MAPPING_STYLE))
136            goto event_error;
137        if (!yaml_emitter_emit(&emitter, &output_event))
138            goto emitter_error;
139
140        /* Analyze the event. */
141
142        switch (input_event.type)
143        {
144            case YAML_STREAM_START_EVENT:
145
146                /* Write 'type'. */
147
148                if (!yaml_scalar_event_initialize(&output_event,
149                            NULL, "tag:yaml.org,2002:str", "type", -1,
150                            1, 1, YAML_PLAIN_SCALAR_STYLE))
151                    goto event_error;
152                if (!yaml_emitter_emit(&emitter, &output_event))
153                    goto emitter_error;
154
155                /* Write 'STREAM-START'. */
156
157                if (!yaml_scalar_event_initialize(&output_event,
158                            NULL, "tag:yaml.org,2002:str", "STREAM-START", -1,
159                            1, 1, YAML_PLAIN_SCALAR_STYLE))
160                    goto event_error;
161                if (!yaml_emitter_emit(&emitter, &output_event))
162                    goto emitter_error;
163
164                /* Display encoding information. */
165
166                if (input_event.data.stream_start.encoding)
167                {
168                    yaml_encoding_t encoding
169                        = input_event.data.stream_start.encoding;
170
171                    /* Write 'encoding'. */
172
173                    if (!yaml_scalar_event_initialize(&output_event,
174                                NULL, "tag:yaml.org,2002:str", "encoding", -1,
175                                1, 1, YAML_PLAIN_SCALAR_STYLE))
176                        goto event_error;
177                    if (!yaml_emitter_emit(&emitter, &output_event))
178                        goto emitter_error;
179
180                    /* Write the stream encoding. */
181
182                    if (!yaml_scalar_event_initialize(&output_event,
183                                NULL, "tag:yaml.org,2002:str",
184                                (encoding == YAML_UTF8_ENCODING ? "utf-8" :
185                                 encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" :
186                                 encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" :
187                                 "unknown"), -1,
188                                1, 1, YAML_PLAIN_SCALAR_STYLE))
189                        goto event_error;
190                    if (!yaml_emitter_emit(&emitter, &output_event))
191                        goto emitter_error;
192                }
193
194                break;
195
196            case YAML_STREAM_END_EVENT:
197
198                /* Write 'type'. */
199
200                if (!yaml_scalar_event_initialize(&output_event,
201                            NULL, "tag:yaml.org,2002:str", "type", -1,
202                            1, 1, YAML_PLAIN_SCALAR_STYLE))
203                    goto event_error;
204                if (!yaml_emitter_emit(&emitter, &output_event))
205                    goto emitter_error;
206
207                /* Write 'STREAM-END'. */
208
209                if (!yaml_scalar_event_initialize(&output_event,
210                            NULL, "tag:yaml.org,2002:str", "STREAM-END", -1,
211                            1, 1, YAML_PLAIN_SCALAR_STYLE))
212                    goto event_error;
213                if (!yaml_emitter_emit(&emitter, &output_event))
214                    goto emitter_error;
215
216                break;
217
218            case YAML_DOCUMENT_START_EVENT:
219
220                /* Write 'type'. */
221
222                if (!yaml_scalar_event_initialize(&output_event,
223                            NULL, "tag:yaml.org,2002:str", "type", -1,
224                            1, 1, YAML_PLAIN_SCALAR_STYLE))
225                    goto event_error;
226                if (!yaml_emitter_emit(&emitter, &output_event))
227                    goto emitter_error;
228
229                /* Write 'DOCUMENT-START'. */
230
231                if (!yaml_scalar_event_initialize(&output_event,
232                            NULL, "tag:yaml.org,2002:str", "DOCUMENT-START", -1,
233                            1, 1, YAML_PLAIN_SCALAR_STYLE))
234                    goto event_error;
235                if (!yaml_emitter_emit(&emitter, &output_event))
236                    goto emitter_error;
237
238                /* Display the document version numbers. */
239
240                if (input_event.data.document_start.version_directive)
241                {
242                    yaml_version_directive_t *version
243                        = input_event.data.document_start.version_directive;
244                    char number[64];
245
246                    /* Write 'version'. */
247
248                    if (!yaml_scalar_event_initialize(&output_event,
249                                NULL, "tag:yaml.org,2002:str", "version", -1,
250                                1, 1, YAML_PLAIN_SCALAR_STYLE))
251                        goto event_error;
252                    if (!yaml_emitter_emit(&emitter, &output_event))
253                        goto emitter_error;
254
255                    /* Write '{'. */
256
257                    if (!yaml_mapping_start_event_initialize(&output_event,
258                                NULL, "tag:yaml.org,2002:map", 1,
259                                YAML_FLOW_MAPPING_STYLE))
260                        goto event_error;
261                    if (!yaml_emitter_emit(&emitter, &output_event))
262                        goto emitter_error;
263
264                    /* Write 'major'. */
265
266                    if (!yaml_scalar_event_initialize(&output_event,
267                                NULL, "tag:yaml.org,2002:str", "major", -1,
268                                1, 1, YAML_PLAIN_SCALAR_STYLE))
269                        goto event_error;
270                    if (!yaml_emitter_emit(&emitter, &output_event))
271                        goto emitter_error;
272
273                    /* Write a number. */
274
275                    sprintf(number, "%d", version->major);
276                    if (!yaml_scalar_event_initialize(&output_event,
277                                NULL, "tag:yaml.org,2002:int", number, -1,
278                                1, 1, YAML_PLAIN_SCALAR_STYLE))
279                        goto event_error;
280                    if (!yaml_emitter_emit(&emitter, &output_event))
281                        goto emitter_error;
282
283                    /* Write 'minor'. */
284
285                    if (!yaml_scalar_event_initialize(&output_event,
286                                NULL, "tag:yaml.org,2002:str", "minor", -1,
287                                1, 1, YAML_PLAIN_SCALAR_STYLE))
288                        goto event_error;
289                    if (!yaml_emitter_emit(&emitter, &output_event))
290                        goto emitter_error;
291
292                    /* Write a number. */
293
294                    sprintf(number, "%d", version->minor);
295                    if (!yaml_scalar_event_initialize(&output_event,
296                                NULL, "tag:yaml.org,2002:int", number, -1,
297                                1, 1, YAML_PLAIN_SCALAR_STYLE))
298                        goto event_error;
299                    if (!yaml_emitter_emit(&emitter, &output_event))
300                        goto emitter_error;
301
302                    /* Write '}'. */
303
304                    if (!yaml_mapping_end_event_initialize(&output_event))
305                        goto event_error;
306                    if (!yaml_emitter_emit(&emitter, &output_event))
307                        goto emitter_error;
308                }
309
310                /* Display the document tag directives. */
311
312                if (input_event.data.document_start.tag_directives.start
313                        != input_event.data.document_start.tag_directives.end)
314                {
315                    yaml_tag_directive_t *tag;
316
317                    /* Write 'tags'. */
318
319                    if (!yaml_scalar_event_initialize(&output_event,
320                                NULL, "tag:yaml.org,2002:str", "tags", -1,
321                                1, 1, YAML_PLAIN_SCALAR_STYLE))
322                        goto event_error;
323                    if (!yaml_emitter_emit(&emitter, &output_event))
324                        goto emitter_error;
325
326                    /* Start a block sequence. */
327
328                    if (!yaml_sequence_start_event_initialize(&output_event,
329                                NULL, "tag:yaml.org,2002:seq", 1,
330                                YAML_BLOCK_SEQUENCE_STYLE))
331                        goto event_error;
332                    if (!yaml_emitter_emit(&emitter, &output_event))
333                        goto emitter_error;
334
335                    for (tag = input_event.data.document_start.tag_directives.start;
336                            tag != input_event.data.document_start.tag_directives.end;
337                            tag ++)
338                    {
339                        /* Write '{'. */
340
341                        if (!yaml_mapping_start_event_initialize(&output_event,
342                                    NULL, "tag:yaml.org,2002:map", 1,
343                                    YAML_FLOW_MAPPING_STYLE))
344                            goto event_error;
345                        if (!yaml_emitter_emit(&emitter, &output_event))
346                            goto emitter_error;
347
348                        /* Write 'handle'. */
349
350                        if (!yaml_scalar_event_initialize(&output_event,
351                                    NULL, "tag:yaml.org,2002:str", "handle", -1,
352                                    1, 1, YAML_PLAIN_SCALAR_STYLE))
353                            goto event_error;
354                        if (!yaml_emitter_emit(&emitter, &output_event))
355                            goto emitter_error;
356
357                        /* Write the tag directive handle. */
358
359                        if (!yaml_scalar_event_initialize(&output_event,
360                                    NULL, "tag:yaml.org,2002:str",
361                                    tag->handle, -1,
362                                    0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
363                            goto event_error;
364                        if (!yaml_emitter_emit(&emitter, &output_event))
365                            goto emitter_error;
366
367                        /* Write 'prefix'. */
368
369                        if (!yaml_scalar_event_initialize(&output_event,
370                                    NULL, "tag:yaml.org,2002:str", "prefix", -1,
371                                    1, 1, YAML_PLAIN_SCALAR_STYLE))
372                            goto event_error;
373                        if (!yaml_emitter_emit(&emitter, &output_event))
374                            goto emitter_error;
375
376                        /* Write the tag directive prefix. */
377
378                        if (!yaml_scalar_event_initialize(&output_event,
379                                    NULL, "tag:yaml.org,2002:str",
380                                    tag->prefix, -1,
381                                    0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
382                            goto event_error;
383                        if (!yaml_emitter_emit(&emitter, &output_event))
384                            goto emitter_error;
385
386                        /* Write '}'. */
387
388                        if (!yaml_mapping_end_event_initialize(&output_event))
389                            goto event_error;
390                        if (!yaml_emitter_emit(&emitter, &output_event))
391                            goto emitter_error;
392                    }
393
394                    /* End a block sequence. */
395
396                    if (!yaml_sequence_end_event_initialize(&output_event))
397                        goto event_error;
398                    if (!yaml_emitter_emit(&emitter, &output_event))
399                        goto emitter_error;
400                }
401
402                /* Write 'implicit'. */
403
404                if (!yaml_scalar_event_initialize(&output_event,
405                            NULL, "tag:yaml.org,2002:str", "implicit", -1,
406                            1, 1, YAML_PLAIN_SCALAR_STYLE))
407                    goto event_error;
408                if (!yaml_emitter_emit(&emitter, &output_event))
409                    goto emitter_error;
410
411                /* Write if the document is implicit. */
412
413                if (!yaml_scalar_event_initialize(&output_event,
414                            NULL, "tag:yaml.org,2002:bool",
415                            (input_event.data.document_start.implicit ?
416                             "true" : "false"), -1,
417                            1, 0, YAML_PLAIN_SCALAR_STYLE))
418                    goto event_error;
419                if (!yaml_emitter_emit(&emitter, &output_event))
420                    goto emitter_error;
421
422                break;
423
424            case YAML_DOCUMENT_END_EVENT:
425
426                /* Write 'type'. */
427
428                if (!yaml_scalar_event_initialize(&output_event,
429                            NULL, "tag:yaml.org,2002:str", "type", -1,
430                            1, 1, YAML_PLAIN_SCALAR_STYLE))
431                    goto event_error;
432                if (!yaml_emitter_emit(&emitter, &output_event))
433                    goto emitter_error;
434
435                /* Write 'DOCUMENT-END'. */
436
437                if (!yaml_scalar_event_initialize(&output_event,
438                            NULL, "tag:yaml.org,2002:str", "DOCUMENT-END", -1,
439                            1, 1, YAML_PLAIN_SCALAR_STYLE))
440                    goto event_error;
441                if (!yaml_emitter_emit(&emitter, &output_event))
442                    goto emitter_error;
443
444                /* Write 'implicit'. */
445
446                if (!yaml_scalar_event_initialize(&output_event,
447                            NULL, "tag:yaml.org,2002:str", "implicit", -1,
448                            1, 1, YAML_PLAIN_SCALAR_STYLE))
449                    goto event_error;
450                if (!yaml_emitter_emit(&emitter, &output_event))
451                    goto emitter_error;
452
453                /* Write if the document is implicit. */
454
455                if (!yaml_scalar_event_initialize(&output_event,
456                            NULL, "tag:yaml.org,2002:bool",
457                            (input_event.data.document_end.implicit ?
458                             "true" : "false"), -1,
459                            1, 0, YAML_PLAIN_SCALAR_STYLE))
460                    goto event_error;
461                if (!yaml_emitter_emit(&emitter, &output_event))
462                    goto emitter_error;
463
464                break;
465
466            case YAML_ALIAS_EVENT:
467
468                /* Write 'type'. */
469
470                if (!yaml_scalar_event_initialize(&output_event,
471                            NULL, "tag:yaml.org,2002:str", "type", -1,
472                            1, 1, YAML_PLAIN_SCALAR_STYLE))
473                    goto event_error;
474                if (!yaml_emitter_emit(&emitter, &output_event))
475                    goto emitter_error;
476
477                /* Write 'ALIAS'. */
478
479                if (!yaml_scalar_event_initialize(&output_event,
480                            NULL, "tag:yaml.org,2002:str", "ALIAS", -1,
481                            1, 1, YAML_PLAIN_SCALAR_STYLE))
482                    goto event_error;
483                if (!yaml_emitter_emit(&emitter, &output_event))
484                    goto emitter_error;
485
486                /* Write 'anchor'. */
487
488                if (!yaml_scalar_event_initialize(&output_event,
489                            NULL, "tag:yaml.org,2002:str", "anchor", -1,
490                            1, 1, YAML_PLAIN_SCALAR_STYLE))
491                    goto event_error;
492                if (!yaml_emitter_emit(&emitter, &output_event))
493                    goto emitter_error;
494
495                /* Write the alias anchor. */
496
497                if (!yaml_scalar_event_initialize(&output_event,
498                            NULL, "tag:yaml.org,2002:str",
499                            input_event.data.alias.anchor, -1,
500                            0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
501                    goto event_error;
502                if (!yaml_emitter_emit(&emitter, &output_event))
503                    goto emitter_error;
504
505                break;
506
507            case YAML_SCALAR_EVENT:
508
509                /* Write 'type'. */
510
511                if (!yaml_scalar_event_initialize(&output_event,
512                            NULL, "tag:yaml.org,2002:str", "type", -1,
513                            1, 1, YAML_PLAIN_SCALAR_STYLE))
514                    goto event_error;
515                if (!yaml_emitter_emit(&emitter, &output_event))
516                    goto emitter_error;
517
518                /* Write 'SCALAR'. */
519
520                if (!yaml_scalar_event_initialize(&output_event,
521                            NULL, "tag:yaml.org,2002:str", "SCALAR", -1,
522                            1, 1, YAML_PLAIN_SCALAR_STYLE))
523                    goto event_error;
524                if (!yaml_emitter_emit(&emitter, &output_event))
525                    goto emitter_error;
526
527                /* Display the scalar anchor. */
528
529                if (input_event.data.scalar.anchor)
530                {
531                    /* Write 'anchor'. */
532
533                    if (!yaml_scalar_event_initialize(&output_event,
534                                NULL, "tag:yaml.org,2002:str", "anchor", -1,
535                                1, 1, YAML_PLAIN_SCALAR_STYLE))
536                        goto event_error;
537                    if (!yaml_emitter_emit(&emitter, &output_event))
538                        goto emitter_error;
539
540                    /* Write the scalar anchor. */
541
542                    if (!yaml_scalar_event_initialize(&output_event,
543                                NULL, "tag:yaml.org,2002:str",
544                                input_event.data.scalar.anchor, -1,
545                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
546                        goto event_error;
547                    if (!yaml_emitter_emit(&emitter, &output_event))
548                        goto emitter_error;
549                }
550
551                /* Display the scalar tag. */
552
553                if (input_event.data.scalar.tag)
554                {
555                    /* Write 'tag'. */
556
557                    if (!yaml_scalar_event_initialize(&output_event,
558                                NULL, "tag:yaml.org,2002:str", "tag", -1,
559                                1, 1, YAML_PLAIN_SCALAR_STYLE))
560                        goto event_error;
561                    if (!yaml_emitter_emit(&emitter, &output_event))
562                        goto emitter_error;
563
564                    /* Write the scalar tag. */
565
566                    if (!yaml_scalar_event_initialize(&output_event,
567                                NULL, "tag:yaml.org,2002:str",
568                                input_event.data.scalar.tag, -1,
569                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
570                        goto event_error;
571                    if (!yaml_emitter_emit(&emitter, &output_event))
572                        goto emitter_error;
573                }
574
575                /* Display the scalar value. */
576
577                /* Write 'value'. */
578
579                if (!yaml_scalar_event_initialize(&output_event,
580                            NULL, "tag:yaml.org,2002:str", "value", -1,
581                            1, 1, YAML_PLAIN_SCALAR_STYLE))
582                    goto event_error;
583                if (!yaml_emitter_emit(&emitter, &output_event))
584                    goto emitter_error;
585
586                /* Write the scalar value. */
587
588                if (!yaml_scalar_event_initialize(&output_event,
589                            NULL, "tag:yaml.org,2002:str",
590                            input_event.data.scalar.value,
591                            input_event.data.scalar.length,
592                            0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
593                    goto event_error;
594                if (!yaml_emitter_emit(&emitter, &output_event))
595                    goto emitter_error;
596
597                /* Display if the scalar tag is implicit. */
598
599                /* Write 'implicit'. */
600
601                if (!yaml_scalar_event_initialize(&output_event,
602                            NULL, "tag:yaml.org,2002:str", "implicit", -1,
603                            1, 1, YAML_PLAIN_SCALAR_STYLE))
604                    goto event_error;
605                if (!yaml_emitter_emit(&emitter, &output_event))
606                    goto emitter_error;
607
608                /* Write '{'. */
609
610                if (!yaml_mapping_start_event_initialize(&output_event,
611                            NULL, "tag:yaml.org,2002:map", 1,
612                            YAML_FLOW_MAPPING_STYLE))
613                    goto event_error;
614                if (!yaml_emitter_emit(&emitter, &output_event))
615                    goto emitter_error;
616
617                /* Write 'plain'. */
618
619                if (!yaml_scalar_event_initialize(&output_event,
620                            NULL, "tag:yaml.org,2002:str", "plain", -1,
621                            1, 1, YAML_PLAIN_SCALAR_STYLE))
622                    goto event_error;
623                if (!yaml_emitter_emit(&emitter, &output_event))
624                    goto emitter_error;
625
626                /* Write if the scalar is implicit in the plain style. */
627
628                if (!yaml_scalar_event_initialize(&output_event,
629                            NULL, "tag:yaml.org,2002:bool",
630                            (input_event.data.scalar.plain_implicit ?
631                             "true" : "false"), -1,
632                            1, 0, YAML_PLAIN_SCALAR_STYLE))
633                    goto event_error;
634                if (!yaml_emitter_emit(&emitter, &output_event))
635                    goto emitter_error;
636
637                /* Write 'quoted'. */
638
639                if (!yaml_scalar_event_initialize(&output_event,
640                            NULL, "tag:yaml.org,2002:str", "non-plain", -1,
641                            1, 1, YAML_PLAIN_SCALAR_STYLE))
642                    goto event_error;
643                if (!yaml_emitter_emit(&emitter, &output_event))
644                    goto emitter_error;
645
646                /* Write if the scalar is implicit in a non-plain style. */
647
648                if (!yaml_scalar_event_initialize(&output_event,
649                            NULL, "tag:yaml.org,2002:bool",
650                            (input_event.data.scalar.quoted_implicit ?
651                             "true" : "false"), -1,
652                            1, 0, YAML_PLAIN_SCALAR_STYLE))
653                    goto event_error;
654                if (!yaml_emitter_emit(&emitter, &output_event))
655                    goto emitter_error;
656
657                /* Write '}'. */
658
659                if (!yaml_mapping_end_event_initialize(&output_event))
660                    goto event_error;
661                if (!yaml_emitter_emit(&emitter, &output_event))
662                    goto emitter_error;
663
664                /* Display the style information. */
665
666                if (input_event.data.scalar.style)
667                {
668                    yaml_scalar_style_t style = input_event.data.scalar.style;
669
670                    /* Write 'style'. */
671
672                    if (!yaml_scalar_event_initialize(&output_event,
673                                NULL, "tag:yaml.org,2002:str", "style", -1,
674                                1, 1, YAML_PLAIN_SCALAR_STYLE))
675                        goto event_error;
676                    if (!yaml_emitter_emit(&emitter, &output_event))
677                        goto emitter_error;
678
679                    /* Write the scalar style. */
680
681                    if (!yaml_scalar_event_initialize(&output_event,
682                                NULL, "tag:yaml.org,2002:str",
683                                (style == YAML_PLAIN_SCALAR_STYLE ? "plain" :
684                                 style == YAML_SINGLE_QUOTED_SCALAR_STYLE ?
685                                        "single-quoted" :
686                                 style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ?
687                                        "double-quoted" :
688                                 style == YAML_LITERAL_SCALAR_STYLE ? "literal" :
689                                 style == YAML_FOLDED_SCALAR_STYLE ? "folded" :
690                                 "unknown"), -1,
691                                1, 1, YAML_PLAIN_SCALAR_STYLE))
692                        goto event_error;
693                    if (!yaml_emitter_emit(&emitter, &output_event))
694                        goto emitter_error;
695                }
696
697                break;
698
699            case YAML_SEQUENCE_START_EVENT:
700
701                /* Write 'type'. */
702
703                if (!yaml_scalar_event_initialize(&output_event,
704                            NULL, "tag:yaml.org,2002:str", "type", -1,
705                            1, 1, YAML_PLAIN_SCALAR_STYLE))
706                    goto event_error;
707                if (!yaml_emitter_emit(&emitter, &output_event))
708                    goto emitter_error;
709
710                /* Write 'SEQUENCE-START'. */
711
712                if (!yaml_scalar_event_initialize(&output_event,
713                            NULL, "tag:yaml.org,2002:str", "SEQUENCE-START", -1,
714                            1, 1, YAML_PLAIN_SCALAR_STYLE))
715                    goto event_error;
716                if (!yaml_emitter_emit(&emitter, &output_event))
717                    goto emitter_error;
718
719                /* Display the sequence anchor. */
720
721                if (input_event.data.sequence_start.anchor)
722                {
723                    /* Write 'anchor'. */
724
725                    if (!yaml_scalar_event_initialize(&output_event,
726                                NULL, "tag:yaml.org,2002:str", "anchor", -1,
727                                1, 1, YAML_PLAIN_SCALAR_STYLE))
728                        goto event_error;
729                    if (!yaml_emitter_emit(&emitter, &output_event))
730                        goto emitter_error;
731
732                    /* Write the sequence anchor. */
733
734                    if (!yaml_scalar_event_initialize(&output_event,
735                                NULL, "tag:yaml.org,2002:str",
736                                input_event.data.sequence_start.anchor, -1,
737                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
738                        goto event_error;
739                    if (!yaml_emitter_emit(&emitter, &output_event))
740                        goto emitter_error;
741                }
742
743                /* Display the sequence tag. */
744
745                if (input_event.data.sequence_start.tag)
746                {
747                    /* Write 'tag'. */
748
749                    if (!yaml_scalar_event_initialize(&output_event,
750                                NULL, "tag:yaml.org,2002:str", "tag", -1,
751                                1, 1, YAML_PLAIN_SCALAR_STYLE))
752                        goto event_error;
753                    if (!yaml_emitter_emit(&emitter, &output_event))
754                        goto emitter_error;
755
756                    /* Write the sequence tag. */
757
758                    if (!yaml_scalar_event_initialize(&output_event,
759                                NULL, "tag:yaml.org,2002:str",
760                                input_event.data.sequence_start.tag, -1,
761                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
762                        goto event_error;
763                    if (!yaml_emitter_emit(&emitter, &output_event))
764                        goto emitter_error;
765                }
766
767                /* Write 'implicit'. */
768
769                if (!yaml_scalar_event_initialize(&output_event,
770                            NULL, "tag:yaml.org,2002:str", "implicit", -1,
771                            1, 1, YAML_PLAIN_SCALAR_STYLE))
772                    goto event_error;
773                if (!yaml_emitter_emit(&emitter, &output_event))
774                    goto emitter_error;
775
776                /* Write if the sequence tag is implicit. */
777
778                if (!yaml_scalar_event_initialize(&output_event,
779                            NULL, "tag:yaml.org,2002:bool",
780                            (input_event.data.sequence_start.implicit ?
781                             "true" : "false"), -1,
782                            1, 0, YAML_PLAIN_SCALAR_STYLE))
783                    goto event_error;
784                if (!yaml_emitter_emit(&emitter, &output_event))
785                    goto emitter_error;
786
787                /* Display the style information. */
788
789                if (input_event.data.sequence_start.style)
790                {
791                    yaml_sequence_style_t style
792                        = input_event.data.sequence_start.style;
793
794                    /* Write 'style'. */
795
796                    if (!yaml_scalar_event_initialize(&output_event,
797                                NULL, "tag:yaml.org,2002:str", "style", -1,
798                                1, 1, YAML_PLAIN_SCALAR_STYLE))
799                        goto event_error;
800                    if (!yaml_emitter_emit(&emitter, &output_event))
801                        goto emitter_error;
802
803                    /* Write the scalar style. */
804
805                    if (!yaml_scalar_event_initialize(&output_event,
806                                NULL, "tag:yaml.org,2002:str",
807                                (style == YAML_BLOCK_SEQUENCE_STYLE ? "block" :
808                                 style == YAML_FLOW_SEQUENCE_STYLE ? "flow" :
809                                 "unknown"), -1,
810                                1, 1, YAML_PLAIN_SCALAR_STYLE))
811                        goto event_error;
812                    if (!yaml_emitter_emit(&emitter, &output_event))
813                        goto emitter_error;
814                }
815
816                break;
817
818            case YAML_SEQUENCE_END_EVENT:
819
820                /* Write 'type'. */
821
822                if (!yaml_scalar_event_initialize(&output_event,
823                            NULL, "tag:yaml.org,2002:str", "type", -1,
824                            1, 1, YAML_PLAIN_SCALAR_STYLE))
825                    goto event_error;
826                if (!yaml_emitter_emit(&emitter, &output_event))
827                    goto emitter_error;
828
829                /* Write 'SEQUENCE-END'. */
830
831                if (!yaml_scalar_event_initialize(&output_event,
832                            NULL, "tag:yaml.org,2002:str", "SEQUENCE-END", -1,
833                            1, 1, YAML_PLAIN_SCALAR_STYLE))
834                    goto event_error;
835                if (!yaml_emitter_emit(&emitter, &output_event))
836                    goto emitter_error;
837
838                break;
839
840            case YAML_MAPPING_START_EVENT:
841
842                /* Write 'type'. */
843
844                if (!yaml_scalar_event_initialize(&output_event,
845                            NULL, "tag:yaml.org,2002:str", "type", -1,
846                            1, 1, YAML_PLAIN_SCALAR_STYLE))
847                    goto event_error;
848                if (!yaml_emitter_emit(&emitter, &output_event))
849                    goto emitter_error;
850
851                /* Write 'MAPPING-START'. */
852
853                if (!yaml_scalar_event_initialize(&output_event,
854                            NULL, "tag:yaml.org,2002:str", "MAPPING-START", -1,
855                            1, 1, YAML_PLAIN_SCALAR_STYLE))
856                    goto event_error;
857                if (!yaml_emitter_emit(&emitter, &output_event))
858                    goto emitter_error;
859
860                /* Display the mapping anchor. */
861
862                if (input_event.data.mapping_start.anchor)
863                {
864                    /* Write 'anchor'. */
865
866                    if (!yaml_scalar_event_initialize(&output_event,
867                                NULL, "tag:yaml.org,2002:str", "anchor", -1,
868                                1, 1, YAML_PLAIN_SCALAR_STYLE))
869                        goto event_error;
870                    if (!yaml_emitter_emit(&emitter, &output_event))
871                        goto emitter_error;
872
873                    /* Write the mapping anchor. */
874
875                    if (!yaml_scalar_event_initialize(&output_event,
876                                NULL, "tag:yaml.org,2002:str",
877                                input_event.data.mapping_start.anchor, -1,
878                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
879                        goto event_error;
880                    if (!yaml_emitter_emit(&emitter, &output_event))
881                        goto emitter_error;
882                }
883
884                /* Display the mapping tag. */
885
886                if (input_event.data.mapping_start.tag)
887                {
888                    /* Write 'tag'. */
889
890                    if (!yaml_scalar_event_initialize(&output_event,
891                                NULL, "tag:yaml.org,2002:str", "tag", -1,
892                                1, 1, YAML_PLAIN_SCALAR_STYLE))
893                        goto event_error;
894                    if (!yaml_emitter_emit(&emitter, &output_event))
895                        goto emitter_error;
896
897                    /* Write the mapping tag. */
898
899                    if (!yaml_scalar_event_initialize(&output_event,
900                                NULL, "tag:yaml.org,2002:str",
901                                input_event.data.mapping_start.tag, -1,
902                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
903                        goto event_error;
904                    if (!yaml_emitter_emit(&emitter, &output_event))
905                        goto emitter_error;
906                }
907
908                /* Write 'implicit'. */
909
910                if (!yaml_scalar_event_initialize(&output_event,
911                            NULL, "tag:yaml.org,2002:str", "implicit", -1,
912                            1, 1, YAML_PLAIN_SCALAR_STYLE))
913                    goto event_error;
914                if (!yaml_emitter_emit(&emitter, &output_event))
915                    goto emitter_error;
916
917                /* Write if the mapping tag is implicit. */
918
919                if (!yaml_scalar_event_initialize(&output_event,
920                            NULL, "tag:yaml.org,2002:bool",
921                            (input_event.data.mapping_start.implicit ?
922                             "true" : "false"), -1,
923                            1, 0, YAML_PLAIN_SCALAR_STYLE))
924                    goto event_error;
925                if (!yaml_emitter_emit(&emitter, &output_event))
926                    goto emitter_error;
927
928                /* Display the style information. */
929
930                if (input_event.data.mapping_start.style)
931                {
932                    yaml_mapping_style_t style
933                        = input_event.data.mapping_start.style;
934
935                    /* Write 'style'. */
936
937                    if (!yaml_scalar_event_initialize(&output_event,
938                                NULL, "tag:yaml.org,2002:str", "style", -1,
939                                1, 1, YAML_PLAIN_SCALAR_STYLE))
940                        goto event_error;
941                    if (!yaml_emitter_emit(&emitter, &output_event))
942                        goto emitter_error;
943
944                    /* Write the scalar style. */
945
946                    if (!yaml_scalar_event_initialize(&output_event,
947                                NULL, "tag:yaml.org,2002:str",
948                                (style == YAML_BLOCK_MAPPING_STYLE ? "block" :
949                                 style == YAML_FLOW_MAPPING_STYLE ? "flow" :
950                                 "unknown"), -1,
951                                1, 1, YAML_PLAIN_SCALAR_STYLE))
952                        goto event_error;
953                    if (!yaml_emitter_emit(&emitter, &output_event))
954                        goto emitter_error;
955                }
956
957                break;
958
959            case YAML_MAPPING_END_EVENT:
960
961                /* Write 'type'. */
962
963                if (!yaml_scalar_event_initialize(&output_event,
964                            NULL, "tag:yaml.org,2002:str", "type", -1,
965                            1, 1, YAML_PLAIN_SCALAR_STYLE))
966                    goto event_error;
967                if (!yaml_emitter_emit(&emitter, &output_event))
968                    goto emitter_error;
969
970                /* Write 'MAPPING-END'. */
971
972                if (!yaml_scalar_event_initialize(&output_event,
973                            NULL, "tag:yaml.org,2002:str", "MAPPING-END", -1,
974                            1, 1, YAML_PLAIN_SCALAR_STYLE))
975                    goto event_error;
976                if (!yaml_emitter_emit(&emitter, &output_event))
977                    goto emitter_error;
978
979                break;
980
981            default:
982                /* It couldn't really happen. */
983                break;
984        }
985
986        /* Delete the event object. */
987
988        yaml_event_delete(&input_event);
989
990        /* Create and emit a MAPPING-END event. */
991
992        if (!yaml_mapping_end_event_initialize(&output_event))
993            goto event_error;
994        if (!yaml_emitter_emit(&emitter, &output_event))
995            goto emitter_error;
996    }
997
998    /* Create and emit the SEQUENCE-END event. */
999
1000    if (!yaml_sequence_end_event_initialize(&output_event))
1001        goto event_error;
1002    if (!yaml_emitter_emit(&emitter, &output_event))
1003        goto emitter_error;
1004
1005    /* Create and emit the DOCUMENT-END event. */
1006
1007    if (!yaml_document_end_event_initialize(&output_event, 0))
1008        goto event_error;
1009    if (!yaml_emitter_emit(&emitter, &output_event))
1010        goto emitter_error;
1011
1012    /* Create and emit the STREAM-END event. */
1013
1014    if (!yaml_stream_end_event_initialize(&output_event))
1015        goto event_error;
1016    if (!yaml_emitter_emit(&emitter, &output_event))
1017        goto emitter_error;
1018
1019    yaml_parser_delete(&parser);
1020    yaml_emitter_delete(&emitter);
1021
1022    return 0;
1023
1024parser_error:
1025
1026    /* Display a parser error message. */
1027
1028    switch (parser.error)
1029    {
1030        case YAML_MEMORY_ERROR:
1031            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
1032            break;
1033
1034        case YAML_READER_ERROR:
1035            if (parser.problem_value != -1) {
1036                fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem,
1037                        parser.problem_value, parser.problem_offset);
1038            }
1039            else {
1040                fprintf(stderr, "Reader error: %s at %d\n", parser.problem,
1041                        parser.problem_offset);
1042            }
1043            break;
1044
1045        case YAML_SCANNER_ERROR:
1046            if (parser.context) {
1047                fprintf(stderr, "Scanner error: %s at line %d, column %d\n"
1048                        "%s at line %d, column %d\n", parser.context,
1049                        parser.context_mark.line+1, parser.context_mark.column+1,
1050                        parser.problem, parser.problem_mark.line+1,
1051                        parser.problem_mark.column+1);
1052            }
1053            else {
1054                fprintf(stderr, "Scanner error: %s at line %d, column %d\n",
1055                        parser.problem, parser.problem_mark.line+1,
1056                        parser.problem_mark.column+1);
1057            }
1058            break;
1059
1060        case YAML_PARSER_ERROR:
1061            if (parser.context) {
1062                fprintf(stderr, "Parser error: %s at line %d, column %d\n"
1063                        "%s at line %d, column %d\n", parser.context,
1064                        parser.context_mark.line+1, parser.context_mark.column+1,
1065                        parser.problem, parser.problem_mark.line+1,
1066                        parser.problem_mark.column+1);
1067            }
1068            else {
1069                fprintf(stderr, "Parser error: %s at line %d, column %d\n",
1070                        parser.problem, parser.problem_mark.line+1,
1071                        parser.problem_mark.column+1);
1072            }
1073            break;
1074
1075        default:
1076            /* Couldn't happen. */
1077            fprintf(stderr, "Internal error\n");
1078            break;
1079    }
1080
1081    yaml_event_delete(&input_event);
1082    yaml_event_delete(&output_event);
1083    yaml_parser_delete(&parser);
1084    yaml_emitter_delete(&emitter);
1085
1086    return 1;
1087
1088emitter_error:
1089
1090    /* Display an emitter error message. */
1091
1092    switch (emitter.error)
1093    {
1094        case YAML_MEMORY_ERROR:
1095            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
1096            break;
1097
1098        case YAML_WRITER_ERROR:
1099            fprintf(stderr, "Writer error: %s\n", emitter.problem);
1100            break;
1101
1102        case YAML_EMITTER_ERROR:
1103            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
1104            break;
1105
1106        default:
1107            /* Couldn't happen. */
1108            fprintf(stderr, "Internal error\n");
1109            break;
1110    }
1111
1112    yaml_event_delete(&input_event);
1113    yaml_event_delete(&output_event);
1114    yaml_parser_delete(&parser);
1115    yaml_emitter_delete(&emitter);
1116
1117    return 1;
1118
1119event_error:
1120
1121    fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
1122
1123    yaml_event_delete(&input_event);
1124    yaml_event_delete(&output_event);
1125    yaml_parser_delete(&parser);
1126    yaml_emitter_delete(&emitter);
1127
1128    return 1;
1129}
1130
1131