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 #define YAML_DECLARE(type) static type 30 31 /** @} */ 32 33 /** 34 * @defgroup basic Basic Types 35 * @{ 36 */ 37 38 /** The character type (UTF-8 octet). */ 39 typedef unsigned char yaml_char_t; 40 41 /** The version directive data. */ 42 typedef struct yaml_version_directive_s { 43 /** The major version number. */ 44 int major; 45 /** The minor version number. */ 46 int minor; 47 } yaml_version_directive_t; 48 49 /** The tag directive data. */ 50 typedef struct yaml_tag_directive_s { 51 /** The tag handle. */ 52 yaml_char_t *handle; 53 /** The tag prefix. */ 54 yaml_char_t *prefix; 55 } yaml_tag_directive_t; 56 57 /** The stream encoding. */ 58 typedef enum yaml_encoding_e { 59 /** Let the parser choose the encoding. */ 60 YAML_ANY_ENCODING, 61 /** The default UTF-8 encoding. */ 62 YAML_UTF8_ENCODING, 63 /** The UTF-16-LE encoding with BOM. */ 64 YAML_UTF16LE_ENCODING, 65 /** The UTF-16-BE encoding with BOM. */ 66 YAML_UTF16BE_ENCODING 67 } yaml_encoding_t; 68 69 /** Line break types. */ 70 71 typedef enum yaml_break_e { 72 /** Let the parser choose the break type. */ 73 YAML_ANY_BREAK, 74 /** Use CR for line breaks (Mac style). */ 75 YAML_CR_BREAK, 76 /** Use LN for line breaks (Unix style). */ 77 YAML_LN_BREAK, 78 /** Use CR LN for line breaks (DOS style). */ 79 YAML_CRLN_BREAK 80 } yaml_break_t; 81 82 /** Many bad things could happen with the parser and emitter. */ 83 typedef enum yaml_error_type_e { 84 /** No error is produced. */ 85 YAML_NO_ERROR, 86 87 /** Cannot allocate or reallocate a block of memory. */ 88 YAML_MEMORY_ERROR, 89 90 /** Cannot read or decode the input stream. */ 91 YAML_READER_ERROR, 92 /** Cannot scan the input stream. */ 93 YAML_SCANNER_ERROR, 94 /** Cannot parse the input stream. */ 95 YAML_PARSER_ERROR, 96 /** Cannot compose a YAML document. */ 97 YAML_COMPOSER_ERROR, 98 99 /** Cannot write to the output stream. */ 100 YAML_WRITER_ERROR, 101 /** Cannot emit a YAML stream. */ 102 YAML_EMITTER_ERROR 103 } yaml_error_type_t; 104 105 /** The pointer position. */ 106 typedef struct yaml_mark_s { 107 /** The position index. */ 108 size_t index; 109 110 /** The position line. */ 111 size_t line; 112 113 /** The position column. */ 114 size_t column; 115 } yaml_mark_t; 116 117 /** @} */ 118 119 /** 120 * @defgroup styles Node Styles 121 * @{ 122 */ 123 124 /** Scalar styles. */ 125 typedef enum yaml_scalar_style_e { 126 /** Let the emitter choose the style. */ 127 YAML_ANY_SCALAR_STYLE, 128 129 /** The plain scalar style. */ 130 YAML_PLAIN_SCALAR_STYLE, 131 132 /** The single-quoted scalar style. */ 133 YAML_SINGLE_QUOTED_SCALAR_STYLE, 134 /** The double-quoted scalar style. */ 135 YAML_DOUBLE_QUOTED_SCALAR_STYLE, 136 137 /** The literal scalar style. */ 138 YAML_LITERAL_SCALAR_STYLE, 139 /** The folded scalar style. */ 140 YAML_FOLDED_SCALAR_STYLE 141 } yaml_scalar_style_t; 142 143 /** Sequence styles. */ 144 typedef enum yaml_sequence_style_e { 145 /** Let the emitter choose the style. */ 146 YAML_ANY_SEQUENCE_STYLE, 147 148 /** The block sequence style. */ 149 YAML_BLOCK_SEQUENCE_STYLE, 150 /** The flow sequence style. */ 151 YAML_FLOW_SEQUENCE_STYLE 152 } yaml_sequence_style_t; 153 154 /** Mapping styles. */ 155 typedef enum yaml_mapping_style_e { 156 /** Let the emitter choose the style. */ 157 YAML_ANY_MAPPING_STYLE, 158 159 /** The block mapping style. */ 160 YAML_BLOCK_MAPPING_STYLE, 161 /** The flow mapping style. */ 162 YAML_FLOW_MAPPING_STYLE 163 /* YAML_FLOW_SET_MAPPING_STYLE */ 164 } yaml_mapping_style_t; 165 166 /** @} */ 167 168 /** 169 * @defgroup tokens Tokens 170 * @{ 171 */ 172 173 /** Token types. */ 174 typedef enum yaml_token_type_e { 175 /** An empty token. */ 176 YAML_NO_TOKEN, 177 178 /** A STREAM-START token. */ 179 YAML_STREAM_START_TOKEN, 180 /** A STREAM-END token. */ 181 YAML_STREAM_END_TOKEN, 182 183 /** A VERSION-DIRECTIVE token. */ 184 YAML_VERSION_DIRECTIVE_TOKEN, 185 /** A TAG-DIRECTIVE token. */ 186 YAML_TAG_DIRECTIVE_TOKEN, 187 /** A DOCUMENT-START token. */ 188 YAML_DOCUMENT_START_TOKEN, 189 /** A DOCUMENT-END token. */ 190 YAML_DOCUMENT_END_TOKEN, 191 192 /** A BLOCK-SEQUENCE-START token. */ 193 YAML_BLOCK_SEQUENCE_START_TOKEN, 194 /** A BLOCK-MAPPING-START token. */ 195 YAML_BLOCK_MAPPING_START_TOKEN, 196 /** A BLOCK-END token. */ 197 YAML_BLOCK_END_TOKEN, 198 199 /** A FLOW-SEQUENCE-START token. */ 200 YAML_FLOW_SEQUENCE_START_TOKEN, 201 /** A FLOW-SEQUENCE-END token. */ 202 YAML_FLOW_SEQUENCE_END_TOKEN, 203 /** A FLOW-MAPPING-START token. */ 204 YAML_FLOW_MAPPING_START_TOKEN, 205 /** A FLOW-MAPPING-END token. */ 206 YAML_FLOW_MAPPING_END_TOKEN, 207 208 /** A BLOCK-ENTRY token. */ 209 YAML_BLOCK_ENTRY_TOKEN, 210 /** A FLOW-ENTRY token. */ 211 YAML_FLOW_ENTRY_TOKEN, 212 /** A KEY token. */ 213 YAML_KEY_TOKEN, 214 /** A VALUE token. */ 215 YAML_VALUE_TOKEN, 216 217 /** An ALIAS token. */ 218 YAML_ALIAS_TOKEN, 219 /** An ANCHOR token. */ 220 YAML_ANCHOR_TOKEN, 221 /** A TAG token. */ 222 YAML_TAG_TOKEN, 223 /** A SCALAR token. */ 224 YAML_SCALAR_TOKEN 225 } yaml_token_type_t; 226 227 /** The token structure. */ 228 typedef struct yaml_token_s { 229 230 /** The token type. */ 231 yaml_token_type_t type; 232 233 /** The token data. */ 234 union { 235 236 /** The stream start (for @c YAML_STREAM_START_TOKEN). */ 237 struct { 238 /** The stream encoding. */ 239 yaml_encoding_t encoding; 240 } stream_start; 241 242 /** The alias (for @c YAML_ALIAS_TOKEN). */ 243 struct { 244 /** The alias value. */ 245 yaml_char_t *value; 246 } alias; 247 248 /** The anchor (for @c YAML_ANCHOR_TOKEN). */ 249 struct { 250 /** The anchor value. */ 251 yaml_char_t *value; 252 } anchor; 253 254 /** The tag (for @c YAML_TAG_TOKEN). */ 255 struct { 256 /** The tag handle. */ 257 yaml_char_t *handle; 258 /** The tag suffix. */ 259 yaml_char_t *suffix; 260 } tag; 261 262 /** The scalar value (for @c YAML_SCALAR_TOKEN). */ 263 struct { 264 /** The scalar value. */ 265 yaml_char_t *value; 266 /** The length of the scalar value. */ 267 size_t length; 268 /** The scalar style. */ 269 yaml_scalar_style_t style; 270 } scalar; 271 272 /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */ 273 struct { 274 /** The major version number. */ 275 int major; 276 /** The minor version number. */ 277 int minor; 278 } version_directive; 279 280 /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */ 281 struct { 282 /** The tag handle. */ 283 yaml_char_t *handle; 284 /** The tag prefix. */ 285 yaml_char_t *prefix; 286 } tag_directive; 287 288 } data; 289 290 /** The beginning of the token. */ 291 yaml_mark_t start_mark; 292 /** The end of the token. */ 293 yaml_mark_t end_mark; 294 295 } yaml_token_t; 296 297 /** 298 * Free any memory allocated for a token object. 299 * 300 * @param[in,out] token A token object. 301 */ 302 303 YAML_DECLARE(void) 304 yaml_token_delete(yaml_token_t *token); 305 306 /** @} */ 307 308 /** 309 * @defgroup events Events 310 * @{ 311 */ 312 313 /** Event types. */ 314 typedef enum yaml_event_type_e { 315 /** An empty event. */ 316 YAML_NO_EVENT, 317 318 /** A STREAM-START event. */ 319 YAML_STREAM_START_EVENT, 320 /** A STREAM-END event. */ 321 YAML_STREAM_END_EVENT, 322 323 /** A DOCUMENT-START event. */ 324 YAML_DOCUMENT_START_EVENT, 325 /** A DOCUMENT-END event. */ 326 YAML_DOCUMENT_END_EVENT, 327 328 /** An ALIAS event. */ 329 YAML_ALIAS_EVENT, 330 /** A SCALAR event. */ 331 YAML_SCALAR_EVENT, 332 333 /** A SEQUENCE-START event. */ 334 YAML_SEQUENCE_START_EVENT, 335 /** A SEQUENCE-END event. */ 336 YAML_SEQUENCE_END_EVENT, 337 338 /** A MAPPING-START event. */ 339 YAML_MAPPING_START_EVENT, 340 /** A MAPPING-END event. */ 341 YAML_MAPPING_END_EVENT 342 } yaml_event_type_t; 343 344 /** The event structure. */ 345 typedef struct yaml_event_s { 346 347 /** The event type. */ 348 yaml_event_type_t type; 349 350 /** The event data. */ 351 union { 352 353 /** The stream parameters (for @c YAML_STREAM_START_EVENT). */ 354 struct { 355 /** The document encoding. */ 356 yaml_encoding_t encoding; 357 } stream_start; 358 359 /** The document parameters (for @c YAML_DOCUMENT_START_EVENT). */ 360 struct { 361 /** The version directive. */ 362 yaml_version_directive_t *version_directive; 363 364 /** The list of tag directives. */ 365 struct { 366 /** The beginning of the tag directives list. */ 367 yaml_tag_directive_t *start; 368 /** The end of the tag directives list. */ 369 yaml_tag_directive_t *end; 370 } tag_directives; 371 372 /** Is the document indicator implicit? */ 373 int implicit; 374 } document_start; 375 376 /** The document end parameters (for @c YAML_DOCUMENT_END_EVENT). */ 377 struct { 378 /** Is the document end indicator implicit? */ 379 int implicit; 380 } document_end; 381 382 /** The alias parameters (for @c YAML_ALIAS_EVENT). */ 383 struct { 384 /** The anchor. */ 385 yaml_char_t *anchor; 386 } alias; 387 388 /** The scalar parameters (for @c YAML_SCALAR_EVENT). */ 389 struct { 390 /** The anchor. */ 391 yaml_char_t *anchor; 392 /** The tag. */ 393 yaml_char_t *tag; 394 /** The scalar value. */ 395 yaml_char_t *value; 396 /** The length of the scalar value. */ 397 size_t length; 398 /** Is the tag optional for the plain style? */ 399 int plain_implicit; 400 /** Is the tag optional for any non-plain style? */ 401 int quoted_implicit; 402 /** The scalar style. */ 403 yaml_scalar_style_t style; 404 } scalar; 405 406 /** The sequence parameters (for @c YAML_SEQUENCE_START_EVENT). */ 407 struct { 408 /** The anchor. */ 409 yaml_char_t *anchor; 410 /** The tag. */ 411 yaml_char_t *tag; 412 /** Is the tag optional? */ 413 int implicit; 414 /** The sequence style. */ 415 yaml_sequence_style_t style; 416 } sequence_start; 417 418 /** The mapping parameters (for @c YAML_MAPPING_START_EVENT). */ 419 struct { 420 /** The anchor. */ 421 yaml_char_t *anchor; 422 /** The tag. */ 423 yaml_char_t *tag; 424 /** Is the tag optional? */ 425 int implicit; 426 /** The mapping style. */ 427 yaml_mapping_style_t style; 428 } mapping_start; 429 430 } data; 431 432 /** The beginning of the event. */ 433 yaml_mark_t start_mark; 434 /** The end of the event. */ 435 yaml_mark_t end_mark; 436 437 } yaml_event_t; 438 439 /** @} */ 440 441 /** 442 * @defgroup nodes Nodes 443 * @{ 444 */ 445 446 /** The tag @c !!null with the only possible value: @c null. */ 447 #define YAML_NULL_TAG "tag:yaml.org,2002:null" 448 /** The tag @c !!bool with the values: @c true and @c false. */ 449 #define YAML_BOOL_TAG "tag:yaml.org,2002:bool" 450 /** The tag @c !!str for string values. */ 451 #define YAML_STR_TAG "tag:yaml.org,2002:str" 452 /** The tag @c !!int for integer values. */ 453 #define YAML_INT_TAG "tag:yaml.org,2002:int" 454 /** The tag @c !!float for float values. */ 455 #define YAML_FLOAT_TAG "tag:yaml.org,2002:float" 456 /** The tag @c !!timestamp for date and time values. */ 457 #define YAML_TIMESTAMP_TAG "tag:yaml.org,2002:timestamp" 458 459 /** The tag @c !!seq is used to denote sequences. */ 460 #define YAML_SEQ_TAG "tag:yaml.org,2002:seq" 461 /** The tag @c !!map is used to denote mapping. */ 462 #define YAML_MAP_TAG "tag:yaml.org,2002:map" 463 464 /** The default scalar tag is @c !!str. */ 465 #define YAML_DEFAULT_SCALAR_TAG YAML_STR_TAG 466 /** The default sequence tag is @c !!seq. */ 467 #define YAML_DEFAULT_SEQUENCE_TAG YAML_SEQ_TAG 468 /** The default mapping tag is @c !!map. */ 469 #define YAML_DEFAULT_MAPPING_TAG YAML_MAP_TAG 470 471 /** Node types. */ 472 typedef enum yaml_node_type_e { 473 /** An empty node. */ 474 YAML_NO_NODE, 475 476 /** A scalar node. */ 477 YAML_SCALAR_NODE, 478 /** A sequence node. */ 479 YAML_SEQUENCE_NODE, 480 /** A mapping node. */ 481 YAML_MAPPING_NODE 482 } yaml_node_type_t; 483 484 /** The forward definition of a document node structure. */ 485 typedef struct yaml_node_s yaml_node_t; 486 487 /** An element of a sequence node. */ 488 typedef int yaml_node_item_t; 489 490 /** An element of a mapping node. */ 491 typedef struct yaml_node_pair_s { 492 /** The key of the element. */ 493 int key; 494 /** The value of the element. */ 495 int value; 496 } yaml_node_pair_t; 497 498 /** The node structure. */ 499 struct yaml_node_s { 500 501 /** The node type. */ 502 yaml_node_type_t type; 503 504 /** The node tag. */ 505 yaml_char_t *tag; 506 507 /** The node data. */ 508 union { 509 510 /** The scalar parameters (for @c YAML_SCALAR_NODE). */ 511 struct { 512 /** The scalar value. */ 513 yaml_char_t *value; 514 /** The length of the scalar value. */ 515 size_t length; 516 /** The scalar style. */ 517 yaml_scalar_style_t style; 518 } scalar; 519 520 /** The sequence parameters (for @c YAML_SEQUENCE_NODE). */ 521 struct { 522 /** The stack of sequence items. */ 523 struct { 524 /** The beginning of the stack. */ 525 yaml_node_item_t *start; 526 /** The end of the stack. */ 527 yaml_node_item_t *end; 528 /** The top of the stack. */ 529 yaml_node_item_t *top; 530 } items; 531 /** The sequence style. */ 532 yaml_sequence_style_t style; 533 } sequence; 534 535 /** The mapping parameters (for @c YAML_MAPPING_NODE). */ 536 struct { 537 /** The stack of mapping pairs (key, value). */ 538 struct { 539 /** The beginning of the stack. */ 540 yaml_node_pair_t *start; 541 /** The end of the stack. */ 542 yaml_node_pair_t *end; 543 /** The top of the stack. */ 544 yaml_node_pair_t *top; 545 } pairs; 546 /** The mapping style. */ 547 yaml_mapping_style_t style; 548 } mapping; 549 550 } data; 551 552 /** The beginning of the node. */ 553 yaml_mark_t start_mark; 554 /** The end of the node. */ 555 yaml_mark_t end_mark; 556 557 }; 558 559 /** The document structure. */ 560 typedef struct yaml_document_s { 561 562 /** The document nodes. */ 563 struct { 564 /** The beginning of the stack. */ 565 yaml_node_t *start; 566 /** The end of the stack. */ 567 yaml_node_t *end; 568 /** The top of the stack. */ 569 yaml_node_t *top; 570 } nodes; 571 572 /** The version directive. */ 573 yaml_version_directive_t *version_directive; 574 575 /** The list of tag directives. */ 576 struct { 577 /** The beginning of the tag directives list. */ 578 yaml_tag_directive_t *start; 579 /** The end of the tag directives list. */ 580 yaml_tag_directive_t *end; 581 } tag_directives; 582 583 /** Is the document start indicator implicit? */ 584 int start_implicit; 585 /** Is the document end indicator implicit? */ 586 int end_implicit; 587 588 /** The beginning of the document. */ 589 yaml_mark_t start_mark; 590 /** The end of the document. */ 591 yaml_mark_t end_mark; 592 593 } yaml_document_t; 594 595 /** 596 * Delete a YAML document and all its nodes. 597 * 598 * @param[in,out] document A document object. 599 */ 600 601 YAML_DECLARE(void) 602 yaml_document_delete(yaml_document_t *document); 603 604 /** 605 * Get a node of a YAML document. 606 * 607 * The pointer returned by this function is valid until any of the functions 608 * modifying the documents are called. 609 * 610 * @param[in] document A document object. 611 * @param[in] index The node id. 612 * 613 * @returns the node objct or @c NULL if @c node_id is out of range. 614 */ 615 616 YAML_DECLARE(yaml_node_t *) 617 yaml_document_get_node(yaml_document_t *document, int index); 618 619 /** 620 * Get the root of a YAML document node. 621 * 622 * The root object is the first object added to the document. 623 * 624 * The pointer returned by this function is valid until any of the functions 625 * modifying the documents are called. 626 * 627 * An empty document produced by the parser signifies the end of a YAML 628 * stream. 629 * 630 * @param[in] document A document object. 631 * 632 * @returns the node object or @c NULL if the document is empty. 633 */ 634 635 YAML_DECLARE(yaml_node_t *) 636 yaml_document_get_root_node(yaml_document_t *document); 637 638 /** 639 * Create a SCALAR node and attach it to the document. 640 * 641 * The @a style argument may be ignored by the emitter. 642 * 643 * @param[in,out] document A document object. 644 * @param[in] tag The scalar tag. 645 * @param[in] value The scalar value. 646 * @param[in] length The length of the scalar value. 647 * @param[in] style The scalar style. 648 * 649 * @returns the node id or @c 0 on error. 650 */ 651 652 /** @} */ 653 654 /** 655 * @defgroup parser Parser Definitions 656 * @{ 657 */ 658 659 /** 660 * The prototype of a read handler. 661 * 662 * The read handler is called when the parser needs to read more bytes from the 663 * source. The handler should write not more than @a size bytes to the @a 664 * buffer. The number of written bytes should be set to the @a length variable. 665 * 666 * @param[in,out] data A pointer to an application data specified by 667 * yaml_parser_set_input(). 668 * @param[out] buffer The buffer to write the data from the source. 669 * @param[in] size The size of the buffer. 670 * @param[out] size_read The actual number of bytes read from the source. 671 * 672 * @returns On success, the handler should return @c 1. If the handler failed, 673 * the returned value should be @c 0. On EOF, the handler should set the 674 * @a size_read to @c 0 and return @c 1. 675 */ 676 677 typedef int yaml_read_handler_t(void *data, unsigned char *buffer, size_t size, 678 size_t *size_read); 679 680 /** 681 * This structure holds information about a potential simple key. 682 */ 683 684 typedef struct yaml_simple_key_s { 685 /** Is a simple key possible? */ 686 int possible; 687 688 /** Is a simple key required? */ 689 int required; 690 691 /** The number of the token. */ 692 size_t token_number; 693 694 /** The position mark. */ 695 yaml_mark_t mark; 696 } yaml_simple_key_t; 697 698 /** 699 * The states of the parser. 700 */ 701 typedef enum yaml_parser_state_e { 702 /** Expect STREAM-START. */ 703 YAML_PARSE_STREAM_START_STATE, 704 /** Expect the beginning of an implicit document. */ 705 YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE, 706 /** Expect DOCUMENT-START. */ 707 YAML_PARSE_DOCUMENT_START_STATE, 708 /** Expect the content of a document. */ 709 YAML_PARSE_DOCUMENT_CONTENT_STATE, 710 /** Expect DOCUMENT-END. */ 711 YAML_PARSE_DOCUMENT_END_STATE, 712 713 /** Expect a block node. */ 714 YAML_PARSE_BLOCK_NODE_STATE, 715 /** Expect a block node or indentless sequence. */ 716 YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE, 717 /** Expect a flow node. */ 718 YAML_PARSE_FLOW_NODE_STATE, 719 /** Expect the first entry of a block sequence. */ 720 YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE, 721 /** Expect an entry of a block sequence. */ 722 YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE, 723 724 /** Expect an entry of an indentless sequence. */ 725 YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE, 726 /** Expect the first key of a block mapping. */ 727 YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE, 728 /** Expect a block mapping key. */ 729 YAML_PARSE_BLOCK_MAPPING_KEY_STATE, 730 /** Expect a block mapping value. */ 731 YAML_PARSE_BLOCK_MAPPING_VALUE_STATE, 732 /** Expect the first entry of a flow sequence. */ 733 YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE, 734 735 /** Expect an entry of a flow sequence. */ 736 YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE, 737 /** Expect a key of an ordered mapping. */ 738 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE, 739 /** Expect a value of an ordered mapping. */ 740 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE, 741 /** Expect the and of an ordered mapping entry. */ 742 YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE, 743 /** Expect the first key of a flow mapping. */ 744 YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE, 745 /** Expect a key of a flow mapping. */ 746 747 YAML_PARSE_FLOW_MAPPING_KEY_STATE, 748 /** Expect a value of a flow mapping. */ 749 YAML_PARSE_FLOW_MAPPING_VALUE_STATE, 750 /** Expect an empty value of a flow mapping. */ 751 YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE, 752 /** Expect nothing. */ 753 YAML_PARSE_END_STATE 754 } yaml_parser_state_t; 755 756 /** 757 * This structure holds aliases data. 758 */ 759 760 typedef struct yaml_alias_data_s { 761 /** The anchor. */ 762 yaml_char_t *anchor; 763 /** The node id. */ 764 int index; 765 /** The anchor mark. */ 766 yaml_mark_t mark; 767 } yaml_alias_data_t; 768 769 /** 770 * The parser structure. 771 * 772 * All members are internal. Manage the structure using the @c yaml_parser_ 773 * family of functions. 774 */ 775 776 typedef struct yaml_parser_s { 777 778 /** 779 * @name Error handling 780 * @{ 781 */ 782 783 /** Error type. */ 784 yaml_error_type_t error; 785 /** Error description. */ 786 const char *problem; 787 /** The byte about which the problem occurred. */ 788 size_t problem_offset; 789 /** The problematic value (@c -1 is none). */ 790 int problem_value; 791 /** The problem position. */ 792 yaml_mark_t problem_mark; 793 /** The error context. */ 794 const char *context; 795 /** The context position. */ 796 yaml_mark_t context_mark; 797 798 /** 799 * @} 800 */ 801 802 /** 803 * @name Reader stuff 804 * @{ 805 */ 806 807 /** Read handler. */ 808 yaml_read_handler_t *read_handler; 809 810 /** A pointer for passing to the read handler. */ 811 void *read_handler_data; 812 813 /** Standard (string or file) input data. */ 814 union { 815 /** String input data. */ 816 struct { 817 /** The string start pointer. */ 818 const unsigned char *start; 819 /** The string end pointer. */ 820 const unsigned char *end; 821 /** The string current position. */ 822 const unsigned char *current; 823 } string; 824 825 /** File input data. */ 826 FILE *file; 827 } input; 828 829 /** EOF flag */ 830 int eof; 831 832 /** The working buffer. */ 833 struct { 834 /** The beginning of the buffer. */ 835 yaml_char_t *start; 836 /** The end of the buffer. */ 837 yaml_char_t *end; 838 /** The current position of the buffer. */ 839 yaml_char_t *pointer; 840 /** The last filled position of the buffer. */ 841 yaml_char_t *last; 842 } buffer; 843 844 /* The number of unread characters in the buffer. */ 845 size_t unread; 846 847 /** The raw buffer. */ 848 struct { 849 /** The beginning of the buffer. */ 850 unsigned char *start; 851 /** The end of the buffer. */ 852 unsigned char *end; 853 /** The current position of the buffer. */ 854 unsigned char *pointer; 855 /** The last filled position of the buffer. */ 856 unsigned char *last; 857 } raw_buffer; 858 859 /** The input encoding. */ 860 yaml_encoding_t encoding; 861 862 /** The offset of the current position (in bytes). */ 863 size_t offset; 864 865 /** The mark of the current position. */ 866 yaml_mark_t mark; 867 868 /** 869 * @} 870 */ 871 872 /** 873 * @name Scanner stuff 874 * @{ 875 */ 876 877 /** Have we started to scan the input stream? */ 878 int stream_start_produced; 879 880 /** Have we reached the end of the input stream? */ 881 int stream_end_produced; 882 883 /** The number of unclosed '[' and '{' indicators. */ 884 int flow_level; 885 886 /** The tokens queue. */ 887 struct { 888 /** The beginning of the tokens queue. */ 889 yaml_token_t *start; 890 /** The end of the tokens queue. */ 891 yaml_token_t *end; 892 /** The head of the tokens queue. */ 893 yaml_token_t *head; 894 /** The tail of the tokens queue. */ 895 yaml_token_t *tail; 896 } tokens; 897 898 /** The number of tokens fetched from the queue. */ 899 size_t tokens_parsed; 900 901 /** Does the tokens queue contain a token ready for dequeueing. */ 902 int token_available; 903 904 /** The indentation levels stack. */ 905 struct { 906 /** The beginning of the stack. */ 907 int *start; 908 /** The end of the stack. */ 909 int *end; 910 /** The top of the stack. */ 911 int *top; 912 } indents; 913 914 /** The current indentation level. */ 915 int indent; 916 917 /** May a simple key occur at the current position? */ 918 int simple_key_allowed; 919 920 /** The stack of simple keys. */ 921 struct { 922 /** The beginning of the stack. */ 923 yaml_simple_key_t *start; 924 /** The end of the stack. */ 925 yaml_simple_key_t *end; 926 /** The top of the stack. */ 927 yaml_simple_key_t *top; 928 } simple_keys; 929 930 /** 931 * @} 932 */ 933 934 /** 935 * @name Parser stuff 936 * @{ 937 */ 938 939 /** The parser states stack. */ 940 struct { 941 /** The beginning of the stack. */ 942 yaml_parser_state_t *start; 943 /** The end of the stack. */ 944 yaml_parser_state_t *end; 945 /** The top of the stack. */ 946 yaml_parser_state_t *top; 947 } states; 948 949 /** The current parser state. */ 950 yaml_parser_state_t state; 951 952 /** The stack of marks. */ 953 struct { 954 /** The beginning of the stack. */ 955 yaml_mark_t *start; 956 /** The end of the stack. */ 957 yaml_mark_t *end; 958 /** The top of the stack. */ 959 yaml_mark_t *top; 960 } marks; 961 962 /** The list of TAG directives. */ 963 struct { 964 /** The beginning of the list. */ 965 yaml_tag_directive_t *start; 966 /** The end of the list. */ 967 yaml_tag_directive_t *end; 968 /** The top of the list. */ 969 yaml_tag_directive_t *top; 970 } tag_directives; 971 972 /** 973 * @} 974 */ 975 976 /** 977 * @name Dumper stuff 978 * @{ 979 */ 980 981 /** The alias data. */ 982 struct { 983 /** The beginning of the list. */ 984 yaml_alias_data_t *start; 985 /** The end of the list. */ 986 yaml_alias_data_t *end; 987 /** The top of the list. */ 988 yaml_alias_data_t *top; 989 } aliases; 990 991 /** The currently parsed document. */ 992 yaml_document_t *document; 993 994 /** 995 * @} 996 */ 997 998 } yaml_parser_t; 999 1000 /** 1001 * Initialize a parser. 1002 * 1003 * This function creates a new parser object. An application is responsible 1004 * for destroying the object using the yaml_parser_delete() function. 1005 * 1006 * @param[out] parser An empty parser object. 1007 * 1008 * @returns @c 1 if the function succeeded, @c 0 on error. 1009 */ 1010 1011 YAML_DECLARE(int) 1012 yaml_parser_initialize(yaml_parser_t *parser); 1013 1014 /** 1015 * Destroy a parser. 1016 * 1017 * @param[in,out] parser A parser object. 1018 */ 1019 1020 YAML_DECLARE(void) 1021 yaml_parser_delete(yaml_parser_t *parser); 1022 1023 /** 1024 * Set a string input. 1025 * 1026 * Note that the @a input pointer must be valid while the @a parser object 1027 * exists. The application is responsible for destroing @a input after 1028 * destroying the @a parser. 1029 * 1030 * @param[in,out] parser A parser object. 1031 * @param[in] input A source data. 1032 * @param[in] size The length of the source data in bytes. 1033 */ 1034 1035 YAML_DECLARE(void) 1036 yaml_parser_set_input_string(yaml_parser_t *parser, 1037 const unsigned char *input, size_t size); 1038 1039 /** 1040 * Set a file input. 1041 * 1042 * @a file should be a file object open for reading. The application is 1043 * responsible for closing the @a file. 1044 * 1045 * @param[in,out] parser A parser object. 1046 * @param[in] file An open file. 1047 */ 1048 1049 YAML_DECLARE(void) 1050 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file); 1051 1052 /** 1053 * Set a generic input handler. 1054 * 1055 * @param[in,out] parser A parser object. 1056 * @param[in] handler A read handler. 1057 * @param[in] data Any application data for passing to the read 1058 * handler. 1059 */ 1060 1061 YAML_DECLARE(void) 1062 yaml_parser_set_input(yaml_parser_t *parser, 1063 yaml_read_handler_t *handler, void *data); 1064 1065 /** 1066 * Set the source encoding. 1067 * 1068 * @param[in,out] parser A parser object. 1069 * @param[in] encoding The source encoding. 1070 */ 1071 1072 YAML_DECLARE(void) 1073 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding); 1074 1075 /** 1076 * Scan the input stream and produce the next token. 1077 * 1078 * Call the function subsequently to produce a sequence of tokens corresponding 1079 * to the input stream. The initial token has the type 1080 * @c YAML_STREAM_START_TOKEN while the ending token has the type 1081 * @c YAML_STREAM_END_TOKEN. 1082 * 1083 * An application is responsible for freeing any buffers associated with the 1084 * produced token object using the @c yaml_token_delete function. 1085 * 1086 * An application must not alternate the calls of yaml_parser_scan() with the 1087 * calls of yaml_parser_parse() or yaml_parser_load(). Doing this will break 1088 * the parser. 1089 * 1090 * @param[in,out] parser A parser object. 1091 * @param[out] token An empty token object. 1092 * 1093 * @returns @c 1 if the function succeeded, @c 0 on error. 1094 */ 1095 1096 YAML_DECLARE(int) 1097 yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token); 1098 1099 /** 1100 * Parse the input stream and produce the next parsing event. 1101 * 1102 * Call the function subsequently to produce a sequence of events corresponding 1103 * to the input stream. The initial event has the type 1104 * @c YAML_STREAM_START_EVENT while the ending event has the type 1105 * @c YAML_STREAM_END_EVENT. 1106 * 1107 * An application is responsible for freeing any buffers associated with the 1108 * produced event object using the yaml_event_delete() function. 1109 * 1110 * An application must not alternate the calls of yaml_parser_parse() with the 1111 * calls of yaml_parser_scan() or yaml_parser_load(). Doing this will break the 1112 * parser. 1113 * 1114 * @param[in,out] parser A parser object. 1115 * @param[out] event An empty event object. 1116 * 1117 * @returns @c 1 if the function succeeded, @c 0 on error. 1118 */ 1119 1120 YAML_DECLARE(int) 1121 yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event); 1122 1123 /** 1124 * Parse the input stream and produce the next YAML document. 1125 * 1126 * Call this function subsequently to produce a sequence of documents 1127 * constituting the input stream. 1128 * 1129 * If the produced document has no root node, it means that the document 1130 * end has been reached. 1131 * 1132 * An application is responsible for freeing any data associated with the 1133 * produced document object using the yaml_document_delete() function. 1134 * 1135 * An application must not alternate the calls of yaml_parser_load() with the 1136 * calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break 1137 * the parser. 1138 * 1139 * @param[in,out] parser A parser object. 1140 * @param[out] document An empty document object. 1141 * 1142 * @returns @c 1 if the function succeeded, @c 0 on error. 1143 */ 1144 1145 YAML_DECLARE(int) 1146 yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document); 1147 1148 /** @} */ 1149 1150 #ifdef __cplusplus 1151 } 1152 #endif 1153 1154 #endif /* #ifndef YAML_H */ 1155 1156