10 YAML_DECLARE(const char *)
11 yaml_get_version_string(void)
13 return YAML_VERSION_STRING;
17 yaml_get_version(int *major, int *minor, int *patch)
19 *major = YAML_VERSION_MAJOR;
20 *minor = YAML_VERSION_MINOR;
21 *patch = YAML_VERSION_PATCH;
25 * Allocate a dynamic memory block.
29 yaml_malloc(size_t size)
31 return malloc(size ? size : 1);
35 * Reallocate a dynamic memory block.
39 yaml_realloc(void *ptr, size_t size)
41 return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
45 * Free a dynamic memory block.
55 * Create a new parser object.
58 YAML_DECLARE(yaml_parser_t *)
61 yaml_parser_t *parser;
63 /* Allocate the parser structure. */
65 parser = yaml_malloc(sizeof(yaml_parser_t));
66 if (!parser) goto error;
68 memset(parser, 0, sizeof(yaml_parser_t));
70 /* Allocate the raw buffer. */
72 parser->raw_buffer = yaml_malloc(YAML_RAW_BUFFER_SIZE);
73 if (!parser->raw_buffer) goto error;
74 memset(parser->raw_buffer, 0, YAML_RAW_BUFFER_SIZE);
76 parser->raw_pointer = parser->raw_buffer;
77 parser->raw_unread = 0;
79 /* Allocate the character buffer. */
81 parser->buffer = yaml_malloc(YAML_BUFFER_SIZE);
82 if (!parser->buffer) goto error;
83 memset(parser->buffer, 0, YAML_BUFFER_SIZE);
85 parser->buffer_end = parser->buffer;
86 parser->pointer = parser->buffer;
89 /* Allocate the tokens queue. */
91 parser->tokens = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_token_t *));
92 if (!parser->tokens) goto error;
93 memset(parser->tokens, 0, YAML_DEFAULT_SIZE*sizeof(yaml_token_t *));
95 parser->tokens_size = YAML_DEFAULT_SIZE;
96 parser->tokens_head = 0;
97 parser->tokens_tail = 0;
98 parser->tokens_parsed = 0;
100 /* Allocate the indents stack. */
102 parser->indents = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(int));
103 if (!parser->indents) goto error;
104 memset(parser->indents, 0, YAML_DEFAULT_SIZE*sizeof(int));
106 parser->indents_size = YAML_DEFAULT_SIZE;
107 parser->indents_length = 0;
109 /* Allocate the stack of potential simple keys. */
111 parser->simple_keys = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_simple_key_t *));
112 if (!parser->simple_keys) goto error;
113 memset(parser->simple_keys, 0, YAML_DEFAULT_SIZE*sizeof(yaml_simple_key_t *));
115 parser->simple_keys_size = YAML_DEFAULT_SIZE;
117 /* Allocate the stack of parser states. */
119 parser->states = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_parser_state_t));
120 if (!parser->states) goto error;
121 memset(parser->states, 0, YAML_DEFAULT_SIZE*sizeof(yaml_parser_state_t));
123 parser->states_size = YAML_DEFAULT_SIZE;
125 /* Set the initial state. */
127 parser->state = YAML_PARSE_STREAM_START_STATE;
129 /* Allocate the list of TAG directives. */
131 parser->tag_directives = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_tag_directive_t *));
132 if (!parser->tag_directives) goto error;
133 memset(parser->tag_directives, 0, YAML_DEFAULT_SIZE*sizeof(yaml_tag_directive_t *));
135 parser->tag_directives_size = YAML_DEFAULT_SIZE;
141 /* On error, free allocated buffers. */
145 if (!parser) return NULL;
147 yaml_free(parser->tag_directives);
148 yaml_free(parser->states);
149 yaml_free(parser->simple_keys);
150 yaml_free(parser->indents);
151 yaml_free(parser->tokens);
152 yaml_free(parser->buffer);
153 yaml_free(parser->raw_buffer);
161 * Destroy a parser object.
165 yaml_parser_delete(yaml_parser_t *parser)
167 assert(parser); /* Non-NULL parser object expected. */
169 yaml_free(parser->tag_directives);
170 yaml_free(parser->states);
171 yaml_free(parser->simple_keys);
172 yaml_free(parser->indents);
173 yaml_free(parser->tokens);
174 yaml_free(parser->buffer);
175 yaml_free(parser->raw_buffer);
177 memset(parser, 0, sizeof(yaml_parser_t));
183 * String read handler.
187 yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
190 yaml_string_input_t *input = data;
192 if (input->current == input->end) {
197 if (size > (input->end - input->current)) {
198 size = input->end - input->current;
201 memcpy(buffer, input->current, size);
202 input->current += size;
212 yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
215 *size_read = fread(buffer, 1, size, (FILE *)data);
216 return !ferror((FILE *)data);
220 * Set a string input.
224 yaml_parser_set_input_string(yaml_parser_t *parser,
225 unsigned char *input, size_t size)
227 assert(parser); /* Non-NULL parser object expected. */
228 assert(!parser->read_handler); /* You can set the source only once. */
229 assert(input); /* Non-NULL input string expected. */
231 parser->string_input.start = input;
232 parser->string_input.current = input;
233 parser->string_input.end = input+size;
235 parser->read_handler = yaml_string_read_handler;
236 parser->read_handler_data = &parser->string_input;
244 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
246 assert(parser); /* Non-NULL parser object expected. */
247 assert(!parser->read_handler); /* You can set the source only once. */
248 assert(file); /* Non-NULL file object expected. */
250 parser->read_handler = yaml_file_read_handler;
251 parser->read_handler_data = file;
255 * Set a generic input.
259 yaml_parser_set_input(yaml_parser_t *parser,
260 yaml_read_handler_t *handler, void *data)
262 assert(parser); /* Non-NULL parser object expected. */
263 assert(!parser->read_handler); /* You can set the source only once. */
264 assert(handler); /* Non-NULL read handler expected. */
266 parser->read_handler = handler;
267 parser->read_handler_data = data;
271 * Set the source encoding.
275 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
277 assert(parser); /* Non-NULL parser object expected. */
278 assert(!parser->encoding); /* Encoding is already set or detected. */
280 parser->encoding = encoding;
287 YAML_DECLARE(yaml_token_t *)
288 yaml_token_new(yaml_token_type_t type,
289 yaml_mark_t start_mark, yaml_mark_t end_mark)
291 yaml_token_t *token = yaml_malloc(sizeof(yaml_token_t));
293 if (!token) return NULL;
295 memset(token, 0, sizeof(yaml_token_t));
298 token->start_mark = start_mark;
299 token->end_mark = end_mark;
305 * Create a STREAM-START token.
308 YAML_DECLARE(yaml_token_t *)
309 yaml_stream_start_token_new(yaml_encoding_t encoding,
310 yaml_mark_t start_mark, yaml_mark_t end_mark)
312 yaml_token_t *token = yaml_token_new(YAML_STREAM_START_TOKEN,
313 start_mark, end_mark);
315 if (!token) return NULL;
317 token->data.stream_start.encoding = encoding;
323 * Create a STREAM-END token.
326 YAML_DECLARE(yaml_token_t *)
327 yaml_stream_end_token_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
329 yaml_token_t *token = yaml_token_new(YAML_STREAM_END_TOKEN,
330 start_mark, end_mark);
332 if (!token) return NULL;
338 * Create a VERSION-DIRECTIVE token.
341 YAML_DECLARE(yaml_token_t *)
342 yaml_version_directive_token_new(int major, int minor,
343 yaml_mark_t start_mark, yaml_mark_t end_mark)
345 yaml_token_t *token = yaml_token_new(YAML_VERSION_DIRECTIVE_TOKEN,
346 start_mark, end_mark);
348 if (!token) return NULL;
350 token->data.version_directive.major = major;
351 token->data.version_directive.minor = minor;
357 * Create a TAG-DIRECTIVE token.
360 YAML_DECLARE(yaml_token_t *)
361 yaml_tag_directive_token_new(yaml_char_t *handle, yaml_char_t *prefix,
362 yaml_mark_t start_mark, yaml_mark_t end_mark)
364 yaml_token_t *token = yaml_token_new(YAML_TAG_DIRECTIVE_TOKEN,
365 start_mark, end_mark);
367 if (!token) return NULL;
369 token->data.tag_directive.handle = handle;
370 token->data.tag_directive.prefix = prefix;
376 * Create an ALIAS token.
379 YAML_DECLARE(yaml_token_t *)
380 yaml_alias_token_new(yaml_char_t *anchor,
381 yaml_mark_t start_mark, yaml_mark_t end_mark)
383 yaml_token_t *token = yaml_token_new(YAML_ALIAS_TOKEN,
384 start_mark, end_mark);
386 if (!token) return NULL;
388 token->data.alias.value = anchor;
394 * Create an ANCHOR token.
397 YAML_DECLARE(yaml_token_t *)
398 yaml_anchor_token_new(yaml_char_t *anchor,
399 yaml_mark_t start_mark, yaml_mark_t end_mark)
401 yaml_token_t *token = yaml_token_new(YAML_ANCHOR_TOKEN,
402 start_mark, end_mark);
404 if (!token) return NULL;
406 token->data.anchor.value = anchor;
412 * Create a TAG token.
415 YAML_DECLARE(yaml_token_t *)
416 yaml_tag_token_new(yaml_char_t *handle, yaml_char_t *suffix,
417 yaml_mark_t start_mark, yaml_mark_t end_mark)
419 yaml_token_t *token = yaml_token_new(YAML_TAG_TOKEN,
420 start_mark, end_mark);
422 if (!token) return NULL;
424 token->data.tag.handle = handle;
425 token->data.tag.suffix = suffix;
431 * Create a SCALAR token.
434 YAML_DECLARE(yaml_token_t *)
435 yaml_scalar_token_new(yaml_char_t *value, size_t length,
436 yaml_scalar_style_t style,
437 yaml_mark_t start_mark, yaml_mark_t end_mark)
439 yaml_token_t *token = yaml_token_new(YAML_SCALAR_TOKEN,
440 start_mark, end_mark);
442 if (!token) return NULL;
444 token->data.scalar.value = value;
445 token->data.scalar.length = length;
446 token->data.scalar.style = style;
452 * Destroy a token object.
456 yaml_token_delete(yaml_token_t *token)
458 assert(token); /* Non-NULL token object expected. */
462 case YAML_TAG_DIRECTIVE_TOKEN:
463 yaml_free(token->data.tag_directive.handle);
464 yaml_free(token->data.tag_directive.prefix);
467 case YAML_ALIAS_TOKEN:
468 yaml_free(token->data.alias.value);
471 case YAML_ANCHOR_TOKEN:
472 yaml_free(token->data.anchor.value);
476 yaml_free(token->data.tag.handle);
477 yaml_free(token->data.tag.suffix);
480 case YAML_SCALAR_TOKEN:
481 yaml_free(token->data.scalar.value);
485 memset(token, 0, sizeof(yaml_token_t));
494 static yaml_event_t *
495 yaml_event_new(yaml_event_type_t type,
496 yaml_mark_t start_mark, yaml_mark_t end_mark)
498 yaml_event_t *event = yaml_malloc(sizeof(yaml_event_t));
500 if (!event) return NULL;
502 memset(event, 0, sizeof(yaml_event_t));
505 event->start_mark = start_mark;
506 event->end_mark = end_mark;
512 * Create a STREAM-START event.
515 YAML_DECLARE(yaml_event_t *)
516 yaml_stream_start_event_new(yaml_encoding_t encoding,
517 yaml_mark_t start_mark, yaml_mark_t end_mark)
519 yaml_event_t *event = yaml_event_new(YAML_STREAM_START_EVENT,
520 start_mark, end_mark);
522 if (!event) return NULL;
524 event->data.stream_start.encoding = encoding;
530 * Create a STREAM-END event.
533 YAML_DECLARE(yaml_event_t *)
534 yaml_stream_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
536 return yaml_event_new(YAML_STREAM_END_EVENT, start_mark, end_mark);
540 * Create a DOCUMENT-START event.
543 YAML_DECLARE(yaml_event_t *)
544 yaml_document_start_event_new(yaml_version_directive_t *version_directive,
545 yaml_tag_directive_t **tag_directives, int implicit,
546 yaml_mark_t start_mark, yaml_mark_t end_mark)
548 yaml_event_t *event = yaml_event_new(YAML_DOCUMENT_START_EVENT,
549 start_mark, end_mark);
551 if (!event) return NULL;
553 event->data.document_start.version_directive = version_directive;
554 event->data.document_start.tag_directives = tag_directives;
555 event->data.document_start.implicit = implicit;
561 * Create a DOCUMENT-END event.
564 YAML_DECLARE(yaml_event_t *)
565 yaml_document_end_event_new(int implicit,
566 yaml_mark_t start_mark, yaml_mark_t end_mark)
568 yaml_event_t *event = yaml_event_new(YAML_DOCUMENT_END_EVENT,
569 start_mark, end_mark);
571 if (!event) return NULL;
573 event->data.document_end.implicit = implicit;
579 * Create an ALIAS event.
582 YAML_DECLARE(yaml_event_t *)
583 yaml_alias_event_new(yaml_char_t *anchor,
584 yaml_mark_t start_mark, yaml_mark_t end_mark)
586 yaml_event_t *event = yaml_event_new(YAML_ALIAS_EVENT,
587 start_mark, end_mark);
589 if (!event) return NULL;
591 event->data.alias.anchor = anchor;
597 * Create a SCALAR event.
600 YAML_DECLARE(yaml_event_t *)
601 yaml_scalar_event_new(yaml_char_t *anchor, yaml_char_t *tag,
602 yaml_char_t *value, size_t length,
603 int plain_implicit, int quoted_implicit,
604 yaml_scalar_style_t style,
605 yaml_mark_t start_mark, yaml_mark_t end_mark)
607 yaml_event_t *event = yaml_event_new(YAML_SCALAR_EVENT,
608 start_mark, end_mark);
610 if (!event) return NULL;
612 event->data.scalar.anchor = anchor;
613 event->data.scalar.tag = tag;
614 event->data.scalar.value = value;
615 event->data.scalar.length = length;
616 event->data.scalar.plain_implicit = plain_implicit;
617 event->data.scalar.quoted_implicit = quoted_implicit;
618 event->data.scalar.style = style;
624 * Create a SEQUENCE-START event.
627 YAML_DECLARE(yaml_event_t *)
628 yaml_sequence_start_new(yaml_char_t *anchor, yaml_char_t *tag,
629 int implicit, yaml_sequence_style_t style,
630 yaml_mark_t start_mark, yaml_mark_t end_mark)
632 yaml_event_t *event = yaml_event_new(YAML_SEQUENCE_START_EVENT,
633 start_mark, end_mark);
635 if (!event) return NULL;
637 event->data.sequence_start.anchor = anchor;
638 event->data.sequence_start.tag = tag;
639 event->data.sequence_start.implicit = implicit;
640 event->data.sequence_start.style = style;
646 * Create a SEQUENCE-END event.
649 YAML_DECLARE(yaml_event_t *)
650 yaml_sequence_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
652 return yaml_event_new(YAML_SEQUENCE_END_EVENT, start_mark, end_mark);
656 * Create a MAPPING-START event.
659 YAML_DECLARE(yaml_event_t *)
660 yaml_mapping_start_new(yaml_char_t *anchor, yaml_char_t *tag,
661 int implicit, yaml_mapping_style_t style,
662 yaml_mark_t start_mark, yaml_mark_t end_mark)
664 yaml_event_t *event = yaml_event_new(YAML_MAPPING_START_EVENT,
665 start_mark, end_mark);
667 if (!event) return NULL;
669 event->data.mapping_start.anchor = anchor;
670 event->data.mapping_start.tag = tag;
671 event->data.mapping_start.implicit = implicit;
672 event->data.mapping_start.style = style;
678 * Create a MAPPING-END event.
681 YAML_DECLARE(yaml_event_t *)
682 yaml_mapping_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
684 return yaml_event_new(YAML_MAPPING_END_EVENT, start_mark, end_mark);
688 * Destroy an event object.
692 yaml_event_delete(yaml_event_t *event)
694 assert(event); /* Non-NULL event object expected. */
698 case YAML_DOCUMENT_START_EVENT:
699 yaml_free(event->data.document_start.version_directive);
700 if (event->data.document_start.tag_directives) {
701 yaml_tag_directive_t **tag_directive;
702 for (tag_directive = event->data.document_start.tag_directives;
703 *tag_directive; tag_directive++) {
704 yaml_free((*tag_directive)->handle);
705 yaml_free((*tag_directive)->prefix);
706 yaml_free(*tag_directive);
708 yaml_free(event->data.document_start.tag_directives);
712 case YAML_ALIAS_EVENT:
713 yaml_free(event->data.alias.anchor);
716 case YAML_SCALAR_EVENT:
717 yaml_free(event->data.scalar.anchor);
718 yaml_free(event->data.scalar.tag);
719 yaml_free(event->data.scalar.value);
722 case YAML_SEQUENCE_START_EVENT:
723 yaml_free(event->data.sequence_start.anchor);
724 yaml_free(event->data.sequence_start.tag);
727 case YAML_MAPPING_START_EVENT:
728 yaml_free(event->data.mapping_start.anchor);
729 yaml_free(event->data.mapping_start.tag);
733 memset(event, 0, sizeof(yaml_event_t));