xref: /petsc/src/sys/yaml/include/yaml.h (revision 53efea5c680dffccb0b7659435e1dc1aa9e95c12)
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