]> andersk Git - libyaml.git/blob - include/yaml/yaml.h
6faf7df8b0f2aa3beee282cedff38e2fb6f5ca16
[libyaml.git] / include / yaml / yaml.h
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/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 Definitions
24  * @{
25  */
26
27 /** The public API declaration. */
28
29 #ifdef WIN32
30 #   if defined(YAML_DECLARE_STATIC)
31 #       define  YAML_DECLARE(type)  type
32 #   elif defined(YAML_DECLARE_EXPORT)
33 #       define  YAML_DECLARE(type)  __declspec(dllexport) type
34 #   else
35 #       define  YAML_DECLARE(type)  __declspec(dllimport) type
36 #   endif
37 #else
38 #   define  YAML_DECLARE(type)  type
39 #endif
40
41 /** @} */
42
43 /**
44  * @defgroup version Version Information
45  * @{
46  */
47
48 /**
49  * Get the library version as a string.
50  *
51  * @returns The function returns the pointer to a static string of the form
52  * @c "X.Y.Z", where @c X is the major version number, @c Y is a minor version
53  * number, and @c Z is the patch version number.
54  */
55
56 YAML_DECLARE(const char *)
57 yaml_get_version_string(void);
58
59 /**
60  * Get the library version numbers.
61  *
62  * @param[out]  major   Major version number.
63  * @param[out]  minor   Minor version number.
64  * @param[out]  patch   Patch version number.
65  */
66
67 YAML_DECLARE(void)
68 yaml_get_version(int *major, int *minor, int *patch);
69
70 /** @} */
71
72 /**
73  * @defgroup basic Basic Types
74  * @{
75  */
76
77 /** The character type (UTF-8 octet). */
78 typedef unsigned char yaml_char_t;
79
80 /** The stream encoding. */
81 typedef enum {
82     YAML_ANY_ENCODING,
83     YAML_UTF8_ENCODING,
84     YAML_UTF16LE_ENCODING,
85     YAML_UTF16BE_ENCODING
86 } yaml_encoding_t;
87
88 /** Many bad things could happen with the parser and emitter. */
89 typedef enum {
90     YAML_NO_ERROR,
91
92     YAML_MEMORY_ERROR,
93
94     YAML_READER_ERROR,
95     YAML_SCANNER_ERROR,
96     YAML_PARSER_ERROR,
97
98     YAML_WRITER_ERROR,
99     YAML_EMITTER_ERROR
100 } yaml_error_type_t;
101
102 /** The pointer position. */
103 typedef struct {
104     /** The position index. */
105     size_t index;
106
107     /** The position line. */
108     size_t line;
109
110     /** The position column. */
111     size_t column;
112 } yaml_mark_t;
113
114 /** @} */
115
116 /**
117  * @defgroup Node Styles
118  * @{
119  */
120
121 /** Scalar styles. */
122 typedef enum {
123     YAML_ANY_SCALAR_STYLE,
124
125     YAML_PLAIN_SCALAR_STYLE,
126
127     YAML_SINGLE_QUOTED_SCALAR_STYLE,
128     YAML_DOUBLE_QUOTED_SCALAR_STYLE,
129
130     YAML_LITERAL_SCALAR_STYLE,
131     YAML_FOLDED_SCALAR_STYLE
132 } yaml_scalar_style_t;
133
134
135 /** Sequence styles. */
136 typedef enum {
137     YAML_ANY_SEQUENCE_STYLE,
138
139     YAML_BLOCK_SEQUENCE_STYLE,
140     YAML_FLOW_SEQUENCE_STYLE
141 } yaml_sequence_style_t;
142
143 /** Mapping styles. */
144 typedef enum {
145     YAML_ANY_MAPPING_STYLE,
146
147     YAML_BLOCK_MAPPING_STYLE,
148     YAML_FLOW_MAPPING_STYLE
149 } yaml_mapping_style_t;
150
151 /** @} */
152
153 /**
154  * @defgroup Tokens
155  * @{
156  */
157
158 /** Token types. */
159 typedef enum {
160     YAML_STREAM_START_TOKEN,
161     YAML_STREAM_END_TOKEN,
162
163     YAML_VERSION_DIRECTIVE_TOKEN,
164     YAML_TAG_DIRECTIVE_TOKEN,
165     YAML_DOCUMENT_START_TOKEN,
166     YAML_DOCUMENT_END_TOKEN,
167
168     YAML_BLOCK_SEQUENCE_START_TOKEN,
169     YAML_BLOCK_MAPPING_START_TOKEN,
170     YAML_BLOCK_END_TOKEN,
171
172     YAML_FLOW_SEQUENCE_START_TOKEN,
173     YAML_FLOW_SEQUENCE_END_TOKEN,
174     YAML_FLOW_MAPPING_START_TOKEN,
175     YAML_FLOW_MAPPING_END_TOKEN,
176
177     YAML_BLOCK_ENTRY_TOKEN,
178     YAML_FLOW_ENTRY_TOKEN,
179     YAML_KEY_TOKEN,
180     YAML_VALUE_TOKEN,
181
182     YAML_ALIAS_TOKEN,
183     YAML_ANCHOR_TOKEN,
184     YAML_TAG_TOKEN,
185     YAML_SCALAR_TOKEN
186 } yaml_token_type_t;
187
188 /** The token structure. */
189 typedef struct {
190
191     /** The token type. */
192     yaml_token_type_t type;
193
194     /** The token data. */
195     union {
196
197         /** The stream encoding (for @c YAML_STREAM_START_TOKEN). */
198         yaml_encoding_t encoding;
199
200         /** The anchor (for @c YAML_ALIAS_TOKEN and @c YAML_ANCHOR_TOKEN). */
201         yaml_char_t *anchor;
202
203         /** The tag (for @c YAML_TAG_TOKEN). */
204         struct {
205             /** The tag handle. */
206             yaml_char_t *handle;
207
208             /** The tag suffix. */
209             yaml_char_t *suffix;
210         } tag;
211
212         /** The scalar value (for @c YAML_SCALAR_TOKEN). */
213         struct {
214
215             /** The scalar value. */
216             yaml_char_t *value;
217
218             /** The length of the scalar value. */
219             size_t length;
220
221             /** The scalar style. */
222             yaml_scalar_style_t style;
223         } scalar;
224
225         /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */
226         struct {
227             /** The major version number. */
228             int major;
229
230             /** The minor version number. */
231             int minor;
232         } version_directive;
233
234         /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */
235         struct {
236             /** The tag handle. */
237             yaml_char_t *handle;
238
239             /** The tag prefix. */
240             yaml_char_t *prefix;
241         } tag_directive;
242     } data;
243
244     /** The beginning of the token. */
245     yaml_mark_t start_mark;
246
247     /** The end of the token. */
248     yaml_mark_t end_mark;
249
250 } yaml_token_t;
251
252 /**
253  * Create a new token without assigning any data.
254  *
255  * This function can be used for constructing indicator tokens:
256  * @c YAML_DOCUMENT_START, @c YAML_DOCUMENT_END,
257  * @c YAML_BLOCK_SEQUENCE_START_TOKEN, @c YAML_BLOCK_MAPPING_START_TOKEN,
258  * @c YAML_BLOCK_END_TOKEN,
259  * @c YAML_FLOW_SEQUENCE_START_TOKEN, @c YAML_FLOW_SEQUENCE_END_TOKEN,
260  * @c YAML_FLOW_MAPPING_START_TOKEN, @c YAML_FLOW_MAPPING_END_TOKEN,
261  * @c YAML_BLOCK_ENTRY_TOKEN, @c YAML_FLOW_ENTRY_TOKEN,
262  * @c YAML_KEY_TOKEN, @c YAML_VALUE_TOKEN.
263  *
264  * @param[in]   type        The token type.
265  * @param[in]   start_mark  The beginning of the token.
266  * @param[in]   end_mark    The end of the token.
267  *
268  * @returns A new token object, or @c NULL on error.
269  */
270
271 YAML_DECLARE(yaml_token_t *)
272 yaml_token_new(yaml_token_type_t type,
273         yaml_mark_t start_mark, yaml_mark_t end_mark);
274
275 /**
276  * Create a new @c YAML_STREAM_START_TOKEN token with the specified encoding.
277  *
278  * @param[in]   encoding    The stream encoding.
279  * @param[in]   start_mark  The beginning of the token.
280  * @param[in]   end_mark    The end of the token.
281  *
282  * @returns A new token object, or @c NULL on error.
283  */
284
285 YAML_DECLARE(yaml_token_t *)
286 yaml_stream_start_token_new(yaml_encoding_t encoding,
287         yaml_mark_t start_mark, yaml_mark_t end_mark);
288
289 /**
290  * Create a new @c YAML_STREAM_END_TOKEN token.
291  *
292  * @param[in]   start_mark  The beginning of the token.
293  * @param[in]   end_mark    The end of the token.
294  *
295  * @returns A new token object, or @c NULL on error.
296  */
297
298 YAML_DECLARE(yaml_token_t *)
299 yaml_stream_end_token_new(yaml_mark_t start_mark, yaml_mark_t end_mark);
300
301 /**
302  * Create a new @c YAML_VERSION_DIRECTIVE_TOKEN token with the specified
303  * version numbers.
304  *
305  * @param[in]   major       The major version number.
306  * @param[in]   minor       The minor version number.
307  * @param[in]   start_mark  The beginning of the token.
308  * @param[in]   end_mark    The end of the token.
309  *
310  * @returns A new token object, or @c NULL on error.
311  */
312
313 YAML_DECLARE(yaml_token_t *)
314 yaml_version_directive_token_new(int major, int minor,
315         yaml_mark_t start_mark, yaml_mark_t end_mark);
316
317 /**
318  * Create a new @c YAML_TAG_DIRECTIVE_TOKEN token with the specified tag
319  * handle and prefix.
320  *
321  * Note that the @a handle and the @a prefix pointers will be freed by
322  * the token descructor.
323  *
324  * @param[in]   handle      The tag handle.
325  * @param[in]   prefix      The tag prefix.
326  * @param[in]   start_mark  The beginning of the token.
327  * @param[in]   end_mark    The end of the token.
328  *
329  * @returns A new token object, or @c NULL on error.
330  */
331
332 YAML_DECLARE(yaml_token_t *)
333 yaml_tag_directive_token_new(yaml_char_t *handle, yaml_char_t *prefix,
334         yaml_mark_t start_mark, yaml_mark_t end_mark);
335
336 /**
337  * Create a new @c YAML_ALIAS_TOKEN token with the specified anchor.
338  *
339  * Note that the @a anchor pointer will be freed by the token descructor.
340  *
341  * @param[in]   anchor      The anchor.
342  * @param[in]   start_mark  The beginning of the token.
343  * @param[in]   end_mark    The end of the token.
344  *
345  * @returns A new token object, or @c NULL on error.
346  */
347
348 YAML_DECLARE(yaml_token_t *)
349 yaml_alias_token_new(yaml_char_t *anchor,
350         yaml_mark_t start_mark, yaml_mark_t end_mark);
351
352 /**
353  * Create a new @c YAML_ANCHOR_TOKEN token with the specified anchor.
354  *
355  * Note that the @a anchor pointer will be freed by the token descructor.
356  *
357  * @param[in]   anchor      The anchor.
358  * @param[in]   start_mark  The beginning of the token.
359  * @param[in]   end_mark    The end of the token.
360  *
361  * @returns A new token object, or @c NULL on error.
362  */
363
364 YAML_DECLARE(yaml_token_t *)
365 yaml_anchor_token_new(yaml_char_t *anchor,
366         yaml_mark_t start_mark, yaml_mark_t end_mark);
367
368 /**
369  * Create a new @c YAML_TAG_TOKEN token with the specified tag handle and
370  * suffix.
371  *
372  * Note that the @a handle and the @a suffix pointers will be freed by
373  * the token descructor.
374  *
375  * @param[in]   handle      The tag handle.
376  * @param[in]   suffix      The tag suffix.
377  * @param[in]   start_mark  The beginning of the token.
378  * @param[in]   end_mark    The end of the token.
379  *
380  * @returns A new token object, or @c NULL on error.
381  */
382
383 YAML_DECLARE(yaml_token_t *)
384 yaml_tag_token_new(yaml_char_t *handle, yaml_char_t *suffix,
385         yaml_mark_t start_mark, yaml_mark_t end_mark);
386
387 /**
388  * Create a new @c YAML_SCALAR_TOKEN token with the specified scalar value,
389  * length, and style.
390  *
391  * Note that the scalar value may contain the @c NUL character, therefore
392  * the value length is also required.  The scalar value always ends with
393  * @c NUL.
394  *
395  * Note that the @a value pointer will be freed by the token descructor.
396  *
397  * @param[in]   value       The scalar value.
398  * @param[in]   length      The value length.
399  * @param[in]   style       The scalar style.
400  * @param[in]   start_mark  The beginning of the token.
401  * @param[in]   end_mark    The end of the token.
402  *
403  * @returns A new token object, or @c NULL on error.
404  */
405
406 YAML_DECLARE(yaml_token_t *)
407 yaml_scalar_token_new(yaml_char_t *value, size_t length,
408         yaml_scalar_style_t style,
409         yaml_mark_t start_mark, yaml_mark_t end_mark);
410
411 /**
412  * Destroy a token object.
413  *
414  * @param[in]   token   A token object.
415  */
416
417 YAML_DECLARE(void)
418 yaml_token_delete(yaml_token_t *token);
419
420 /** @} */
421
422 /*
423
424 typedef enum {
425     YAML_STREAM_START_EVENT,
426     YAML_STREAM_END_EVENT,
427
428     YAML_DOCUMENT_START_EVENT,
429     YAML_DOCUMENT_END_EVENT,
430
431     YAML_ALIAS_EVENT,
432     YAML_SCALAR_EVENT,
433
434     YAML_SEQUENCE_START_EVENT,
435     YAML_SEQUENCE_END_EVENT,
436
437     YAML_MAPPING_START_EVENT,
438     YAML_MAPPING_END_EVENT
439 } yaml_event_type_t;
440
441 typedef struct {
442     yaml_event_type_t type;
443     union {
444         struct {
445             yaml_encoding_t encoding;
446         } stream_start;
447         struct {
448             struct {
449                 int major;
450                 int minor;
451             } version;
452             struct {
453                 char *handle;
454                 char *prefix;
455             } **tag_pairs;
456             int implicit;
457         } document_start;
458         struct {
459             int implicit;
460         } document_end;
461         struct {
462             char *anchor;
463         } alias;
464         struct {
465             char *anchor;
466             char *tag;
467             char *value;
468             size_t length;
469             int plain_implicit;
470             int quoted_implicit;
471             yaml_scalar_style_t style;
472         } scalar;
473         struct {
474             char *anchor;
475             char *tag;
476             int implicit;
477             yaml_sequence_style_t style;
478         } sequence_start;
479         struct {
480             char *anchor;
481             char *tag;
482             int implicit;
483             yaml_mapping_style_t style;
484         } mapping_start;
485     } data;
486     yaml_mark_t start_mark;
487     yaml_mark_t end_mark;
488 } yaml_event_t;
489
490 */
491
492
493 /**
494  * @defgroup parser Parser Definitions
495  * @{
496  */
497
498 /**
499  * The prototype of a read handler.
500  *
501  * The read handler is called when the parser needs to read more bytes from the
502  * source.  The handler should write not more than @a size bytes to the @a
503  * buffer.  The number of written bytes should be set to the @a length variable.
504  *
505  * @param[in]   data        A pointer to an application data specified by
506  *                          @c yaml_parser_set_read_handler.
507  * @param[out]  buffer      The buffer to write the data from the source.
508  * @param[in]   size        The size of the buffer.
509  * @param[out]  size_read   The actual number of bytes read from the source.
510  *
511  * @returns On success, the handler should return @c 1.  If the handler failed,
512  * the returned value should be @c 0.  On EOF, the handler should set the
513  * @a length to @c 0 and return @c 1.
514  */
515
516 typedef int yaml_read_handler_t(void *data, unsigned char *buffer, size_t size,
517         size_t *size_read);
518
519 /**
520  * This structure holds a string input specified by
521  * @c yaml_parser_set_input_string.
522  */
523
524 typedef struct {
525     /** The string start pointer. */
526     unsigned char *start;
527
528     /** The string end pointer. */
529     unsigned char *end;
530
531     /** The string current position. */
532     unsigned char *current;
533 } yaml_string_input_t;
534
535 /**
536  * The parser structure.
537  *
538  * All members are internal.  Manage the structure using the @c yaml_parser_
539  * family of functions.
540  */
541
542 typedef struct {
543
544     /**
545      * @name Error handling
546      * @{
547      */
548
549     /** Error type. */
550     yaml_error_type_t error;
551
552     /** Error description. */
553     const char *problem;
554
555     /** The byte about which the problem occured. */
556     size_t problem_offset;
557
558     /** The problematic value (@c -1 is none). */
559     int problem_value;
560
561     /**
562      * @}
563      */
564
565     /**
566      * @name Reader stuff
567      * @{
568      */
569
570     /** Read handler. */
571     yaml_read_handler_t *read_handler;
572
573     /** A pointer for passing to the read handler. */
574     void *read_handler_data;
575
576     /** EOF flag */
577     int eof;
578
579     /** The pointer to the beginning of the working buffer. */
580     yaml_char_t *buffer;
581
582     /** The pointer to the end of the working buffer. */
583     yaml_char_t *buffer_end;
584
585     /** The pointer to the current character in the working buffer. */
586     yaml_char_t *pointer;
587
588     /** The number of unread characters in the working buffer. */
589     size_t unread;
590
591     /** The pointer to the beginning of the raw buffer. */
592     unsigned char *raw_buffer;
593
594     /** The pointer to the current character in the raw buffer. */
595     unsigned char *raw_pointer;
596
597     /** The number of unread bytes in the raw buffer. */
598     size_t raw_unread;
599
600     /** The input encoding. */
601     yaml_encoding_t encoding;
602
603     /** The offset of the current position (in bytes). */
604     size_t offset;
605
606     /** The index of the current position (in characters). */
607     size_t index;
608
609     /** The line of the current position (starting from @c 0). */
610     size_t line;
611
612     /** The column of the current position (starting from @c 0). */
613     size_t column;
614
615     /* String input structure. */
616     yaml_string_input_t string_input;
617
618     /**
619      * @}
620      */
621
622 } yaml_parser_t;
623
624 /**
625  * Create a new parser.
626  *
627  * This function creates a new parser object.  An application is responsible
628  * for destroying the object using the @c yaml_parser_delete function.
629  *
630  * @returns A new parser object; @c NULL on error.
631  */
632
633 YAML_DECLARE(yaml_parser_t *)
634 yaml_parser_new(void);
635
636 /**
637  * Destroy a parser.
638  *
639  * @param[in]   parser  A parser object.
640  */
641
642 YAML_DECLARE(void)
643 yaml_parser_delete(yaml_parser_t *parser);
644
645 /**
646  * Set a string input.
647  *
648  * Note that the @a input pointer must be valid while the @a parser object
649  * exists.  The application is responsible for destroing @a input after
650  * destroying the @a parser.
651  *
652  * @param[in]   parser  A parser object.
653  * @param[in]   input   A source data.
654  * @param[in]   size    The length of the source data in bytes.
655  */
656
657 YAML_DECLARE(void)
658 yaml_parser_set_input_string(yaml_parser_t *parser,
659         unsigned char *input, size_t size);
660
661
662 /**
663  * Set a file input.
664  *
665  * @a file should be a file object open for reading.  The application is
666  * responsible for closing the @a file.
667  *
668  * @param[in]   parser  A parser object.
669  * @param[in]   file    An open file.
670  */
671
672 YAML_DECLARE(void)
673 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file);
674
675 /**
676  * Set a generic input handler.
677  *
678  * @param[in]   parser  A parser object.
679  * @param[in]   handler A read handler.
680  * @param[in]   data    Any application data for passing to the read handler.
681  */
682
683 YAML_DECLARE(void)
684 yaml_parser_set_input(yaml_parser_t *parser,
685         yaml_read_handler_t *handler, void *data);
686
687 /**
688  * Set the source encoding.
689  *
690  * @param[in]   parser      A parser object.
691  * @param[in]   encoding    The source encoding.
692  */
693
694 YAML_DECLARE(void)
695 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding);
696
697 /** @} */
698
699 /*
700 typedef struct {
701 } yaml_emitter_t;
702 */
703
704 /**
705  * @defgroup internal Internal Definitions
706  * @{
707  */
708
709 /**
710  * Allocate a dynamic memory block.
711  *
712  * @param[in]   size    Size of a memory block, \c 0 is valid.
713  *
714  * @returns @c yaml_malloc returns a pointer to a newly allocated memory block,
715  * or @c NULL if it failed.
716  */
717
718 YAML_DECLARE(void *)
719 yaml_malloc(size_t size);
720
721 /**
722  * Reallocate a dynamic memory block.
723  *
724  * @param[in]   ptr     A pointer to an existing memory block, \c NULL is
725  *                      valid.
726  * @param[in]   size    A size of a new block, \c 0 is valid.
727  *
728  * @returns @c yaml_realloc returns a pointer to a reallocated memory block,
729  * or @c NULL if it failed.
730  */
731
732 YAML_DECLARE(void *)
733 yaml_realloc(void *ptr, size_t size);
734
735 /**
736  * Free a dynamic memory block.
737  *
738  * @param[in]   ptr     A pointer to an existing memory block, \c NULL is
739  *                      valid.
740  */
741
742 YAML_DECLARE(void)
743 yaml_free(void *ptr);
744
745 /** The size of the raw buffer. */
746
747 #define YAML_RAW_BUFFER_SIZE 16384
748
749 /**
750  * The size of the buffer.
751  *
752  * We allocate enough space for decoding the whole raw buffer.
753  */
754
755 #define YAML_BUFFER_SIZE    (YAML_RAW_BUFFER_SIZE*3)
756
757 /**
758  * Ensure that the buffer contains at least @a length characters.
759  *
760  * @param[in]   parser  A parser object.
761  * @param[in]   length  The number of characters in the buffer.
762  *
763  * @returns @c 1 on success, @c 0 on error.
764  */
765
766 YAML_DECLARE(int)
767 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
768
769 /** @} */
770
771
772 #ifdef __cplusplus
773 }
774 #endif
775
776 #endif /* #ifndef YAML_H */
777
This page took 0.127672 seconds and 3 git commands to generate.