Index: libyaml/trunk/src/api.c
===================================================================
--- libyaml/trunk/src/api.c	(revision 180)
+++ libyaml/trunk/src/api.c	(revision 183)
@@ -12,5 +12,5 @@
  */
 
-void *
+YAML_DECLARE(void *)
 yaml_malloc(size_t size)
 {
@@ -22,5 +22,5 @@
  */
 
-void *
+YAML_DECLARE(void *)
 yaml_realloc(void *ptr, size_t size)
 {
@@ -32,5 +32,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_free(void *ptr)
 {
@@ -42,5 +42,5 @@
  */
 
-yaml_parser_t *
+YAML_DECLARE(yaml_parser_t *)
 yaml_parser_new(void)
 {
@@ -83,5 +83,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_delete(yaml_parser_t *parser)
 {
@@ -137,5 +137,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input_string(yaml_parser_t *parser,
         unsigned char *input, size_t size)
@@ -157,5 +157,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
 {
@@ -172,5 +172,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input(yaml_parser_t *parser,
         yaml_read_handler_t *handler, void *data)
@@ -188,5 +188,5 @@
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
 {
@@ -197,2 +197,206 @@
 }
 
+/*
+ * 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);
+}
+
