package goyaml

import (
	"io"
)

// The version directive data.
type yaml_version_directive_t struct {
	major int // The major version number.
	minor int // The minor version number.
}

// The tag directive data.
type yaml_tag_directive_t struct {
	handle []byte // The tag handle.
	prefix []byte // The tag prefix.
}

type yaml_encoding_t int

// The stream encoding.
const (
	// Let the parser choose the encoding.
	yaml_ANY_ENCODING yaml_encoding_t = iota

	yaml_UTF8_ENCODING    // The default UTF-8 encoding.
	yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
	yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
)

type yaml_break_t int

// Line break types.
const (
	// Let the parser choose the break type.
	yaml_ANY_BREAK yaml_break_t = iota

	yaml_CR_BREAK   // Use CR for line breaks (Mac style).
	yaml_LN_BREAK   // Use LN for line breaks (Unix style).
	yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
)

type yaml_error_type_t int

// Many bad things could happen with the parser and emitter.
const (
	// No error is produced.
	yaml_NO_ERROR yaml_error_type_t = iota

	yaml_MEMORY_ERROR   // Cannot allocate or reallocate a block of memory.
	yaml_READER_ERROR   // Cannot read or decode the input stream.
	yaml_SCANNER_ERROR  // Cannot scan the input stream.
	yaml_PARSER_ERROR   // Cannot parse the input stream.
	yaml_COMPOSER_ERROR // Cannot compose a YAML document.
	yaml_WRITER_ERROR   // Cannot write to the output stream.
	yaml_EMITTER_ERROR  // Cannot emit a YAML stream.
)

// The pointer position.
type yaml_mark_t struct {
	index  int // The position index.
	line   int // The position line.
	column int // The position column.
}

// Node Styles

type yaml_scalar_style_t int

// Scalar styles.
const (
	// Let the emitter choose the style.
	yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota

	yaml_PLAIN_SCALAR_STYLE         // The plain scalar style.
	yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
	yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
	yaml_LITERAL_SCALAR_STYLE       // The literal scalar style.
	yaml_FOLDED_SCALAR_STYLE        // The folded scalar style.
)

type yaml_sequence_style_t int

// Sequence styles.
const (
	// Let the emitter choose the style.
	yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota

	yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
	yaml_FLOW_SEQUENCE_STYLE  // The flow sequence style.
)

type yaml_mapping_style_t int

// Mapping styles.
const (
	// Let the emitter choose the style.
	YAML_ANY_MAPPING_STYLE yaml_mapping_style_t = iota

	yaml_BLOCK_MAPPING_STYLE // The block mapping style.
	yaml_FLOW_MAPPING_STYLE  // The flow mapping style.
)

// Tokens

type yaml_token_type_t int

// Token types.
const (
	// An empty token.
	yaml_NO_TOKEN yaml_token_type_t = iota

	yaml_STREAM_START_TOKEN // A STREAM-START token.
	yaml_STREAM_END_TOKEN   // A STREAM-END token.

	yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
	yaml_TAG_DIRECTIVE_TOKEN     // A TAG-DIRECTIVE token.
	yaml_DOCUMENT_START_TOKEN    // A DOCUMENT-START token.
	yaml_DOCUMENT_END_TOKEN      // A DOCUMENT-END token.

	yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
	yaml_BLOCK_MAPPING_START_TOKEN  // A BLOCK-SEQUENCE-END token.
	yaml_BLOCK_END_TOKEN            // A BLOCK-END token.

	yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
	yaml_FLOW_SEQUENCE_END_TOKEN   // A FLOW-SEQUENCE-END token.
	yaml_FLOW_MAPPING_START_TOKEN  // A FLOW-MAPPING-START token.
	yaml_FLOW_MAPPING_END_TOKEN    // A FLOW-MAPPING-END token.

	yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
	yaml_FLOW_ENTRY_TOKEN  // A FLOW-ENTRY token.
	yaml_KEY_TOKEN         // A KEY token.
	yaml_VALUE_TOKEN       // A VALUE token.

	yaml_ALIAS_TOKEN  // An ALIAS token.
	yaml_ANCHOR_TOKEN // An ANCHOR token.
	yaml_TAG_TOKEN    // A TAG token.
	yaml_SCALAR_TOKEN // A SCALAR token.
)

// The token structure.
type yaml_token_t struct {

	// The token type.
	typ yaml_token_type_t

	// The token data.

	// The stream start (for yaml_STREAM_START_TOKEN).
	stream_start struct {
		encoding yaml_encoding_t // The stream encoding.
	}

	// The alias (for yaml_ALIAS_TOKEN).
	alias struct {
		value []byte // The alias value.
	}

	// The anchor (for yaml_ANCHOR_TOKEN).
	anchor struct {
		value []byte // The anchor value.
	}

	// The tag (for yaml_TAG_TOKEN).
	tag struct {
		handle []byte // The tag handle.
		suffix []byte // The tag suffix.
	}

	// The scalar value (for yaml_SCALAR_TOKEN).
	scalar struct {
		value []byte              // The scalar value.
		style yaml_scalar_style_t // The scalar style.
	}

	// The version directive (for yaml_VERSION_DIRECTIVE_TOKEN).
	version_directive struct {
		major int // The major version number.
		minor int // The minor version number.
	}

	// The tag directive (for yaml_TAG_DIRECTIVE_TOKEN).
	tag_directive struct {
		handle []byte // The tag handle.
		prefix []byte // The tag prefix.
	}

	// The beginning of the token.
	start_mark yaml_mark_t
	// The end of the token.
	end_mark yaml_mark_t
}

// Events

type yaml_event_type_t int

// Event types.
const (
	// An empty event.
	yaml_NO_EVENT yaml_event_type_t = iota

	yaml_STREAM_START_EVENT   // A STREAM-START event.
	yaml_STREAM_END_EVENT     // A STREAM-END event.
	yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
	yaml_DOCUMENT_END_EVENT   // A DOCUMENT-END event.
	yaml_ALIAS_EVENT          // An ALIAS event.
	yaml_SCALAR_EVENT         // A SCALAR event.
	yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
	yaml_SEQUENCE_END_EVENT   // A SEQUENCE-END event.
	yaml_MAPPING_START_EVENT  // A MAPPING-START event.
	yaml_MAPPING_END_EVENT    // A MAPPING-END event.
)

// The event structure.
type yaml_event_t struct {

	// The event type.
	typ yaml_event_type_t

	// The event data.

	// The stream parameters (for yaml_STREAM_START_EVENT).
	stream_start struct {
		encoding yaml_encoding_t // The document encoding.
	}

	// The document parameters (for yaml_DOCUMENT_START_EVENT).
	document_start struct {
		version_directive *yaml_version_directive_t // The version directive.

		// The list of tag directives.
		tag_directives []yaml_tag_directive_t
		implicit       bool // Is the document indicator implicit?
	}

	// The document end parameters (for yaml_DOCUMENT_END_EVENT).
	document_end struct {
		implicit bool // Is the document end indicator implicit?
	}

	// The alias parameters (for yaml_ALIAS_EVENT).
	alias struct {
		anchor []byte // The anchor.
	}

	// The scalar parameters (for yaml_SCALAR_EVENT).
	scalar struct {
		anchor          []byte              // The anchor.
		tag             []byte              // The tag.
		value           []byte              // The scalar value.
		length          int                 // The length of the scalar value.
		plain_implicit  bool                // Is the tag optional for the plain style?
		quoted_implicit bool                // Is the tag optional for any non-plain style?
		style           yaml_scalar_style_t // The scalar style.
	}

	// The sequence parameters (for yaml_SEQUENCE_START_EVENT).
	sequence_start struct {
		anchor   []byte                // The anchor.
		tag      []byte                // The tag.
		implicit bool                  // Is the tag optional?
		style    yaml_sequence_style_t // The sequence style.
	}

	// The mapping parameters (for yaml_MAPPING_START_EVENT).
	mapping_start struct {
		anchor   []byte               // The anchor.
		tag      []byte               // The tag.
		implicit bool                 // Is the tag optional?
		style    yaml_mapping_style_t // The mapping style.
	}

	start_mark yaml_mark_t // The beginning of the event.
	end_mark   yaml_mark_t // The end of the event.

}

///**
// * 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(void)
//yaml_event_delete(yaml_event_t *event);
//
//// @}
//

// Nodes

const (
	yaml_NULL_TAG      = "tag:yaml.org,2002:null"      // The tag !!null with the only possible value: null.
	yaml_BOOL_TAG      = "tag:yaml.org,2002:bool"      // The tag !!bool with the values: true and false.
	yaml_STR_TAG       = "tag:yaml.org,2002:str"       // The tag !!str for string values.
	yaml_INT_TAG       = "tag:yaml.org,2002:int"       // The tag !!int for integer values.
	yaml_FLOAT_TAG     = "tag:yaml.org,2002:float"     // The tag !!float for float values.
	yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.

	yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
	yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.

	yaml_DEFAULT_SCALAR_TAG   = yaml_STR_TAG // The default scalar tag is !!str.
	yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
	yaml_DEFAULT_MAPPING_TAG  = yaml_MAP_TAG // The default mapping tag is !!map.
)

type yaml_node_type_t int

// Node types.
const (
	// An empty node.
	yaml_NO_NODE yaml_node_type_t = iota

	yaml_SCALAR_NODE   // A scalar node.
	yaml_SEQUENCE_NODE // A sequence node.
	yaml_MAPPING_NODE  // A mapping node.
)

// An element of a sequence node.
type yaml_node_item_t int

// An element of a mapping node.
type yaml_node_pair_t struct {
	key   int // The key of the element.
	value int // The value of the element.
}

// The node structure.
type yaml_node_t struct {
	typ yaml_node_type_t // The node type.
	tag []byte           // The node tag.

	// The node data.

	// The scalar parameters (for yaml_SCALAR_NODE).
	scalar struct {
		value  []byte              // The scalar value.
		length int                 // The length of the scalar value.
		style  yaml_scalar_style_t // The scalar style.
	}

	// The sequence parameters (for YAML_SEQUENCE_NODE).
	sequence struct {
		items_data []yaml_node_item_t    // The stack of sequence items.
		style      yaml_sequence_style_t // The sequence style.
	}

	// The mapping parameters (for yaml_MAPPING_NODE).
	mapping struct {
		pairs_data  []yaml_node_pair_t   // The stack of mapping pairs (key, value).
		pairs_start *yaml_node_pair_t    // The beginning of the stack.
		pairs_end   *yaml_node_pair_t    // The end of the stack.
		pairs_top   *yaml_node_pair_t    // The top of the stack.
		style       yaml_mapping_style_t // The mapping style.
	}

	start_mark yaml_mark_t // The beginning of the node.
	end_mark   yaml_mark_t // The end of the node.

}

// The document structure.
type yaml_document_t struct {

	// The document nodes.
	nodes []yaml_node_t

	// The version directive.
	version_directive *yaml_version_directive_t

	// The list of tag directives.
	tag_directives_data  []yaml_tag_directive_t
	tag_directives_start int // The beginning of the tag directives list.
	tag_directives_end   int // The end of the tag directives list.

	start_implicit int // Is the document start indicator implicit?
	end_implicit   int // Is the document end indicator implicit?

	start_mark yaml_mark_t // The beginning of the document.
	end_mark   yaml_mark_t // The end of the document.

}

///**
// * 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(void)
//yaml_document_delete(yaml_document_t *document);
//
///**
// * 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(int)
//yaml_document_append_mapping_pair(yaml_document_t *document,
//        int mapping, int key, int value);
//

// 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 size bytes to the buffer.
// The number of written bytes should be set to the size_read variable.
//
// [in,out]   data        A pointer to an application data specified by
//                        yaml_parser_set_input().
// [out]      buffer      The buffer to write the data from the source.
// [in]       size        The size of the buffer.
// [out]      size_read   The actual number of bytes read from the source.
//
// On success, the handler should return 1.  If the handler failed,
// the returned value should be 0. On EOF, the handler should set the
// size_read to 0 and return 1.
type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)

// This structure holds information about a potential simple key.
type yaml_simple_key_t struct {
	possible     bool        // Is a simple key possible?
	required     bool        // Is a simple key required?
	token_number int         // The number of the token.
	mark         yaml_mark_t // The position mark.
}

// The states of the parser.
type yaml_parser_state_t int

const (
	yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota

	yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE           // Expect the beginning of an implicit document.
	yaml_PARSE_DOCUMENT_START_STATE                    // Expect DOCUMENT-START.
	yaml_PARSE_DOCUMENT_CONTENT_STATE                  // Expect the content of a document.
	yaml_PARSE_DOCUMENT_END_STATE                      // Expect DOCUMENT-END.
	yaml_PARSE_BLOCK_NODE_STATE                        // Expect a block node.
	yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
	yaml_PARSE_FLOW_NODE_STATE                         // Expect a flow node.
	yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE        // Expect the first entry of a block sequence.
	yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE              // Expect an entry of a block sequence.
	yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE         // Expect an entry of an indentless sequence.
	yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE           // Expect the first key of a block mapping.
	yaml_PARSE_BLOCK_MAPPING_KEY_STATE                 // Expect a block mapping key.
	yaml_PARSE_BLOCK_MAPPING_VALUE_STATE               // Expect a block mapping value.
	yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE         // Expect the first entry of a flow sequence.
	yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE               // Expect an entry of a flow sequence.
	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE   // Expect a key of an ordered mapping.
	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE   // Expect the and of an ordered mapping entry.
	yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE            // Expect the first key of a flow mapping.
	yaml_PARSE_FLOW_MAPPING_KEY_STATE                  // Expect a key of a flow mapping.
	yaml_PARSE_FLOW_MAPPING_VALUE_STATE                // Expect a value of a flow mapping.
	yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE          // Expect an empty value of a flow mapping.
	yaml_PARSE_END_STATE                               // Expect nothing.
)

// This structure holds aliases data.
type yaml_alias_data_t struct {
	anchor []byte      // The anchor.
	index  int         // The node id.
	mark   yaml_mark_t // The anchor mark.
}

// The parser structure.
//
// All members are internal. Manage the structure using the
// yaml_parser_ family of functions.
type yaml_parser_t struct {

	// Error handling

	error yaml_error_type_t // Error type.

	problem string // Error description.

	// The byte about which the problem occured.
	problem_offset int
	problem_value  int
	problem_mark   yaml_mark_t

	// The error context.
	context      string
	context_mark yaml_mark_t

	// Reader stuff

	read_handler yaml_read_handler_t // Read handler.

	input_file io.Reader // File input data.
	input      []byte    // String input data.
	input_pos  int

	eof bool // EOF flag

	buffer     []byte // The working buffer.
	buffer_pos int    // The current position of the buffer.

	unread int // The number of unread characters in the buffer.

	raw_buffer     []byte // The raw buffer.
	raw_buffer_pos int    // The current position of the buffer.

	encoding yaml_encoding_t // The input encoding.

	offset int         // The offset of the current position (in bytes).
	mark   yaml_mark_t // The mark of the current position.

	// Scanner stuff

	stream_start_produced bool // Have we started to scan the input stream?
	stream_end_produced   bool // Have we reached the end of the input stream?

	flow_level int // The number of unclosed '[' and '{' indicators.

	tokens          []yaml_token_t // The tokens queue.
	tokens_head     int            // The head of the tokens queue.
	tokens_parsed   int            // The number of tokens fetched from the queue.
	token_available bool           // Does the tokens queue contain a token ready for dequeueing.

	indent  int   // The current indentation level.
	indents []int // The indentation levels stack.

	simple_key_allowed bool                // May a simple key occur at the current position?
	simple_keys        []yaml_simple_key_t // The stack of simple keys.

	// Parser stuff

	state          yaml_parser_state_t    // The current parser state.
	states         []yaml_parser_state_t  // The parser states stack.
	marks          []yaml_mark_t          // The stack of marks.
	tag_directives []yaml_tag_directive_t // The list of TAG directives.

	// Dumper stuff

	aliases []yaml_alias_data_t // The alias data.

	document *yaml_document_t // The currently parsed document.
}

//
///**
// * 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.
// */
//
//YAML_DECLARE(int)
//yaml_parser_initialize(yaml_parser_t *parser);
//
///**
// * Destroy a parser.
// *
// * @param[in,out]   parser  A parser object.
// */
//
//YAML_DECLARE(void)
//yaml_parser_delete(yaml_parser_t *parser);
//
///**
// * 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.
// */
//
//YAML_DECLARE(void)
//yaml_parser_set_input_string(yaml_parser_t *parser,
//        unsigned char *input, int 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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
// * yaml_STREAM_START_TOKEN while the ending token has the type
// * 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.
// */
//
//YAML_DECLARE(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
// * yaml_STREAM_START_EVENT while the ending event has the type
// * 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//typedef int yaml_write_handler_t(void *data, unsigned char *buffer, int size);
//
//// The emitter states.
//typedef enum yaml_emitter_state_e {
//    // Expect STREAM-START.
//    YAML_EMIT_STREAM_START_STATE,
//    // Expect the first DOCUMENT-START or STREAM-END.
//    YAML_EMIT_FIRST_DOCUMENT_START_STATE,
//    // Expect DOCUMENT-START or STREAM-END.
//    YAML_EMIT_DOCUMENT_START_STATE,
//    // Expect the content of a document.
//    YAML_EMIT_DOCUMENT_CONTENT_STATE,
//    // Expect DOCUMENT-END.
//    YAML_EMIT_DOCUMENT_END_STATE,
//    // Expect the first item of a flow sequence.
//    YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE,
//    // Expect an item of a flow sequence.
//    YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE,
//    // Expect the first key of a flow mapping.
//    YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE,
//    // Expect a key of a flow mapping.
//    YAML_EMIT_FLOW_MAPPING_KEY_STATE,
//    // Expect a value for a simple key of a flow mapping.
//    YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE,
//    // Expect a value of a flow mapping.
//    YAML_EMIT_FLOW_MAPPING_VALUE_STATE,
//    // Expect the first item of a block sequence.
//    YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE,
//    // Expect an item of a block sequence.
//    YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE,
//    // Expect the first key of a block mapping.
//    YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE,
//    // Expect the key of a block mapping.
//    YAML_EMIT_BLOCK_MAPPING_KEY_STATE,
//    // Expect a value for a simple key of a block mapping.
//    YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE,
//    // Expect a value of a block mapping.
//    YAML_EMIT_BLOCK_MAPPING_VALUE_STATE,
//    // Expect nothing.
//    YAML_EMIT_END_STATE
//} yaml_emitter_state_t;
//
///**
// * The emitter structure.
// *
// * All members are internal.  Manage the structure using the @c yaml_emitter_
// * family of functions.
// */
//
//typedef struct yaml_emitter_s {
//
//    /**
//     * @name Error handling
//     * @{
//     */
//
//    // Error type.
//    yaml_error_type_t error;
//    // Error description.
//    char *problem;
//
//    /**
//     * @}
//     */
//
//    /**
//     * @name Writer stuff
//     * @{
//     */
//
//    // Write handler.
//    yaml_write_handler_t *write_handler;
//
//    // A pointer for passing to the white handler.
//    void *write_handler_data;
//
//    // Standard (string or file) output data.
//    union {
//        // String output data.
//        struct {
//            // The buffer pointer.
//            unsigned char *buffer;
//            // The buffer size.
//            int size;
//            // The number of written bytes.
//            int *size_written;
//        } string;
//
//        // File output data.
//        FILE *file;
//    } output;
//
//    // The working buffer.
//    struct {
//        // The beginning of the buffer.
//        yaml_char_t *start;
//        // The end of the buffer.
//        yaml_char_t *end;
//        // The current position of the buffer.
//        yaml_char_t *pointer;
//        // The last filled position of the buffer.
//        yaml_char_t *last;
//    } buffer;
//
//    // The raw buffer.
//    struct {
//        // The beginning of the buffer.
//        unsigned char *start;
//        // The end of the buffer.
//        unsigned char *end;
//        // The current position of the buffer.
//        unsigned char *pointer;
//        // The last filled position of the buffer.
//        unsigned char *last;
//    } raw_buffer;
//
//    // The stream encoding.
//    yaml_encoding_t encoding;
//
//    /**
//     * @}
//     */
//
//    /**
//     * @name Emitter stuff
//     * @{
//     */
//
//    // If the output is in the canonical style?
//    int canonical;
//    // The number of indentation spaces.
//    int best_indent;
//    // The preferred width of the output lines.
//    int best_width;
//    // Allow unescaped non-ASCII characters?
//    int unicode;
//    // The preferred line break.
//    yaml_break_t line_break;
//
//    // The stack of states.
//    struct {
//        // The beginning of the stack.
//        yaml_emitter_state_t *start;
//        // The end of the stack.
//        yaml_emitter_state_t *end;
//        // The top of the stack.
//        yaml_emitter_state_t *top;
//    } states;
//
//    // The current emitter state.
//    yaml_emitter_state_t state;
//
//    // The event queue.
//    struct {
//        // The beginning of the event queue.
//        yaml_event_t *start;
//        // The end of the event queue.
//        yaml_event_t *end;
//        // The head of the event queue.
//        yaml_event_t *head;
//        // The tail of the event queue.
//        yaml_event_t *tail;
//    } events;
//
//    // The stack of indentation levels.
//    struct {
//        // The beginning of the stack.
//        int *start;
//        // The end of the stack.
//        int *end;
//        // The top of the stack.
//        int *top;
//    } indents;
//
//    // The list of tag directives.
//    struct {
//        // The beginning of the list.
//        yaml_tag_directive_t *start;
//        // The end of the list.
//        yaml_tag_directive_t *end;
//        // The top of the list.
//        yaml_tag_directive_t *top;
//    } tag_directives;
//
//    // The current indentation level.
//    int indent;
//
//    // The current flow level.
//    int flow_level;
//
//    // Is it the document root context?
//    int root_context;
//    // Is it a sequence context?
//    int sequence_context;
//    // Is it a mapping context?
//    int mapping_context;
//    // Is it a simple mapping key context?
//    int simple_key_context;
//
//    // The current line.
//    int line;
//    // The current column.
//    int column;
//    // If the last character was a whitespace?
//    int whitespace;
//    // If the last character was an indentation character (' ', '-', '?', ':')?
//    int indention;
//    // If an explicit document end is required?
//    int open_ended;
//
//    // Anchor analysis.
//    struct {
//        // The anchor value.
//        yaml_char_t *anchor;
//        // The anchor length.
//        int anchor_length;
//        // Is it an alias?
//        int alias;
//    } anchor_data;
//
//    // Tag analysis.
//    struct {
//        // The tag handle.
//        yaml_char_t *handle;
//        // The tag handle length.
//        int handle_length;
//        // The tag suffix.
//        yaml_char_t *suffix;
//        // The tag suffix length.
//        int suffix_length;
//    } tag_data;
//
//    // Scalar analysis.
//    struct {
//        // The scalar value.
//        yaml_char_t *value;
//        // The scalar length.
//        int length;
//        // Does the scalar contain line breaks?
//        int multiline;
//        // Can the scalar be expessed in the flow plain style?
//        int flow_plain_allowed;
//        // Can the scalar be expressed in the block plain style?
//        int block_plain_allowed;
//        // Can the scalar be expressed in the single quoted style?
//        int single_quoted_allowed;
//        // Can the scalar be expressed in the literal or folded styles?
//        int block_allowed;
//        // The output style.
//        yaml_scalar_style_t style;
//    } scalar_data;
//
//    /**
//     * @}
//     */
//
//    /**
//     * @name Dumper stuff
//     * @{
//     */
//
//    // If the stream was already opened?
//    int opened;
//    // If the stream was already closed?
//    int closed;
//
//    // The information associated with the document nodes.
//    struct {
//        // The number of references.
//        int references;
//        // The anchor id.
//        int anchor;
//        // If the node has been emitted?
//        int serialized;
//    } *anchors;
//
//    // The last assigned anchor id.
//    int last_anchor_id;
//
//    // The currently emitted document.
//    yaml_document_t *document;
//
//    /**
//     * @}
//     */
//
//} yaml_emitter_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.
// */
//
//YAML_DECLARE(int)
//yaml_emitter_initialize(yaml_emitter_t *emitter);
//
///**
// * Destroy an emitter.
// *
// * @param[in,out]   emitter     An emitter object.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_delete(yaml_emitter_t *emitter);
//
///**
// * 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.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_output_string(yaml_emitter_t *emitter,
//        unsigned char *output, int 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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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).
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(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.
// */
//
//YAML_DECLARE(int)
//yaml_emitter_flush(yaml_emitter_t *emitter);
//
//// @}
//
//#ifdef __cplusplus
//}
//#endif
//
//#endif /* #ifndef YAML_H */
//
