1 
2 #include <yaml.h>
3 
4 #include <stdlib.h>
5 #include <stdio.h>
6 
7 int
main(int argc,char * argv[])8 main(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, (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str",
184                                 (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:int", (yaml_char_t *)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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:int", (yaml_char_t *)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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
415                             (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
457                             (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
630                             (yaml_char_t * )(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
650                             (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str",
683                                 (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
780                             (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str",
807                                 (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:bool",
921                             (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str",
948                                 (yaml_char_t *)(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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"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 
1024 parser_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 %zu\n", parser.problem,
1037                         parser.problem_value, parser.problem_offset);
1038             }
1039             else {
1040                 fprintf(stderr, "Reader error: %s at %zu\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 %lu, column %lu\n"
1048                         "%s at line %lu, column %lu\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 %lu, column %lu\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 %lu, column %lu\n"
1063                         "%s at line %lu, column %lu\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 %lu, column %lu\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_parser_delete(&parser);
1083     yaml_emitter_delete(&emitter);
1084 
1085     return 1;
1086 
1087 emitter_error:
1088 
1089     /* Display an emitter error message. */
1090 
1091     switch (emitter.error)
1092     {
1093         case YAML_MEMORY_ERROR:
1094             fprintf(stderr, "Memory error: Not enough memory for emitting\n");
1095             break;
1096 
1097         case YAML_WRITER_ERROR:
1098             fprintf(stderr, "Writer error: %s\n", emitter.problem);
1099             break;
1100 
1101         case YAML_EMITTER_ERROR:
1102             fprintf(stderr, "Emitter error: %s\n", emitter.problem);
1103             break;
1104 
1105         default:
1106             /* Couldn't happen. */
1107             fprintf(stderr, "Internal error\n");
1108             break;
1109     }
1110 
1111     yaml_event_delete(&input_event);
1112     yaml_parser_delete(&parser);
1113     yaml_emitter_delete(&emitter);
1114 
1115     return 1;
1116 
1117 event_error:
1118 
1119     fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
1120 
1121     yaml_event_delete(&input_event);
1122     yaml_parser_delete(&parser);
1123     yaml_emitter_delete(&emitter);
1124 
1125     return 1;
1126 }
1127 
1128