1 /** 2 * @file yaml.h 3 * @brief Public interface for libyaml. 4 * 5 * Include the header file with the code: 6 * @code 7 * #include <yaml.h> 8 * @endcode 9 */ 10 11 #ifndef YAML_H 12 #define YAML_H 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 #include <stdlib.h> 19 #include <stdio.h> 20 #include <string.h> 21 22 /** 23 * @defgroup export Export Definitions 24 * @{ 25 */ 26 27 /** The public API declaration. */ 28 29 #if defined(__MINGW32__) 30 # define YAML_DECLARE(type) type 31 #elif defined(_WIN32) 32 # if defined(YAML_DECLARE_STATIC) 33 # define YAML_DECLARE(type) type 34 # elif defined(YAML_DECLARE_EXPORT) 35 # define YAML_DECLARE(type) __declspec(dllexport) type 36 # else 37 # define YAML_DECLARE(type) __declspec(dllimport) type 38 # endif 39 #else 40 # define YAML_DECLARE(type) type 41 #endif 42 43 /** @} */ 44 45 /** 46 * @defgroup version Version Information 47 * @{ 48 */ 49 50 /** 51 * Get the library version as a string. 52 * 53 * @returns The function returns the pointer to a static string of the form 54 * @c "X.Y.Z", where @c X is the major version number, @c Y is a minor version 55 * number, and @c Z is the patch version number. 56 */ 57 58 YAML_DECLARE(const char *) 59 yaml_get_version_string(void); 60 61 /** 62 * Get the library version numbers. 63 * 64 * @param[out] major Major version number. 65 * @param[out] minor Minor version number. 66 * @param[out] patch Patch version number. 67 */ 68 69 YAML_DECLARE(void) 70 yaml_get_version(int *major, int *minor, int *patch); 71 72 /** @} */ 73 74 /** 75 * @defgroup basic Basic Types 76 * @{ 77 */ 78 79 /** The character type (UTF-8 octet). */ 80 typedef unsigned char yaml_char_t; 81 82 /** The version directive data. */ 83 typedef struct yaml_version_directive_s { 84 /** The major version number. */ 85 int major; 86 /** The minor version number. */ 87 int minor; 88 } yaml_version_directive_t; 89 90 /** The tag directive data. */ 91 typedef struct yaml_tag_directive_s { 92 /** The tag handle. */ 93 yaml_char_t *handle; 94 /** The tag prefix. */ 95 yaml_char_t *prefix; 96 } yaml_tag_directive_t; 97 98 /** The stream encoding. */ 99 typedef enum yaml_encoding_e { 100 /** Let the parser choose the encoding. */ 101 YAML_ANY_ENCODING, 102 /** The default UTF-8 encoding. */ 103 YAML_UTF8_ENCODING, 104 /** The UTF-16-LE encoding with BOM. */ 105 YAML_UTF16LE_ENCODING, 106 /** The UTF-16-BE encoding with BOM. */ 107 YAML_UTF16BE_ENCODING 108 } yaml_encoding_t; 109 110 /** Line break types. */ 111 112 typedef enum yaml_break_e { 113 /** Let the parser choose the break type. */ 114 YAML_ANY_BREAK, 115 /** Use CR for line breaks (Mac style). */ 116 YAML_CR_BREAK, 117 /** Use LN for line breaks (Unix style). */ 118 YAML_LN_BREAK, 119 /** Use CR LN for line breaks (DOS style). */ 120 YAML_CRLN_BREAK 121 } yaml_break_t; 122 123 /** Many bad things could happen with the parser and emitter. */ 124 typedef enum yaml_error_type_e { 125 /** No error is produced. */ 126 YAML_NO_ERROR, 127 128 /** Cannot allocate or reallocate a block of memory. */ 129 YAML_MEMORY_ERROR, 130 131 /** Cannot read or decode the input stream. */ 132 YAML_READER_ERROR, 133 /** Cannot scan the input stream. */ 134 YAML_SCANNER_ERROR, 135 /** Cannot parse the input stream. */ 136 YAML_PARSER_ERROR, 137 /** Cannot compose a YAML document. */ 138 YAML_COMPOSER_ERROR, 139 140 /** Cannot write to the output stream. */ 141 YAML_WRITER_ERROR, 142 /** Cannot emit a YAML stream. */ 143 YAML_EMITTER_ERROR 144 } yaml_error_type_t; 145 146 /** The pointer position. */ 147 typedef struct yaml_mark_s { 148 /** The position index. */ 149 size_t index; 150 151 /** The position line. */ 152 size_t line; 153 154 /** The position column. */ 155 size_t column; 156 } yaml_mark_t; 157 158 /** @} */ 159 160 /** 161 * @defgroup styles Node Styles 162 * @{ 163 */ 164 165 /** Scalar styles. */ 166 typedef enum yaml_scalar_style_e { 167 /** Let the emitter choose the style. */ 168 YAML_ANY_SCALAR_STYLE, 169 170 /** The plain scalar style. */ 171 YAML_PLAIN_SCALAR_STYLE, 172 173 /** The single-quoted scalar style. */ 174 YAML_SINGLE_QUOTED_SCALAR_STYLE, 175 /** The double-quoted scalar style. */ 176 YAML_DOUBLE_QUOTED_SCALAR_STYLE, 177 178 /** The literal scalar style. */ 179 YAML_LITERAL_SCALAR_STYLE, 180 /** The folded scalar style. */ 181 YAML_FOLDED_SCALAR_STYLE 182 } yaml_scalar_style_t; 183 184 /** Sequence styles. */ 185 typedef enum yaml_sequence_style_e { 186 /** Let the emitter choose the style. */ 187 YAML_ANY_SEQUENCE_STYLE, 188 189 /** The block sequence style. */ 190 YAML_BLOCK_SEQUENCE_STYLE, 191 /** The flow sequence style. */ 192 YAML_FLOW_SEQUENCE_STYLE 193 } yaml_sequence_style_t; 194 195 /** Mapping styles. */ 196 typedef enum yaml_mapping_style_e { 197 /** Let the emitter choose the style. */ 198 YAML_ANY_MAPPING_STYLE, 199 200 /** The block mapping style. */ 201 YAML_BLOCK_MAPPING_STYLE, 202 /** The flow mapping style. */ 203 YAML_FLOW_MAPPING_STYLE 204 /* YAML_FLOW_SET_MAPPING_STYLE */ 205 } yaml_mapping_style_t; 206 207 /** @} */ 208 209 /** 210 * @defgroup tokens Tokens 211 * @{ 212 */ 213 214 /** Token types. */ 215 typedef enum yaml_token_type_e { 216 /** An empty token. */ 217 YAML_NO_TOKEN, 218 219 /** A STREAM-START token. */ 220 YAML_STREAM_START_TOKEN, 221 /** A STREAM-END token. */ 222 YAML_STREAM_END_TOKEN, 223 224 /** A VERSION-DIRECTIVE token. */ 225 YAML_VERSION_DIRECTIVE_TOKEN, 226 /** A TAG-DIRECTIVE token. */ 227 YAML_TAG_DIRECTIVE_TOKEN, 228 /** A DOCUMENT-START token. */ 229 YAML_DOCUMENT_START_TOKEN, 230 /** A DOCUMENT-END token. */ 231 YAML_DOCUMENT_END_TOKEN, 232 233 /** A BLOCK-SEQUENCE-START token. */ 234 YAML_BLOCK_SEQUENCE_START_TOKEN, 235 /** A BLOCK-MAPPING-START token. */ 236 YAML_BLOCK_MAPPING_START_TOKEN, 237 /** A BLOCK-END token. */ 238 YAML_BLOCK_END_TOKEN, 239 240 /** A FLOW-SEQUENCE-START token. */ 241 YAML_FLOW_SEQUENCE_START_TOKEN, 242 /** A FLOW-SEQUENCE-END token. */ 243 YAML_FLOW_SEQUENCE_END_TOKEN, 244 /** A FLOW-MAPPING-START token. */ 245 YAML_FLOW_MAPPING_START_TOKEN, 246 /** A FLOW-MAPPING-END token. */ 247 YAML_FLOW_MAPPING_END_TOKEN, 248 249 /** A BLOCK-ENTRY token. */ 250 YAML_BLOCK_ENTRY_TOKEN, 251 /** A FLOW-ENTRY token. */ 252 YAML_FLOW_ENTRY_TOKEN, 253 /** A KEY token. */ 254 YAML_KEY_TOKEN, 255 /** A VALUE token. */ 256 YAML_VALUE_TOKEN, 257 258 /** An ALIAS token. */ 259 YAML_ALIAS_TOKEN, 260 /** An ANCHOR token. */ 261 YAML_ANCHOR_TOKEN, 262 /** A TAG token. */ 263 YAML_TAG_TOKEN, 264 /** A SCALAR token. */ 265 YAML_SCALAR_TOKEN 266 } yaml_token_type_t; 267 268 /** The token structure. */ 269 typedef struct yaml_token_s { 270 271 /** The token type. */ 272 yaml_token_type_t type; 273 274 /** The token data. */ 275 union { 276 277 /** The stream start (for @c YAML_STREAM_START_TOKEN). */ 278 struct { 279 /** The stream encoding. */ 280 yaml_encoding_t encoding; 281 } stream_start; 282 283 /** The alias (for @c YAML_ALIAS_TOKEN). */ 284 struct { 285 /** The alias value. */ 286 yaml_char_t *value; 287 } alias; 288 289 /** The anchor (for @c YAML_ANCHOR_TOKEN). */ 290 struct { 291 /** The anchor value. */ 292 yaml_char_t *value; 293 } anchor; 294 295 /** The tag (for @c YAML_TAG_TOKEN). */ 296 struct { 297 /** The tag handle. */ 298 yaml_char_t *handle; 299 /** The tag suffix. */ 300 yaml_char_t *suffix; 301 } tag; 302 303 /** The scalar value (for @c YAML_SCALAR_TOKEN). */ 304 struct { 305 /** The scalar value. */ 306 yaml_char_t *value; 307 /** The length of the scalar value. */ 308 size_t length; 309 /** The scalar style. */ 310 yaml_scalar_style_t style; 311 } scalar; 312 313 /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */ 314 struct { 315 /** The major version number. */ 316 int major; 317 /** The minor version number. */ 318 int minor; 319 } version_directive; 320 321 /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */ 322 struct { 323 /** The tag handle. */ 324 yaml_char_t *handle; 325 /** The tag prefix. */ 326 yaml_char_t *prefix; 327 } tag_directive; 328 329 } data; 330 331 /** The beginning of the token. */ 332 yaml_mark_t start_mark; 333 /** The end of the token. */ 334 yaml_mark_t end_mark; 335 336 } yaml_token_t; 337 338 /** 339 * Free any memory allocated for a token object. 340 * 341 * @param[in,out] token A token object. 342 */ 343 344 YAML_DECLARE(void) 345 yaml_token_delete(yaml_token_t *token); 346 347 /** @} */ 348 349 /** 350 * @defgroup events Events 351 * @{ 352 */ 353 354 /** Event types. */ 355 typedef enum yaml_event_type_e { 356 /** An empty event. */ 357 YAML_NO_EVENT, 358 359 /** A STREAM-START event. */ 360 YAML_STREAM_START_EVENT, 361 /** A STREAM-END event. */ 362 YAML_STREAM_END_EVENT, 363 364 /** A DOCUMENT-START event. */ 365 YAML_DOCUMENT_START_EVENT, 366 /** A DOCUMENT-END event. */ 367 YAML_DOCUMENT_END_EVENT, 368 369 /** An ALIAS event. */ 370 YAML_ALIAS_EVENT, 371 /** A SCALAR event. */ 372 YAML_SCALAR_EVENT, 373 374 /** A SEQUENCE-START event. */ 375 YAML_SEQUENCE_START_EVENT, 376 /** A SEQUENCE-END event. */ 377 YAML_SEQUENCE_END_EVENT, 378 379 /** A MAPPING-START event. */ 380 YAML_MAPPING_START_EVENT, 381 /** A MAPPING-END event. */ 382 YAML_MAPPING_END_EVENT 383 } yaml_event_type_t; 384 385 /** The event structure. */ 386 typedef struct yaml_event_s { 387 388 /** The event type. */ 389 yaml_event_type_t type; 390 391 /** The event data. */ 392 union { 393 394 /** The stream parameters (for @c YAML_STREAM_START_EVENT). */ 395 struct { 396 /** The document encoding. */ 397 yaml_encoding_t encoding; 398 } stream_start; 399 400 /** The document parameters (for @c YAML_DOCUMENT_START_EVENT). */ 401 struct { 402 /** The version directive. */ 403 yaml_version_directive_t *version_directive; 404 405 /** The list of tag directives. */ 406 struct { 407 /** The beginning of the tag directives list. */ 408 yaml_tag_directive_t *start; 409 /** The end of the tag directives list. */ 410 yaml_tag_directive_t *end; 411 } tag_directives; 412 413 /** Is the document indicator implicit? */ 414 int implicit; 415 } document_start; 416 417 /** The document end parameters (for @c YAML_DOCUMENT_END_EVENT). */ 418 struct { 419 /** Is the document end indicator implicit? */ 420 int implicit; 421 } document_end; 422 423 /** The alias parameters (for @c YAML_ALIAS_EVENT). */ 424 struct { 425 /** The anchor. */ 426 yaml_char_t *anchor; 427 } alias; 428 429 /** The scalar parameters (for @c YAML_SCALAR_EVENT). */ 430 struct { 431 /** The anchor. */ 432 yaml_char_t *anchor; 433 /** The tag. */ 434 yaml_char_t *tag; 435 /** The scalar value. */ 436 yaml_char_t *value; 437 /** The length of the scalar value. */ 438 size_t length; 439 /** Is the tag optional for the plain style? */ 440 int plain_implicit; 441 /** Is the tag optional for any non-plain style? */ 442 int quoted_implicit; 443 /** The scalar style. */ 444 yaml_scalar_style_t style; 445 } scalar; 446 447 /** The sequence parameters (for @c YAML_SEQUENCE_START_EVENT). */ 448 struct { 449 /** The anchor. */ 450 yaml_char_t *anchor; 451 /** The tag. */ 452 yaml_char_t *tag; 453 /** Is the tag optional? */ 454 int implicit; 455 /** The sequence style. */ 456 yaml_sequence_style_t style; 457 } sequence_start; 458 459 /** The mapping parameters (for @c YAML_MAPPING_START_EVENT). */ 460 struct { 461 /** The anchor. */ 462 yaml_char_t *anchor; 463 /** The tag. */ 464 yaml_char_t *tag; 465 /** Is the tag optional? */ 466 int implicit; 467 /** The mapping style. */ 468 yaml_mapping_style_t style; 469 } mapping_start; 470 471 } data; 472 473 /** The beginning of the event. */ 474 yaml_mark_t start_mark; 475 /** The end of the event. */ 476 yaml_mark_t end_mark; 477 478 } yaml_event_t; 479 480 /** 481 * Create the STREAM-START event. 482 * 483 * @param[out] event An empty event object. 484 * @param[in] encoding The stream encoding. 485 * 486 * @returns @c 1 if the function succeeded, @c 0 on error. 487 */ 488 489 YAML_DECLARE(int) 490 yaml_stream_start_event_initialize(yaml_event_t *event, 491 yaml_encoding_t encoding); 492 493 /** 494 * Create the STREAM-END event. 495 * 496 * @param[out] event An empty event object. 497 * 498 * @returns @c 1 if the function succeeded, @c 0 on error. 499 */ 500 501 YAML_DECLARE(int) 502 yaml_stream_end_event_initialize(yaml_event_t *event); 503 504 /** 505 * Create the DOCUMENT-START event. 506 * 507 * The @a implicit argument is considered as a stylistic parameter and may be 508 * ignored by the emitter. 509 * 510 * @param[out] event An empty event object. 511 * @param[in] version_directive The %YAML directive value or 512 * @c NULL. 513 * @param[in] tag_directives_start The beginning of the %TAG 514 * directives list. 515 * @param[in] tag_directives_end The end of the %TAG directives 516 * list. 517 * @param[in] implicit If the document start indicator is 518 * implicit. 519 * 520 * @returns @c 1 if the function succeeded, @c 0 on error. 521 */ 522 523 YAML_DECLARE(int) 524 yaml_document_start_event_initialize(yaml_event_t *event, 525 yaml_version_directive_t *version_directive, 526 yaml_tag_directive_t *tag_directives_start, 527 yaml_tag_directive_t *tag_directives_end, 528 int implicit); 529 530 /** 531 * Create the DOCUMENT-END event. 532 * 533 * The @a implicit argument is considered as a stylistic parameter and may be 534 * ignored by the emitter. 535 * 536 * @param[out] event An empty event object. 537 * @param[in] implicit If the document end indicator is implicit. 538 * 539 * @returns @c 1 if the function succeeded, @c 0 on error. 540 */ 541 542 YAML_DECLARE(int) 543 yaml_document_end_event_initialize(yaml_event_t *event, int implicit); 544 545 /** 546 * Create an ALIAS event. 547 * 548 * @param[out] event An empty event object. 549 * @param[in] anchor The anchor value. 550 * 551 * @returns @c 1 if the function succeeded, @c 0 on error. 552 */ 553 554 YAML_DECLARE(int) 555 yaml_alias_event_initialize(yaml_event_t *event, const yaml_char_t *anchor); 556 557 /** 558 * Create a SCALAR event. 559 * 560 * The @a style argument may be ignored by the emitter. 561 * 562 * Either the @a tag attribute or one of the @a plain_implicit and 563 * @a quoted_implicit flags must be set. 564 * 565 * @param[out] event An empty event object. 566 * @param[in] anchor The scalar anchor or @c NULL. 567 * @param[in] tag The scalar tag or @c NULL. 568 * @param[in] value The scalar value. 569 * @param[in] length The length of the scalar value. 570 * @param[in] plain_implicit If the tag may be omitted for the plain 571 * style. 572 * @param[in] quoted_implicit If the tag may be omitted for any 573 * non-plain style. 574 * @param[in] style The scalar style. 575 * 576 * @returns @c 1 if the function succeeded, @c 0 on error. 577 */ 578 579 YAML_DECLARE(int) 580 yaml_scalar_event_initialize(yaml_event_t *event, 581 const yaml_char_t *anchor, const yaml_char_t *tag, 582 const yaml_char_t *value, int length, 583 int plain_implicit, int quoted_implicit, 584 yaml_scalar_style_t style); 585 586 /** 587 * Create a SEQUENCE-START event. 588 * 589 * The @a style argument may be ignored by the emitter. 590 * 591 * Either the @a tag attribute or the @a implicit flag must be set. 592 * 593 * @param[out] event An empty event object. 594 * @param[in] anchor The sequence anchor or @c NULL. 595 * @param[in] tag The sequence tag or @c NULL. 596 * @param[in] implicit If the tag may be omitted. 597 * @param[in] style The sequence style. 598 * 599 * @returns @c 1 if the function succeeded, @c 0 on error. 600 */ 601 602 YAML_DECLARE(int) 603 yaml_sequence_start_event_initialize(yaml_event_t *event, 604 const yaml_char_t *anchor, const yaml_char_t *tag, int implicit, 605 yaml_sequence_style_t style); 606 607 /** 608 * Create a SEQUENCE-END event. 609 * 610 * @param[out] event An empty event object. 611 * 612 * @returns @c 1 if the function succeeded, @c 0 on error. 613 */ 614 615 YAML_DECLARE(int) 616 yaml_sequence_end_event_initialize(yaml_event_t *event); 617 618 /** 619 * Create a MAPPING-START event. 620 * 621 * The @a style argument may be ignored by the emitter. 622 * 623 * Either the @a tag attribute or the @a implicit flag must be set. 624 * 625 * @param[out] event An empty event object. 626 * @param[in] anchor The mapping anchor or @c NULL. 627 * @param[in] tag The mapping tag or @c NULL. 628 * @param[in] implicit If the tag may be omitted. 629 * @param[in] style The mapping style. 630 * 631 * @returns @c 1 if the function succeeded, @c 0 on error. 632 */ 633 634 YAML_DECLARE(int) 635 yaml_mapping_start_event_initialize(yaml_event_t *event, 636 const yaml_char_t *anchor, const yaml_char_t *tag, int implicit, 637 yaml_mapping_style_t style); 638 639 /** 640 * Create a MAPPING-END event. 641 * 642 * @param[out] event An empty event object. 643 * 644 * @returns @c 1 if the function succeeded, @c 0 on error. 645 */ 646 647 YAML_DECLARE(int) 648 yaml_mapping_end_event_initialize(yaml_event_t *event); 649 650 /** 651 * Free any memory allocated for an event object. 652 * 653 * @param[in,out] event An event object. 654 */ 655 656 YAML_DECLARE(void) 657 yaml_event_delete(yaml_event_t *event); 658 659 /** @} */ 660 661 /** 662 * @defgroup nodes Nodes 663 * @{ 664 */ 665 666 /** The tag @c !!null with the only possible value: @c null. */ 667 #define YAML_NULL_TAG "tag:yaml.org,2002:null" 668 /** The tag @c !!bool with the values: @c true and @c false. */ 669 #define YAML_BOOL_TAG "tag:yaml.org,2002:bool" 670 /** The tag @c !!str for string values. */ 671 #define YAML_STR_TAG "tag:yaml.org,2002:str" 672 /** The tag @c !!int for integer values. */ 673 #define YAML_INT_TAG "tag:yaml.org,2002:int" 674 /** The tag @c !!float for float values. */ 675 #define YAML_FLOAT_TAG "tag:yaml.org,2002:float" 676 /** The tag @c !!timestamp for date and time values. */ 677 #define YAML_TIMESTAMP_TAG "tag:yaml.org,2002:timestamp" 678 679 /** The tag @c !!seq is used to denote sequences. */ 680 #define YAML_SEQ_TAG "tag:yaml.org,2002:seq" 681 /** The tag @c !!map is used to denote mapping. */ 682 #define YAML_MAP_TAG "tag:yaml.org,2002:map" 683 684 /** The default scalar tag is @c !!str. */ 685 #define YAML_DEFAULT_SCALAR_TAG YAML_STR_TAG 686 /** The default sequence tag is @c !!seq. */ 687 #define YAML_DEFAULT_SEQUENCE_TAG YAML_SEQ_TAG 688 /** The default mapping tag is @c !!map. */ 689 #define YAML_DEFAULT_MAPPING_TAG YAML_MAP_TAG 690 691 /** Node types. */ 692 typedef enum yaml_node_type_e { 693 /** An empty node. */ 694 YAML_NO_NODE, 695 696 /** A scalar node. */ 697 YAML_SCALAR_NODE, 698 /** A sequence node. */ 699 YAML_SEQUENCE_NODE, 700 /** A mapping node. */ 701 YAML_MAPPING_NODE 702 } yaml_node_type_t; 703 704 /** The forward definition of a document node structure. */ 705 typedef struct yaml_node_s yaml_node_t; 706 707 /** An element of a sequence node. */ 708 typedef int yaml_node_item_t; 709 710 /** An element of a mapping node. */ 711 typedef struct yaml_node_pair_s { 712 /** The key of the element. */ 713 int key; 714 /** The value of the element. */ 715 int value; 716 } yaml_node_pair_t; 717 718 /** The node structure. */ 719 struct yaml_node_s { 720 721 /** The node type. */ 722 yaml_node_type_t type; 723 724 /** The node tag. */ 725 yaml_char_t *tag; 726 727 /** The node data. */ 728 union { 729 730 /** The scalar parameters (for @c YAML_SCALAR_NODE). */ 731 struct { 732 /** The scalar value. */ 733 yaml_char_t *value; 734 /** The length of the scalar value. */ 735 size_t length; 736 /** The scalar style. */ 737 yaml_scalar_style_t style; 738 } scalar; 739 740 /** The sequence parameters (for @c YAML_SEQUENCE_NODE). */ 741 struct { 742 /** The stack of sequence items. */ 743 struct { 744 /** The beginning of the stack. */ 745 yaml_node_item_t *start; 746 /** The end of the stack. */ 747 yaml_node_item_t *end; 748 /** The top of the stack. */ 749 yaml_node_item_t *top; 750 } items; 751 /** The sequence style. */ 752 yaml_sequence_style_t style; 753 } sequence; 754 755 /** The mapping parameters (for @c YAML_MAPPING_NODE). */ 756 struct { 757 /** The stack of mapping pairs (key, value). */ 758 struct { 759 /** The beginning of the stack. */ 760 yaml_node_pair_t *start; 761 /** The end of the stack. */ 762 yaml_node_pair_t *end; 763 /** The top of the stack. */ 764 yaml_node_pair_t *top; 765 } pairs; 766 /** The mapping style. */ 767 yaml_mapping_style_t style; 768 } mapping; 769 770 } data; 771 772 /** The beginning of the node. */ 773 yaml_mark_t start_mark; 774 /** The end of the node. */ 775 yaml_mark_t end_mark; 776 777 }; 778 779 /** The document structure. */ 780 typedef struct yaml_document_s { 781 782 /** The document nodes. */ 783 struct { 784 /** The beginning of the stack. */ 785 yaml_node_t *start; 786 /** The end of the stack. */ 787 yaml_node_t *end; 788 /** The top of the stack. */ 789 yaml_node_t *top; 790 } nodes; 791 792 /** The version directive. */ 793 yaml_version_directive_t *version_directive; 794 795 /** The list of tag directives. */ 796 struct { 797 /** The beginning of the tag directives list. */ 798 yaml_tag_directive_t *start; 799 /** The end of the tag directives list. */ 800 yaml_tag_directive_t *end; 801 } tag_directives; 802 803 /** Is the document start indicator implicit? */ 804 int start_implicit; 805 /** Is the document end indicator implicit? */ 806 int end_implicit; 807 808 /** The beginning of the document. */ 809 yaml_mark_t start_mark; 810 /** The end of the document. */ 811 yaml_mark_t end_mark; 812 813 } yaml_document_t; 814 815 /** 816 * Create a YAML document. 817 * 818 * @param[out] document An empty document object. 819 * @param[in] version_directive The %YAML directive value or 820 * @c NULL. 821 * @param[in] tag_directives_start The beginning of the %TAG 822 * directives list. 823 * @param[in] tag_directives_end The end of the %TAG directives 824 * list. 825 * @param[in] start_implicit If the document start indicator is 826 * implicit. 827 * @param[in] end_implicit If the document end indicator is 828 * implicit. 829 * 830 * @returns @c 1 if the function succeeded, @c 0 on error. 831 */ 832 833 YAML_DECLARE(int) 834 yaml_document_initialize(yaml_document_t *document, 835 yaml_version_directive_t *version_directive, 836 yaml_tag_directive_t *tag_directives_start, 837 yaml_tag_directive_t *tag_directives_end, 838 int start_implicit, int end_implicit); 839 840 /** 841 * Delete a YAML document and all its nodes. 842 * 843 * @param[in,out] document A document object. 844 */ 845 846 YAML_DECLARE(void) 847 yaml_document_delete(yaml_document_t *document); 848 849 /** 850 * Get a node of a YAML document. 851 * 852 * The pointer returned by this function is valid until any of the functions 853 * modifying the documents are called. 854 * 855 * @param[in] document A document object. 856 * @param[in] index The node id. 857 * 858 * @returns the node objct or @c NULL if @c node_id is out of range. 859 */ 860 861 YAML_DECLARE(yaml_node_t *) 862 yaml_document_get_node(yaml_document_t *document, int index); 863 864 /** 865 * Get the root of a YAML document node. 866 * 867 * The root object is the first object added to the document. 868 * 869 * The pointer returned by this function is valid until any of the functions 870 * modifying the documents are called. 871 * 872 * An empty document produced by the parser signifies the end of a YAML 873 * stream. 874 * 875 * @param[in] document A document object. 876 * 877 * @returns the node object or @c NULL if the document is empty. 878 */ 879 880 YAML_DECLARE(yaml_node_t *) 881 yaml_document_get_root_node(yaml_document_t *document); 882 883 /** 884 * Create a SCALAR node and attach it to the document. 885 * 886 * The @a style argument may be ignored by the emitter. 887 * 888 * @param[in,out] document A document object. 889 * @param[in] tag The scalar tag. 890 * @param[in] value The scalar value. 891 * @param[in] length The length of the scalar value. 892 * @param[in] style The scalar style. 893 * 894 * @returns the node id or @c 0 on error. 895 */ 896 897 YAML_DECLARE(int) 898 yaml_document_add_scalar(yaml_document_t *document, 899 const yaml_char_t *tag, const yaml_char_t *value, int length, 900 yaml_scalar_style_t style); 901 902 /** 903 * Create a SEQUENCE node and attach it to the document. 904 * 905 * The @a style argument may be ignored by the emitter. 906 * 907 * @param[in,out] document A document object. 908 * @param[in] tag The sequence tag. 909 * @param[in] style The sequence style. 910 * 911 * @returns the node id or @c 0 on error. 912 */ 913 914 YAML_DECLARE(int) 915 yaml_document_add_sequence(yaml_document_t *document, 916 const yaml_char_t *tag, yaml_sequence_style_t style); 917 918 /** 919 * Create a MAPPING node and attach it to the document. 920 * 921 * The @a style argument may be ignored by the emitter. 922 * 923 * @param[in,out] document A document object. 924 * @param[in] tag The sequence tag. 925 * @param[in] style The sequence style. 926 * 927 * @returns the node id or @c 0 on error. 928 */ 929 930 YAML_DECLARE(int) 931 yaml_document_add_mapping(yaml_document_t *document, 932 const yaml_char_t *tag, yaml_mapping_style_t style); 933 934 /** 935 * Add an item to a SEQUENCE node. 936 * 937 * @param[in,out] document A document object. 938 * @param[in] sequence The sequence node id. 939 * @param[in] item The item node id. 940 * 941 * @returns @c 1 if the function succeeded, @c 0 on error. 942 */ 943 944 YAML_DECLARE(int) 945 yaml_document_append_sequence_item(yaml_document_t *document, 946 int sequence, int item); 947 948 /** 949 * Add a pair of a key and a value to a MAPPING node. 950 * 951 * @param[in,out] document A document object. 952 * @param[in] mapping The mapping node id. 953 * @param[in] key The key node id. 954 * @param[in] value The value node id. 955 * 956 * @returns @c 1 if the function succeeded, @c 0 on error. 957 */ 958 959 YAML_DECLARE(int) 960 yaml_document_append_mapping_pair(yaml_document_t *document, 961 int mapping, int key, int value); 962 963 /** @} */ 964 965 /** 966 * @defgroup parser Parser Definitions 967 * @{ 968 */ 969 970 /** 971 * The prototype of a read handler. 972 * 973 * The read handler is called when the parser needs to read more bytes from the 974 * source. The handler should write not more than @a size bytes to the @a 975 * buffer. The number of written bytes should be set to the @a length variable. 976 * 977 * @param[in,out] data A pointer to an application data specified by 978 * yaml_parser_set_input(). 979 * @param[out] buffer The buffer to write the data from the source. 980 * @param[in] size The size of the buffer. 981 * @param[out] size_read The actual number of bytes read from the source. 982 * 983 * @returns On success, the handler should return @c 1. If the handler failed, 984 * the returned value should be @c 0. On EOF, the handler should set the 985 * @a size_read to @c 0 and return @c 1. 986 */ 987 988 typedef int yaml_read_handler_t(void *data, unsigned char *buffer, size_t size, 989 size_t *size_read); 990 991 /** 992 * This structure holds information about a potential simple key. 993 */ 994 995 typedef struct yaml_simple_key_s { 996 /** Is a simple key possible? */ 997 int possible; 998 999 /** Is a simple key required? */ 1000 int required; 1001 1002 /** The number of the token. */ 1003 size_t token_number; 1004 1005 /** The position mark. */ 1006 yaml_mark_t mark; 1007 } yaml_simple_key_t; 1008 1009 /** 1010 * The states of the parser. 1011 */ 1012 typedef enum yaml_parser_state_e { 1013 /** Expect STREAM-START. */ 1014 YAML_PARSE_STREAM_START_STATE, 1015 /** Expect the beginning of an implicit document. */ 1016 YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE, 1017 /** Expect DOCUMENT-START. */ 1018 YAML_PARSE_DOCUMENT_START_STATE, 1019 /** Expect the content of a document. */ 1020 YAML_PARSE_DOCUMENT_CONTENT_STATE, 1021 /** Expect DOCUMENT-END. */ 1022 YAML_PARSE_DOCUMENT_END_STATE, 1023 1024 /** Expect a block node. */ 1025 YAML_PARSE_BLOCK_NODE_STATE, 1026 /** Expect a block node or indentless sequence. */ 1027 YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE, 1028 /** Expect a flow node. */ 1029 YAML_PARSE_FLOW_NODE_STATE, 1030 /** Expect the first entry of a block sequence. */ 1031 YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE, 1032 /** Expect an entry of a block sequence. */ 1033 YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE, 1034 1035 /** Expect an entry of an indentless sequence. */ 1036 YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE, 1037 /** Expect the first key of a block mapping. */ 1038 YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE, 1039 /** Expect a block mapping key. */ 1040 YAML_PARSE_BLOCK_MAPPING_KEY_STATE, 1041 /** Expect a block mapping value. */ 1042 YAML_PARSE_BLOCK_MAPPING_VALUE_STATE, 1043 /** Expect the first entry of a flow sequence. */ 1044 YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE, 1045 1046 /** Expect an entry of a flow sequence. */ 1047 YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE, 1048 /** Expect a key of an ordered mapping. */ 1049 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE, 1050 /** Expect a value of an ordered mapping. */ 1051 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE, 1052 /** Expect the and of an ordered mapping entry. */ 1053 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE, 1054 /** Expect the first key of a flow mapping. */ 1055 YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE, 1056 /** Expect a key of a flow mapping. */ 1057 1058 YAML_PARSE_FLOW_MAPPING_KEY_STATE, 1059 /** Expect a value of a flow mapping. */ 1060 YAML_PARSE_FLOW_MAPPING_VALUE_STATE, 1061 /** Expect an empty value of a flow mapping. */ 1062 YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE, 1063 /** Expect nothing. */ 1064 YAML_PARSE_END_STATE 1065 } yaml_parser_state_t; 1066 1067 /** 1068 * This structure holds aliases data. 1069 */ 1070 1071 typedef struct yaml_alias_data_s { 1072 /** The anchor. */ 1073 yaml_char_t *anchor; 1074 /** The node id. */ 1075 int index; 1076 /** The anchor mark. */ 1077 yaml_mark_t mark; 1078 } yaml_alias_data_t; 1079 1080 /** 1081 * The parser structure. 1082 * 1083 * All members are internal. Manage the structure using the @c yaml_parser_ 1084 * family of functions. 1085 */ 1086 1087 typedef struct yaml_parser_s { 1088 1089 /** 1090 * @name Error handling 1091 * @{ 1092 */ 1093 1094 /** Error type. */ 1095 yaml_error_type_t error; 1096 /** Error description. */ 1097 const char *problem; 1098 /** The byte about which the problem occured. */ 1099 size_t problem_offset; 1100 /** The problematic value (@c -1 is none). */ 1101 int problem_value; 1102 /** The problem position. */ 1103 yaml_mark_t problem_mark; 1104 /** The error context. */ 1105 const char *context; 1106 /** The context position. */ 1107 yaml_mark_t context_mark; 1108 1109 /** 1110 * @} 1111 */ 1112 1113 /** 1114 * @name Reader stuff 1115 * @{ 1116 */ 1117 1118 /** Read handler. */ 1119 yaml_read_handler_t *read_handler; 1120 1121 /** A pointer for passing to the read handler. */ 1122 void *read_handler_data; 1123 1124 /** Standard (string or file) input data. */ 1125 union { 1126 /** String input data. */ 1127 struct { 1128 /** The string start pointer. */ 1129 const unsigned char *start; 1130 /** The string end pointer. */ 1131 const unsigned char *end; 1132 /** The string current position. */ 1133 const unsigned char *current; 1134 } string; 1135 1136 /** File input data. */ 1137 FILE *file; 1138 } input; 1139 1140 /** EOF flag */ 1141 int eof; 1142 1143 /** The working buffer. */ 1144 struct { 1145 /** The beginning of the buffer. */ 1146 yaml_char_t *start; 1147 /** The end of the buffer. */ 1148 yaml_char_t *end; 1149 /** The current position of the buffer. */ 1150 yaml_char_t *pointer; 1151 /** The last filled position of the buffer. */ 1152 yaml_char_t *last; 1153 } buffer; 1154 1155 /* The number of unread characters in the buffer. */ 1156 size_t unread; 1157 1158 /** The raw buffer. */ 1159 struct { 1160 /** The beginning of the buffer. */ 1161 unsigned char *start; 1162 /** The end of the buffer. */ 1163 unsigned char *end; 1164 /** The current position of the buffer. */ 1165 unsigned char *pointer; 1166 /** The last filled position of the buffer. */ 1167 unsigned char *last; 1168 } raw_buffer; 1169 1170 /** The input encoding. */ 1171 yaml_encoding_t encoding; 1172 1173 /** The offset of the current position (in bytes). */ 1174 size_t offset; 1175 1176 /** The mark of the current position. */ 1177 yaml_mark_t mark; 1178 1179 /** 1180 * @} 1181 */ 1182 1183 /** 1184 * @name Scanner stuff 1185 * @{ 1186 */ 1187 1188 /** Have we started to scan the input stream? */ 1189 int stream_start_produced; 1190 1191 /** Have we reached the end of the input stream? */ 1192 int stream_end_produced; 1193 1194 /** The number of unclosed '[' and '{' indicators. */ 1195 int flow_level; 1196 1197 /** The tokens queue. */ 1198 struct { 1199 /** The beginning of the tokens queue. */ 1200 yaml_token_t *start; 1201 /** The end of the tokens queue. */ 1202 yaml_token_t *end; 1203 /** The head of the tokens queue. */ 1204 yaml_token_t *head; 1205 /** The tail of the tokens queue. */ 1206 yaml_token_t *tail; 1207 } tokens; 1208 1209 /** The number of tokens fetched from the queue. */ 1210 size_t tokens_parsed; 1211 1212 /** Does the tokens queue contain a token ready for dequeueing. */ 1213 int token_available; 1214 1215 /** The indentation levels stack. */ 1216 struct { 1217 /** The beginning of the stack. */ 1218 int *start; 1219 /** The end of the stack. */ 1220 int *end; 1221 /** The top of the stack. */ 1222 int *top; 1223 } indents; 1224 1225 /** The current indentation level. */ 1226 int indent; 1227 1228 /** May a simple key occur at the current position? */ 1229 int simple_key_allowed; 1230 1231 /** The stack of simple keys. */ 1232 struct { 1233 /** The beginning of the stack. */ 1234 yaml_simple_key_t *start; 1235 /** The end of the stack. */ 1236 yaml_simple_key_t *end; 1237 /** The top of the stack. */ 1238 yaml_simple_key_t *top; 1239 } simple_keys; 1240 1241 /** 1242 * @} 1243 */ 1244 1245 /** 1246 * @name Parser stuff 1247 * @{ 1248 */ 1249 1250 /** The parser states stack. */ 1251 struct { 1252 /** The beginning of the stack. */ 1253 yaml_parser_state_t *start; 1254 /** The end of the stack. */ 1255 yaml_parser_state_t *end; 1256 /** The top of the stack. */ 1257 yaml_parser_state_t *top; 1258 } states; 1259 1260 /** The current parser state. */ 1261 yaml_parser_state_t state; 1262 1263 /** The stack of marks. */ 1264 struct { 1265 /** The beginning of the stack. */ 1266 yaml_mark_t *start; 1267 /** The end of the stack. */ 1268 yaml_mark_t *end; 1269 /** The top of the stack. */ 1270 yaml_mark_t *top; 1271 } marks; 1272 1273 /** The list of TAG directives. */ 1274 struct { 1275 /** The beginning of the list. */ 1276 yaml_tag_directive_t *start; 1277 /** The end of the list. */ 1278 yaml_tag_directive_t *end; 1279 /** The top of the list. */ 1280 yaml_tag_directive_t *top; 1281 } tag_directives; 1282 1283 /** 1284 * @} 1285 */ 1286 1287 /** 1288 * @name Dumper stuff 1289 * @{ 1290 */ 1291 1292 /** The alias data. */ 1293 struct { 1294 /** The beginning of the list. */ 1295 yaml_alias_data_t *start; 1296 /** The end of the list. */ 1297 yaml_alias_data_t *end; 1298 /** The top of the list. */ 1299 yaml_alias_data_t *top; 1300 } aliases; 1301 1302 /** The currently parsed document. */ 1303 yaml_document_t *document; 1304 1305 /** 1306 * @} 1307 */ 1308 1309 } yaml_parser_t; 1310 1311 /** 1312 * Initialize a parser. 1313 * 1314 * This function creates a new parser object. An application is responsible 1315 * for destroying the object using the yaml_parser_delete() function. 1316 * 1317 * @param[out] parser An empty parser object. 1318 * 1319 * @returns @c 1 if the function succeeded, @c 0 on error. 1320 */ 1321 1322 YAML_DECLARE(int) 1323 yaml_parser_initialize(yaml_parser_t *parser); 1324 1325 /** 1326 * Destroy a parser. 1327 * 1328 * @param[in,out] parser A parser object. 1329 */ 1330 1331 YAML_DECLARE(void) 1332 yaml_parser_delete(yaml_parser_t *parser); 1333 1334 /** 1335 * Set a string input. 1336 * 1337 * Note that the @a input pointer must be valid while the @a parser object 1338 * exists. The application is responsible for destroing @a input after 1339 * destroying the @a parser. 1340 * 1341 * @param[in,out] parser A parser object. 1342 * @param[in] input A source data. 1343 * @param[in] size The length of the source data in bytes. 1344 */ 1345 1346 YAML_DECLARE(void) 1347 yaml_parser_set_input_string(yaml_parser_t *parser, 1348 const unsigned char *input, size_t size); 1349 1350 /** 1351 * Set a file input. 1352 * 1353 * @a file should be a file object open for reading. The application is 1354 * responsible for closing the @a file. 1355 * 1356 * @param[in,out] parser A parser object. 1357 * @param[in] file An open file. 1358 */ 1359 1360 YAML_DECLARE(void) 1361 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file); 1362 1363 /** 1364 * Set a generic input handler. 1365 * 1366 * @param[in,out] parser A parser object. 1367 * @param[in] handler A read handler. 1368 * @param[in] data Any application data for passing to the read 1369 * handler. 1370 */ 1371 1372 YAML_DECLARE(void) 1373 yaml_parser_set_input(yaml_parser_t *parser, 1374 yaml_read_handler_t *handler, void *data); 1375 1376 /** 1377 * Set the source encoding. 1378 * 1379 * @param[in,out] parser A parser object. 1380 * @param[in] encoding The source encoding. 1381 */ 1382 1383 YAML_DECLARE(void) 1384 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding); 1385 1386 /** 1387 * Scan the input stream and produce the next token. 1388 * 1389 * Call the function subsequently to produce a sequence of tokens corresponding 1390 * to the input stream. The initial token has the type 1391 * @c YAML_STREAM_START_TOKEN while the ending token has the type 1392 * @c YAML_STREAM_END_TOKEN. 1393 * 1394 * An application is responsible for freeing any buffers associated with the 1395 * produced token object using the @c yaml_token_delete function. 1396 * 1397 * An application must not alternate the calls of yaml_parser_scan() with the 1398 * calls of yaml_parser_parse() or yaml_parser_load(). Doing this will break 1399 * the parser. 1400 * 1401 * @param[in,out] parser A parser object. 1402 * @param[out] token An empty token object. 1403 * 1404 * @returns @c 1 if the function succeeded, @c 0 on error. 1405 */ 1406 1407 YAML_DECLARE(int) 1408 yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token); 1409 1410 /** 1411 * Parse the input stream and produce the next parsing event. 1412 * 1413 * Call the function subsequently to produce a sequence of events corresponding 1414 * to the input stream. The initial event has the type 1415 * @c YAML_STREAM_START_EVENT while the ending event has the type 1416 * @c YAML_STREAM_END_EVENT. 1417 * 1418 * An application is responsible for freeing any buffers associated with the 1419 * produced event object using the yaml_event_delete() function. 1420 * 1421 * An application must not alternate the calls of yaml_parser_parse() with the 1422 * calls of yaml_parser_scan() or yaml_parser_load(). Doing this will break the 1423 * parser. 1424 * 1425 * @param[in,out] parser A parser object. 1426 * @param[out] event An empty event object. 1427 * 1428 * @returns @c 1 if the function succeeded, @c 0 on error. 1429 */ 1430 1431 YAML_DECLARE(int) 1432 yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event); 1433 1434 /** 1435 * Parse the input stream and produce the next YAML document. 1436 * 1437 * Call this function subsequently to produce a sequence of documents 1438 * constituting the input stream. 1439 * 1440 * If the produced document has no root node, it means that the document 1441 * end has been reached. 1442 * 1443 * An application is responsible for freeing any data associated with the 1444 * produced document object using the yaml_document_delete() function. 1445 * 1446 * An application must not alternate the calls of yaml_parser_load() with the 1447 * calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break 1448 * the parser. 1449 * 1450 * @param[in,out] parser A parser object. 1451 * @param[out] document An empty document object. 1452 * 1453 * @returns @c 1 if the function succeeded, @c 0 on error. 1454 */ 1455 1456 YAML_DECLARE(int) 1457 yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document); 1458 1459 /** @} */ 1460 1461 /** 1462 * @defgroup emitter Emitter Definitions 1463 * @{ 1464 */ 1465 1466 /** 1467 * The prototype of a write handler. 1468 * 1469 * The write handler is called when the emitter needs to flush the accumulated 1470 * characters to the output. The handler should write @a size bytes of the 1471 * @a buffer to the output. 1472 * 1473 * @param[in,out] data A pointer to an application data specified by 1474 * yaml_emitter_set_output(). 1475 * @param[in] buffer The buffer with bytes to be written. 1476 * @param[in] size The size of the buffer. 1477 * 1478 * @returns On success, the handler should return @c 1. If the handler failed, 1479 * the returned value should be @c 0. 1480 */ 1481 1482 typedef int yaml_write_handler_t(void *data, unsigned char *buffer, size_t size); 1483 1484 /** The emitter states. */ 1485 typedef enum yaml_emitter_state_e { 1486 /** Expect STREAM-START. */ 1487 YAML_EMIT_STREAM_START_STATE, 1488 /** Expect the first DOCUMENT-START or STREAM-END. */ 1489 YAML_EMIT_FIRST_DOCUMENT_START_STATE, 1490 /** Expect DOCUMENT-START or STREAM-END. */ 1491 YAML_EMIT_DOCUMENT_START_STATE, 1492 /** Expect the content of a document. */ 1493 YAML_EMIT_DOCUMENT_CONTENT_STATE, 1494 /** Expect DOCUMENT-END. */ 1495 YAML_EMIT_DOCUMENT_END_STATE, 1496 1497 /** Expect the first item of a flow sequence. */ 1498 YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE, 1499 /** Expect an item of a flow sequence. */ 1500 YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE, 1501 /** Expect the first key of a flow mapping. */ 1502 YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE, 1503 /** Expect a key of a flow mapping. */ 1504 YAML_EMIT_FLOW_MAPPING_KEY_STATE, 1505 /** Expect a value for a simple key of a flow mapping. */ 1506 YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE, 1507 1508 /** Expect a value of a flow mapping. */ 1509 YAML_EMIT_FLOW_MAPPING_VALUE_STATE, 1510 /** Expect the first item of a block sequence. */ 1511 YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE, 1512 /** Expect an item of a block sequence. */ 1513 YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE, 1514 /** Expect the first key of a block mapping. */ 1515 YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE, 1516 /** Expect the key of a block mapping. */ 1517 YAML_EMIT_BLOCK_MAPPING_KEY_STATE, 1518 1519 /** Expect a value for a simple key of a block mapping. */ 1520 YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE, 1521 /** Expect a value of a block mapping. */ 1522 YAML_EMIT_BLOCK_MAPPING_VALUE_STATE, 1523 /** Expect nothing. */ 1524 YAML_EMIT_END_STATE 1525 } yaml_emitter_state_t; 1526 1527 1528 /* This is needed for C++ */ 1529 1530 typedef struct yaml_anchors_s { 1531 /** The number of references. */ 1532 int references; 1533 /** The anchor id. */ 1534 int anchor; 1535 /** If the node has been emitted? */ 1536 int serialized; 1537 } yaml_anchors_t; 1538 1539 /** 1540 * The emitter structure. 1541 * 1542 * All members are internal. Manage the structure using the @c yaml_emitter_ 1543 * family of functions. 1544 */ 1545 1546 typedef struct yaml_emitter_s { 1547 1548 /** 1549 * @name Error handling 1550 * @{ 1551 */ 1552 1553 /** Error type. */ 1554 yaml_error_type_t error; 1555 /** Error description. */ 1556 const char *problem; 1557 1558 /** 1559 * @} 1560 */ 1561 1562 /** 1563 * @name Writer stuff 1564 * @{ 1565 */ 1566 1567 /** Write handler. */ 1568 yaml_write_handler_t *write_handler; 1569 1570 /** A pointer for passing to the write handler. */ 1571 void *write_handler_data; 1572 1573 /** Standard (string or file) output data. */ 1574 union { 1575 /** String output data. */ 1576 struct { 1577 /** The buffer pointer. */ 1578 unsigned char *buffer; 1579 /** The buffer size. */ 1580 size_t size; 1581 /** The number of written bytes. */ 1582 size_t *size_written; 1583 } string; 1584 1585 /** File output data. */ 1586 FILE *file; 1587 } output; 1588 1589 /** The working buffer. */ 1590 struct { 1591 /** The beginning of the buffer. */ 1592 yaml_char_t *start; 1593 /** The end of the buffer. */ 1594 yaml_char_t *end; 1595 /** The current position of the buffer. */ 1596 yaml_char_t *pointer; 1597 /** The last filled position of the buffer. */ 1598 yaml_char_t *last; 1599 } buffer; 1600 1601 /** The raw buffer. */ 1602 struct { 1603 /** The beginning of the buffer. */ 1604 unsigned char *start; 1605 /** The end of the buffer. */ 1606 unsigned char *end; 1607 /** The current position of the buffer. */ 1608 unsigned char *pointer; 1609 /** The last filled position of the buffer. */ 1610 unsigned char *last; 1611 } raw_buffer; 1612 1613 /** The stream encoding. */ 1614 yaml_encoding_t encoding; 1615 1616 /** 1617 * @} 1618 */ 1619 1620 /** 1621 * @name Emitter stuff 1622 * @{ 1623 */ 1624 1625 /** If the output is in the canonical style? */ 1626 int canonical; 1627 /** The number of indentation spaces. */ 1628 int best_indent; 1629 /** The preferred width of the output lines. */ 1630 int best_width; 1631 /** Allow unescaped non-ASCII characters? */ 1632 int unicode; 1633 /** The preferred line break. */ 1634 yaml_break_t line_break; 1635 1636 /** The stack of states. */ 1637 struct { 1638 /** The beginning of the stack. */ 1639 yaml_emitter_state_t *start; 1640 /** The end of the stack. */ 1641 yaml_emitter_state_t *end; 1642 /** The top of the stack. */ 1643 yaml_emitter_state_t *top; 1644 } states; 1645 1646 /** The current emitter state. */ 1647 yaml_emitter_state_t state; 1648 1649 /** The event queue. */ 1650 struct { 1651 /** The beginning of the event queue. */ 1652 yaml_event_t *start; 1653 /** The end of the event queue. */ 1654 yaml_event_t *end; 1655 /** The head of the event queue. */ 1656 yaml_event_t *head; 1657 /** The tail of the event queue. */ 1658 yaml_event_t *tail; 1659 } events; 1660 1661 /** The stack of indentation levels. */ 1662 struct { 1663 /** The beginning of the stack. */ 1664 int *start; 1665 /** The end of the stack. */ 1666 int *end; 1667 /** The top of the stack. */ 1668 int *top; 1669 } indents; 1670 1671 /** The list of tag directives. */ 1672 struct { 1673 /** The beginning of the list. */ 1674 yaml_tag_directive_t *start; 1675 /** The end of the list. */ 1676 yaml_tag_directive_t *end; 1677 /** The top of the list. */ 1678 yaml_tag_directive_t *top; 1679 } tag_directives; 1680 1681 /** The current indentation level. */ 1682 int indent; 1683 1684 /** The current flow level. */ 1685 int flow_level; 1686 1687 /** Is it the document root context? */ 1688 int root_context; 1689 /** Is it a sequence context? */ 1690 int sequence_context; 1691 /** Is it a mapping context? */ 1692 int mapping_context; 1693 /** Is it a simple mapping key context? */ 1694 int simple_key_context; 1695 1696 /** The current line. */ 1697 int line; 1698 /** The current column. */ 1699 int column; 1700 /** If the last character was a whitespace? */ 1701 int whitespace; 1702 /** If the last character was an indentation character (' ', '-', '?', ':')? */ 1703 int indention; 1704 /** If an explicit document end is required? */ 1705 int open_ended; 1706 1707 /** Anchor analysis. */ 1708 struct { 1709 /** The anchor value. */ 1710 yaml_char_t *anchor; 1711 /** The anchor length. */ 1712 size_t anchor_length; 1713 /** Is it an alias? */ 1714 int alias; 1715 } anchor_data; 1716 1717 /** Tag analysis. */ 1718 struct { 1719 /** The tag handle. */ 1720 yaml_char_t *handle; 1721 /** The tag handle length. */ 1722 size_t handle_length; 1723 /** The tag suffix. */ 1724 yaml_char_t *suffix; 1725 /** The tag suffix length. */ 1726 size_t suffix_length; 1727 } tag_data; 1728 1729 /** Scalar analysis. */ 1730 struct { 1731 /** The scalar value. */ 1732 yaml_char_t *value; 1733 /** The scalar length. */ 1734 size_t length; 1735 /** Does the scalar contain line breaks? */ 1736 int multiline; 1737 /** Can the scalar be expessed in the flow plain style? */ 1738 int flow_plain_allowed; 1739 /** Can the scalar be expressed in the block plain style? */ 1740 int block_plain_allowed; 1741 /** Can the scalar be expressed in the single quoted style? */ 1742 int single_quoted_allowed; 1743 /** Can the scalar be expressed in the literal or folded styles? */ 1744 int block_allowed; 1745 /** The output style. */ 1746 yaml_scalar_style_t style; 1747 } scalar_data; 1748 1749 /** 1750 * @} 1751 */ 1752 1753 /** 1754 * @name Dumper stuff 1755 * @{ 1756 */ 1757 1758 /** If the stream was already opened? */ 1759 int opened; 1760 /** If the stream was already closed? */ 1761 int closed; 1762 1763 /** The information associated with the document nodes. */ 1764 yaml_anchors_t *anchors; 1765 1766 /** The last assigned anchor id. */ 1767 int last_anchor_id; 1768 1769 /** The currently emitted document. */ 1770 yaml_document_t *document; 1771 1772 /** 1773 * @} 1774 */ 1775 1776 } yaml_emitter_t; 1777 1778 /** 1779 * Initialize an emitter. 1780 * 1781 * This function creates a new emitter object. An application is responsible 1782 * for destroying the object using the yaml_emitter_delete() function. 1783 * 1784 * @param[out] emitter An empty parser object. 1785 * 1786 * @returns @c 1 if the function succeeded, @c 0 on error. 1787 */ 1788 1789 YAML_DECLARE(int) 1790 yaml_emitter_initialize(yaml_emitter_t *emitter); 1791 1792 /** 1793 * Destroy an emitter. 1794 * 1795 * @param[in,out] emitter An emitter object. 1796 */ 1797 1798 YAML_DECLARE(void) 1799 yaml_emitter_delete(yaml_emitter_t *emitter); 1800 1801 /** 1802 * Set a string output. 1803 * 1804 * The emitter will write the output characters to the @a output buffer of the 1805 * size @a size. The emitter will set @a size_written to the number of written 1806 * bytes. If the buffer is smaller than required, the emitter produces the 1807 * YAML_WRITE_ERROR error. 1808 * 1809 * @param[in,out] emitter An emitter object. 1810 * @param[in] output An output buffer. 1811 * @param[in] size The buffer size. 1812 * @param[in] size_written The pointer to save the number of written 1813 * bytes. 1814 */ 1815 1816 YAML_DECLARE(void) 1817 yaml_emitter_set_output_string(yaml_emitter_t *emitter, 1818 unsigned char *output, size_t size, size_t *size_written); 1819 1820 /** 1821 * Set a file output. 1822 * 1823 * @a file should be a file object open for writing. The application is 1824 * responsible for closing the @a file. 1825 * 1826 * @param[in,out] emitter An emitter object. 1827 * @param[in] file An open file. 1828 */ 1829 1830 YAML_DECLARE(void) 1831 yaml_emitter_set_output_file(yaml_emitter_t *emitter, FILE *file); 1832 1833 /** 1834 * Set a generic output handler. 1835 * 1836 * @param[in,out] emitter An emitter object. 1837 * @param[in] handler A write handler. 1838 * @param[in] data Any application data for passing to the write 1839 * handler. 1840 */ 1841 1842 YAML_DECLARE(void) 1843 yaml_emitter_set_output(yaml_emitter_t *emitter, 1844 yaml_write_handler_t *handler, void *data); 1845 1846 /** 1847 * Set the output encoding. 1848 * 1849 * @param[in,out] emitter An emitter object. 1850 * @param[in] encoding The output encoding. 1851 */ 1852 1853 YAML_DECLARE(void) 1854 yaml_emitter_set_encoding(yaml_emitter_t *emitter, yaml_encoding_t encoding); 1855 1856 /** 1857 * Set if the output should be in the "canonical" format as in the YAML 1858 * specification. 1859 * 1860 * @param[in,out] emitter An emitter object. 1861 * @param[in] canonical If the output is canonical. 1862 */ 1863 1864 YAML_DECLARE(void) 1865 yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical); 1866 1867 /** 1868 * Set the indentation increment. 1869 * 1870 * @param[in,out] emitter An emitter object. 1871 * @param[in] indent The indentation increment (1 < . < 10). 1872 */ 1873 1874 YAML_DECLARE(void) 1875 yaml_emitter_set_indent(yaml_emitter_t *emitter, int indent); 1876 1877 /** 1878 * Set the preferred line width. @c -1 means unlimited. 1879 * 1880 * @param[in,out] emitter An emitter object. 1881 * @param[in] width The preferred line width. 1882 */ 1883 1884 YAML_DECLARE(void) 1885 yaml_emitter_set_width(yaml_emitter_t *emitter, int width); 1886 1887 /** 1888 * Set if unescaped non-ASCII characters are allowed. 1889 * 1890 * @param[in,out] emitter An emitter object. 1891 * @param[in] unicode If unescaped Unicode characters are allowed. 1892 */ 1893 1894 YAML_DECLARE(void) 1895 yaml_emitter_set_unicode(yaml_emitter_t *emitter, int unicode); 1896 1897 /** 1898 * Set the preferred line break. 1899 * 1900 * @param[in,out] emitter An emitter object. 1901 * @param[in] line_break The preferred line break. 1902 */ 1903 1904 YAML_DECLARE(void) 1905 yaml_emitter_set_break(yaml_emitter_t *emitter, yaml_break_t line_break); 1906 1907 /** 1908 * Emit an event. 1909 * 1910 * The event object may be generated using the yaml_parser_parse() function. 1911 * The emitter takes the responsibility for the event object and destroys its 1912 * content after it is emitted. The event object is destroyed even if the 1913 * function fails. 1914 * 1915 * @param[in,out] emitter An emitter object. 1916 * @param[in,out] event An event object. 1917 * 1918 * @returns @c 1 if the function succeeded, @c 0 on error. 1919 */ 1920 1921 YAML_DECLARE(int) 1922 yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event); 1923 1924 /** 1925 * Start a YAML stream. 1926 * 1927 * This function should be used before yaml_emitter_dump() is called. 1928 * 1929 * @param[in,out] emitter An emitter object. 1930 * 1931 * @returns @c 1 if the function succeeded, @c 0 on error. 1932 */ 1933 1934 YAML_DECLARE(int) 1935 yaml_emitter_open(yaml_emitter_t *emitter); 1936 1937 /** 1938 * Finish a YAML stream. 1939 * 1940 * This function should be used after yaml_emitter_dump() is called. 1941 * 1942 * @param[in,out] emitter An emitter object. 1943 * 1944 * @returns @c 1 if the function succeeded, @c 0 on error. 1945 */ 1946 1947 YAML_DECLARE(int) 1948 yaml_emitter_close(yaml_emitter_t *emitter); 1949 1950 /** 1951 * Emit a YAML document. 1952 * 1953 * The documen object may be generated using the yaml_parser_load() function 1954 * or the yaml_document_initialize() function. The emitter takes the 1955 * responsibility for the document object and destroys its content after 1956 * it is emitted. The document object is destroyed even if the function fails. 1957 * 1958 * @param[in,out] emitter An emitter object. 1959 * @param[in,out] document A document object. 1960 * 1961 * @returns @c 1 if the function succeeded, @c 0 on error. 1962 */ 1963 1964 YAML_DECLARE(int) 1965 yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document); 1966 1967 /** 1968 * Flush the accumulated characters to the output. 1969 * 1970 * @param[in,out] emitter An emitter object. 1971 * 1972 * @returns @c 1 if the function succeeded, @c 0 on error. 1973 */ 1974 1975 YAML_DECLARE(int) 1976 yaml_emitter_flush(yaml_emitter_t *emitter); 1977 1978 /** @} */ 1979 1980 #ifdef __cplusplus 1981 } 1982 #endif 1983 1984 #endif /* #ifndef YAML_H */ 1985 1986