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