diff options
Diffstat (limited to 'src/api.c')
-rw-r--r-- | src/api.c | 222 |
1 files changed, 213 insertions, 9 deletions
@@ -11,7 +11,7 @@ * Allocate a dynamic memory block. */ -void * +YAML_DECLARE(void *) yaml_malloc(size_t size) { return malloc(size ? size : 1); @@ -21,7 +21,7 @@ yaml_malloc(size_t size) * Reallocate a dynamic memory block. */ -void * +YAML_DECLARE(void *) yaml_realloc(void *ptr, size_t size) { return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1); @@ -31,7 +31,7 @@ yaml_realloc(void *ptr, size_t size) * Free a dynamic memory block. */ -void +YAML_DECLARE(void) yaml_free(void *ptr) { if (ptr) free(ptr); @@ -41,7 +41,7 @@ yaml_free(void *ptr) * Create a new parser object. */ -yaml_parser_t * +YAML_DECLARE(yaml_parser_t *) yaml_parser_new(void) { yaml_parser_t *parser; @@ -82,7 +82,7 @@ yaml_parser_new(void) * Destroy a parser object. */ -void +YAML_DECLARE(void) yaml_parser_delete(yaml_parser_t *parser) { assert(parser); /* Non-NULL parser object expected. */ @@ -136,7 +136,7 @@ yaml_file_read_handler(void *data, unsigned char *buffer, size_t size, * Set a string input. */ -void +YAML_DECLARE(void) yaml_parser_set_input_string(yaml_parser_t *parser, unsigned char *input, size_t size) { @@ -156,7 +156,7 @@ yaml_parser_set_input_string(yaml_parser_t *parser, * Set a file input. */ -void +YAML_DECLARE(void) yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file) { assert(parser); /* Non-NULL parser object expected. */ @@ -171,7 +171,7 @@ yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file) * Set a generic input. */ -void +YAML_DECLARE(void) yaml_parser_set_input(yaml_parser_t *parser, yaml_read_handler_t *handler, void *data) { @@ -187,7 +187,7 @@ yaml_parser_set_input(yaml_parser_t *parser, * Set the source encoding. */ -void +YAML_DECLARE(void) yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding) { assert(parser); /* Non-NULL parser object expected. */ @@ -196,3 +196,207 @@ yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding) parser->encoding = encoding; } +/* + * Create a token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_token_new(yaml_token_type_t type, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_malloc(sizeof(yaml_token_t)); + + if (!token) return NULL; + + memset(token, 0, sizeof(yaml_token_t)); + + token->type = type; + token->start_mark = start_mark; + token->end_mark = end_mark; + + return token; +} + +/* + * Create a STREAM-START token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_stream_start_token(yaml_encoding_t encoding, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_STREAM_START_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.encoding = encoding; + + return token; +} + +/* + * Create a STREAM-END token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_stream_end_token(yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_STREAM_END_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + return token; +} + +/* + * Create a VERSION-DIRECTIVE token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_version_directive_token_new(int major, int minor, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_VERSION_DIRECTIVE_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.version_directive.major = major; + token->data.version_directive.minor = minor; + + return token; +} + +/* + * Create a TAG-DIRECTIVE token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_tag_directive_token_new(yaml_char_t *handle, yaml_char_t *prefix, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_TAG_DIRECTIVE_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.tag_directive.handle = handle; + token->data.tag_directive.prefix = prefix; + + return token; +} + +/* + * Create an ALIAS token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_alias_token_new(yaml_char_t *anchor, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_ALIAS_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.anchor = anchor; + + return token; +} + +/* + * Create an ANCHOR token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_anchor_token_new(yaml_char_t *anchor, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_ANCHOR_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.anchor = anchor; + + return token; +} + +/* + * Create a TAG token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_tag_token_new(yaml_char_t *handle, yaml_char_t *suffix, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_TAG_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.tag.handle = handle; + token->data.tag.suffix = suffix; + + return token; +} + +/* + * Create a SCALAR token. + */ + +YAML_DECLARE(yaml_token_t *) +yaml_scalar_token_new(yaml_char_t *value, size_t length, + yaml_scalar_style_t style, + yaml_mark_t start_mark, yaml_mark_t end_mark) +{ + yaml_token_t *token = yaml_token_new(YAML_SCALAR_TOKEN, + start_mark, end_mark); + + if (!token) return NULL; + + token->data.scalar.value = value; + token->data.scalar.length = length; + token->data.scalar.style = style; + + return token; +} + +/* + * Destroy a token object. + */ + +YAML_DECLARE(void) +yaml_token_delete(yaml_token_t *token) +{ + assert(token); /* Non-NULL token object expected. */ + + switch (token->type) + { + case YAML_TAG_DIRECTIVE_TOKEN: + yaml_free(token->data.tag_directive.handle); + yaml_free(token->data.tag_directive.prefix); + break; + + case YAML_ALIAS_TOKEN: + case YAML_ANCHOR_TOKEN: + yaml_free(token->data.anchor); + break; + + case YAML_TAG_TOKEN: + yaml_free(token->data.tag.handle); + yaml_free(token->data.tag.suffix); + break; + + case YAML_SCALAR_TOKEN: + yaml_free(token->data.scalar.value); + break; + } + + memset(token, 0, sizeof(yaml_token_t)); + + yaml_free(token); +} + |