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