--- /dev/null
+! Copyright (C) 2013 Jon Harper.
+! See http://factorcode.org/license.txt for BSD license.
+! adapted from "yaml.h" libYAML 0.1.4
+! http://pyyaml.org/wiki/LibYAML
+USING: alien alien.c-types alien.destructors alien.libraries alien.syntax
+combinators system classes.struct ;
+IN: yaml.ffi
+
+<<
+"libyaml" {
+ { [ os unix? ] [ "libyaml.so" ] }
+} cond cdecl add-library
+>>
+
+C-TYPE: FILE
+
+LIBRARY: libyaml
+
+! /**
+! * @defgroup version Version Information
+! * @{
+! */
+
+! /**
+! * Get the library version as a string.
+! *
+! * @returns The function returns the pointer to a static string of the form
+! * @c "X.Y.Z", where @c X is the major version number, @c Y is a minor version
+! * number, and @c Z is the patch version number.
+! */
+FUNCTION: c-string
+yaml_get_version_string ( ) ;
+
+! /**
+! * Get the library version numbers.
+! *
+! * @param[out] major Major version number.
+! * @param[out] minor Minor version number.
+! * @param[out] patch Patch version number.
+! */
+FUNCTION: void
+yaml_get_version ( int *major, int *minor, int *patch ) ;
+
+! /** @} */
+
+! /**
+! * @defgroup basic Basic Types
+! * @{
+! */
+
+! /** The character type (UTF-8 octet). */
+TYPEDEF: uchar yaml_char_t
+
+! /** The version directive data. */
+STRUCT: yaml_version_directive_t
+ { major int }
+ { minor int }
+;
+
+! /** The tag directive data. */
+STRUCT: yaml_tag_directive_t
+ { handle yaml_char_t* }
+ { prefix yaml_char_t* }
+;
+
+! /** The stream encoding. */
+ENUM: yaml_encoding_t
+ YAML_ANY_ENCODING
+ YAML_UTF8_ENCODING
+ YAML_UTF16LE_ENCODING
+ YAML_UTF16BE_ENCODING
+;
+
+! /** Line break types. */
+ENUM: yaml_break_t
+ YAML_ANY_BREAK
+ YAML_CR_BREAK
+ YAML_LN_BREAK
+ YAML_CRLN_BREAK
+;
+
+! /** Many bad things could happen with the parser and emitter. */
+ENUM: yaml_error_type_t
+ YAML_NO_ERROR
+
+ YAML_MEMORY_ERROR
+
+ YAML_READER_ERROR
+ YAML_SCANNER_ERROR
+ YAML_PARSER_ERROR
+ YAML_COMPOSER_ERROR
+
+ YAML_WRITER_ERROR
+ YAML_EMITTER_ERROR
+;
+
+! /** The pointer position. */
+STRUCT: yaml_mark_t
+ { index size_t }
+ { line size_t }
+ { column size_t }
+;
+
+! /** @} */
+
+! /**
+! * @defgroup styles Node Styles
+! * @{
+! */
+
+! /** Scalar styles. */
+ENUM: yaml_scalar_style_t
+ 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
+;
+
+! /** Sequence styles. */
+ENUM: yaml_sequence_style_t
+ YAML_ANY_SEQUENCE_STYLE
+
+ YAML_BLOCK_SEQUENCE_STYLE
+ YAML_FLOW_SEQUENCE_STYLE
+;
+
+! /** Mapping styles. */
+ENUM: yaml_mapping_style_t
+ YAML_ANY_MAPPING_STYLE
+
+ YAML_BLOCK_MAPPING_STYLE
+ YAML_FLOW_MAPPING_STYLE
+;
+
+! /** @} */
+
+! /**
+! * @defgroup tokens Tokens
+! * @{
+! */
+
+! /** Token types. */
+ENUM: yaml_token_type_t
+ YAML_NO_TOKEN
+
+ YAML_STREAM_START_TOKEN
+ YAML_STREAM_END_TOKEN
+
+ YAML_VERSION_DIRECTIVE_TOKEN
+ YAML_TAG_DIRECTIVE_TOKEN
+ YAML_DOCUMENT_START_TOKEN
+ YAML_DOCUMENT_END_TOKEN
+
+ YAML_BLOCK_SEQUENCE_START_TOKEN
+ YAML_BLOCK_MAPPING_START_TOKEN
+ YAML_BLOCK_END_TOKEN
+
+ YAML_FLOW_SEQUENCE_START_TOKEN
+ YAML_FLOW_SEQUENCE_END_TOKEN
+ YAML_FLOW_MAPPING_START_TOKEN
+ YAML_FLOW_MAPPING_END_TOKEN
+
+ YAML_BLOCK_ENTRY_TOKEN
+ YAML_FLOW_ENTRY_TOKEN
+ YAML_KEY_TOKEN
+ YAML_VALUE_TOKEN
+
+ YAML_ALIAS_TOKEN
+ YAML_ANCHOR_TOKEN
+ YAML_TAG_TOKEN
+ YAML_SCALAR_TOKEN
+;
+
+! /** The token structure. */
+! /** The stream start (for @c YAML_STREAM_START_TOKEN). */
+STRUCT: stream_start_token_data
+ { encoding yaml_encoding_t }
+;
+! /** The alias (for @c YAML_ALIAS_TOKEN). */
+STRUCT: alias_token_data
+ { value yaml_char_t* }
+;
+! /** The anchor (for @c YAML_ANCHOR_TOKEN). */
+STRUCT: anchor_token_data
+ { value yaml_char_t* }
+;
+
+! /** The tag (for @c YAML_TAG_TOKEN). */
+STRUCT: tag_token_data
+ { handle yaml_char_t* }
+ { suffix yaml_char_t* }
+;
+
+! /** The scalar value (for @c YAML_SCALAR_TOKEN). */
+STRUCT: scalar_token_data
+ { value yaml_char_t* }
+ { length size_t }
+ { style yaml_scalar_style_t }
+;
+
+! /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */
+STRUCT: version_directive_token_data
+ { major int }
+ { minor int }
+;
+
+UNION-STRUCT: token_data
+ { stream_start stream_start_token_data }
+ { alias alias_token_data }
+ { anchor anchor_token_data }
+ { tag tag_token_data }
+ { scalar scalar_token_data }
+ { version_directive version_directive_token_data }
+;
+STRUCT: yaml_token_t
+
+ { type yaml_token_type_t }
+
+ { data token_data }
+
+ { start_mark yaml_mark_t }
+ { end_mark yaml_mark_t }
+;
+
+! /**
+! * Free any memory allocated for a token object.
+! *
+! * @param[in,out] token A token object.
+! */
+
+FUNCTION: void
+yaml_token_delete ( yaml_token_t *token ) ;
+DESTRUCTOR: yaml_token_delete
+
+! /** @} */
+
+! /**
+! * @defgroup events Events
+! * @{
+! */
+
+! /** Event types. */
+ENUM: yaml_event_type_t
+ YAML_NO_EVENT
+
+ YAML_STREAM_START_EVENT
+ YAML_STREAM_END_EVENT
+
+ YAML_DOCUMENT_START_EVENT
+ YAML_DOCUMENT_END_EVENT
+
+ YAML_ALIAS_EVENT
+ YAML_SCALAR_EVENT
+
+ YAML_SEQUENCE_START_EVENT
+ YAML_SEQUENCE_END_EVENT
+
+ YAML_MAPPING_START_EVENT
+ YAML_MAPPING_END_EVENT
+;
+
+! /** The event structure. */
+
+! /** The event data. */
+! /** The stream parameters (for @c YAML_STREAM_START_EVENT). */
+STRUCT: stream_start_event_data
+ { encoding yaml_encoding_t }
+;
+
+! /** The document parameters (for @c YAML_DOCUMENT_START_EVENT). */
+! /** The list of tag directives. */
+ STRUCT: tag_directives_document_start_event_data
+ { start yaml_tag_directive_t* }
+ { end yaml_tag_directive_t* }
+ ;
+STRUCT: document_start_event_data
+ { version_directive yaml_version_directive_t* }
+ { tag_directives tag_directives_document_start_event_data }
+ { implicit int }
+;
+
+! /** The document end parameters (for @c YAML_DOCUMENT_END_EVENT). */
+STRUCT: document_end_event_data
+ { implicit int }
+;
+
+! /** The alias parameters (for @c YAML_ALIAS_EVENT). */
+STRUCT: alias_event_data
+ { anchor yaml_char_t* }
+;
+
+! /** The scalar parameters (for @c YAML_SCALAR_EVENT). */
+STRUCT: scalar_event_data
+ { anchor yaml_char_t* }
+ { tag yaml_char_t* }
+ { value yaml_char_t* }
+ { length size_t }
+ { plain_implicit int }
+ { quoted_implicit int }
+ { style yaml_scalar_style_t }
+;
+
+! /** The sequence parameters (for @c YAML_SEQUENCE_START_EVENT). */
+STRUCT: sequence_start_event_data
+ { anchor yaml_char_t* }
+ { tag yaml_char_t* }
+ { implicit int }
+ { style yaml_sequence_style_t }
+;
+
+! /** The mapping parameters (for @c YAML_MAPPING_START_EVENT). */
+STRUCT: mapping_start_event_data
+ { anchor yaml_char_t* }
+ { tag yaml_char_t* }
+ { implicit int }
+ { style yaml_mapping_style_t }
+;
+
+UNION-STRUCT: event_data
+ { stream_start stream_start_event_data }
+ { document_start document_start_event_data }
+ { document_end document_end_event_data }
+ { alias alias_event_data }
+ { scalar scalar_event_data }
+ { sequence_start sequence_start_event_data }
+ { mapping_start mapping_start_event_data }
+;
+
+STRUCT: yaml_event_t
+
+ { type yaml_event_type_t }
+
+ { data event_data }
+
+ { start_mark yaml_mark_t }
+ { end_mark yaml_mark_t }
+;
+
+! /**
+! * Create the STREAM-START event.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] encoding The stream encoding.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_stream_start_event_initialize ( yaml_event_t *event,
+ yaml_encoding_t encoding ) ;
+
+! /**
+! * Create the STREAM-END event.
+! *
+! * @param[out] event An empty event object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_stream_end_event_initialize ( yaml_event_t *event ) ;
+
+! /**
+! * Create the DOCUMENT-START event.
+! *
+! * The @a implicit argument is considered as a stylistic parameter and may be
+! * ignored by the emitter.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] version_directive The %YAML directive value or
+! * @c NULL.
+! * @param[in] tag_directives_start The beginning of the %TAG
+! * directives list.
+! * @param[in] tag_directives_end The end of the %TAG directives
+! * list.
+! * @param[in] implicit If the document start indicator is
+! * implicit.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_start_event_initialize ( yaml_event_t *event,
+ yaml_version_directive_t *version_directive,
+ yaml_tag_directive_t *tag_directives_start,
+ yaml_tag_directive_t *tag_directives_end,
+ int implicit ) ;
+
+! /**
+! * Create the DOCUMENT-END event.
+! *
+! * The @a implicit argument is considered as a stylistic parameter and may be
+! * ignored by the emitter.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] implicit If the document end indicator is implicit.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_end_event_initialize ( yaml_event_t *event, int implicit ) ;
+
+! /**
+! * Create an ALIAS event.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] anchor The anchor value.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_alias_event_initialize ( yaml_event_t *event, yaml_char_t *anchor ) ;
+
+! /**
+! * Create a SCALAR event.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * Either the @a tag attribute or one of the @a plain_implicit and
+! * @a quoted_implicit flags must be set.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] anchor The scalar anchor or @c NULL.
+! * @param[in] tag The scalar tag or @c NULL.
+! * @param[in] value The scalar value.
+! * @param[in] length The length of the scalar value.
+! * @param[in] plain_implicit If the tag may be omitted for the plain
+! * style.
+! * @param[in] quoted_implicit If the tag may be omitted for any
+! * non-plain style.
+! * @param[in] style The scalar style.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_scalar_event_initialize ( yaml_event_t *event,
+ yaml_char_t *anchor, yaml_char_t *tag,
+ yaml_char_t *value, int length,
+ int plain_implicit, int quoted_implicit,
+ yaml_scalar_style_t style ) ;
+
+! /**
+! * Create a SEQUENCE-START event.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * Either the @a tag attribute or the @a implicit flag must be set.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] anchor The sequence anchor or @c NULL.
+! * @param[in] tag The sequence tag or @c NULL.
+! * @param[in] implicit If the tag may be omitted.
+! * @param[in] style The sequence style.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_sequence_start_event_initialize ( yaml_event_t *event,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_sequence_style_t style ) ;
+
+! /**
+! * Create a SEQUENCE-END event.
+! *
+! * @param[out] event An empty event object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_sequence_end_event_initialize ( yaml_event_t *event ) ;
+
+! /**
+! * Create a MAPPING-START event.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * Either the @a tag attribute or the @a implicit flag must be set.
+! *
+! * @param[out] event An empty event object.
+! * @param[in] anchor The mapping anchor or @c NULL.
+! * @param[in] tag The mapping tag or @c NULL.
+! * @param[in] implicit If the tag may be omitted.
+! * @param[in] style The mapping style.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_mapping_start_event_initialize ( yaml_event_t *event,
+ yaml_char_t *anchor, yaml_char_t *tag, int implicit,
+ yaml_mapping_style_t style ) ;
+
+! /**
+! * Create a MAPPING-END event.
+! *
+! * @param[out] event An empty event object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_mapping_end_event_initialize ( yaml_event_t *event ) ;
+
+! /**
+! * Free any memory allocated for an event object.
+! *
+! * @param[in,out] event An event object.
+! */
+
+FUNCTION: void
+yaml_event_delete ( yaml_event_t *event ) ;
+DESTRUCTOR: yaml_event_delete
+
+! /** @} */
+
+! /**
+! * @defgroup nodes Nodes
+! * @{
+! */
+
+! /** The tag @c !!null with the only possible value: @c null. */
+CONSTANT: YAML_NULL_TAG "tag:yaml.org,2002:null"
+! /** The tag @c !!bool with the values: @c true and @c falce. */
+CONSTANT: YAML_BOOL_TAG "tag:yaml.org,2002:bool"
+! /** The tag @c !!str for string values. */
+CONSTANT: YAML_STR_TAG "tag:yaml.org,2002:str"
+! /** The tag @c !!int for integer values. */
+CONSTANT: YAML_INT_TAG "tag:yaml.org,2002:int"
+! /** The tag @c !!float for float values. */
+CONSTANT: YAML_FLOAT_TAG "tag:yaml.org,2002:float"
+! /** The tag @c !!timestamp for date and time values. */
+CONSTANT: YAML_TIMESTAMP_TAG "tag:yaml.org,2002:timestamp"
+
+! /** The tag @c !!seq is used to denote sequences. */
+CONSTANT: YAML_SEQ_TAG "tag:yaml.org,2002:seq"
+! /** The tag @c !!map is used to denote mapping. */
+CONSTANT: YAML_MAP_TAG "tag:yaml.org,2002:map"
+
+! /** The default scalar tag is @c !!str. */
+CONSTANT: YAML_DEFAULT_SCALAR_TAG YAML_STR_TAG
+! /** The default sequence tag is @c !!seq. */
+CONSTANT: YAML_DEFAULT_SEQUENCE_TAG YAML_SEQ_TAG
+! /** The default mapping tag is @c !!map. */
+CONSTANT: YAML_DEFAULT_MAPPING_TAG YAML_MAP_TAG
+
+! /** Node types. */
+ENUM: yaml_node_type_t
+ YAML_NO_NODE
+
+ YAML_SCALAR_NODE
+ YAML_SEQUENCE_NODE
+ YAML_MAPPING_NODE
+;
+
+! /** The forward definition of a document node structure. */
+! typedef struct yaml_node_s yaml_node_t;
+
+! /** An element of a sequence node. */
+TYPEDEF: int yaml_node_item_t
+
+! /** An element of a mapping node. */
+STRUCT: yaml_node_pair_t
+ { key int }
+ { value int }
+;
+
+! /** The node structure. */
+ ! /** The scalar parameters (for @c YAML_SCALAR_NODE). */
+ STRUCT: scalar_node_data
+ { value yaml_char_t* }
+ { length size_t }
+ { style yaml_scalar_style_t }
+ ;
+
+ ! /** The sequence parameters (for @c YAML_SEQUENCE_NODE). */
+ ! /** The stack of sequence items. */
+ STRUCT: sequence_node_data_items
+ { start yaml_node_item_t* }
+ { end yaml_node_item_t* }
+ { top yaml_node_item_t* }
+ ;
+ STRUCT: sequence_node_data
+ { items sequence_node_data_items }
+ { style yaml_sequence_style_t }
+ ;
+
+ ! /** The mapping parameters (for @c YAML_MAPPING_NODE). */
+ ! /** The stack of mapping pairs (key, value). */
+ STRUCT: mapping_node_data_pairs
+ { start yaml_node_pair_t* }
+ { end yaml_node_pair_t* }
+ { top yaml_node_pair_t* }
+ ;
+ STRUCT: mapping_node_data
+ { pairs mapping_node_data_pairs }
+ { style yaml_mapping_style_t }
+ ;
+ UNION-STRUCT: node_data
+ { scalar scalar_node_data }
+ { sequence sequence_node_data }
+ { mapping mapping_node_data }
+ ;
+
+STRUCT: yaml_node_t
+
+ { type yaml_node_type_t }
+
+ { tag yaml_char_t* }
+
+ { data node_data }
+
+ { start_mark yaml_mark_t }
+ { end_mark yaml_mark_t }
+
+;
+
+! /** The document structure. */
+ ! /** The document nodes. */
+ STRUCT: yaml_document_nodes
+ { start yaml_node_t* }
+ { end yaml_node_t* }
+ { top yaml_node_t* }
+ ;
+
+ ! /** The list of tag directives. */
+ STRUCT: yaml_document_tag_directives
+ { start yaml_tag_directive_t* }
+ { end yaml_tag_directive_t* }
+ ;
+
+STRUCT: yaml_document_t
+
+ { nodes yaml_document_nodes }
+
+ { version_directive yaml_version_directive_t* }
+
+ { tag_directives yaml_document_tag_directives }
+
+ { start_implicit int }
+ { end_implicit int }
+
+ { start_mark yaml_mark_t }
+ { end_mark yaml_mark_t }
+
+;
+
+! /**
+! * Create a YAML document.
+! *
+! * @param[out] document An empty document object.
+! * @param[in] version_directive The %YAML directive value or
+! * @c NULL.
+! * @param[in] tag_directives_start The beginning of the %TAG
+! * directives list.
+! * @param[in] tag_directives_end The end of the %TAG directives
+! * list.
+! * @param[in] start_implicit If the document start indicator is
+! * implicit.
+! * @param[in] end_implicit If the document end indicator is
+! * implicit.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_initialize ( yaml_document_t *document,
+ yaml_version_directive_t *version_directive,
+ yaml_tag_directive_t *tag_directives_start,
+ yaml_tag_directive_t *tag_directives_end,
+ int start_implicit, int end_implicit ) ;
+
+! /**
+! * Delete a YAML document and all its nodes.
+! *
+! * @param[in,out] document A document object.
+! */
+
+FUNCTION: void
+yaml_document_delete ( yaml_document_t *document ) ;
+DESTRUCTOR: yaml_document_delete
+
+! /**
+! * Get a node of a YAML document.
+! *
+! * The pointer returned by this function is valid until any of the functions
+! * modifying the documents are called.
+! *
+! * @param[in] document A document object.
+! * @param[in] index The node id.
+! *
+! * @returns the node objct or @c NULL if @c node_id is out of range.
+! */
+
+FUNCTION: yaml_node_t*
+yaml_document_get_node ( yaml_document_t *document, int index ) ;
+
+! /**
+! * Get the root of a YAML document node.
+! *
+! * The root object is the first object added to the document.
+! *
+! * The pointer returned by this function is valid until any of the functions
+! * modifying the documents are called.
+! *
+! * An empty document produced by the parser signifies the end of a YAML
+! * stream.
+! *
+! * @param[in] document A document object.
+! *
+! * @returns the node object or @c NULL if the document is empty.
+! */
+
+FUNCTION: yaml_node_t*
+yaml_document_get_root_node ( yaml_document_t *document ) ;
+
+! /**
+! * Create a SCALAR node and attach it to the document.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * @param[in,out] document A document object.
+! * @param[in] tag The scalar tag.
+! * @param[in] value The scalar value.
+! * @param[in] length The length of the scalar value.
+! * @param[in] style The scalar style.
+! *
+! * @returns the node id or @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_add_scalar ( yaml_document_t *document,
+ yaml_char_t *tag, yaml_char_t *value, int length,
+ yaml_scalar_style_t style ) ;
+
+! /**
+! * Create a SEQUENCE node and attach it to the document.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * @param[in,out] document A document object.
+! * @param[in] tag The sequence tag.
+! * @param[in] style The sequence style.
+! *
+! * @returns the node id or @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_add_sequence ( yaml_document_t *document,
+ yaml_char_t *tag, yaml_sequence_style_t style ) ;
+
+! /**
+! * Create a MAPPING node and attach it to the document.
+! *
+! * The @a style argument may be ignored by the emitter.
+! *
+! * @param[in,out] document A document object.
+! * @param[in] tag The sequence tag.
+! * @param[in] style The sequence style.
+! *
+! * @returns the node id or @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_add_mapping ( yaml_document_t *document,
+ yaml_char_t *tag, yaml_mapping_style_t style ) ;
+
+! /**
+! * Add an item to a SEQUENCE node.
+! *
+! * @param[in,out] document A document object.
+! * @param[in] sequence The sequence node id.
+! * @param[in] item The item node id.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_append_sequence_item ( yaml_document_t *document,
+ int sequence, int item ) ;
+
+! /**
+! * Add a pair of a key and a value to a MAPPING node.
+! *
+! * @param[in,out] document A document object.
+! * @param[in] mapping The mapping node id.
+! * @param[in] key The key node id.
+! * @param[in] value The value node id.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_document_append_mapping_pair ( yaml_document_t *document,
+ int mapping, int key, int value ) ;
+
+! /** @} */
+
+! /**
+! * @defgroup parser Parser Definitions
+! * @{
+! */
+
+! /**
+! * The prototype of a read handler.
+! *
+! * The read handler is called when the parser needs to read more bytes from the
+! * source. The handler should write not more than @a size bytes to the @a
+! * buffer. The number of written bytes should be set to the @a length variable.
+! *
+! * @param[in,out] data A pointer to an application data specified by
+! * yaml_parser_set_input().
+! * @param[out] buffer The buffer to write the data from the source.
+! * @param[in] size The size of the buffer.
+! * @param[out] size_read The actual number of bytes read from the source.
+! *
+! * @returns On success, the handler should return @c 1. If the handler failed,
+! * the returned value should be @c 0. On EOF, the handler should set the
+! * @a size_read to @c 0 and return @c 1.
+! */
+
+CALLBACK: int yaml_read_handler_t ( void *data, uchar *buffer, size_t size,
+ size_t *size_read ) ;
+
+! /**
+! * This structure holds information about a potential simple key.
+! */
+
+STRUCT: yaml_simple_key_t
+ { possible int }
+
+ { required int }
+
+ { token_number size_t }
+
+ { mark yaml_mark_t }
+;
+
+! /**
+! * The states of the parser.
+! */
+ENUM: yaml_parser_state_t
+ YAML_PARSE_STREAM_START_STATE
+ YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE
+ YAML_PARSE_DOCUMENT_START_STATE
+ YAML_PARSE_DOCUMENT_CONTENT_STATE
+ YAML_PARSE_DOCUMENT_END_STATE
+ YAML_PARSE_BLOCK_NODE_STATE
+ YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE
+ YAML_PARSE_FLOW_NODE_STATE
+ YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
+ YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
+ YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
+ YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
+ YAML_PARSE_BLOCK_MAPPING_KEY_STATE
+ YAML_PARSE_BLOCK_MAPPING_VALUE_STATE
+ YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
+ YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE
+ YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
+ YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
+ YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
+ YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
+ YAML_PARSE_FLOW_MAPPING_KEY_STATE
+ YAML_PARSE_FLOW_MAPPING_VALUE_STATE
+ YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE
+ YAML_PARSE_END_STATE
+;
+
+! /**
+! * This structure holds aliases data.
+! */
+
+STRUCT: yaml_alias_data_t
+ { anchor yaml_char_t* }
+ { index int }
+ { mark yaml_mark_t }
+;
+
+! /**
+! * The parser structure.
+! *
+! * All members are internal. Manage the structure using the @c yaml_parser_
+! * family of functions.
+! */
+
+ ! /** Standard (string or file) input data. */
+ ! /** String input data. */
+ STRUCT: string_yaml_parser_input
+ { start uchar* }
+ { end uchar* }
+ { current uchar* }
+ ;
+ UNION-STRUCT: yaml_parser_input
+ { string string_yaml_parser_input }
+ { file FILE* }
+ ;
+
+ ! /** The working buffer. */
+ STRUCT: yaml_parser_buffer
+ { start yaml_char_t* }
+ { end yaml_char_t* }
+ { pointer yaml_char_t* }
+ { last yaml_char_t* }
+ ;
+
+ ! /** The raw buffer. */
+ STRUCT: yaml_parser_raw_buffer
+ { start uchar* }
+ { end uchar* }
+ { pointer uchar* }
+ { last uchar* }
+ ;
+
+ ! /** The tokens queue. */
+ STRUCT: yaml_parser_tokens
+ { start yaml_token_t* }
+ { end yaml_token_t* }
+ { head yaml_token_t* }
+ { tail yaml_token_t* }
+ ;
+
+ ! /** The indentation levels stack. */
+ STRUCT: yaml_parser_idents
+ { start int* }
+ { end int* }
+ { top int* }
+ ;
+
+ ! /** The stack of simple keys. */
+ STRUCT: yaml_parser_simple_keys
+ { start yaml_simple_key_t* }
+ { end yaml_simple_key_t* }
+ { top yaml_simple_key_t* }
+ ;
+
+ ! /** The parser states stack. */
+ STRUCT: yaml_parser_states
+ { start yaml_parser_state_t* }
+ { end yaml_parser_state_t* }
+ { top yaml_parser_state_t* }
+ ;
+
+ ! /** The stack of marks. */
+ STRUCT: yaml_parser_marks
+ { start yaml_mark_t* }
+ { end yaml_mark_t* }
+ { top yaml_mark_t* }
+ ;
+
+ ! /** The list of TAG directives. */
+ STRUCT: yaml_parser_tag_directives
+ { start yaml_tag_directive_t* }
+ { end yaml_tag_directive_t* }
+ { top yaml_tag_directive_t* }
+ ;
+
+ ! /** The alias data. */
+ STRUCT: yaml_parser_aliases
+ { start yaml_alias_data_t* }
+ { end yaml_alias_data_t* }
+ { top yaml_alias_data_t* }
+ ;
+STRUCT: yaml_parser_t
+
+ { error yaml_error_type_t }
+ { problem c-string }
+ { problem_offset size_t }
+ { problem_value int }
+ { problem_mark yaml_mark_t }
+ { context c-string }
+ { context_mark yaml_mark_t }
+
+ { read_handler yaml_read_handler_t* }
+
+ { read_handler_data void* }
+
+ { input yaml_parser_input }
+
+ { eof int }
+
+ { buffer yaml_parser_buffer }
+
+ { unread size_t }
+
+ { raw_buffer yaml_parser_raw_buffer }
+
+ { encoding yaml_encoding_t }
+
+ { offset size_t }
+
+ { mark yaml_mark_t }
+
+ { stream_start_produced int }
+
+ { stream_end_produced int }
+
+ { flow_level int }
+
+ { tokens yaml_parser_tokens }
+
+ { tokens_parsed size_t }
+
+ { token_available int }
+
+ { indents yaml_parser_idents }
+
+ { indent int }
+
+ { simple_key_allowed int }
+
+ { simple_keys yaml_parser_simple_keys }
+
+ { states yaml_parser_states }
+
+ { state yaml_parser_state_t }
+
+ { marks yaml_parser_marks }
+
+ { tag_directives yaml_parser_tag_directives }
+
+ { aliases yaml_parser_aliases }
+
+ { document yaml_document_t* }
+;
+
+! /**
+! * Initialize a parser.
+! *
+! * This function creates a new parser object. An application is responsible
+! * for destroying the object using the yaml_parser_delete() function.
+! *
+! * @param[out] parser An empty parser object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_parser_initialize ( yaml_parser_t *parser ) ;
+
+! /**
+! * Destroy a parser.
+! *
+! * @param[in,out] parser A parser object.
+! */
+
+FUNCTION: void
+yaml_parser_delete ( yaml_parser_t *parser ) ;
+DESTRUCTOR: yaml_parser_delete
+
+! /**
+! * Set a string input.
+! *
+! * Note that the @a input pointer must be valid while the @a parser object
+! * exists. The application is responsible for destroing @a input after
+! * destroying the @a parser.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[in] input A source data.
+! * @param[in] size The length of the source data in bytes.
+! */
+
+FUNCTION: void
+yaml_parser_set_input_string ( yaml_parser_t *parser,
+ uchar *input, size_t size ) ;
+
+! /**
+! * Set a file input.
+! *
+! * @a file should be a file object open for reading. The application is
+! * responsible for closing the @a file.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[in] file An open file.
+! */
+
+FUNCTION: void
+yaml_parser_set_input_file ( yaml_parser_t *parser, FILE *file ) ;
+
+! /**
+! * Set a generic input handler.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[in] handler A read handler.
+! * @param[in] data Any application data for passing to the read
+! * handler.
+! */
+
+FUNCTION: void
+yaml_parser_set_input ( yaml_parser_t *parser,
+ yaml_read_handler_t *handler, void *data ) ;
+
+! /**
+! * Set the source encoding.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[in] encoding The source encoding.
+! */
+
+FUNCTION: void
+yaml_parser_set_encoding ( yaml_parser_t *parser, yaml_encoding_t encoding ) ;
+
+! /**
+! * Scan the input stream and produce the next token.
+! *
+! * Call the function subsequently to produce a sequence of tokens corresponding
+! * to the input stream. The initial token has the type
+! * @c YAML_STREAM_START_TOKEN while the ending token has the type
+! * @c YAML_STREAM_END_TOKEN.
+! *
+! * An application is responsible for freeing any buffers associated with the
+! * produced token object using the @c yaml_token_delete function.
+! *
+! * An application must not alternate the calls of yaml_parser_scan() with the
+! * calls of yaml_parser_parse() or yaml_parser_load(). Doing this will break
+! * the parser.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[out] token An empty token object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_parser_scan ( yaml_parser_t *parser, yaml_token_t *token ) ;
+
+! /**
+! * Parse the input stream and produce the next parsing event.
+! *
+! * Call the function subsequently to produce a sequence of events corresponding
+! * to the input stream. The initial event has the type
+! * @c YAML_STREAM_START_EVENT while the ending event has the type
+! * @c YAML_STREAM_END_EVENT.
+! *
+! * An application is responsible for freeing any buffers associated with the
+! * produced event object using the yaml_event_delete() function.
+! *
+! * An application must not alternate the calls of yaml_parser_parse() with the
+! * calls of yaml_parser_scan() or yaml_parser_load(). Doing this will break the
+! * parser.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[out] event An empty event object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_parser_parse ( yaml_parser_t *parser, yaml_event_t *event ) ;
+
+! /**
+! * Parse the input stream and produce the next YAML document.
+! *
+! * Call this function subsequently to produce a sequence of documents
+! * constituting the input stream.
+! *
+! * If the produced document has no root node, it means that the document
+! * end has been reached.
+! *
+! * An application is responsible for freeing any data associated with the
+! * produced document object using the yaml_document_delete() function.
+! *
+! * An application must not alternate the calls of yaml_parser_load() with the
+! * calls of yaml_parser_scan() or yaml_parser_parse(). Doing this will break
+! * the parser.
+! *
+! * @param[in,out] parser A parser object.
+! * @param[out] document An empty document object.
+! *
+! * @return @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_parser_load ( yaml_parser_t *parser, yaml_document_t *document ) ;
+
+! /** @} */
+
+! /**
+! * @defgroup emitter Emitter Definitions
+! * @{
+! */
+
+! /**
+! * The prototype of a write handler.
+! *
+! * The write handler is called when the emitter needs to flush the accumulated
+! * characters to the output. The handler should write @a size bytes of the
+! * @a buffer to the output.
+! *
+! * @param[in,out] data A pointer to an application data specified by
+! * yaml_emitter_set_output().
+! * @param[in] buffer The buffer with bytes to be written.
+! * @param[in] size The size of the buffer.
+! *
+! * @returns On success, the handler should return @c 1. If the handler failed,
+! * the returned value should be @c 0.
+! */
+
+CALLBACK: int yaml_write_handler_t ( void *data, uchar *buffer, size_t size ) ;
+
+! /** The emitter states. */
+ENUM: yaml_emitter_state_t
+ YAML_EMIT_STREAM_START_STATE
+ YAML_EMIT_FIRST_DOCUMENT_START_STATE
+ YAML_EMIT_DOCUMENT_START_STATE
+ YAML_EMIT_DOCUMENT_CONTENT_STATE
+ YAML_EMIT_DOCUMENT_END_STATE
+ YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
+ YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE
+ YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
+ YAML_EMIT_FLOW_MAPPING_KEY_STATE
+ YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE
+ YAML_EMIT_FLOW_MAPPING_VALUE_STATE
+ YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
+ YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE
+ YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
+ YAML_EMIT_BLOCK_MAPPING_KEY_STATE
+ YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE
+ YAML_EMIT_BLOCK_MAPPING_VALUE_STATE
+ YAML_EMIT_END_STATE
+;
+
+! /**
+! * The emitter structure.
+! *
+! * All members are internal. Manage the structure using the @c yaml_emitter_
+! * family of functions.
+! */
+
+ ! /** Standard (string or file) output data. */
+ ! /** String output data. */
+ STRUCT: yaml_emitter_output_string
+ { buffer uchar* }
+ { size size_t }
+ { size_written size_t* }
+ ;
+
+ UNION-STRUCT: yaml_emitter_output
+ { string yaml_emitter_output_string }
+
+ { file FILE* }
+ ;
+
+ ! /** The working buffer. */
+ STRUCT: yaml_emitter_buffer
+ { start yaml_char_t* }
+ { end yaml_char_t* }
+ { pointer yaml_char_t* }
+ { last yaml_char_t* }
+ ;
+
+ ! /** The raw buffer. */
+ STRUCT: yaml_emitter_raw_buffer
+ { start uchar* }
+ { end uchar* }
+ { pointer uchar* }
+ { last uchar* }
+ ;
+
+ ! /** The stack of states. */
+ STRUCT: yaml_emitter_states
+ { start yaml_emitter_state_t* }
+ { end yaml_emitter_state_t* }
+ { top yaml_emitter_state_t* }
+ ;
+
+ ! /** The event queue. */
+ STRUCT: yaml_emitter_events
+ { start yaml_event_t* }
+ { end yaml_event_t* }
+ { head yaml_event_t* }
+ { tail yaml_event_t* }
+ ;
+
+ ! /** The stack of indentation levels. */
+ STRUCT: yaml_emitter_indents
+ { start int* }
+ { end int* }
+ { top int* }
+ ;
+
+ ! /** The list of tag directives. */
+ STRUCT: yaml_emitter_tag_directives
+ { start yaml_tag_directive_t* }
+ { end yaml_tag_directive_t* }
+ { top yaml_tag_directive_t* }
+ ;
+
+ ! /** Anchor analysis. */
+ STRUCT: yaml_emitter_anchor_data
+ { anchor yaml_char_t* }
+ { anchor_length size_t }
+ { alias int }
+ ;
+
+ ! /** Tag analysis. */
+ STRUCT: yaml_emitter_tag_data
+ { handle yaml_char_t* }
+ { handle_length size_t }
+ { suffix yaml_char_t* }
+ { suffix_length size_t }
+ ;
+
+ ! /** Scalar analysis. */
+ STRUCT: yaml_emitter_scalar_data
+ { value yaml_char_t* }
+ { length size_t }
+ { multiline int }
+ { flow_plain_allowed int }
+ { block_plain_allowed int }
+ { single_quoted_allowed int }
+ { block_allowed int }
+ { style yaml_scalar_style_t }
+ ;
+
+ ! /** The information associated with the document nodes. */
+ STRUCT: yaml_emitter_anchors
+ { references int }
+ { anchor int }
+ { serialized int }
+ ;
+STRUCT: yaml_emitter_t
+
+ { error yaml_error_type_t }
+ { problem c-string }
+
+ { write_handler yaml_write_handler_t* }
+
+ { write_handler_data void* }
+
+ { output yaml_emitter_output }
+
+ { buffer yaml_emitter_buffer }
+
+ { raw_buffer yaml_emitter_raw_buffer }
+
+ { encoding yaml_encoding_t }
+
+ { canonical int }
+ { best_indent int }
+ { best_width int }
+ { unicode int }
+ { line_break yaml_break_t }
+
+ { states yaml_emitter_states }
+ { state yaml_emitter_state_t }
+
+ { events yaml_emitter_events }
+
+ { indents yaml_emitter_indents }
+
+ { tag_directives yaml_emitter_tag_directives }
+
+ { indent int }
+
+ { flow_level int }
+
+ { root_context int }
+ { sequence_context int }
+ { mapping_context int }
+ { simple_key_context int }
+
+ { line int }
+ { column int }
+ { whitespace int }
+ { indention int }
+ { open_ended int }
+
+ { anchor_data yaml_emitter_anchor_data }
+
+ { tag_data yaml_emitter_tag_data }
+
+ { scalar_data yaml_emitter_scalar_data }
+
+ { opened int }
+ { closed int }
+
+ { anchors yaml_emitter_anchors* }
+
+ { last_anchor_id int }
+
+ { document yaml_document_t* }
+
+;
+
+! /**
+! * Initialize an emitter.
+! *
+! * This function creates a new emitter object. An application is responsible
+! * for destroying the object using the yaml_emitter_delete() function.
+! *
+! * @param[out] emitter An empty parser object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_initialize ( yaml_emitter_t *emitter ) ;
+
+! /**
+! * Destroy an emitter.
+! *
+! * @param[in,out] emitter An emitter object.
+! */
+
+FUNCTION: void
+yaml_emitter_delete ( yaml_emitter_t *emitter ) ;
+DESTRUCTOR: yaml_emitter_delete
+
+! /**
+! * Set a string output.
+! *
+! * The emitter will write the output characters to the @a output buffer of the
+! * size @a size. The emitter will set @a size_written to the number of written
+! * bytes. If the buffer is smaller than required, the emitter produces the
+! * YAML_WRITE_ERROR error.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] output An output buffer.
+! * @param[in] size The buffer size.
+! * @param[in] size_written The pointer to save the number of written
+! * bytes.
+! */
+
+FUNCTION: void
+yaml_emitter_set_output_string ( yaml_emitter_t *emitter,
+ uchar *output, size_t size, size_t *size_written ) ;
+
+! /**
+! * Set a file output.
+! *
+! * @a file should be a file object open for writing. The application is
+! * responsible for closing the @a file.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] file An open file.
+! */
+
+FUNCTION: void
+yaml_emitter_set_output_file ( yaml_emitter_t *emitter, FILE *file ) ;
+
+! /**
+! * Set a generic output handler.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] handler A write handler.
+! * @param[in] data Any application data for passing to the write
+! * handler.
+! */
+
+FUNCTION: void
+yaml_emitter_set_output ( yaml_emitter_t *emitter,
+ yaml_write_handler_t *handler, void *data ) ;
+
+! /**
+! * Set the output encoding.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] encoding The output encoding.
+! */
+
+FUNCTION: void
+yaml_emitter_set_encoding ( yaml_emitter_t *emitter, yaml_encoding_t encoding ) ;
+
+! /**
+! * Set if the output should be in the "canonical" format as in the YAML
+! * specification.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] canonical If the output is canonical.
+! */
+
+FUNCTION: void
+yaml_emitter_set_canonical ( yaml_emitter_t *emitter, int canonical ) ;
+
+! /**
+! * Set the intendation increment.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] indent The indentation increment (1 < . < 10).
+! */
+
+FUNCTION: void
+yaml_emitter_set_indent ( yaml_emitter_t *emitter, int indent ) ;
+
+! /**
+! * Set the preferred line width. @c -1 means unlimited.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] width The preferred line width.
+! */
+
+FUNCTION: void
+yaml_emitter_set_width ( yaml_emitter_t *emitter, int width ) ;
+
+! /**
+! * Set if unescaped non-ASCII characters are allowed.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] unicode If unescaped Unicode characters are allowed.
+! */
+
+FUNCTION: void
+yaml_emitter_set_unicode ( yaml_emitter_t *emitter, int unicode ) ;
+
+! /**
+! * Set the preferred line break.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in] line_break The preferred line break.
+! */
+
+FUNCTION: void
+yaml_emitter_set_break ( yaml_emitter_t *emitter, yaml_break_t line_break ) ;
+
+! /**
+! * Emit an event.
+! *
+! * The event object may be generated using the yaml_parser_parse() function.
+! * The emitter takes the responsibility for the event object and destroys its
+! * content after it is emitted. The event object is destroyed even if the
+! * function fails.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in,out] event An event object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_emit ( yaml_emitter_t *emitter, yaml_event_t *event ) ;
+
+! /**
+! * Start a YAML stream.
+! *
+! * This function should be used before yaml_emitter_dump() is called.
+! *
+! * @param[in,out] emitter An emitter object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_open ( yaml_emitter_t *emitter ) ;
+
+! /**
+! * Finish a YAML stream.
+! *
+! * This function should be used after yaml_emitter_dump() is called.
+! *
+! * @param[in,out] emitter An emitter object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_close ( yaml_emitter_t *emitter ) ;
+
+! /**
+! * Emit a YAML document.
+! *
+! * The documen object may be generated using the yaml_parser_load() function
+! * or the yaml_document_initialize() function. The emitter takes the
+! * responsibility for the document object and destoys its content after
+! * it is emitted. The document object is destroyedeven if the function fails.
+! *
+! * @param[in,out] emitter An emitter object.
+! * @param[in,out] document A document object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_dump ( yaml_emitter_t *emitter, yaml_document_t *document ) ;
+
+! /**
+! * Flush the accumulated characters to the output.
+! *
+! * @param[in,out] emitter An emitter object.
+! *
+! * @returns @c 1 if the function succeeded, @c 0 on error.
+! */
+
+FUNCTION: int
+yaml_emitter_flush ( yaml_emitter_t *emitter ) ;
+
+! /** @} */
+
+! #ifdef __cplusplus
+! }
+! #endif
+
+! #endif /* #ifndef YAML_H */