xref: /petsc/src/sys/yaml/include/yaml.h (revision b98e75f9f81e78f593efd2c19514f44db7497d0a)
153efea5cSLisandro Dalcin /**
253efea5cSLisandro Dalcin  * @file yaml.h
353efea5cSLisandro Dalcin  * @brief Public interface for libyaml.
453efea5cSLisandro Dalcin  *
553efea5cSLisandro Dalcin  * Include the header file with the code:
653efea5cSLisandro Dalcin  * @code
753efea5cSLisandro Dalcin  * #include <yaml.h>
853efea5cSLisandro Dalcin  * @endcode
953efea5cSLisandro Dalcin  */
1053efea5cSLisandro Dalcin 
1153efea5cSLisandro Dalcin #ifndef YAML_H
1253efea5cSLisandro Dalcin #define YAML_H
1353efea5cSLisandro Dalcin 
1453efea5cSLisandro Dalcin #ifdef __cplusplus
1553efea5cSLisandro Dalcin extern "C" {
1653efea5cSLisandro Dalcin #endif
1753efea5cSLisandro Dalcin 
1853efea5cSLisandro Dalcin #include <stdlib.h>
1953efea5cSLisandro Dalcin #include <stdio.h>
2053efea5cSLisandro Dalcin #include <string.h>
2153efea5cSLisandro Dalcin 
2253efea5cSLisandro Dalcin /**
2353efea5cSLisandro Dalcin  * @defgroup export Export Definitions
2453efea5cSLisandro Dalcin  * @{
2553efea5cSLisandro Dalcin  */
2653efea5cSLisandro Dalcin 
2753efea5cSLisandro Dalcin /** The public API declaration. */
2853efea5cSLisandro Dalcin 
2953efea5cSLisandro Dalcin #define YAML_DECLARE(type) static type
3053efea5cSLisandro Dalcin 
3153efea5cSLisandro Dalcin /** @} */
3253efea5cSLisandro Dalcin 
3353efea5cSLisandro Dalcin /**
3453efea5cSLisandro Dalcin  * @defgroup basic Basic Types
3553efea5cSLisandro Dalcin  * @{
3653efea5cSLisandro Dalcin  */
3753efea5cSLisandro Dalcin 
3853efea5cSLisandro Dalcin /** The character type (UTF-8 octet). */
3953efea5cSLisandro Dalcin typedef unsigned char yaml_char_t;
4053efea5cSLisandro Dalcin 
4153efea5cSLisandro Dalcin /** The version directive data. */
4253efea5cSLisandro Dalcin typedef struct yaml_version_directive_s {
4353efea5cSLisandro Dalcin     /** The major version number. */
4453efea5cSLisandro Dalcin     int major;
4553efea5cSLisandro Dalcin     /** The minor version number. */
4653efea5cSLisandro Dalcin     int minor;
4753efea5cSLisandro Dalcin } yaml_version_directive_t;
4853efea5cSLisandro Dalcin 
4953efea5cSLisandro Dalcin /** The tag directive data. */
5053efea5cSLisandro Dalcin typedef struct yaml_tag_directive_s {
5153efea5cSLisandro Dalcin     /** The tag handle. */
5253efea5cSLisandro Dalcin     yaml_char_t *handle;
5353efea5cSLisandro Dalcin     /** The tag prefix. */
5453efea5cSLisandro Dalcin     yaml_char_t *prefix;
5553efea5cSLisandro Dalcin } yaml_tag_directive_t;
5653efea5cSLisandro Dalcin 
5753efea5cSLisandro Dalcin /** The stream encoding. */
5853efea5cSLisandro Dalcin typedef enum yaml_encoding_e {
5953efea5cSLisandro Dalcin     /** Let the parser choose the encoding. */
6053efea5cSLisandro Dalcin     YAML_ANY_ENCODING,
6153efea5cSLisandro Dalcin     /** The default UTF-8 encoding. */
6253efea5cSLisandro Dalcin     YAML_UTF8_ENCODING,
6353efea5cSLisandro Dalcin     /** The UTF-16-LE encoding with BOM. */
6453efea5cSLisandro Dalcin     YAML_UTF16LE_ENCODING,
6553efea5cSLisandro Dalcin     /** The UTF-16-BE encoding with BOM. */
6653efea5cSLisandro Dalcin     YAML_UTF16BE_ENCODING
6753efea5cSLisandro Dalcin } yaml_encoding_t;
6853efea5cSLisandro Dalcin 
6953efea5cSLisandro Dalcin /** Line break types. */
7053efea5cSLisandro Dalcin 
7153efea5cSLisandro Dalcin typedef enum yaml_break_e {
7253efea5cSLisandro Dalcin     /** Let the parser choose the break type. */
7353efea5cSLisandro Dalcin     YAML_ANY_BREAK,
7453efea5cSLisandro Dalcin     /** Use CR for line breaks (Mac style). */
7553efea5cSLisandro Dalcin     YAML_CR_BREAK,
7653efea5cSLisandro Dalcin     /** Use LN for line breaks (Unix style). */
7753efea5cSLisandro Dalcin     YAML_LN_BREAK,
7853efea5cSLisandro Dalcin     /** Use CR LN for line breaks (DOS style). */
7953efea5cSLisandro Dalcin     YAML_CRLN_BREAK
8053efea5cSLisandro Dalcin } yaml_break_t;
8153efea5cSLisandro Dalcin 
8253efea5cSLisandro Dalcin /** Many bad things could happen with the parser and emitter. */
8353efea5cSLisandro Dalcin typedef enum yaml_error_type_e {
8453efea5cSLisandro Dalcin     /** No error is produced. */
8553efea5cSLisandro Dalcin     YAML_NO_ERROR,
8653efea5cSLisandro Dalcin 
8753efea5cSLisandro Dalcin     /** Cannot allocate or reallocate a block of memory. */
8853efea5cSLisandro Dalcin     YAML_MEMORY_ERROR,
8953efea5cSLisandro Dalcin 
9053efea5cSLisandro Dalcin     /** Cannot read or decode the input stream. */
9153efea5cSLisandro Dalcin     YAML_READER_ERROR,
9253efea5cSLisandro Dalcin     /** Cannot scan the input stream. */
9353efea5cSLisandro Dalcin     YAML_SCANNER_ERROR,
9453efea5cSLisandro Dalcin     /** Cannot parse the input stream. */
9553efea5cSLisandro Dalcin     YAML_PARSER_ERROR,
9653efea5cSLisandro Dalcin     /** Cannot compose a YAML document. */
9753efea5cSLisandro Dalcin     YAML_COMPOSER_ERROR,
9853efea5cSLisandro Dalcin 
9953efea5cSLisandro Dalcin     /** Cannot write to the output stream. */
10053efea5cSLisandro Dalcin     YAML_WRITER_ERROR,
10153efea5cSLisandro Dalcin     /** Cannot emit a YAML stream. */
10253efea5cSLisandro Dalcin     YAML_EMITTER_ERROR
10353efea5cSLisandro Dalcin } yaml_error_type_t;
10453efea5cSLisandro Dalcin 
10553efea5cSLisandro Dalcin /** The pointer position. */
10653efea5cSLisandro Dalcin typedef struct yaml_mark_s {
10753efea5cSLisandro Dalcin     /** The position index. */
10853efea5cSLisandro Dalcin     size_t index;
10953efea5cSLisandro Dalcin 
11053efea5cSLisandro Dalcin     /** The position line. */
11153efea5cSLisandro Dalcin     size_t line;
11253efea5cSLisandro Dalcin 
11353efea5cSLisandro Dalcin     /** The position column. */
11453efea5cSLisandro Dalcin     size_t column;
11553efea5cSLisandro Dalcin } yaml_mark_t;
11653efea5cSLisandro Dalcin 
11753efea5cSLisandro Dalcin /** @} */
11853efea5cSLisandro Dalcin 
11953efea5cSLisandro Dalcin /**
12053efea5cSLisandro Dalcin  * @defgroup styles Node Styles
12153efea5cSLisandro Dalcin  * @{
12253efea5cSLisandro Dalcin  */
12353efea5cSLisandro Dalcin 
12453efea5cSLisandro Dalcin /** Scalar styles. */
12553efea5cSLisandro Dalcin typedef enum yaml_scalar_style_e {
12653efea5cSLisandro Dalcin     /** Let the emitter choose the style. */
12753efea5cSLisandro Dalcin     YAML_ANY_SCALAR_STYLE,
12853efea5cSLisandro Dalcin 
12953efea5cSLisandro Dalcin     /** The plain scalar style. */
13053efea5cSLisandro Dalcin     YAML_PLAIN_SCALAR_STYLE,
13153efea5cSLisandro Dalcin 
13253efea5cSLisandro Dalcin     /** The single-quoted scalar style. */
13353efea5cSLisandro Dalcin     YAML_SINGLE_QUOTED_SCALAR_STYLE,
13453efea5cSLisandro Dalcin     /** The double-quoted scalar style. */
13553efea5cSLisandro Dalcin     YAML_DOUBLE_QUOTED_SCALAR_STYLE,
13653efea5cSLisandro Dalcin 
13753efea5cSLisandro Dalcin     /** The literal scalar style. */
13853efea5cSLisandro Dalcin     YAML_LITERAL_SCALAR_STYLE,
13953efea5cSLisandro Dalcin     /** The folded scalar style. */
14053efea5cSLisandro Dalcin     YAML_FOLDED_SCALAR_STYLE
14153efea5cSLisandro Dalcin } yaml_scalar_style_t;
14253efea5cSLisandro Dalcin 
14353efea5cSLisandro Dalcin /** Sequence styles. */
14453efea5cSLisandro Dalcin typedef enum yaml_sequence_style_e {
14553efea5cSLisandro Dalcin     /** Let the emitter choose the style. */
14653efea5cSLisandro Dalcin     YAML_ANY_SEQUENCE_STYLE,
14753efea5cSLisandro Dalcin 
14853efea5cSLisandro Dalcin     /** The block sequence style. */
14953efea5cSLisandro Dalcin     YAML_BLOCK_SEQUENCE_STYLE,
15053efea5cSLisandro Dalcin     /** The flow sequence style. */
15153efea5cSLisandro Dalcin     YAML_FLOW_SEQUENCE_STYLE
15253efea5cSLisandro Dalcin } yaml_sequence_style_t;
15353efea5cSLisandro Dalcin 
15453efea5cSLisandro Dalcin /** Mapping styles. */
15553efea5cSLisandro Dalcin typedef enum yaml_mapping_style_e {
15653efea5cSLisandro Dalcin     /** Let the emitter choose the style. */
15753efea5cSLisandro Dalcin     YAML_ANY_MAPPING_STYLE,
15853efea5cSLisandro Dalcin 
15953efea5cSLisandro Dalcin     /** The block mapping style. */
16053efea5cSLisandro Dalcin     YAML_BLOCK_MAPPING_STYLE,
16153efea5cSLisandro Dalcin     /** The flow mapping style. */
16253efea5cSLisandro Dalcin     YAML_FLOW_MAPPING_STYLE
16353efea5cSLisandro Dalcin /*    YAML_FLOW_SET_MAPPING_STYLE   */
16453efea5cSLisandro Dalcin } yaml_mapping_style_t;
16553efea5cSLisandro Dalcin 
16653efea5cSLisandro Dalcin /** @} */
16753efea5cSLisandro Dalcin 
16853efea5cSLisandro Dalcin /**
16953efea5cSLisandro Dalcin  * @defgroup tokens Tokens
17053efea5cSLisandro Dalcin  * @{
17153efea5cSLisandro Dalcin  */
17253efea5cSLisandro Dalcin 
17353efea5cSLisandro Dalcin /** Token types. */
17453efea5cSLisandro Dalcin typedef enum yaml_token_type_e {
17553efea5cSLisandro Dalcin     /** An empty token. */
17653efea5cSLisandro Dalcin     YAML_NO_TOKEN,
17753efea5cSLisandro Dalcin 
17853efea5cSLisandro Dalcin     /** A STREAM-START token. */
17953efea5cSLisandro Dalcin     YAML_STREAM_START_TOKEN,
18053efea5cSLisandro Dalcin     /** A STREAM-END token. */
18153efea5cSLisandro Dalcin     YAML_STREAM_END_TOKEN,
18253efea5cSLisandro Dalcin 
18353efea5cSLisandro Dalcin     /** A VERSION-DIRECTIVE token. */
18453efea5cSLisandro Dalcin     YAML_VERSION_DIRECTIVE_TOKEN,
18553efea5cSLisandro Dalcin     /** A TAG-DIRECTIVE token. */
18653efea5cSLisandro Dalcin     YAML_TAG_DIRECTIVE_TOKEN,
18753efea5cSLisandro Dalcin     /** A DOCUMENT-START token. */
18853efea5cSLisandro Dalcin     YAML_DOCUMENT_START_TOKEN,
18953efea5cSLisandro Dalcin     /** A DOCUMENT-END token. */
19053efea5cSLisandro Dalcin     YAML_DOCUMENT_END_TOKEN,
19153efea5cSLisandro Dalcin 
19253efea5cSLisandro Dalcin     /** A BLOCK-SEQUENCE-START token. */
19353efea5cSLisandro Dalcin     YAML_BLOCK_SEQUENCE_START_TOKEN,
19453efea5cSLisandro Dalcin     /** A BLOCK-MAPPING-START token. */
19553efea5cSLisandro Dalcin     YAML_BLOCK_MAPPING_START_TOKEN,
19653efea5cSLisandro Dalcin     /** A BLOCK-END token. */
19753efea5cSLisandro Dalcin     YAML_BLOCK_END_TOKEN,
19853efea5cSLisandro Dalcin 
19953efea5cSLisandro Dalcin     /** A FLOW-SEQUENCE-START token. */
20053efea5cSLisandro Dalcin     YAML_FLOW_SEQUENCE_START_TOKEN,
20153efea5cSLisandro Dalcin     /** A FLOW-SEQUENCE-END token. */
20253efea5cSLisandro Dalcin     YAML_FLOW_SEQUENCE_END_TOKEN,
20353efea5cSLisandro Dalcin     /** A FLOW-MAPPING-START token. */
20453efea5cSLisandro Dalcin     YAML_FLOW_MAPPING_START_TOKEN,
20553efea5cSLisandro Dalcin     /** A FLOW-MAPPING-END token. */
20653efea5cSLisandro Dalcin     YAML_FLOW_MAPPING_END_TOKEN,
20753efea5cSLisandro Dalcin 
20853efea5cSLisandro Dalcin     /** A BLOCK-ENTRY token. */
20953efea5cSLisandro Dalcin     YAML_BLOCK_ENTRY_TOKEN,
21053efea5cSLisandro Dalcin     /** A FLOW-ENTRY token. */
21153efea5cSLisandro Dalcin     YAML_FLOW_ENTRY_TOKEN,
21253efea5cSLisandro Dalcin     /** A KEY token. */
21353efea5cSLisandro Dalcin     YAML_KEY_TOKEN,
21453efea5cSLisandro Dalcin     /** A VALUE token. */
21553efea5cSLisandro Dalcin     YAML_VALUE_TOKEN,
21653efea5cSLisandro Dalcin 
21753efea5cSLisandro Dalcin     /** An ALIAS token. */
21853efea5cSLisandro Dalcin     YAML_ALIAS_TOKEN,
21953efea5cSLisandro Dalcin     /** An ANCHOR token. */
22053efea5cSLisandro Dalcin     YAML_ANCHOR_TOKEN,
22153efea5cSLisandro Dalcin     /** A TAG token. */
22253efea5cSLisandro Dalcin     YAML_TAG_TOKEN,
22353efea5cSLisandro Dalcin     /** A SCALAR token. */
22453efea5cSLisandro Dalcin     YAML_SCALAR_TOKEN
22553efea5cSLisandro Dalcin } yaml_token_type_t;
22653efea5cSLisandro Dalcin 
22753efea5cSLisandro Dalcin /** The token structure. */
22853efea5cSLisandro Dalcin typedef struct yaml_token_s {
22953efea5cSLisandro Dalcin 
23053efea5cSLisandro Dalcin     /** The token type. */
23153efea5cSLisandro Dalcin     yaml_token_type_t type;
23253efea5cSLisandro Dalcin 
23353efea5cSLisandro Dalcin     /** The token data. */
23453efea5cSLisandro Dalcin     union {
23553efea5cSLisandro Dalcin 
23653efea5cSLisandro Dalcin         /** The stream start (for @c YAML_STREAM_START_TOKEN). */
23753efea5cSLisandro Dalcin         struct {
23853efea5cSLisandro Dalcin             /** The stream encoding. */
23953efea5cSLisandro Dalcin             yaml_encoding_t encoding;
24053efea5cSLisandro Dalcin         } stream_start;
24153efea5cSLisandro Dalcin 
24253efea5cSLisandro Dalcin         /** The alias (for @c YAML_ALIAS_TOKEN). */
24353efea5cSLisandro Dalcin         struct {
24453efea5cSLisandro Dalcin             /** The alias value. */
24553efea5cSLisandro Dalcin             yaml_char_t *value;
24653efea5cSLisandro Dalcin         } alias;
24753efea5cSLisandro Dalcin 
24853efea5cSLisandro Dalcin         /** The anchor (for @c YAML_ANCHOR_TOKEN). */
24953efea5cSLisandro Dalcin         struct {
25053efea5cSLisandro Dalcin             /** The anchor value. */
25153efea5cSLisandro Dalcin             yaml_char_t *value;
25253efea5cSLisandro Dalcin         } anchor;
25353efea5cSLisandro Dalcin 
25453efea5cSLisandro Dalcin         /** The tag (for @c YAML_TAG_TOKEN). */
25553efea5cSLisandro Dalcin         struct {
25653efea5cSLisandro Dalcin             /** The tag handle. */
25753efea5cSLisandro Dalcin             yaml_char_t *handle;
25853efea5cSLisandro Dalcin             /** The tag suffix. */
25953efea5cSLisandro Dalcin             yaml_char_t *suffix;
26053efea5cSLisandro Dalcin         } tag;
26153efea5cSLisandro Dalcin 
26253efea5cSLisandro Dalcin         /** The scalar value (for @c YAML_SCALAR_TOKEN). */
26353efea5cSLisandro Dalcin         struct {
26453efea5cSLisandro Dalcin             /** The scalar value. */
26553efea5cSLisandro Dalcin             yaml_char_t *value;
26653efea5cSLisandro Dalcin             /** The length of the scalar value. */
26753efea5cSLisandro Dalcin             size_t length;
26853efea5cSLisandro Dalcin             /** The scalar style. */
26953efea5cSLisandro Dalcin             yaml_scalar_style_t style;
27053efea5cSLisandro Dalcin         } scalar;
27153efea5cSLisandro Dalcin 
27253efea5cSLisandro Dalcin         /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */
27353efea5cSLisandro Dalcin         struct {
27453efea5cSLisandro Dalcin             /** The major version number. */
27553efea5cSLisandro Dalcin             int major;
27653efea5cSLisandro Dalcin             /** The minor version number. */
27753efea5cSLisandro Dalcin             int minor;
27853efea5cSLisandro Dalcin         } version_directive;
27953efea5cSLisandro Dalcin 
28053efea5cSLisandro Dalcin         /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */
28153efea5cSLisandro Dalcin         struct {
28253efea5cSLisandro Dalcin             /** The tag handle. */
28353efea5cSLisandro Dalcin             yaml_char_t *handle;
28453efea5cSLisandro Dalcin             /** The tag prefix. */
28553efea5cSLisandro Dalcin             yaml_char_t *prefix;
28653efea5cSLisandro Dalcin         } tag_directive;
28753efea5cSLisandro Dalcin 
28853efea5cSLisandro Dalcin     } data;
28953efea5cSLisandro Dalcin 
29053efea5cSLisandro Dalcin     /** The beginning of the token. */
29153efea5cSLisandro Dalcin     yaml_mark_t start_mark;
29253efea5cSLisandro Dalcin     /** The end of the token. */
29353efea5cSLisandro Dalcin     yaml_mark_t end_mark;
29453efea5cSLisandro Dalcin 
29553efea5cSLisandro Dalcin } yaml_token_t;
29653efea5cSLisandro Dalcin 
29753efea5cSLisandro Dalcin /**
29853efea5cSLisandro Dalcin  * Free any memory allocated for a token object.
29953efea5cSLisandro Dalcin  *
30053efea5cSLisandro Dalcin  * @param[in,out]   token   A token object.
30153efea5cSLisandro Dalcin  */
30253efea5cSLisandro Dalcin 
30353efea5cSLisandro Dalcin YAML_DECLARE(void)
30453efea5cSLisandro Dalcin yaml_token_delete(yaml_token_t *token);
30553efea5cSLisandro Dalcin 
30653efea5cSLisandro Dalcin /** @} */
30753efea5cSLisandro Dalcin 
30853efea5cSLisandro Dalcin /**
30953efea5cSLisandro Dalcin  * @defgroup events Events
31053efea5cSLisandro Dalcin  * @{
31153efea5cSLisandro Dalcin  */
31253efea5cSLisandro Dalcin 
31353efea5cSLisandro Dalcin /** Event types. */
31453efea5cSLisandro Dalcin typedef enum yaml_event_type_e {
31553efea5cSLisandro Dalcin     /** An empty event. */
31653efea5cSLisandro Dalcin     YAML_NO_EVENT,
31753efea5cSLisandro Dalcin 
31853efea5cSLisandro Dalcin     /** A STREAM-START event. */
31953efea5cSLisandro Dalcin     YAML_STREAM_START_EVENT,
32053efea5cSLisandro Dalcin     /** A STREAM-END event. */
32153efea5cSLisandro Dalcin     YAML_STREAM_END_EVENT,
32253efea5cSLisandro Dalcin 
32353efea5cSLisandro Dalcin     /** A DOCUMENT-START event. */
32453efea5cSLisandro Dalcin     YAML_DOCUMENT_START_EVENT,
32553efea5cSLisandro Dalcin     /** A DOCUMENT-END event. */
32653efea5cSLisandro Dalcin     YAML_DOCUMENT_END_EVENT,
32753efea5cSLisandro Dalcin 
32853efea5cSLisandro Dalcin     /** An ALIAS event. */
32953efea5cSLisandro Dalcin     YAML_ALIAS_EVENT,
33053efea5cSLisandro Dalcin     /** A SCALAR event. */
33153efea5cSLisandro Dalcin     YAML_SCALAR_EVENT,
33253efea5cSLisandro Dalcin 
33353efea5cSLisandro Dalcin     /** A SEQUENCE-START event. */
33453efea5cSLisandro Dalcin     YAML_SEQUENCE_START_EVENT,
33553efea5cSLisandro Dalcin     /** A SEQUENCE-END event. */
33653efea5cSLisandro Dalcin     YAML_SEQUENCE_END_EVENT,
33753efea5cSLisandro Dalcin 
33853efea5cSLisandro Dalcin     /** A MAPPING-START event. */
33953efea5cSLisandro Dalcin     YAML_MAPPING_START_EVENT,
34053efea5cSLisandro Dalcin     /** A MAPPING-END event. */
34153efea5cSLisandro Dalcin     YAML_MAPPING_END_EVENT
34253efea5cSLisandro Dalcin } yaml_event_type_t;
34353efea5cSLisandro Dalcin 
34453efea5cSLisandro Dalcin /** The event structure. */
34553efea5cSLisandro Dalcin typedef struct yaml_event_s {
34653efea5cSLisandro Dalcin 
34753efea5cSLisandro Dalcin     /** The event type. */
34853efea5cSLisandro Dalcin     yaml_event_type_t type;
34953efea5cSLisandro Dalcin 
35053efea5cSLisandro Dalcin     /** The event data. */
35153efea5cSLisandro Dalcin     union {
35253efea5cSLisandro Dalcin 
35353efea5cSLisandro Dalcin         /** The stream parameters (for @c YAML_STREAM_START_EVENT). */
35453efea5cSLisandro Dalcin         struct {
35553efea5cSLisandro Dalcin             /** The document encoding. */
35653efea5cSLisandro Dalcin             yaml_encoding_t encoding;
35753efea5cSLisandro Dalcin         } stream_start;
35853efea5cSLisandro Dalcin 
35953efea5cSLisandro Dalcin         /** The document parameters (for @c YAML_DOCUMENT_START_EVENT). */
36053efea5cSLisandro Dalcin         struct {
36153efea5cSLisandro Dalcin             /** The version directive. */
36253efea5cSLisandro Dalcin             yaml_version_directive_t *version_directive;
36353efea5cSLisandro Dalcin 
36453efea5cSLisandro Dalcin             /** The list of tag directives. */
36553efea5cSLisandro Dalcin             struct {
36653efea5cSLisandro Dalcin                 /** The beginning of the tag directives list. */
36753efea5cSLisandro Dalcin                 yaml_tag_directive_t *start;
36853efea5cSLisandro Dalcin                 /** The end of the tag directives list. */
36953efea5cSLisandro Dalcin                 yaml_tag_directive_t *end;
37053efea5cSLisandro Dalcin             } tag_directives;
37153efea5cSLisandro Dalcin 
37253efea5cSLisandro Dalcin             /** Is the document indicator implicit? */
37353efea5cSLisandro Dalcin             int implicit;
37453efea5cSLisandro Dalcin         } document_start;
37553efea5cSLisandro Dalcin 
37653efea5cSLisandro Dalcin         /** The document end parameters (for @c YAML_DOCUMENT_END_EVENT). */
37753efea5cSLisandro Dalcin         struct {
37853efea5cSLisandro Dalcin             /** Is the document end indicator implicit? */
37953efea5cSLisandro Dalcin             int implicit;
38053efea5cSLisandro Dalcin         } document_end;
38153efea5cSLisandro Dalcin 
38253efea5cSLisandro Dalcin         /** The alias parameters (for @c YAML_ALIAS_EVENT). */
38353efea5cSLisandro Dalcin         struct {
38453efea5cSLisandro Dalcin             /** The anchor. */
38553efea5cSLisandro Dalcin             yaml_char_t *anchor;
38653efea5cSLisandro Dalcin         } alias;
38753efea5cSLisandro Dalcin 
38853efea5cSLisandro Dalcin         /** The scalar parameters (for @c YAML_SCALAR_EVENT). */
38953efea5cSLisandro Dalcin         struct {
39053efea5cSLisandro Dalcin             /** The anchor. */
39153efea5cSLisandro Dalcin             yaml_char_t *anchor;
39253efea5cSLisandro Dalcin             /** The tag. */
39353efea5cSLisandro Dalcin             yaml_char_t *tag;
39453efea5cSLisandro Dalcin             /** The scalar value. */
39553efea5cSLisandro Dalcin             yaml_char_t *value;
39653efea5cSLisandro Dalcin             /** The length of the scalar value. */
39753efea5cSLisandro Dalcin             size_t length;
39853efea5cSLisandro Dalcin             /** Is the tag optional for the plain style? */
39953efea5cSLisandro Dalcin             int plain_implicit;
40053efea5cSLisandro Dalcin             /** Is the tag optional for any non-plain style? */
40153efea5cSLisandro Dalcin             int quoted_implicit;
40253efea5cSLisandro Dalcin             /** The scalar style. */
40353efea5cSLisandro Dalcin             yaml_scalar_style_t style;
40453efea5cSLisandro Dalcin         } scalar;
40553efea5cSLisandro Dalcin 
40653efea5cSLisandro Dalcin         /** The sequence parameters (for @c YAML_SEQUENCE_START_EVENT). */
40753efea5cSLisandro Dalcin         struct {
40853efea5cSLisandro Dalcin             /** The anchor. */
40953efea5cSLisandro Dalcin             yaml_char_t *anchor;
41053efea5cSLisandro Dalcin             /** The tag. */
41153efea5cSLisandro Dalcin             yaml_char_t *tag;
41253efea5cSLisandro Dalcin             /** Is the tag optional? */
41353efea5cSLisandro Dalcin             int implicit;
41453efea5cSLisandro Dalcin             /** The sequence style. */
41553efea5cSLisandro Dalcin             yaml_sequence_style_t style;
41653efea5cSLisandro Dalcin         } sequence_start;
41753efea5cSLisandro Dalcin 
41853efea5cSLisandro Dalcin         /** The mapping parameters (for @c YAML_MAPPING_START_EVENT). */
41953efea5cSLisandro Dalcin         struct {
42053efea5cSLisandro Dalcin             /** The anchor. */
42153efea5cSLisandro Dalcin             yaml_char_t *anchor;
42253efea5cSLisandro Dalcin             /** The tag. */
42353efea5cSLisandro Dalcin             yaml_char_t *tag;
42453efea5cSLisandro Dalcin             /** Is the tag optional? */
42553efea5cSLisandro Dalcin             int implicit;
42653efea5cSLisandro Dalcin             /** The mapping style. */
42753efea5cSLisandro Dalcin             yaml_mapping_style_t style;
42853efea5cSLisandro Dalcin         } mapping_start;
42953efea5cSLisandro Dalcin 
43053efea5cSLisandro Dalcin     } data;
43153efea5cSLisandro Dalcin 
43253efea5cSLisandro Dalcin     /** The beginning of the event. */
43353efea5cSLisandro Dalcin     yaml_mark_t start_mark;
43453efea5cSLisandro Dalcin     /** The end of the event. */
43553efea5cSLisandro Dalcin     yaml_mark_t end_mark;
43653efea5cSLisandro Dalcin 
43753efea5cSLisandro Dalcin } yaml_event_t;
43853efea5cSLisandro Dalcin 
43953efea5cSLisandro Dalcin /** @} */
44053efea5cSLisandro Dalcin 
44153efea5cSLisandro Dalcin /**
44253efea5cSLisandro Dalcin  * @defgroup nodes Nodes
44353efea5cSLisandro Dalcin  * @{
44453efea5cSLisandro Dalcin  */
44553efea5cSLisandro Dalcin 
44653efea5cSLisandro Dalcin /** The tag @c !!null with the only possible value: @c null. */
44753efea5cSLisandro Dalcin #define YAML_NULL_TAG       "tag:yaml.org,2002:null"
44853efea5cSLisandro Dalcin /** The tag @c !!bool with the values: @c true and @c false. */
44953efea5cSLisandro Dalcin #define YAML_BOOL_TAG       "tag:yaml.org,2002:bool"
45053efea5cSLisandro Dalcin /** The tag @c !!str for string values. */
45153efea5cSLisandro Dalcin #define YAML_STR_TAG        "tag:yaml.org,2002:str"
45253efea5cSLisandro Dalcin /** The tag @c !!int for integer values. */
45353efea5cSLisandro Dalcin #define YAML_INT_TAG        "tag:yaml.org,2002:int"
45453efea5cSLisandro Dalcin /** The tag @c !!float for float values. */
45553efea5cSLisandro Dalcin #define YAML_FLOAT_TAG      "tag:yaml.org,2002:float"
45653efea5cSLisandro Dalcin /** The tag @c !!timestamp for date and time values. */
45753efea5cSLisandro Dalcin #define YAML_TIMESTAMP_TAG  "tag:yaml.org,2002:timestamp"
45853efea5cSLisandro Dalcin 
45953efea5cSLisandro Dalcin /** The tag @c !!seq is used to denote sequences. */
46053efea5cSLisandro Dalcin #define YAML_SEQ_TAG        "tag:yaml.org,2002:seq"
46153efea5cSLisandro Dalcin /** The tag @c !!map is used to denote mapping. */
46253efea5cSLisandro Dalcin #define YAML_MAP_TAG        "tag:yaml.org,2002:map"
46353efea5cSLisandro Dalcin 
46453efea5cSLisandro Dalcin /** The default scalar tag is @c !!str. */
46553efea5cSLisandro Dalcin #define YAML_DEFAULT_SCALAR_TAG     YAML_STR_TAG
46653efea5cSLisandro Dalcin /** The default sequence tag is @c !!seq. */
46753efea5cSLisandro Dalcin #define YAML_DEFAULT_SEQUENCE_TAG   YAML_SEQ_TAG
46853efea5cSLisandro Dalcin /** The default mapping tag is @c !!map. */
46953efea5cSLisandro Dalcin #define YAML_DEFAULT_MAPPING_TAG    YAML_MAP_TAG
47053efea5cSLisandro Dalcin 
47153efea5cSLisandro Dalcin /** Node types. */
47253efea5cSLisandro Dalcin typedef enum yaml_node_type_e {
47353efea5cSLisandro Dalcin     /** An empty node. */
47453efea5cSLisandro Dalcin     YAML_NO_NODE,
47553efea5cSLisandro Dalcin 
47653efea5cSLisandro Dalcin     /** A scalar node. */
47753efea5cSLisandro Dalcin     YAML_SCALAR_NODE,
47853efea5cSLisandro Dalcin     /** A sequence node. */
47953efea5cSLisandro Dalcin     YAML_SEQUENCE_NODE,
48053efea5cSLisandro Dalcin     /** A mapping node. */
48153efea5cSLisandro Dalcin     YAML_MAPPING_NODE
48253efea5cSLisandro Dalcin } yaml_node_type_t;
48353efea5cSLisandro Dalcin 
48453efea5cSLisandro Dalcin /** The forward definition of a document node structure. */
48553efea5cSLisandro Dalcin typedef struct yaml_node_s yaml_node_t;
48653efea5cSLisandro Dalcin 
48753efea5cSLisandro Dalcin /** An element of a sequence node. */
48853efea5cSLisandro Dalcin typedef int yaml_node_item_t;
48953efea5cSLisandro Dalcin 
49053efea5cSLisandro Dalcin /** An element of a mapping node. */
49153efea5cSLisandro Dalcin typedef struct yaml_node_pair_s {
49253efea5cSLisandro Dalcin     /** The key of the element. */
49353efea5cSLisandro Dalcin     int key;
49453efea5cSLisandro Dalcin     /** The value of the element. */
49553efea5cSLisandro Dalcin     int value;
49653efea5cSLisandro Dalcin } yaml_node_pair_t;
49753efea5cSLisandro Dalcin 
49853efea5cSLisandro Dalcin /** The node structure. */
49953efea5cSLisandro Dalcin struct yaml_node_s {
50053efea5cSLisandro Dalcin 
50153efea5cSLisandro Dalcin     /** The node type. */
50253efea5cSLisandro Dalcin     yaml_node_type_t type;
50353efea5cSLisandro Dalcin 
50453efea5cSLisandro Dalcin     /** The node tag. */
50553efea5cSLisandro Dalcin     yaml_char_t *tag;
50653efea5cSLisandro Dalcin 
50753efea5cSLisandro Dalcin     /** The node data. */
50853efea5cSLisandro Dalcin     union {
50953efea5cSLisandro Dalcin 
51053efea5cSLisandro Dalcin         /** The scalar parameters (for @c YAML_SCALAR_NODE). */
51153efea5cSLisandro Dalcin         struct {
51253efea5cSLisandro Dalcin             /** The scalar value. */
51353efea5cSLisandro Dalcin             yaml_char_t *value;
51453efea5cSLisandro Dalcin             /** The length of the scalar value. */
51553efea5cSLisandro Dalcin             size_t length;
51653efea5cSLisandro Dalcin             /** The scalar style. */
51753efea5cSLisandro Dalcin             yaml_scalar_style_t style;
51853efea5cSLisandro Dalcin         } scalar;
51953efea5cSLisandro Dalcin 
52053efea5cSLisandro Dalcin         /** The sequence parameters (for @c YAML_SEQUENCE_NODE). */
52153efea5cSLisandro Dalcin         struct {
52253efea5cSLisandro Dalcin             /** The stack of sequence items. */
52353efea5cSLisandro Dalcin             struct {
52453efea5cSLisandro Dalcin                 /** The beginning of the stack. */
52553efea5cSLisandro Dalcin                 yaml_node_item_t *start;
52653efea5cSLisandro Dalcin                 /** The end of the stack. */
52753efea5cSLisandro Dalcin                 yaml_node_item_t *end;
52853efea5cSLisandro Dalcin                 /** The top of the stack. */
52953efea5cSLisandro Dalcin                 yaml_node_item_t *top;
53053efea5cSLisandro Dalcin             } items;
53153efea5cSLisandro Dalcin             /** The sequence style. */
53253efea5cSLisandro Dalcin             yaml_sequence_style_t style;
53353efea5cSLisandro Dalcin         } sequence;
53453efea5cSLisandro Dalcin 
53553efea5cSLisandro Dalcin         /** The mapping parameters (for @c YAML_MAPPING_NODE). */
53653efea5cSLisandro Dalcin         struct {
53753efea5cSLisandro Dalcin             /** The stack of mapping pairs (key, value). */
53853efea5cSLisandro Dalcin             struct {
53953efea5cSLisandro Dalcin                 /** The beginning of the stack. */
54053efea5cSLisandro Dalcin                 yaml_node_pair_t *start;
54153efea5cSLisandro Dalcin                 /** The end of the stack. */
54253efea5cSLisandro Dalcin                 yaml_node_pair_t *end;
54353efea5cSLisandro Dalcin                 /** The top of the stack. */
54453efea5cSLisandro Dalcin                 yaml_node_pair_t *top;
54553efea5cSLisandro Dalcin             } pairs;
54653efea5cSLisandro Dalcin             /** The mapping style. */
54753efea5cSLisandro Dalcin             yaml_mapping_style_t style;
54853efea5cSLisandro Dalcin         } mapping;
54953efea5cSLisandro Dalcin 
55053efea5cSLisandro Dalcin     } data;
55153efea5cSLisandro Dalcin 
55253efea5cSLisandro Dalcin     /** The beginning of the node. */
55353efea5cSLisandro Dalcin     yaml_mark_t start_mark;
55453efea5cSLisandro Dalcin     /** The end of the node. */
55553efea5cSLisandro Dalcin     yaml_mark_t end_mark;
55653efea5cSLisandro Dalcin 
55753efea5cSLisandro Dalcin };
55853efea5cSLisandro Dalcin 
55953efea5cSLisandro Dalcin /** The document structure. */
56053efea5cSLisandro Dalcin typedef struct yaml_document_s {
56153efea5cSLisandro Dalcin 
56253efea5cSLisandro Dalcin     /** The document nodes. */
56353efea5cSLisandro Dalcin     struct {
56453efea5cSLisandro Dalcin         /** The beginning of the stack. */
56553efea5cSLisandro Dalcin         yaml_node_t *start;
56653efea5cSLisandro Dalcin         /** The end of the stack. */
56753efea5cSLisandro Dalcin         yaml_node_t *end;
56853efea5cSLisandro Dalcin         /** The top of the stack. */
56953efea5cSLisandro Dalcin         yaml_node_t *top;
57053efea5cSLisandro Dalcin     } nodes;
57153efea5cSLisandro Dalcin 
57253efea5cSLisandro Dalcin     /** The version directive. */
57353efea5cSLisandro Dalcin     yaml_version_directive_t *version_directive;
57453efea5cSLisandro Dalcin 
57553efea5cSLisandro Dalcin     /** The list of tag directives. */
57653efea5cSLisandro Dalcin     struct {
57753efea5cSLisandro Dalcin         /** The beginning of the tag directives list. */
57853efea5cSLisandro Dalcin         yaml_tag_directive_t *start;
57953efea5cSLisandro Dalcin         /** The end of the tag directives list. */
58053efea5cSLisandro Dalcin         yaml_tag_directive_t *end;
58153efea5cSLisandro Dalcin     } tag_directives;
58253efea5cSLisandro Dalcin 
58353efea5cSLisandro Dalcin     /** Is the document start indicator implicit? */
58453efea5cSLisandro Dalcin     int start_implicit;
58553efea5cSLisandro Dalcin     /** Is the document end indicator implicit? */
58653efea5cSLisandro Dalcin     int end_implicit;
58753efea5cSLisandro Dalcin 
58853efea5cSLisandro Dalcin     /** The beginning of the document. */
58953efea5cSLisandro Dalcin     yaml_mark_t start_mark;
59053efea5cSLisandro Dalcin     /** The end of the document. */
59153efea5cSLisandro Dalcin     yaml_mark_t end_mark;
59253efea5cSLisandro Dalcin 
59353efea5cSLisandro Dalcin } yaml_document_t;
59453efea5cSLisandro Dalcin 
59553efea5cSLisandro Dalcin /**
59653efea5cSLisandro Dalcin  * Delete a YAML document and all its nodes.
59753efea5cSLisandro Dalcin  *
59853efea5cSLisandro Dalcin  * @param[in,out]   document        A document object.
59953efea5cSLisandro Dalcin  */
60053efea5cSLisandro Dalcin 
60153efea5cSLisandro Dalcin YAML_DECLARE(void)
60253efea5cSLisandro Dalcin yaml_document_delete(yaml_document_t *document);
60353efea5cSLisandro Dalcin 
60453efea5cSLisandro Dalcin /**
60553efea5cSLisandro Dalcin  * Get a node of a YAML document.
60653efea5cSLisandro Dalcin  *
60753efea5cSLisandro Dalcin  * The pointer returned by this function is valid until any of the functions
60853efea5cSLisandro Dalcin  * modifying the documents are called.
60953efea5cSLisandro Dalcin  *
61053efea5cSLisandro Dalcin  * @param[in]       document        A document object.
61153efea5cSLisandro Dalcin  * @param[in]       index           The node id.
61253efea5cSLisandro Dalcin  *
613*f332b1cbSPierre Jolivet  * @returns the node object or @c NULL if @c node_id is out of range.
61453efea5cSLisandro Dalcin  */
61553efea5cSLisandro Dalcin 
61653efea5cSLisandro Dalcin YAML_DECLARE(yaml_node_t *)
61753efea5cSLisandro Dalcin yaml_document_get_node(yaml_document_t *document, int index);
61853efea5cSLisandro Dalcin 
61953efea5cSLisandro Dalcin /**
62053efea5cSLisandro Dalcin  * Get the root of a YAML document node.
62153efea5cSLisandro Dalcin  *
62253efea5cSLisandro Dalcin  * The root object is the first object added to the document.
62353efea5cSLisandro Dalcin  *
62453efea5cSLisandro Dalcin  * The pointer returned by this function is valid until any of the functions
62553efea5cSLisandro Dalcin  * modifying the documents are called.
62653efea5cSLisandro Dalcin  *
62753efea5cSLisandro Dalcin  * An empty document produced by the parser signifies the end of a YAML
62853efea5cSLisandro Dalcin  * stream.
62953efea5cSLisandro Dalcin  *
63053efea5cSLisandro Dalcin  * @param[in]       document        A document object.
63153efea5cSLisandro Dalcin  *
63253efea5cSLisandro Dalcin  * @returns the node object or @c NULL if the document is empty.
63353efea5cSLisandro Dalcin  */
63453efea5cSLisandro Dalcin 
63553efea5cSLisandro Dalcin YAML_DECLARE(yaml_node_t *)
63653efea5cSLisandro Dalcin yaml_document_get_root_node(yaml_document_t *document);
63753efea5cSLisandro Dalcin 
63853efea5cSLisandro Dalcin /**
63953efea5cSLisandro Dalcin  * Create a SCALAR node and attach it to the document.
64053efea5cSLisandro Dalcin  *
64153efea5cSLisandro Dalcin  * The @a style argument may be ignored by the emitter.
64253efea5cSLisandro Dalcin  *
64353efea5cSLisandro Dalcin  * @param[in,out]   document        A document object.
64453efea5cSLisandro Dalcin  * @param[in]       tag             The scalar tag.
64553efea5cSLisandro Dalcin  * @param[in]       value           The scalar value.
64653efea5cSLisandro Dalcin  * @param[in]       length          The length of the scalar value.
64753efea5cSLisandro Dalcin  * @param[in]       style           The scalar style.
64853efea5cSLisandro Dalcin  *
64953efea5cSLisandro Dalcin  * @returns the node id or @c 0 on error.
65053efea5cSLisandro Dalcin  */
65153efea5cSLisandro Dalcin 
65253efea5cSLisandro Dalcin /** @} */
65353efea5cSLisandro Dalcin 
65453efea5cSLisandro Dalcin /**
65553efea5cSLisandro Dalcin  * @defgroup parser Parser Definitions
65653efea5cSLisandro Dalcin  * @{
65753efea5cSLisandro Dalcin  */
65853efea5cSLisandro Dalcin 
65953efea5cSLisandro Dalcin /**
66053efea5cSLisandro Dalcin  * The prototype of a read handler.
66153efea5cSLisandro Dalcin  *
66253efea5cSLisandro Dalcin  * The read handler is called when the parser needs to read more bytes from the
66353efea5cSLisandro Dalcin  * source.  The handler should write not more than @a size bytes to the @a
66453efea5cSLisandro Dalcin  * buffer.  The number of written bytes should be set to the @a length variable.
66553efea5cSLisandro Dalcin  *
66653efea5cSLisandro Dalcin  * @param[in,out]   data        A pointer to an application data specified by
66753efea5cSLisandro Dalcin  *                              yaml_parser_set_input().
66853efea5cSLisandro Dalcin  * @param[out]      buffer      The buffer to write the data from the source.
66953efea5cSLisandro Dalcin  * @param[in]       size        The size of the buffer.
67053efea5cSLisandro Dalcin  * @param[out]      size_read   The actual number of bytes read from the source.
67153efea5cSLisandro Dalcin  *
67253efea5cSLisandro Dalcin  * @returns On success, the handler should return @c 1.  If the handler failed,
67353efea5cSLisandro Dalcin  * the returned value should be @c 0.  On EOF, the handler should set the
67453efea5cSLisandro Dalcin  * @a size_read to @c 0 and return @c 1.
67553efea5cSLisandro Dalcin  */
67653efea5cSLisandro Dalcin 
67753efea5cSLisandro Dalcin typedef int yaml_read_handler_t(void *data, unsigned char *buffer, size_t size,
67853efea5cSLisandro Dalcin         size_t *size_read);
67953efea5cSLisandro Dalcin 
68053efea5cSLisandro Dalcin /**
68153efea5cSLisandro Dalcin  * This structure holds information about a potential simple key.
68253efea5cSLisandro Dalcin  */
68353efea5cSLisandro Dalcin 
68453efea5cSLisandro Dalcin typedef struct yaml_simple_key_s {
68553efea5cSLisandro Dalcin     /** Is a simple key possible? */
68653efea5cSLisandro Dalcin     int possible;
68753efea5cSLisandro Dalcin 
68853efea5cSLisandro Dalcin     /** Is a simple key required? */
68953efea5cSLisandro Dalcin     int required;
69053efea5cSLisandro Dalcin 
69153efea5cSLisandro Dalcin     /** The number of the token. */
69253efea5cSLisandro Dalcin     size_t token_number;
69353efea5cSLisandro Dalcin 
69453efea5cSLisandro Dalcin     /** The position mark. */
69553efea5cSLisandro Dalcin     yaml_mark_t mark;
69653efea5cSLisandro Dalcin } yaml_simple_key_t;
69753efea5cSLisandro Dalcin 
69853efea5cSLisandro Dalcin /**
69953efea5cSLisandro Dalcin  * The states of the parser.
70053efea5cSLisandro Dalcin  */
70153efea5cSLisandro Dalcin typedef enum yaml_parser_state_e {
70253efea5cSLisandro Dalcin     /** Expect STREAM-START. */
70353efea5cSLisandro Dalcin     YAML_PARSE_STREAM_START_STATE,
70453efea5cSLisandro Dalcin     /** Expect the beginning of an implicit document. */
70553efea5cSLisandro Dalcin     YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE,
70653efea5cSLisandro Dalcin     /** Expect DOCUMENT-START. */
70753efea5cSLisandro Dalcin     YAML_PARSE_DOCUMENT_START_STATE,
70853efea5cSLisandro Dalcin     /** Expect the content of a document. */
70953efea5cSLisandro Dalcin     YAML_PARSE_DOCUMENT_CONTENT_STATE,
71053efea5cSLisandro Dalcin     /** Expect DOCUMENT-END. */
71153efea5cSLisandro Dalcin     YAML_PARSE_DOCUMENT_END_STATE,
71253efea5cSLisandro Dalcin 
71353efea5cSLisandro Dalcin     /** Expect a block node. */
71453efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_NODE_STATE,
71553efea5cSLisandro Dalcin     /** Expect a block node or indentless sequence. */
71653efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE,
71753efea5cSLisandro Dalcin     /** Expect a flow node. */
71853efea5cSLisandro Dalcin     YAML_PARSE_FLOW_NODE_STATE,
71953efea5cSLisandro Dalcin     /** Expect the first entry of a block sequence. */
72053efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE,
72153efea5cSLisandro Dalcin     /** Expect an entry of a block sequence. */
72253efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE,
72353efea5cSLisandro Dalcin 
72453efea5cSLisandro Dalcin     /** Expect an entry of an indentless sequence. */
72553efea5cSLisandro Dalcin     YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE,
72653efea5cSLisandro Dalcin     /** Expect the first key of a block mapping. */
72753efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE,
72853efea5cSLisandro Dalcin     /** Expect a block mapping key. */
72953efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_MAPPING_KEY_STATE,
73053efea5cSLisandro Dalcin     /** Expect a block mapping value. */
73153efea5cSLisandro Dalcin     YAML_PARSE_BLOCK_MAPPING_VALUE_STATE,
73253efea5cSLisandro Dalcin     /** Expect the first entry of a flow sequence. */
73353efea5cSLisandro Dalcin     YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE,
73453efea5cSLisandro Dalcin 
73553efea5cSLisandro Dalcin     /** Expect an entry of a flow sequence. */
73653efea5cSLisandro Dalcin     YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE,
73753efea5cSLisandro Dalcin     /** Expect a key of an ordered mapping. */
73853efea5cSLisandro Dalcin     YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE,
73953efea5cSLisandro Dalcin     /** Expect a value of an ordered mapping. */
74053efea5cSLisandro Dalcin     YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE,
74153efea5cSLisandro Dalcin     /** Expect the and of an ordered mapping entry. */
74253efea5cSLisandro Dalcin     YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE,
74353efea5cSLisandro Dalcin     /** Expect the first key of a flow mapping. */
74453efea5cSLisandro Dalcin     YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE,
74553efea5cSLisandro Dalcin     /** Expect a key of a flow mapping. */
74653efea5cSLisandro Dalcin 
74753efea5cSLisandro Dalcin     YAML_PARSE_FLOW_MAPPING_KEY_STATE,
74853efea5cSLisandro Dalcin     /** Expect a value of a flow mapping. */
74953efea5cSLisandro Dalcin     YAML_PARSE_FLOW_MAPPING_VALUE_STATE,
75053efea5cSLisandro Dalcin     /** Expect an empty value of a flow mapping. */
75153efea5cSLisandro Dalcin     YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE,
75253efea5cSLisandro Dalcin     /** Expect nothing. */
75353efea5cSLisandro Dalcin     YAML_PARSE_END_STATE
75453efea5cSLisandro Dalcin } yaml_parser_state_t;
75553efea5cSLisandro Dalcin 
75653efea5cSLisandro Dalcin /**
75753efea5cSLisandro Dalcin  * This structure holds aliases data.
75853efea5cSLisandro Dalcin  */
75953efea5cSLisandro Dalcin 
76053efea5cSLisandro Dalcin typedef struct yaml_alias_data_s {
76153efea5cSLisandro Dalcin     /** The anchor. */
76253efea5cSLisandro Dalcin     yaml_char_t *anchor;
76353efea5cSLisandro Dalcin     /** The node id. */
76453efea5cSLisandro Dalcin     int index;
76553efea5cSLisandro Dalcin     /** The anchor mark. */
76653efea5cSLisandro Dalcin     yaml_mark_t mark;
76753efea5cSLisandro Dalcin } yaml_alias_data_t;
76853efea5cSLisandro Dalcin 
76953efea5cSLisandro Dalcin /**
77053efea5cSLisandro Dalcin  * The parser structure.
77153efea5cSLisandro Dalcin  *
77253efea5cSLisandro Dalcin  * All members are internal.  Manage the structure using the @c yaml_parser_
77353efea5cSLisandro Dalcin  * family of functions.
77453efea5cSLisandro Dalcin  */
77553efea5cSLisandro Dalcin 
77653efea5cSLisandro Dalcin typedef struct yaml_parser_s {
77753efea5cSLisandro Dalcin 
77853efea5cSLisandro Dalcin     /**
77953efea5cSLisandro Dalcin      * @name Error handling
78053efea5cSLisandro Dalcin      * @{
78153efea5cSLisandro Dalcin      */
78253efea5cSLisandro Dalcin 
78353efea5cSLisandro Dalcin     /** Error type. */
78453efea5cSLisandro Dalcin     yaml_error_type_t error;
78553efea5cSLisandro Dalcin     /** Error description. */
78653efea5cSLisandro Dalcin     const char *problem;
787a5b23f4aSJose E. Roman     /** The byte about which the problem occurred. */
78853efea5cSLisandro Dalcin     size_t problem_offset;
78953efea5cSLisandro Dalcin     /** The problematic value (@c -1 is none). */
79053efea5cSLisandro Dalcin     int problem_value;
79153efea5cSLisandro Dalcin     /** The problem position. */
79253efea5cSLisandro Dalcin     yaml_mark_t problem_mark;
79353efea5cSLisandro Dalcin     /** The error context. */
79453efea5cSLisandro Dalcin     const char *context;
79553efea5cSLisandro Dalcin     /** The context position. */
79653efea5cSLisandro Dalcin     yaml_mark_t context_mark;
79753efea5cSLisandro Dalcin 
79853efea5cSLisandro Dalcin     /**
79953efea5cSLisandro Dalcin      * @}
80053efea5cSLisandro Dalcin      */
80153efea5cSLisandro Dalcin 
80253efea5cSLisandro Dalcin     /**
80353efea5cSLisandro Dalcin      * @name Reader stuff
80453efea5cSLisandro Dalcin      * @{
80553efea5cSLisandro Dalcin      */
80653efea5cSLisandro Dalcin 
80753efea5cSLisandro Dalcin     /** Read handler. */
80853efea5cSLisandro Dalcin     yaml_read_handler_t *read_handler;
80953efea5cSLisandro Dalcin 
81053efea5cSLisandro Dalcin     /** A pointer for passing to the read handler. */
81153efea5cSLisandro Dalcin     void *read_handler_data;
81253efea5cSLisandro Dalcin 
81353efea5cSLisandro Dalcin     /** Standard (string or file) input data. */
81453efea5cSLisandro Dalcin     union {
81553efea5cSLisandro Dalcin         /** String input data. */
81653efea5cSLisandro Dalcin         struct {
81753efea5cSLisandro Dalcin             /** The string start pointer. */
81853efea5cSLisandro Dalcin             const unsigned char *start;
81953efea5cSLisandro Dalcin             /** The string end pointer. */
82053efea5cSLisandro Dalcin             const unsigned char *end;
82153efea5cSLisandro Dalcin             /** The string current position. */
82253efea5cSLisandro Dalcin             const unsigned char *current;
82353efea5cSLisandro Dalcin         } string;
82453efea5cSLisandro Dalcin 
82553efea5cSLisandro Dalcin         /** File input data. */
82653efea5cSLisandro Dalcin         FILE *file;
82753efea5cSLisandro Dalcin     } input;
82853efea5cSLisandro Dalcin 
82953efea5cSLisandro Dalcin     /** EOF flag */
83053efea5cSLisandro Dalcin     int eof;
83153efea5cSLisandro Dalcin 
83253efea5cSLisandro Dalcin     /** The working buffer. */
83353efea5cSLisandro Dalcin     struct {
83453efea5cSLisandro Dalcin         /** The beginning of the buffer. */
83553efea5cSLisandro Dalcin         yaml_char_t *start;
83653efea5cSLisandro Dalcin         /** The end of the buffer. */
83753efea5cSLisandro Dalcin         yaml_char_t *end;
83853efea5cSLisandro Dalcin         /** The current position of the buffer. */
83953efea5cSLisandro Dalcin         yaml_char_t *pointer;
84053efea5cSLisandro Dalcin         /** The last filled position of the buffer. */
84153efea5cSLisandro Dalcin         yaml_char_t *last;
84253efea5cSLisandro Dalcin     } buffer;
84353efea5cSLisandro Dalcin 
84453efea5cSLisandro Dalcin     /* The number of unread characters in the buffer. */
84553efea5cSLisandro Dalcin     size_t unread;
84653efea5cSLisandro Dalcin 
84753efea5cSLisandro Dalcin     /** The raw buffer. */
84853efea5cSLisandro Dalcin     struct {
84953efea5cSLisandro Dalcin         /** The beginning of the buffer. */
85053efea5cSLisandro Dalcin         unsigned char *start;
85153efea5cSLisandro Dalcin         /** The end of the buffer. */
85253efea5cSLisandro Dalcin         unsigned char *end;
85353efea5cSLisandro Dalcin         /** The current position of the buffer. */
85453efea5cSLisandro Dalcin         unsigned char *pointer;
85553efea5cSLisandro Dalcin         /** The last filled position of the buffer. */
85653efea5cSLisandro Dalcin         unsigned char *last;
85753efea5cSLisandro Dalcin     } raw_buffer;
85853efea5cSLisandro Dalcin 
85953efea5cSLisandro Dalcin     /** The input encoding. */
86053efea5cSLisandro Dalcin     yaml_encoding_t encoding;
86153efea5cSLisandro Dalcin 
86253efea5cSLisandro Dalcin     /** The offset of the current position (in bytes). */
86353efea5cSLisandro Dalcin     size_t offset;
86453efea5cSLisandro Dalcin 
86553efea5cSLisandro Dalcin     /** The mark of the current position. */
86653efea5cSLisandro Dalcin     yaml_mark_t mark;
86753efea5cSLisandro Dalcin 
86853efea5cSLisandro Dalcin     /**
86953efea5cSLisandro Dalcin      * @}
87053efea5cSLisandro Dalcin      */
87153efea5cSLisandro Dalcin 
87253efea5cSLisandro Dalcin     /**
87353efea5cSLisandro Dalcin      * @name Scanner stuff
87453efea5cSLisandro Dalcin      * @{
87553efea5cSLisandro Dalcin      */
87653efea5cSLisandro Dalcin 
87753efea5cSLisandro Dalcin     /** Have we started to scan the input stream? */
87853efea5cSLisandro Dalcin     int stream_start_produced;
87953efea5cSLisandro Dalcin 
88053efea5cSLisandro Dalcin     /** Have we reached the end of the input stream? */
88153efea5cSLisandro Dalcin     int stream_end_produced;
88253efea5cSLisandro Dalcin 
88353efea5cSLisandro Dalcin     /** The number of unclosed '[' and '{' indicators. */
88453efea5cSLisandro Dalcin     int flow_level;
88553efea5cSLisandro Dalcin 
88653efea5cSLisandro Dalcin     /** The tokens queue. */
88753efea5cSLisandro Dalcin     struct {
88853efea5cSLisandro Dalcin         /** The beginning of the tokens queue. */
88953efea5cSLisandro Dalcin         yaml_token_t *start;
89053efea5cSLisandro Dalcin         /** The end of the tokens queue. */
89153efea5cSLisandro Dalcin         yaml_token_t *end;
89253efea5cSLisandro Dalcin         /** The head of the tokens queue. */
89353efea5cSLisandro Dalcin         yaml_token_t *head;
89453efea5cSLisandro Dalcin         /** The tail of the tokens queue. */
89553efea5cSLisandro Dalcin         yaml_token_t *tail;
89653efea5cSLisandro Dalcin     } tokens;
89753efea5cSLisandro Dalcin 
89853efea5cSLisandro Dalcin     /** The number of tokens fetched from the queue. */
89953efea5cSLisandro Dalcin     size_t tokens_parsed;
90053efea5cSLisandro Dalcin 
90153efea5cSLisandro Dalcin     /** Does the tokens queue contain a token ready for dequeueing. */
90253efea5cSLisandro Dalcin     int token_available;
90353efea5cSLisandro Dalcin 
90453efea5cSLisandro Dalcin     /** The indentation levels stack. */
90553efea5cSLisandro Dalcin     struct {
90653efea5cSLisandro Dalcin         /** The beginning of the stack. */
90753efea5cSLisandro Dalcin         int *start;
90853efea5cSLisandro Dalcin         /** The end of the stack. */
90953efea5cSLisandro Dalcin         int *end;
91053efea5cSLisandro Dalcin         /** The top of the stack. */
91153efea5cSLisandro Dalcin         int *top;
91253efea5cSLisandro Dalcin     } indents;
91353efea5cSLisandro Dalcin 
91453efea5cSLisandro Dalcin     /** The current indentation level. */
91553efea5cSLisandro Dalcin     int indent;
91653efea5cSLisandro Dalcin 
91753efea5cSLisandro Dalcin     /** May a simple key occur at the current position? */
91853efea5cSLisandro Dalcin     int simple_key_allowed;
91953efea5cSLisandro Dalcin 
92053efea5cSLisandro Dalcin     /** The stack of simple keys. */
92153efea5cSLisandro Dalcin     struct {
92253efea5cSLisandro Dalcin         /** The beginning of the stack. */
92353efea5cSLisandro Dalcin         yaml_simple_key_t *start;
92453efea5cSLisandro Dalcin         /** The end of the stack. */
92553efea5cSLisandro Dalcin         yaml_simple_key_t *end;
92653efea5cSLisandro Dalcin         /** The top of the stack. */
92753efea5cSLisandro Dalcin         yaml_simple_key_t *top;
92853efea5cSLisandro Dalcin     } simple_keys;
92953efea5cSLisandro Dalcin 
93053efea5cSLisandro Dalcin     /**
93153efea5cSLisandro Dalcin      * @}
93253efea5cSLisandro Dalcin      */
93353efea5cSLisandro Dalcin 
93453efea5cSLisandro Dalcin     /**
93553efea5cSLisandro Dalcin      * @name Parser stuff
93653efea5cSLisandro Dalcin      * @{
93753efea5cSLisandro Dalcin      */
93853efea5cSLisandro Dalcin 
93953efea5cSLisandro Dalcin     /** The parser states stack. */
94053efea5cSLisandro Dalcin     struct {
94153efea5cSLisandro Dalcin         /** The beginning of the stack. */
94253efea5cSLisandro Dalcin         yaml_parser_state_t *start;
94353efea5cSLisandro Dalcin         /** The end of the stack. */
94453efea5cSLisandro Dalcin         yaml_parser_state_t *end;
94553efea5cSLisandro Dalcin         /** The top of the stack. */
94653efea5cSLisandro Dalcin         yaml_parser_state_t *top;
94753efea5cSLisandro Dalcin     } states;
94853efea5cSLisandro Dalcin 
94953efea5cSLisandro Dalcin     /** The current parser state. */
95053efea5cSLisandro Dalcin     yaml_parser_state_t state;
95153efea5cSLisandro Dalcin 
95253efea5cSLisandro Dalcin     /** The stack of marks. */
95353efea5cSLisandro Dalcin     struct {
95453efea5cSLisandro Dalcin         /** The beginning of the stack. */
95553efea5cSLisandro Dalcin         yaml_mark_t *start;
95653efea5cSLisandro Dalcin         /** The end of the stack. */
95753efea5cSLisandro Dalcin         yaml_mark_t *end;
95853efea5cSLisandro Dalcin         /** The top of the stack. */
95953efea5cSLisandro Dalcin         yaml_mark_t *top;
96053efea5cSLisandro Dalcin     } marks;
96153efea5cSLisandro Dalcin 
96253efea5cSLisandro Dalcin     /** The list of TAG directives. */
96353efea5cSLisandro Dalcin     struct {
96453efea5cSLisandro Dalcin         /** The beginning of the list. */
96553efea5cSLisandro Dalcin         yaml_tag_directive_t *start;
96653efea5cSLisandro Dalcin         /** The end of the list. */
96753efea5cSLisandro Dalcin         yaml_tag_directive_t *end;
96853efea5cSLisandro Dalcin         /** The top of the list. */
96953efea5cSLisandro Dalcin         yaml_tag_directive_t *top;
97053efea5cSLisandro Dalcin     } tag_directives;
97153efea5cSLisandro Dalcin 
97253efea5cSLisandro Dalcin     /**
97353efea5cSLisandro Dalcin      * @}
97453efea5cSLisandro Dalcin      */
97553efea5cSLisandro Dalcin 
97653efea5cSLisandro Dalcin     /**
97753efea5cSLisandro Dalcin      * @name Dumper stuff
97853efea5cSLisandro Dalcin      * @{
97953efea5cSLisandro Dalcin      */
98053efea5cSLisandro Dalcin 
98153efea5cSLisandro Dalcin     /** The alias data. */
98253efea5cSLisandro Dalcin     struct {
98353efea5cSLisandro Dalcin         /** The beginning of the list. */
98453efea5cSLisandro Dalcin         yaml_alias_data_t *start;
98553efea5cSLisandro Dalcin         /** The end of the list. */
98653efea5cSLisandro Dalcin         yaml_alias_data_t *end;
98753efea5cSLisandro Dalcin         /** The top of the list. */
98853efea5cSLisandro Dalcin         yaml_alias_data_t *top;
98953efea5cSLisandro Dalcin     } aliases;
99053efea5cSLisandro Dalcin 
99153efea5cSLisandro Dalcin     /** The currently parsed document. */
99253efea5cSLisandro Dalcin     yaml_document_t *document;
99353efea5cSLisandro Dalcin 
99453efea5cSLisandro Dalcin     /**
99553efea5cSLisandro Dalcin      * @}
99653efea5cSLisandro Dalcin      */
99753efea5cSLisandro Dalcin 
99853efea5cSLisandro Dalcin } yaml_parser_t;
99953efea5cSLisandro Dalcin 
100053efea5cSLisandro Dalcin /**
100153efea5cSLisandro Dalcin  * Initialize a parser.
100253efea5cSLisandro Dalcin  *
100353efea5cSLisandro Dalcin  * This function creates a new parser object.  An application is responsible
100453efea5cSLisandro Dalcin  * for destroying the object using the yaml_parser_delete() function.
100553efea5cSLisandro Dalcin  *
100653efea5cSLisandro Dalcin  * @param[out]      parser  An empty parser object.
100753efea5cSLisandro Dalcin  *
100853efea5cSLisandro Dalcin  * @returns @c 1 if the function succeeded, @c 0 on error.
100953efea5cSLisandro Dalcin  */
101053efea5cSLisandro Dalcin 
101153efea5cSLisandro Dalcin YAML_DECLARE(int)
101253efea5cSLisandro Dalcin yaml_parser_initialize(yaml_parser_t *parser);
101353efea5cSLisandro Dalcin 
101453efea5cSLisandro Dalcin /**
101553efea5cSLisandro Dalcin  * Destroy a parser.
101653efea5cSLisandro Dalcin  *
101753efea5cSLisandro Dalcin  * @param[in,out]   parser  A parser object.
101853efea5cSLisandro Dalcin  */
101953efea5cSLisandro Dalcin 
102053efea5cSLisandro Dalcin YAML_DECLARE(void)
102153efea5cSLisandro Dalcin yaml_parser_delete(yaml_parser_t *parser);
102253efea5cSLisandro Dalcin 
102353efea5cSLisandro Dalcin /**
102453efea5cSLisandro Dalcin  * Set a string input.
102553efea5cSLisandro Dalcin  *
102653efea5cSLisandro Dalcin  * Note that the @a input pointer must be valid while the @a parser object
10271a28a8ebSPierre Jolivet  * exists.  The application is responsible for destroying @a input after
102853efea5cSLisandro Dalcin  * destroying the @a parser.
102953efea5cSLisandro Dalcin  *
103053efea5cSLisandro Dalcin  * @param[in,out]   parser  A parser object.
103153efea5cSLisandro Dalcin  * @param[in]       input   A source data.
103253efea5cSLisandro Dalcin  * @param[in]       size    The length of the source data in bytes.
103353efea5cSLisandro Dalcin  */
103453efea5cSLisandro Dalcin 
103553efea5cSLisandro Dalcin YAML_DECLARE(void)
103653efea5cSLisandro Dalcin yaml_parser_set_input_string(yaml_parser_t *parser,
103753efea5cSLisandro Dalcin         const unsigned char *input, size_t size);
103853efea5cSLisandro Dalcin 
103953efea5cSLisandro Dalcin /**
104053efea5cSLisandro Dalcin  * Set a file input.
104153efea5cSLisandro Dalcin  *
104253efea5cSLisandro Dalcin  * @a file should be a file object open for reading.  The application is
104353efea5cSLisandro Dalcin  * responsible for closing the @a file.
104453efea5cSLisandro Dalcin  *
104553efea5cSLisandro Dalcin  * @param[in,out]   parser  A parser object.
104653efea5cSLisandro Dalcin  * @param[in]       file    An open file.
104753efea5cSLisandro Dalcin  */
104853efea5cSLisandro Dalcin 
104953efea5cSLisandro Dalcin YAML_DECLARE(void)
105053efea5cSLisandro Dalcin yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file);
105153efea5cSLisandro Dalcin 
105253efea5cSLisandro Dalcin /**
105353efea5cSLisandro Dalcin  * Set a generic input handler.
105453efea5cSLisandro Dalcin  *
105553efea5cSLisandro Dalcin  * @param[in,out]   parser  A parser object.
105653efea5cSLisandro Dalcin  * @param[in]       handler A read handler.
105753efea5cSLisandro Dalcin  * @param[in]       data    Any application data for passing to the read
105853efea5cSLisandro Dalcin  *                          handler.
105953efea5cSLisandro Dalcin  */
106053efea5cSLisandro Dalcin 
106153efea5cSLisandro Dalcin YAML_DECLARE(void)
106253efea5cSLisandro Dalcin yaml_parser_set_input(yaml_parser_t *parser,
106353efea5cSLisandro Dalcin         yaml_read_handler_t *handler, void *data);
106453efea5cSLisandro Dalcin 
106553efea5cSLisandro Dalcin /**
106653efea5cSLisandro Dalcin  * Set the source encoding.
106753efea5cSLisandro Dalcin  *
106853efea5cSLisandro Dalcin  * @param[in,out]   parser      A parser object.
106953efea5cSLisandro Dalcin  * @param[in]       encoding    The source encoding.
107053efea5cSLisandro Dalcin  */
107153efea5cSLisandro Dalcin 
107253efea5cSLisandro Dalcin YAML_DECLARE(void)
107353efea5cSLisandro Dalcin yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding);
107453efea5cSLisandro Dalcin 
107553efea5cSLisandro Dalcin /**
107653efea5cSLisandro Dalcin  * Scan the input stream and produce the next token.
107753efea5cSLisandro Dalcin  *
107853efea5cSLisandro Dalcin  * Call the function subsequently to produce a sequence of tokens corresponding
107953efea5cSLisandro Dalcin  * to the input stream.  The initial token has the type
108053efea5cSLisandro Dalcin  * @c YAML_STREAM_START_TOKEN while the ending token has the type
108153efea5cSLisandro Dalcin  * @c YAML_STREAM_END_TOKEN.
108253efea5cSLisandro Dalcin  *
108353efea5cSLisandro Dalcin  * An application is responsible for freeing any buffers associated with the
108453efea5cSLisandro Dalcin  * produced token object using the @c yaml_token_delete function.
108553efea5cSLisandro Dalcin  *
108653efea5cSLisandro Dalcin  * An application must not alternate the calls of yaml_parser_scan() with the
108753efea5cSLisandro Dalcin  * calls of yaml_parser_parse() or yaml_parser_load(). Doing this will break
108853efea5cSLisandro Dalcin  * the parser.
108953efea5cSLisandro Dalcin  *
109053efea5cSLisandro Dalcin  * @param[in,out]   parser      A parser object.
109153efea5cSLisandro Dalcin  * @param[out]      token       An empty token object.
109253efea5cSLisandro Dalcin  *
109353efea5cSLisandro Dalcin  * @returns @c 1 if the function succeeded, @c 0 on error.
109453efea5cSLisandro Dalcin  */
109553efea5cSLisandro Dalcin 
109653efea5cSLisandro Dalcin YAML_DECLARE(int)
109753efea5cSLisandro Dalcin yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token);
109853efea5cSLisandro Dalcin 
109953efea5cSLisandro Dalcin /**
110053efea5cSLisandro Dalcin  * Parse the input stream and produce the next parsing event.
110153efea5cSLisandro Dalcin  *
110253efea5cSLisandro Dalcin  * Call the function subsequently to produce a sequence of events corresponding
110353efea5cSLisandro Dalcin  * to the input stream.  The initial event has the type
110453efea5cSLisandro Dalcin  * @c YAML_STREAM_START_EVENT while the ending event has the type
110553efea5cSLisandro Dalcin  * @c YAML_STREAM_END_EVENT.
110653efea5cSLisandro Dalcin  *
110753efea5cSLisandro Dalcin  * An application is responsible for freeing any buffers associated with the
110853efea5cSLisandro Dalcin  * produced event object using the yaml_event_delete() function.
110953efea5cSLisandro Dalcin  *
111053efea5cSLisandro Dalcin  * An application must not alternate the calls of yaml_parser_parse() with the
111153efea5cSLisandro Dalcin  * calls of yaml_parser_scan() or yaml_parser_load(). Doing this will break the
111253efea5cSLisandro Dalcin  * parser.
111353efea5cSLisandro Dalcin  *
111453efea5cSLisandro Dalcin  * @param[in,out]   parser      A parser object.
111553efea5cSLisandro Dalcin  * @param[out]      event       An empty event object.
111653efea5cSLisandro Dalcin  *
111753efea5cSLisandro Dalcin  * @returns @c 1 if the function succeeded, @c 0 on error.
111853efea5cSLisandro Dalcin  */
111953efea5cSLisandro Dalcin 
112053efea5cSLisandro Dalcin YAML_DECLARE(int)
112153efea5cSLisandro Dalcin yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
112253efea5cSLisandro Dalcin 
112353efea5cSLisandro Dalcin /**
112453efea5cSLisandro Dalcin  * Parse the input stream and produce the next YAML document.
112553efea5cSLisandro Dalcin  *
112653efea5cSLisandro Dalcin  * Call this function subsequently to produce a sequence of documents
112753efea5cSLisandro Dalcin  * constituting the input stream.
112853efea5cSLisandro Dalcin  *
112953efea5cSLisandro Dalcin  * If the produced document has no root node, it means that the document
113053efea5cSLisandro Dalcin  * end has been reached.
113153efea5cSLisandro Dalcin  *
113253efea5cSLisandro Dalcin  * An application is responsible for freeing any data associated with the
113353efea5cSLisandro Dalcin  * produced document object using the yaml_document_delete() function.
113453efea5cSLisandro Dalcin  *
113553efea5cSLisandro Dalcin  * An application must not alternate the calls of yaml_parser_load() with the
113653efea5cSLisandro Dalcin  * calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break
113753efea5cSLisandro Dalcin  * the parser.
113853efea5cSLisandro Dalcin  *
113953efea5cSLisandro Dalcin  * @param[in,out]   parser      A parser object.
114053efea5cSLisandro Dalcin  * @param[out]      document    An empty document object.
114153efea5cSLisandro Dalcin  *
114253efea5cSLisandro Dalcin  * @returns @c 1 if the function succeeded, @c 0 on error.
114353efea5cSLisandro Dalcin  */
114453efea5cSLisandro Dalcin 
114553efea5cSLisandro Dalcin YAML_DECLARE(int)
114653efea5cSLisandro Dalcin yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document);
114753efea5cSLisandro Dalcin 
114853efea5cSLisandro Dalcin /** @} */
114953efea5cSLisandro Dalcin 
115053efea5cSLisandro Dalcin #ifdef __cplusplus
115153efea5cSLisandro Dalcin }
115253efea5cSLisandro Dalcin #endif
115353efea5cSLisandro Dalcin 
115453efea5cSLisandro Dalcin #endif /* #ifndef YAML_H */
115553efea5cSLisandro Dalcin 
1156