Commits

Kirill Simonov committed 82de714

Add token constructors and destructors.

Add YAML_DECLARE to the API declarations (Thanks to Peter Murphy for suggestion).

  • Participants
  • Parent commits 57721c7

Comments (0)

Files changed (4)

File doc/doxygen.cfg

 # Configuration options related to the preprocessor   
 #---------------------------------------------------------------------------
 ENABLE_PREPROCESSING   = YES
-MACRO_EXPANSION        = NO
-EXPAND_ONLY_PREDEF     = NO
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
 SEARCH_INCLUDES        = YES
 INCLUDE_PATH           = 
 INCLUDE_FILE_PATTERNS  = 
-PREDEFINED             = 
+PREDEFINED             = "YAML_DECLARE(type)=type"
 EXPAND_AS_DEFINED      = 
 SKIP_FUNCTION_MACROS   = YES
 #---------------------------------------------------------------------------

File include/yaml/yaml.h

 #include <string.h>
 
 /**
+ * @defgroup Export Definitions
+ * @{
+ */
+
+/** The public API declaration. */
+
+#ifdef WIN32
+#   if defined(YAML_DECLARE_STATIC)
+#       define  YAML_DECLARE(type)  type
+#   elif defined(YAML_DECLARE_EXPORT)
+#       define  YAML_DECLARE(type)  __declspec(dllexport) type
+#   else
+#       define  YAML_DECLARE(type)  __declspec(dllimport) type
+#   endif
+#else
+#   define  YAML_DECLARE(type)  type
+#endif
+
+/** @} */
+
+/**
  * @defgroup version Version Information
  * @{
  */
  * number, and @c Z is the patch version number.
  */
 
-const char *
+YAML_DECLARE(const char *)
 yaml_get_version_string(void);
 
 /**
  * @param[out]  patch   Patch version number.
  */
 
-void
+YAML_DECLARE(void)
 yaml_get_version(int *major, int *minor, int *patch);
 
 /** @} */
  * @{
  */
 
-/** The character type. */
+/** The character type (UTF-8 octet). */
 typedef unsigned char yaml_char_t;
 
 /** The stream encoding. */
     YAML_EMITTER_ERROR
 } yaml_error_type_t;
 
+/** The pointer position. */
+typedef struct {
+    /** The position index. */
+    size_t index;
+
+    /** The position line. */
+    size_t line;
+
+    /** The position column. */
+    size_t column;
+} yaml_mark_t;
+
 /** @} */
 
-/*
+/**
+ * @defgroup Node Styles
+ * @{
+ */
 
+/** Scalar styles. */
 typedef enum {
     YAML_ANY_SCALAR_STYLE,
+
     YAML_PLAIN_SCALAR_STYLE,
+
     YAML_SINGLE_QUOTED_SCALAR_STYLE,
     YAML_DOUBLE_QUOTED_SCALAR_STYLE,
+
     YAML_LITERAL_SCALAR_STYLE,
     YAML_FOLDED_SCALAR_STYLE
 } yaml_scalar_style_t;
 
+
+/** Sequence styles. */
 typedef enum {
     YAML_ANY_SEQUENCE_STYLE,
+
     YAML_BLOCK_SEQUENCE_STYLE,
     YAML_FLOW_SEQUENCE_STYLE
 } yaml_sequence_style_t;
 
+/** Mapping styles. */
 typedef enum {
     YAML_ANY_MAPPING_STYLE,
+
     YAML_BLOCK_MAPPING_STYLE,
     YAML_FLOW_MAPPING_STYLE
 } yaml_mapping_style_t;
 
+/** @} */
+
+/**
+ * @defgroup Tokens
+ * @{
+ */
+
+/** Token types. */
 typedef enum {
     YAML_STREAM_START_TOKEN,
     YAML_STREAM_END_TOKEN,
     YAML_SCALAR_TOKEN
 } yaml_token_type_t;
 
+/** The token structure. */
+typedef struct {
+
+    /** The token type. */
+    yaml_token_type_t type;
+
+    /** The token data. */
+    union {
+
+        /** The stream encoding (for @c YAML_STREAM_START_TOKEN). */
+        yaml_encoding_t encoding;
+
+        /** The anchor (for @c YAML_ALIAS_TOKEN and @c YAML_ANCHOR_TOKEN). */
+        yaml_char_t *anchor;
+
+        /** The tag (for @c YAML_TAG_TOKEN). */
+        struct {
+            /** The tag handle. */
+            yaml_char_t *handle;
+
+            /** The tag suffix. */
+            yaml_char_t *suffix;
+        } tag;
+
+        /** The scalar value (for @c YAML_SCALAR_TOKEN). */
+        struct {
+
+            /** The scalar value. */
+            yaml_char_t *value;
+
+            /** The length of the scalar value. */
+            size_t length;
+
+            /** The scalar style. */
+            yaml_scalar_style_t style;
+        } scalar;
+
+        /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */
+        struct {
+            /** The major version number. */
+            int major;
+
+            /** The minor version number. */
+            int minor;
+        } version_directive;
+
+        /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */
+        struct {
+            /** The tag handle. */
+            yaml_char_t *handle;
+
+            /** The tag prefix. */
+            yaml_char_t *prefix;
+        } tag_directive;
+    } data;
+
+    /** The beginning of the token. */
+    yaml_mark_t start_mark;
+
+    /** The end of the token. */
+    yaml_mark_t end_mark;
+
+} yaml_token_t;
+
+/**
+ * Create a new token without assigning any data.
+ *
+ * This function can be used for constructing indicator tokens:
+ * @c YAML_DOCUMENT_START, @c YAML_DOCUMENT_END,
+ * @c YAML_BLOCK_SEQUENCE_START_TOKEN, @c YAML_BLOCK_MAPPING_START_TOKEN,
+ * @c YAML_BLOCK_END_TOKEN,
+ * @c YAML_FLOW_SEQUENCE_START_TOKEN, @c YAML_FLOW_SEQUENCE_END_TOKEN,
+ * @c YAML_FLOW_MAPPING_START_TOKEN, @c YAML_FLOW_MAPPING_END_TOKEN,
+ * @c YAML_BLOCK_ENTRY_TOKEN, @c YAML_FLOW_ENTRY_TOKEN,
+ * @c YAML_KEY_TOKEN, @c YAML_VALUE_TOKEN.
+ *
+ * @param[in]   type        The token type.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_token_new(yaml_token_type_t type,
+        yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_STREAM_START_TOKEN token with the specified encoding.
+ *
+ * @param[in]   encoding    The stream encoding.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_stream_start_token_new(yaml_encoding_t encoding,
+        yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_STREAM_END_TOKEN token.
+ *
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_stream_end_token_new(yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_VERSION_DIRECTIVE_TOKEN token with the specified
+ * version numbers.
+ *
+ * @param[in]   major       The major version number.
+ * @param[in]   minor       The minor version number.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_version_directive_token_new(int major, int minor,
+        yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_TAG_DIRECTIVE_TOKEN token with the specified tag
+ * handle and prefix.
+ *
+ * Note that the @a handle and the @a prefix pointers will be freed by
+ * the token descructor.
+ *
+ * @param[in]   handle      The tag handle.
+ * @param[in]   prefix      The tag prefix.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+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);
+
+/**
+ * Create a new @c YAML_ALIAS_TOKEN token with the specified anchor.
+ *
+ * Note that the @a anchor pointer will be freed by the token descructor.
+ *
+ * @param[in]   anchor      The anchor.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_alias_token_new(yaml_char_t *anchor,
+        yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_ANCHOR_TOKEN token with the specified anchor.
+ *
+ * Note that the @a anchor pointer will be freed by the token descructor.
+ *
+ * @param[in]   anchor      The anchor.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+YAML_DECLARE(yaml_token_t *)
+yaml_anchor_token_new(yaml_char_t *anchor,
+        yaml_mark_t start_mark, yaml_mark_t end_mark);
+
+/**
+ * Create a new @c YAML_TAG_TOKEN token with the specified tag handle and
+ * suffix.
+ *
+ * Note that the @a handle and the @a suffix pointers will be freed by
+ * the token descructor.
+ *
+ * @param[in]   handle      The tag handle.
+ * @param[in]   suffix      The tag suffix.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+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);
+
+/**
+ * Create a new @c YAML_SCALAR_TOKEN token with the specified scalar value,
+ * length, and style.
+ *
+ * Note that the scalar value may contain the @c NUL character, therefore
+ * the value length is also required.  The scalar value always ends with
+ * @c NUL.
+ *
+ * Note that the @a value pointer will be freed by the token descructor.
+ *
+ * @param[in]   value       The scalar value.
+ * @param[in]   length      The value length.
+ * @param[in]   style       The scalar style.
+ * @param[in]   start_mark  The beginning of the token.
+ * @param[in]   end_mark    The end of the token.
+ *
+ * @returns A new token object, or @c NULL on error.
+ */
+
+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);
+
+/**
+ * Destroy a token object.
+ *
+ * @param[in]   token   A token object.
+ */
+
+YAML_DECLARE(void)
+yaml_token_delete(yaml_token_t *token);
+
+/** @} */
+
+/*
+
 typedef enum {
     YAML_STREAM_START_EVENT,
     YAML_STREAM_END_EVENT,
 } yaml_event_type_t;
 
 typedef struct {
-    size_t offset;
-    size_t index;
-    size_t line;
-    size_t column;
-} yaml_mark_t;
-
-typedef struct {
-    yaml_error_type_t type;
-    char *context;
-    yaml_mark_t context_mark;
-    char *problem;
-    yaml_mark_t problem_mark;
-} yaml_error_t;
-
-typedef struct {
-    yaml_token_type_t type;
-    union {
-        yaml_encoding_t encoding;
-        char *anchor;
-        char *tag;
-        struct {
-            char *value;
-            size_t length;
-            yaml_scalar_style_t style;
-        } scalar;
-        struct {
-            int major;
-            int minor;
-        } version;
-        struct {
-          char *handle;
-          char *prefix;
-        } tag_pair;
-    } data;
-    yaml_mark_t start_mark;
-    yaml_mark_t end_mark;
-} yaml_token_t;
-
-typedef struct {
     yaml_event_type_t type;
     union {
         struct {
  */
 
 typedef struct {
+    /** The string start pointer. */
     unsigned char *start;
+
+    /** The string end pointer. */
     unsigned char *end;
+
+    /** The string current position. */
     unsigned char *current;
 } yaml_string_input_t;
 
  * @returns A new parser object; @c NULL on error.
  */
 
-yaml_parser_t *
+YAML_DECLARE(yaml_parser_t *)
 yaml_parser_new(void);
 
 /**
  * @param[in]   parser  A parser object.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_delete(yaml_parser_t *parser);
 
 /**
  *
  * @param[in]   parser  A parser object.
  * @param[in]   input   A source data.
- * @param[in]   length  The length of the source data in bytes.
+ * @param[in]   size    The length of the source data in bytes.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input_string(yaml_parser_t *parser,
         unsigned char *input, size_t size);
 
  * @param[in]   file    An open file.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file);
 
 /**
  * @param[in]   data    Any application data for passing to the read handler.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input(yaml_parser_t *parser,
         yaml_read_handler_t *handler, void *data);
 
 /**
  * Set the source encoding.
  *
+ * @param[in]   parser      A parser object.
  * @param[in]   encoding    The source encoding.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding);
 
 /** @} */
  * or @c NULL if it failed.
  */
 
-void *
+YAML_DECLARE(void *)
 yaml_malloc(size_t size);
 
 /**
  * or @c NULL if it failed.
  */
 
-void *
+YAML_DECLARE(void *)
 yaml_realloc(void *ptr, size_t size);
 
 /**
  *                      valid.
  */
 
-void
+YAML_DECLARE(void)
 yaml_free(void *ptr);
 
 /** The size of the raw buffer. */
  * @returns @c 1 on success, @c 0 on error.
  */
 
-int
+YAML_DECLARE(int)
 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
 
 /** @} */
  * Allocate a dynamic memory block.
  */
 
-void *
+YAML_DECLARE(void *)
 yaml_malloc(size_t size)
 {
     return malloc(size ? size : 1);
  * 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);
  * Free a dynamic memory block.
  */
 
-void
+YAML_DECLARE(void)
 yaml_free(void *ptr)
 {
     if (ptr) free(ptr);
  * Create a new parser object.
  */
 
-yaml_parser_t *
+YAML_DECLARE(yaml_parser_t *)
 yaml_parser_new(void)
 {
     yaml_parser_t *parser;
  * Destroy a parser object.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_delete(yaml_parser_t *parser)
 {
     assert(parser); /* Non-NULL parser object expected. */
  * Set a string input.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input_string(yaml_parser_t *parser,
         unsigned char *input, size_t size)
 {
  * 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. */
  * Set a generic input.
  */
 
-void
+YAML_DECLARE(void)
 yaml_parser_set_input(yaml_parser_t *parser,
         yaml_read_handler_t *handler, void *data)
 {
  * 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. */
     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);
+}
+

File src/reader.c

  * Set the reader error and return 0.
  */
 
-int
+static int
 yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,
         size_t offset, int value)
 {
     return 0;
 }
 
+/*
+ * Update the raw buffer.
+ */
+
+static int
+yaml_parser_update_raw_buffer(yaml_parser_t *parser)
+{
+    size_t size_read = 0;
+
+    /* Return if the raw buffer is full. */
+
+    if (parser->raw_unread == YAML_RAW_BUFFER_SIZE) return 1;
+
+    /* Return on EOF. */
+
+    if (parser->eof) return 1;
+
+    /* Move the remaining bytes in the raw buffer to the beginning. */
+
+    if (parser->raw_unread && parser->raw_buffer < parser->raw_pointer) {
+        memmove(parser->raw_buffer, parser->raw_pointer, parser->raw_unread);
+    }
+    parser->raw_pointer = parser->raw_buffer;
+
+    /* Call the read handler to fill the buffer. */
+
+    if (!parser->read_handler(parser->read_handler_data,
+                parser->raw_buffer + parser->raw_unread,
+                YAML_RAW_BUFFER_SIZE - parser->raw_unread,
+                &size_read)) {
+        return yaml_parser_set_reader_error(parser, "Input error",
+                parser->offset, -1);
+    }
+    parser->raw_unread += size_read;
+    if (!size_read) {
+        parser->eof = 1;
+    }
+
+    return 1;
+}
+
+/*
+ * Determine the input stream encoding by checking the BOM symbol. If no BOM is
+ * found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
+ */
+
+#define BOM_UTF8    "\xef\xbb\xbf"
+#define BOM_UTF16LE "\xff\xfe"
+#define BOM_UTF16BE "\xfe\xff"
+
+static int
+yaml_parser_determine_encoding(yaml_parser_t *parser)
+{
+    /* Ensure that we had enough bytes in the raw buffer. */
+
+    while (!parser->eof && parser->raw_unread < 3) {
+        if (!yaml_parser_update_raw_buffer(parser)) {
+            return 0;
+        }
+    }
+
+    /* Determine the encoding. */
+
+    if (parser->raw_unread >= 2
+            && !memcmp(parser->raw_pointer, BOM_UTF16LE, 2)) {
+        parser->encoding = YAML_UTF16LE_ENCODING;
+        parser->raw_pointer += 2;
+        parser->raw_unread -= 2;
+        parser->offset += 2;
+    }
+    else if (parser->raw_unread >= 2
+            && !memcmp(parser->raw_pointer, BOM_UTF16BE, 2)) {
+        parser->encoding = YAML_UTF16BE_ENCODING;
+        parser->raw_pointer += 2;
+        parser->raw_unread -= 2;
+        parser->offset += 2;
+    }
+    else if (parser->raw_unread >= 3
+            && !memcmp(parser->raw_pointer, BOM_UTF8, 3)) {
+        parser->encoding = YAML_UTF8_ENCODING;
+        parser->raw_pointer += 3;
+        parser->raw_unread -= 3;
+        parser->offset += 3;
+    }
+    else {
+        parser->encoding = YAML_UTF8_ENCODING;
+    }
+
+    return 1;
+}
 
 /*
  * Ensure that the buffer contains at least length characters.
  * The length is supposed to be significantly less that the buffer size.
  */
 
-int
+YAML_DECLARE(int)
 yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
 {
     /* If the EOF flag is set and the raw buffer is empty, do nothing. */
     return 1;
 }
 
-/*
- * Determine the input stream encoding by checking the BOM symbol. If no BOM is
- * found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
- */
-
-#define BOM_UTF8    "\xef\xbb\xbf"
-#define BOM_UTF16LE "\xff\xfe"
-#define BOM_UTF16BE "\xfe\xff"
-
-int
-yaml_parser_determine_encoding(yaml_parser_t *parser)
-{
-    /* Ensure that we had enough bytes in the raw buffer. */
-
-    while (!parser->eof && parser->raw_unread < 3) {
-        if (!yaml_parser_update_raw_buffer(parser)) {
-            return 0;
-        }
-    }
-
-    /* Determine the encoding. */
-
-    if (parser->raw_unread >= 2
-            && !memcmp(parser->raw_pointer, BOM_UTF16LE, 2)) {
-        parser->encoding = YAML_UTF16LE_ENCODING;
-        parser->raw_pointer += 2;
-        parser->raw_unread -= 2;
-        parser->offset += 2;
-    }
-    else if (parser->raw_unread >= 2
-            && !memcmp(parser->raw_pointer, BOM_UTF16BE, 2)) {
-        parser->encoding = YAML_UTF16BE_ENCODING;
-        parser->raw_pointer += 2;
-        parser->raw_unread -= 2;
-        parser->offset += 2;
-    }
-    else if (parser->raw_unread >= 3
-            && !memcmp(parser->raw_pointer, BOM_UTF8, 3)) {
-        parser->encoding = YAML_UTF8_ENCODING;
-        parser->raw_pointer += 3;
-        parser->raw_unread -= 3;
-        parser->offset += 3;
-    }
-    else {
-        parser->encoding = YAML_UTF8_ENCODING;
-    }
-
-    return 1;
-}
-
-/*
- * Update the raw buffer.
- */
-
-int
-yaml_parser_update_raw_buffer(yaml_parser_t *parser)
-{
-    size_t size_read = 0;
-
-    /* Return if the raw buffer is full. */
-
-    if (parser->raw_unread == YAML_RAW_BUFFER_SIZE) return 1;
-
-    /* Return on EOF. */
-
-    if (parser->eof) return 1;
-
-    /* Move the remaining bytes in the raw buffer to the beginning. */
-
-    if (parser->raw_unread && parser->raw_buffer < parser->raw_pointer) {
-        memmove(parser->raw_buffer, parser->raw_pointer, parser->raw_unread);
-    }
-    parser->raw_pointer = parser->raw_buffer;
-
-    /* Call the read handler to fill the buffer. */
-
-    if (!parser->read_handler(parser->read_handler_data,
-                parser->raw_buffer + parser->raw_unread,
-                YAML_RAW_BUFFER_SIZE - parser->raw_unread,
-                &size_read)) {
-        return yaml_parser_set_reader_error(parser, "Input error",
-                parser->offset, -1);
-    }
-    parser->raw_unread += size_read;
-    if (!size_read) {
-        parser->eof = 1;
-    }
-
-    return 1;
-}
-