example-deconstructor.c revision 247738
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