11 * Allocate a dynamic memory block.
15 yaml_malloc(size_t size)
17 return malloc(size ? size : 1);
21 * Reallocate a dynamic memory block.
25 yaml_realloc(void *ptr, size_t size)
27 return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
31 * Free a dynamic memory block.
41 * Create a new parser object.
44 YAML_DECLARE(yaml_parser_t *)
47 yaml_parser_t *parser;
49 /* Allocate the parser structure. */
51 parser = yaml_malloc(sizeof(yaml_parser_t));
52 if (!parser) goto error;
54 memset(parser, 0, sizeof(yaml_parser_t));
56 /* Allocate the raw buffer. */
58 parser->raw_buffer = yaml_malloc(YAML_RAW_BUFFER_SIZE);
59 if (!parser->raw_buffer) goto error;
60 memset(parser->raw_buffer, 0, YAML_RAW_BUFFER_SIZE);
62 parser->raw_pointer = parser->raw_buffer;
63 parser->raw_unread = 0;
65 /* Allocate the character buffer. */
67 parser->buffer = yaml_malloc(YAML_BUFFER_SIZE);
68 if (!parser->buffer) goto error;
69 memset(parser->buffer, 0, YAML_BUFFER_SIZE);
71 parser->buffer_end = parser->buffer;
72 parser->pointer = parser->buffer;
75 /* Allocate the tokens queue. */
77 parser->tokens = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_token_t *));
78 if (!parser->tokens) goto error;
79 memset(parser->tokens, 0, YAML_DEFAULT_SIZE*sizeof(yaml_token_t *));
81 parser->tokens_size = YAML_DEFAULT_SIZE;
82 parser->tokens_head = 0;
83 parser->tokens_tail = 0;
84 parser->tokens_parsed = 0;
86 /* Allocate the indents stack. */
88 parser->indents = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(int));
89 if (!parser->indents) goto error;
90 memset(parser->indents, 0, YAML_DEFAULT_SIZE*sizeof(int));
92 parser->indents_size = YAML_DEFAULT_SIZE;
93 parser->indents_length = 0;
95 /* Allocate the stack of potential simple keys. */
97 parser->simple_keys = yaml_malloc(YAML_DEFAULT_SIZE*sizeof(yaml_simple_key_t *));
98 if (!parser->simple_keys) goto error;
99 memset(parser->simple_keys, 0, YAML_DEFAULT_SIZE*sizeof(yaml_simple_key_t *));
101 parser->simple_keys_size = YAML_DEFAULT_SIZE;
107 /* On error, free allocated buffers. */
111 if (!parser) return NULL;
113 yaml_free(parser->simple_keys);
114 yaml_free(parser->indents);
115 yaml_free(parser->tokens);
116 yaml_free(parser->buffer);
117 yaml_free(parser->raw_buffer);
125 * Destroy a parser object.
129 yaml_parser_delete(yaml_parser_t *parser)
131 assert(parser); /* Non-NULL parser object expected. */
133 yaml_free(parser->simple_keys);
134 yaml_free(parser->indents);
135 yaml_free(parser->tokens);
136 yaml_free(parser->buffer);
137 yaml_free(parser->raw_buffer);
139 memset(parser, 0, sizeof(yaml_parser_t));
145 * String read handler.
149 yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
152 yaml_string_input_t *input = data;
154 if (input->current == input->end) {
159 if (size > (input->end - input->current)) {
160 size = input->end - input->current;
163 memcpy(buffer, input->current, size);
164 input->current += size;
174 yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
177 *size_read = fread(buffer, 1, size, (FILE *)data);
178 return !ferror((FILE *)data);
182 * Set a string input.
186 yaml_parser_set_input_string(yaml_parser_t *parser,
187 unsigned char *input, size_t size)
189 assert(parser); /* Non-NULL parser object expected. */
190 assert(!parser->read_handler); /* You can set the source only once. */
191 assert(input); /* Non-NULL input string expected. */
193 parser->string_input.start = input;
194 parser->string_input.current = input;
195 parser->string_input.end = input+size;
197 parser->read_handler = yaml_string_read_handler;
198 parser->read_handler_data = &parser->string_input;
206 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
208 assert(parser); /* Non-NULL parser object expected. */
209 assert(!parser->read_handler); /* You can set the source only once. */
210 assert(file); /* Non-NULL file object expected. */
212 parser->read_handler = yaml_file_read_handler;
213 parser->read_handler_data = file;
217 * Set a generic input.
221 yaml_parser_set_input(yaml_parser_t *parser,
222 yaml_read_handler_t *handler, void *data)
224 assert(parser); /* Non-NULL parser object expected. */
225 assert(!parser->read_handler); /* You can set the source only once. */
226 assert(handler); /* Non-NULL read handler expected. */
228 parser->read_handler = handler;
229 parser->read_handler_data = data;
233 * Set the source encoding.
237 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
239 assert(parser); /* Non-NULL parser object expected. */
240 assert(!parser->encoding); /* Encoding is already set or detected. */
242 parser->encoding = encoding;
249 YAML_DECLARE(yaml_token_t *)
250 yaml_token_new(yaml_token_type_t type,
251 yaml_mark_t start_mark, yaml_mark_t end_mark)
253 yaml_token_t *token = yaml_malloc(sizeof(yaml_token_t));
255 if (!token) return NULL;
257 memset(token, 0, sizeof(yaml_token_t));
260 token->start_mark = start_mark;
261 token->end_mark = end_mark;
267 * Create a STREAM-START token.
270 YAML_DECLARE(yaml_token_t *)
271 yaml_stream_start_token_new(yaml_encoding_t encoding,
272 yaml_mark_t start_mark, yaml_mark_t end_mark)
274 yaml_token_t *token = yaml_token_new(YAML_STREAM_START_TOKEN,
275 start_mark, end_mark);
277 if (!token) return NULL;
279 token->data.stream_start.encoding = encoding;
285 * Create a STREAM-END token.
288 YAML_DECLARE(yaml_token_t *)
289 yaml_stream_end_token_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
291 yaml_token_t *token = yaml_token_new(YAML_STREAM_END_TOKEN,
292 start_mark, end_mark);
294 if (!token) return NULL;
300 * Create a VERSION-DIRECTIVE token.
303 YAML_DECLARE(yaml_token_t *)
304 yaml_version_directive_token_new(int major, int minor,
305 yaml_mark_t start_mark, yaml_mark_t end_mark)
307 yaml_token_t *token = yaml_token_new(YAML_VERSION_DIRECTIVE_TOKEN,
308 start_mark, end_mark);
310 if (!token) return NULL;
312 token->data.version_directive.major = major;
313 token->data.version_directive.minor = minor;
319 * Create a TAG-DIRECTIVE token.
322 YAML_DECLARE(yaml_token_t *)
323 yaml_tag_directive_token_new(yaml_char_t *handle, yaml_char_t *prefix,
324 yaml_mark_t start_mark, yaml_mark_t end_mark)
326 yaml_token_t *token = yaml_token_new(YAML_TAG_DIRECTIVE_TOKEN,
327 start_mark, end_mark);
329 if (!token) return NULL;
331 token->data.tag_directive.handle = handle;
332 token->data.tag_directive.prefix = prefix;
338 * Create an ALIAS token.
341 YAML_DECLARE(yaml_token_t *)
342 yaml_alias_token_new(yaml_char_t *anchor,
343 yaml_mark_t start_mark, yaml_mark_t end_mark)
345 yaml_token_t *token = yaml_token_new(YAML_ALIAS_TOKEN,
346 start_mark, end_mark);
348 if (!token) return NULL;
350 token->data.alias.value = anchor;
356 * Create an ANCHOR token.
359 YAML_DECLARE(yaml_token_t *)
360 yaml_anchor_token_new(yaml_char_t *anchor,
361 yaml_mark_t start_mark, yaml_mark_t end_mark)
363 yaml_token_t *token = yaml_token_new(YAML_ANCHOR_TOKEN,
364 start_mark, end_mark);
366 if (!token) return NULL;
368 token->data.anchor.value = anchor;
374 * Create a TAG token.
377 YAML_DECLARE(yaml_token_t *)
378 yaml_tag_token_new(yaml_char_t *handle, yaml_char_t *suffix,
379 yaml_mark_t start_mark, yaml_mark_t end_mark)
381 yaml_token_t *token = yaml_token_new(YAML_TAG_TOKEN,
382 start_mark, end_mark);
384 if (!token) return NULL;
386 token->data.tag.handle = handle;
387 token->data.tag.suffix = suffix;
393 * Create a SCALAR token.
396 YAML_DECLARE(yaml_token_t *)
397 yaml_scalar_token_new(yaml_char_t *value, size_t length,
398 yaml_scalar_style_t style,
399 yaml_mark_t start_mark, yaml_mark_t end_mark)
401 yaml_token_t *token = yaml_token_new(YAML_SCALAR_TOKEN,
402 start_mark, end_mark);
404 if (!token) return NULL;
406 token->data.scalar.value = value;
407 token->data.scalar.length = length;
408 token->data.scalar.style = style;
414 * Destroy a token object.
418 yaml_token_delete(yaml_token_t *token)
420 assert(token); /* Non-NULL token object expected. */
424 case YAML_TAG_DIRECTIVE_TOKEN:
425 yaml_free(token->data.tag_directive.handle);
426 yaml_free(token->data.tag_directive.prefix);
429 case YAML_ALIAS_TOKEN:
430 yaml_free(token->data.alias.value);
433 case YAML_ANCHOR_TOKEN:
434 yaml_free(token->data.anchor.value);
438 yaml_free(token->data.tag.handle);
439 yaml_free(token->data.tag.suffix);
442 case YAML_SCALAR_TOKEN:
443 yaml_free(token->data.scalar.value);
447 memset(token, 0, sizeof(yaml_token_t));
456 static yaml_event_t *
457 yaml_event_new(yaml_event_type_t type,
458 yaml_mark_t start_mark, yaml_mark_t end_mark)
460 yaml_event_t *event = yaml_malloc(sizeof(yaml_event_t));
462 if (!event) return NULL;
464 memset(event, 0, sizeof(yaml_event_t));
467 event->start_mark = start_mark;
468 event->end_mark = end_mark;
474 * Create a STREAM-START event.
477 YAML_DECLARE(yaml_event_t *)
478 yaml_stream_start_event_new(yaml_encoding_t encoding,
479 yaml_mark_t start_mark, yaml_mark_t end_mark)
481 yaml_event_t *event = yaml_event_new(YAML_STREAM_START_EVENT,
482 start_mark, end_mark);
484 if (!event) return NULL;
486 event->data.stream_start.encoding = encoding;
492 * Create a STREAM-END event.
495 YAML_DECLARE(yaml_event_t *)
496 yaml_stream_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
498 return yaml_event_new(YAML_STREAM_END_EVENT, start_mark, end_mark);
502 * Create a DOCUMENT-START event.
505 YAML_DECLARE(yaml_event_t *)
506 yaml_document_start_event_new(yaml_version_directive_t *version_directive,
507 yaml_tag_directive_t **tag_directives, int implicit,
508 yaml_mark_t start_mark, yaml_mark_t end_mark)
510 yaml_event_t *event = yaml_event_new(YAML_DOCUMENT_START_EVENT,
511 start_mark, end_mark);
513 if (!event) return NULL;
515 event->data.document_start.version_directive = version_directive;
516 event->data.document_start.tag_directives = tag_directives;
517 event->data.document_start.implicit = implicit;
523 * Create a DOCUMENT-END event.
526 YAML_DECLARE(yaml_event_t *)
527 yaml_document_end_event_new(int implicit,
528 yaml_mark_t start_mark, yaml_mark_t end_mark)
530 yaml_event_t *event = yaml_event_new(YAML_DOCUMENT_END_EVENT,
531 start_mark, end_mark);
533 if (!event) return NULL;
535 event->data.document_end.implicit = implicit;
541 * Create an ALIAS event.
544 YAML_DECLARE(yaml_event_t *)
545 yaml_alias_event_new(yaml_char_t *anchor,
546 yaml_mark_t start_mark, yaml_mark_t end_mark)
548 yaml_event_t *event = yaml_event_new(YAML_ALIAS_EVENT,
549 start_mark, end_mark);
551 if (!event) return NULL;
553 event->data.alias.anchor = anchor;
559 * Create a SCALAR event.
562 YAML_DECLARE(yaml_event_t *)
563 yaml_scalar_event_new(yaml_char_t *anchor, yaml_char_t *tag,
564 yaml_char_t *value, size_t length,
565 int plain_implicit, int quoted_implicit,
566 yaml_scalar_style_t style,
567 yaml_mark_t start_mark, yaml_mark_t end_mark)
569 yaml_event_t *event = yaml_event_new(YAML_SCALAR_EVENT,
570 start_mark, end_mark);
572 if (!event) return NULL;
574 event->data.scalar.anchor = anchor;
575 event->data.scalar.tag = tag;
576 event->data.scalar.value = value;
577 event->data.scalar.length = length;
578 event->data.scalar.plain_implicit = plain_implicit;
579 event->data.scalar.quoted_implicit = quoted_implicit;
580 event->data.scalar.style = style;
586 * Create a SEQUENCE-START event.
589 YAML_DECLARE(yaml_event_t *)
590 yaml_sequence_start_new(yaml_char_t *anchor, yaml_char_t *tag,
591 int implicit, yaml_sequence_style_t style,
592 yaml_mark_t start_mark, yaml_mark_t end_mark)
594 yaml_event_t *event = yaml_event_new(YAML_SEQUENCE_START_EVENT,
595 start_mark, end_mark);
597 if (!event) return NULL;
599 event->data.sequence_start.anchor = anchor;
600 event->data.sequence_start.tag = tag;
601 event->data.sequence_start.implicit = implicit;
602 event->data.sequence_start.style = style;
608 * Create a SEQUENCE-END event.
611 YAML_DECLARE(yaml_event_t *)
612 yaml_sequence_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
614 return yaml_event_new(YAML_SEQUENCE_END_EVENT, start_mark, end_mark);
618 * Create a MAPPING-START event.
621 YAML_DECLARE(yaml_event_t *)
622 yaml_mapping_start_new(yaml_char_t *anchor, yaml_char_t *tag,
623 int implicit, yaml_mapping_style_t style,
624 yaml_mark_t start_mark, yaml_mark_t end_mark)
626 yaml_event_t *event = yaml_event_new(YAML_MAPPING_START_EVENT,
627 start_mark, end_mark);
629 if (!event) return NULL;
631 event->data.mapping_start.anchor = anchor;
632 event->data.mapping_start.tag = tag;
633 event->data.mapping_start.implicit = implicit;
634 event->data.mapping_start.style = style;
640 * Create a MAPPING-END event.
643 YAML_DECLARE(yaml_event_t *)
644 yaml_mapping_end_event_new(yaml_mark_t start_mark, yaml_mark_t end_mark)
646 return yaml_event_new(YAML_MAPPING_END_EVENT, start_mark, end_mark);
650 * Destroy an event object.
654 yaml_event_delete(yaml_event_t *event)
656 assert(event); /* Non-NULL event object expected. */
660 case YAML_DOCUMENT_START_EVENT:
661 yaml_free(event->data.document_start.version_directive);
662 if (event->data.document_start.tag_directives) {
663 yaml_tag_directive_t **tag_directive;
664 for (tag_directive = event->data.document_start.tag_directives;
665 *tag_directive; tag_directive++) {
666 yaml_free((*tag_directive)->handle);
667 yaml_free((*tag_directive)->prefix);
668 yaml_free(*tag_directive);
670 yaml_free(event->data.document_start.tag_directives);
674 case YAML_ALIAS_EVENT:
675 yaml_free(event->data.alias.anchor);
678 case YAML_SCALAR_EVENT:
679 yaml_free(event->data.scalar.anchor);
680 yaml_free(event->data.scalar.tag);
681 yaml_free(event->data.scalar.value);
684 case YAML_SEQUENCE_START_EVENT:
685 yaml_free(event->data.sequence_start.anchor);
686 yaml_free(event->data.sequence_start.tag);
689 case YAML_MAPPING_START_EVENT:
690 yaml_free(event->data.mapping_start.anchor);
691 yaml_free(event->data.mapping_start.tag);
695 memset(event, 0, sizeof(yaml_event_t));