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