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) return NULL;
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) {
63 parser->raw_pointer = parser->raw_buffer;
64 parser->raw_unread = 0;
66 /* Allocate the character buffer. */
68 parser->buffer = yaml_malloc(YAML_BUFFER_SIZE);
69 if (!parser->buffer) {
70 yaml_free(parser->raw_buffer);
74 parser->buffer_end = parser->buffer;
75 parser->pointer = parser->buffer;
82 * Destroy a parser object.
86 yaml_parser_delete(yaml_parser_t *parser)
88 assert(parser); /* Non-NULL parser object expected. */
90 yaml_free(parser->buffer);
91 yaml_free(parser->raw_buffer);
93 memset(parser, 0, sizeof(yaml_parser_t));
99 * String read handler.
103 yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
106 yaml_string_input_t *input = data;
108 if (input->current == input->end) {
113 if (size > (input->end - input->current)) {
114 size = input->end - input->current;
117 memcpy(buffer, input->current, size);
118 input->current += size;
128 yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
131 *size_read = fread(buffer, 1, size, (FILE *)data);
132 return !ferror((FILE *)data);
136 * Set a string input.
140 yaml_parser_set_input_string(yaml_parser_t *parser,
141 unsigned char *input, size_t size)
143 assert(parser); /* Non-NULL parser object expected. */
144 assert(!parser->read_handler); /* You can set the source only once. */
145 assert(input); /* Non-NULL input string expected. */
147 parser->string_input.start = input;
148 parser->string_input.current = input;
149 parser->string_input.end = input+size;
151 parser->read_handler = yaml_string_read_handler;
152 parser->read_handler_data = &parser->string_input;
160 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
162 assert(parser); /* Non-NULL parser object expected. */
163 assert(!parser->read_handler); /* You can set the source only once. */
164 assert(file); /* Non-NULL file object expected. */
166 parser->read_handler = yaml_file_read_handler;
167 parser->read_handler_data = file;
171 * Set a generic input.
175 yaml_parser_set_input(yaml_parser_t *parser,
176 yaml_read_handler_t *handler, void *data)
178 assert(parser); /* Non-NULL parser object expected. */
179 assert(!parser->read_handler); /* You can set the source only once. */
180 assert(handler); /* Non-NULL read handler expected. */
182 parser->read_handler = handler;
183 parser->read_handler_data = data;
187 * Set the source encoding.
191 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
193 assert(parser); /* Non-NULL parser object expected. */
194 assert(!parser->encoding); /* Encoding is already set or detected. */
196 parser->encoding = encoding;
203 YAML_DECLARE(yaml_token_t *)
204 yaml_token_new(yaml_token_type_t type,
205 yaml_mark_t start_mark, yaml_mark_t end_mark)
207 yaml_token_t *token = yaml_malloc(sizeof(yaml_token_t));
209 if (!token) return NULL;
211 memset(token, 0, sizeof(yaml_token_t));
214 token->start_mark = start_mark;
215 token->end_mark = end_mark;
221 * Create a STREAM-START token.
224 YAML_DECLARE(yaml_token_t *)
225 yaml_stream_start_token(yaml_encoding_t encoding,
226 yaml_mark_t start_mark, yaml_mark_t end_mark)
228 yaml_token_t *token = yaml_token_new(YAML_STREAM_START_TOKEN,
229 start_mark, end_mark);
231 if (!token) return NULL;
233 token->data.encoding = encoding;
239 * Create a STREAM-END token.
242 YAML_DECLARE(yaml_token_t *)
243 yaml_stream_end_token(yaml_mark_t start_mark, yaml_mark_t end_mark)
245 yaml_token_t *token = yaml_token_new(YAML_STREAM_END_TOKEN,
246 start_mark, end_mark);
248 if (!token) return NULL;
254 * Create a VERSION-DIRECTIVE token.
257 YAML_DECLARE(yaml_token_t *)
258 yaml_version_directive_token_new(int major, int minor,
259 yaml_mark_t start_mark, yaml_mark_t end_mark)
261 yaml_token_t *token = yaml_token_new(YAML_VERSION_DIRECTIVE_TOKEN,
262 start_mark, end_mark);
264 if (!token) return NULL;
266 token->data.version_directive.major = major;
267 token->data.version_directive.minor = minor;
273 * Create a TAG-DIRECTIVE token.
276 YAML_DECLARE(yaml_token_t *)
277 yaml_tag_directive_token_new(yaml_char_t *handle, yaml_char_t *prefix,
278 yaml_mark_t start_mark, yaml_mark_t end_mark)
280 yaml_token_t *token = yaml_token_new(YAML_TAG_DIRECTIVE_TOKEN,
281 start_mark, end_mark);
283 if (!token) return NULL;
285 token->data.tag_directive.handle = handle;
286 token->data.tag_directive.prefix = prefix;
292 * Create an ALIAS token.
295 YAML_DECLARE(yaml_token_t *)
296 yaml_alias_token_new(yaml_char_t *anchor,
297 yaml_mark_t start_mark, yaml_mark_t end_mark)
299 yaml_token_t *token = yaml_token_new(YAML_ALIAS_TOKEN,
300 start_mark, end_mark);
302 if (!token) return NULL;
304 token->data.anchor = anchor;
310 * Create an ANCHOR token.
313 YAML_DECLARE(yaml_token_t *)
314 yaml_anchor_token_new(yaml_char_t *anchor,
315 yaml_mark_t start_mark, yaml_mark_t end_mark)
317 yaml_token_t *token = yaml_token_new(YAML_ANCHOR_TOKEN,
318 start_mark, end_mark);
320 if (!token) return NULL;
322 token->data.anchor = anchor;
328 * Create a TAG token.
331 YAML_DECLARE(yaml_token_t *)
332 yaml_tag_token_new(yaml_char_t *handle, yaml_char_t *suffix,
333 yaml_mark_t start_mark, yaml_mark_t end_mark)
335 yaml_token_t *token = yaml_token_new(YAML_TAG_TOKEN,
336 start_mark, end_mark);
338 if (!token) return NULL;
340 token->data.tag.handle = handle;
341 token->data.tag.suffix = suffix;
347 * Create a SCALAR token.
350 YAML_DECLARE(yaml_token_t *)
351 yaml_scalar_token_new(yaml_char_t *value, size_t length,
352 yaml_scalar_style_t style,
353 yaml_mark_t start_mark, yaml_mark_t end_mark)
355 yaml_token_t *token = yaml_token_new(YAML_SCALAR_TOKEN,
356 start_mark, end_mark);
358 if (!token) return NULL;
360 token->data.scalar.value = value;
361 token->data.scalar.length = length;
362 token->data.scalar.style = style;
368 * Destroy a token object.
372 yaml_token_delete(yaml_token_t *token)
374 assert(token); /* Non-NULL token object expected. */
378 case YAML_TAG_DIRECTIVE_TOKEN:
379 yaml_free(token->data.tag_directive.handle);
380 yaml_free(token->data.tag_directive.prefix);
383 case YAML_ALIAS_TOKEN:
384 case YAML_ANCHOR_TOKEN:
385 yaml_free(token->data.anchor);
389 yaml_free(token->data.tag.handle);
390 yaml_free(token->data.tag.suffix);
393 case YAML_SCALAR_TOKEN:
394 yaml_free(token->data.scalar.value);
398 memset(token, 0, sizeof(yaml_token_t));