Skip to content
Snippets Groups Projects
Commit 3a362a6b35b9 authored by Kirill Simonov's avatar Kirill Simonov
Browse files

Add token constructors and destructors.

Add YAML_DECLARE to the API declarations (Thanks to Peter Murphy for suggestion).
parent f3610ca68294
No related branches found
No related tags found
No related merge requests found
...@@ -174,8 +174,8 @@ ...@@ -174,8 +174,8 @@
# Configuration options related to the preprocessor # Configuration options related to the preprocessor
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = NO EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES SEARCH_INCLUDES = YES
INCLUDE_PATH = INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = INCLUDE_FILE_PATTERNS =
...@@ -179,7 +179,7 @@ ...@@ -179,7 +179,7 @@
SEARCH_INCLUDES = YES SEARCH_INCLUDES = YES
INCLUDE_PATH = INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = INCLUDE_FILE_PATTERNS =
PREDEFINED = PREDEFINED = "YAML_DECLARE(type)=type"
EXPAND_AS_DEFINED = EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES SKIP_FUNCTION_MACROS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
......
...@@ -20,6 +20,27 @@ ...@@ -20,6 +20,27 @@
#include <string.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 * @defgroup version Version Information
* @{ * @{
*/ */
...@@ -32,7 +53,7 @@ ...@@ -32,7 +53,7 @@
* number, and @c Z is the patch version number. * number, and @c Z is the patch version number.
*/ */
const char * YAML_DECLARE(const char *)
yaml_get_version_string(void); yaml_get_version_string(void);
/** /**
...@@ -43,7 +64,7 @@ ...@@ -43,7 +64,7 @@
* @param[out] patch Patch version number. * @param[out] patch Patch version number.
*/ */
void YAML_DECLARE(void)
yaml_get_version(int *major, int *minor, int *patch); yaml_get_version(int *major, int *minor, int *patch);
/** @} */ /** @} */
...@@ -53,7 +74,7 @@ ...@@ -53,7 +74,7 @@
* @{ * @{
*/ */
/** The character type. */ /** The character type (UTF-8 octet). */
typedef unsigned char yaml_char_t; typedef unsigned char yaml_char_t;
/** The stream encoding. */ /** The stream encoding. */
...@@ -78,5 +99,17 @@ ...@@ -78,5 +99,17 @@
YAML_EMITTER_ERROR YAML_EMITTER_ERROR
} yaml_error_type_t; } 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;
/** @} */ /** @} */
...@@ -81,4 +114,7 @@ ...@@ -81,4 +114,7 @@
/** @} */ /** @} */
/* /**
* @defgroup Node Styles
* @{
*/
...@@ -84,3 +120,4 @@ ...@@ -84,3 +120,4 @@
/** Scalar styles. */
typedef enum { typedef enum {
YAML_ANY_SCALAR_STYLE, YAML_ANY_SCALAR_STYLE,
...@@ -85,3 +122,4 @@ ...@@ -85,3 +122,4 @@
typedef enum { typedef enum {
YAML_ANY_SCALAR_STYLE, YAML_ANY_SCALAR_STYLE,
YAML_PLAIN_SCALAR_STYLE, YAML_PLAIN_SCALAR_STYLE,
...@@ -87,3 +125,4 @@ ...@@ -87,3 +125,4 @@
YAML_PLAIN_SCALAR_STYLE, YAML_PLAIN_SCALAR_STYLE,
YAML_SINGLE_QUOTED_SCALAR_STYLE, YAML_SINGLE_QUOTED_SCALAR_STYLE,
YAML_DOUBLE_QUOTED_SCALAR_STYLE, YAML_DOUBLE_QUOTED_SCALAR_STYLE,
...@@ -88,6 +127,7 @@ ...@@ -88,6 +127,7 @@
YAML_SINGLE_QUOTED_SCALAR_STYLE, YAML_SINGLE_QUOTED_SCALAR_STYLE,
YAML_DOUBLE_QUOTED_SCALAR_STYLE, YAML_DOUBLE_QUOTED_SCALAR_STYLE,
YAML_LITERAL_SCALAR_STYLE, YAML_LITERAL_SCALAR_STYLE,
YAML_FOLDED_SCALAR_STYLE YAML_FOLDED_SCALAR_STYLE
} yaml_scalar_style_t; } yaml_scalar_style_t;
...@@ -90,6 +130,8 @@ ...@@ -90,6 +130,8 @@
YAML_LITERAL_SCALAR_STYLE, YAML_LITERAL_SCALAR_STYLE,
YAML_FOLDED_SCALAR_STYLE YAML_FOLDED_SCALAR_STYLE
} yaml_scalar_style_t; } yaml_scalar_style_t;
/** Sequence styles. */
typedef enum { typedef enum {
YAML_ANY_SEQUENCE_STYLE, YAML_ANY_SEQUENCE_STYLE,
...@@ -94,6 +136,7 @@ ...@@ -94,6 +136,7 @@
typedef enum { typedef enum {
YAML_ANY_SEQUENCE_STYLE, YAML_ANY_SEQUENCE_STYLE,
YAML_BLOCK_SEQUENCE_STYLE, YAML_BLOCK_SEQUENCE_STYLE,
YAML_FLOW_SEQUENCE_STYLE YAML_FLOW_SEQUENCE_STYLE
} yaml_sequence_style_t; } yaml_sequence_style_t;
...@@ -96,6 +139,7 @@ ...@@ -96,6 +139,7 @@
YAML_BLOCK_SEQUENCE_STYLE, YAML_BLOCK_SEQUENCE_STYLE,
YAML_FLOW_SEQUENCE_STYLE YAML_FLOW_SEQUENCE_STYLE
} yaml_sequence_style_t; } yaml_sequence_style_t;
/** Mapping styles. */
typedef enum { typedef enum {
YAML_ANY_MAPPING_STYLE, YAML_ANY_MAPPING_STYLE,
...@@ -100,6 +144,7 @@ ...@@ -100,6 +144,7 @@
typedef enum { typedef enum {
YAML_ANY_MAPPING_STYLE, YAML_ANY_MAPPING_STYLE,
YAML_BLOCK_MAPPING_STYLE, YAML_BLOCK_MAPPING_STYLE,
YAML_FLOW_MAPPING_STYLE YAML_FLOW_MAPPING_STYLE
} yaml_mapping_style_t; } yaml_mapping_style_t;
...@@ -102,7 +147,15 @@ ...@@ -102,7 +147,15 @@
YAML_BLOCK_MAPPING_STYLE, YAML_BLOCK_MAPPING_STYLE,
YAML_FLOW_MAPPING_STYLE YAML_FLOW_MAPPING_STYLE
} yaml_mapping_style_t; } yaml_mapping_style_t;
/** @} */
/**
* @defgroup Tokens
* @{
*/
/** Token types. */
typedef enum { typedef enum {
YAML_STREAM_START_TOKEN, YAML_STREAM_START_TOKEN,
YAML_STREAM_END_TOKEN, YAML_STREAM_END_TOKEN,
...@@ -132,6 +185,242 @@ ...@@ -132,6 +185,242 @@
YAML_SCALAR_TOKEN YAML_SCALAR_TOKEN
} yaml_token_type_t; } 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 { typedef enum {
YAML_STREAM_START_EVENT, YAML_STREAM_START_EVENT,
YAML_STREAM_END_EVENT, YAML_STREAM_END_EVENT,
...@@ -150,45 +439,6 @@ ...@@ -150,45 +439,6 @@
} yaml_event_type_t; } yaml_event_type_t;
typedef struct { 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; yaml_event_type_t type;
union { union {
struct { struct {
...@@ -272,4 +522,5 @@ ...@@ -272,4 +522,5 @@
*/ */
typedef struct { typedef struct {
/** The string start pointer. */
unsigned char *start; unsigned char *start;
...@@ -275,2 +526,4 @@ ...@@ -275,2 +526,4 @@
unsigned char *start; unsigned char *start;
/** The string end pointer. */
unsigned char *end; unsigned char *end;
...@@ -276,4 +529,6 @@ ...@@ -276,4 +529,6 @@
unsigned char *end; unsigned char *end;
/** The string current position. */
unsigned char *current; unsigned char *current;
} yaml_string_input_t; } yaml_string_input_t;
...@@ -375,7 +630,7 @@ ...@@ -375,7 +630,7 @@
* @returns A new parser object; @c NULL on error. * @returns A new parser object; @c NULL on error.
*/ */
yaml_parser_t * YAML_DECLARE(yaml_parser_t *)
yaml_parser_new(void); yaml_parser_new(void);
/** /**
...@@ -384,7 +639,7 @@ ...@@ -384,7 +639,7 @@
* @param[in] parser A parser object. * @param[in] parser A parser object.
*/ */
void YAML_DECLARE(void)
yaml_parser_delete(yaml_parser_t *parser); yaml_parser_delete(yaml_parser_t *parser);
/** /**
...@@ -396,6 +651,6 @@ ...@@ -396,6 +651,6 @@
* *
* @param[in] parser A parser object. * @param[in] parser A parser object.
* @param[in] input A source data. * @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.
*/ */
...@@ -400,6 +655,6 @@ ...@@ -400,6 +655,6 @@
*/ */
void YAML_DECLARE(void)
yaml_parser_set_input_string(yaml_parser_t *parser, yaml_parser_set_input_string(yaml_parser_t *parser,
unsigned char *input, size_t size); unsigned char *input, size_t size);
...@@ -414,7 +669,7 @@ ...@@ -414,7 +669,7 @@
* @param[in] file An open file. * @param[in] file An open file.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file); yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file);
/** /**
...@@ -425,10 +680,10 @@ ...@@ -425,10 +680,10 @@
* @param[in] data Any application data for passing to the read handler. * @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_parser_set_input(yaml_parser_t *parser,
yaml_read_handler_t *handler, void *data); yaml_read_handler_t *handler, void *data);
/** /**
* Set the source encoding. * Set the source encoding.
* *
...@@ -429,9 +684,10 @@ ...@@ -429,9 +684,10 @@
yaml_parser_set_input(yaml_parser_t *parser, yaml_parser_set_input(yaml_parser_t *parser,
yaml_read_handler_t *handler, void *data); yaml_read_handler_t *handler, void *data);
/** /**
* Set the source encoding. * Set the source encoding.
* *
* @param[in] parser A parser object.
* @param[in] encoding The source encoding. * @param[in] encoding The source encoding.
*/ */
...@@ -435,7 +691,7 @@ ...@@ -435,7 +691,7 @@
* @param[in] encoding The source encoding. * @param[in] encoding The source encoding.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding); yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding);
/** @} */ /** @} */
...@@ -459,7 +715,7 @@ ...@@ -459,7 +715,7 @@
* or @c NULL if it failed. * or @c NULL if it failed.
*/ */
void * YAML_DECLARE(void *)
yaml_malloc(size_t size); yaml_malloc(size_t size);
/** /**
...@@ -473,7 +729,7 @@ ...@@ -473,7 +729,7 @@
* or @c NULL if it failed. * or @c NULL if it failed.
*/ */
void * YAML_DECLARE(void *)
yaml_realloc(void *ptr, size_t size); yaml_realloc(void *ptr, size_t size);
/** /**
...@@ -483,7 +739,7 @@ ...@@ -483,7 +739,7 @@
* valid. * valid.
*/ */
void YAML_DECLARE(void)
yaml_free(void *ptr); yaml_free(void *ptr);
/** The size of the raw buffer. */ /** The size of the raw buffer. */
...@@ -507,7 +763,7 @@ ...@@ -507,7 +763,7 @@
* @returns @c 1 on success, @c 0 on error. * @returns @c 1 on success, @c 0 on error.
*/ */
int YAML_DECLARE(int)
yaml_parser_update_buffer(yaml_parser_t *parser, size_t length); yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
/** @} */ /** @} */
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Allocate a dynamic memory block. * Allocate a dynamic memory block.
*/ */
void * YAML_DECLARE(void *)
yaml_malloc(size_t size) yaml_malloc(size_t size)
{ {
return malloc(size ? size : 1); return malloc(size ? size : 1);
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* Reallocate a dynamic memory block. * Reallocate a dynamic memory block.
*/ */
void * YAML_DECLARE(void *)
yaml_realloc(void *ptr, size_t size) yaml_realloc(void *ptr, size_t size)
{ {
return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1); return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
* Free a dynamic memory block. * Free a dynamic memory block.
*/ */
void YAML_DECLARE(void)
yaml_free(void *ptr) yaml_free(void *ptr)
{ {
if (ptr) free(ptr); if (ptr) free(ptr);
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
* Create a new parser object. * Create a new parser object.
*/ */
yaml_parser_t * YAML_DECLARE(yaml_parser_t *)
yaml_parser_new(void) yaml_parser_new(void)
{ {
yaml_parser_t *parser; yaml_parser_t *parser;
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
* Destroy a parser object. * Destroy a parser object.
*/ */
void YAML_DECLARE(void)
yaml_parser_delete(yaml_parser_t *parser) yaml_parser_delete(yaml_parser_t *parser)
{ {
assert(parser); /* Non-NULL parser object expected. */ assert(parser); /* Non-NULL parser object expected. */
...@@ -136,7 +136,7 @@ ...@@ -136,7 +136,7 @@
* Set a string input. * Set a string input.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_input_string(yaml_parser_t *parser, yaml_parser_set_input_string(yaml_parser_t *parser,
unsigned char *input, size_t size) unsigned char *input, size_t size)
{ {
...@@ -156,7 +156,7 @@ ...@@ -156,7 +156,7 @@
* Set a file input. * Set a file input.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file) yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
{ {
assert(parser); /* Non-NULL parser object expected. */ assert(parser); /* Non-NULL parser object expected. */
...@@ -171,7 +171,7 @@ ...@@ -171,7 +171,7 @@
* Set a generic input. * Set a generic input.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_input(yaml_parser_t *parser, yaml_parser_set_input(yaml_parser_t *parser,
yaml_read_handler_t *handler, void *data) yaml_read_handler_t *handler, void *data)
{ {
...@@ -187,7 +187,7 @@ ...@@ -187,7 +187,7 @@
* Set the source encoding. * Set the source encoding.
*/ */
void YAML_DECLARE(void)
yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding) yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
{ {
assert(parser); /* Non-NULL parser object expected. */ assert(parser); /* Non-NULL parser object expected. */
...@@ -196,3 +196,207 @@ ...@@ -196,3 +196,207 @@
parser->encoding = 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);
}
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Set the reader error and return 0. * Set the reader error and return 0.
*/ */
int static int
yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem, yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,
size_t offset, int value) size_t offset, int value)
{ {
...@@ -23,6 +23,96 @@ ...@@ -23,6 +23,96 @@
return 0; 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. * Ensure that the buffer contains at least length characters.
...@@ -31,7 +121,7 @@ ...@@ -31,7 +121,7 @@
* The length is supposed to be significantly less that the buffer size. * 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) 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. */ /* If the EOF flag is set and the raw buffer is empty, do nothing. */
...@@ -345,94 +435,3 @@ ...@@ -345,94 +435,3 @@
return 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"
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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment