summaryrefslogtreecommitdiff
path: root/src/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/api.c')
-rw-r--r--src/api.c222
1 files changed, 213 insertions, 9 deletions
diff --git a/src/api.c b/src/api.c
index aa183af..50f118a 100644
--- a/src/api.c
+++ b/src/api.c
@@ -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);
+}
+