package goyaml

import (
	"io"
	"os"
)

///*
// * Extend a string.
// */
//
//YAML_DECLARE(int)
//yaml_string_extend(yaml_char_t **start,
//        yaml_char_t **pointer, yaml_char_t **end)
//{
//    yaml_char_t *new_start = yaml_realloc(*start, (*end - *start)*2);
//
//    if (!new_start) return 0;
//
//    memset(new_start + (*end - *start), 0, *end - *start);
//
//    *pointer = new_start + (*pointer - *start);
//    *end = new_start + (*end - *start)*2;
//    *start = new_start;
//
//    return 1;
//}
//
///*
// * Append a string B to a string A.
// */
//
//YAML_DECLARE(int)
//yaml_string_join(
//        yaml_char_t **a_start, yaml_char_t **a_pointer, yaml_char_t **a_end,
//        yaml_char_t **b_start, yaml_char_t **b_pointer, yaml_char_t **b_end)
//{
//    if (*b_start == *b_pointer)
//        return 1;
//
//    while (*a_end - *a_pointer <= *b_pointer - *b_start) {
//        if (!yaml_string_extend(a_start, a_pointer, a_end))
//            return 0;
//    }
//
//    memcpy(*a_pointer, *b_start, *b_pointer - *b_start);
//    *a_pointer += *b_pointer - *b_start;
//
//    return 1;
//}
//
///*
// * Extend a stack.
// */
//
//YAML_DECLARE(int)
//yaml_stack_extend(void **start, void **top, void **end)
//{
//    void *new_start = yaml_realloc(*start, ((char *)*end - (char *)*start)*2);
//
//    if (!new_start) return 0;
//
//    *top = (char *)new_start + ((char *)*top - (char *)*start);
//    *end = (char *)new_start + ((char *)*end - (char *)*start)*2;
//    *start = new_start;
//
//    return 1;
//}

func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
	//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
	// Check if we can move the queue at the beginning of the buffer.
	if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
		if parser.tokens_head != len(parser.tokens) {
			copy(parser.tokens, parser.tokens[parser.tokens_head:])
		}
		parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
		parser.tokens_head = 0
	}
	parser.tokens = append(parser.tokens, *token)
	if pos < 0 {
		return
	}
	copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
	parser.tokens[parser.tokens_head+pos] = *token
}

// Create a new parser object.
func yaml_parser_initialize(parser *yaml_parser_t) bool {
	// [Go] These should be initialized lazily, and probably start with smaller sizes.
	parser.raw_buffer = make([]byte, 0, input_raw_buffer_size)
	parser.buffer = make([]byte, 0, input_buffer_size)
	parser.tokens = make([]yaml_token_t, 0, initial_queue_size)
	parser.indents = make([]int, 0, initial_stack_size)
	parser.simple_keys = make([]yaml_simple_key_t, 0, initial_stack_size)
	parser.states = make([]yaml_parser_state_t, 0, initial_stack_size)
	parser.marks = make([]yaml_mark_t, 0, initial_stack_size)
	parser.tag_directives = make([]yaml_tag_directive_t, 0, initial_stack_size)
	return true
}

// Destroy a parser object.
func yaml_parser_delete(parser *yaml_parser_t) {
    *parser = yaml_parser_t{}
}

// String read handler.
func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
	if parser.input_pos == len(parser.input) {
		return 0, io.EOF
	}
	n = copy(buffer, parser.input[parser.input_pos:])
	parser.input_pos += n
	return n, nil
}

// File read handler.
func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
	return parser.input_file.Read(buffer)
}

// Set a string input.
func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
	if parser.read_handler != nil {
		panic("must set the input source only once")
	}
	parser.read_handler = yaml_string_read_handler
	parser.input = input
	parser.input_pos = 0
}

// Set a file input.
func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) {
	if parser.read_handler != nil {
		panic("must set the input source only once")
	}
	parser.read_handler = yaml_file_read_handler
	parser.input_file = file
}

///*
// * Set the source encoding.
// */
//
//YAML_DECLARE(void)
//yaml_parser_set_encoding(yaml_parser_t *parser, yaml_encoding_t encoding)
//{
//    assert(parser); // Non-NULL parser object expected.
//    assert(!parser.encoding); // Encoding is already set or detected.
//
//    parser.encoding = encoding;
//}
//
///*
// * Create a new emitter object.
// */
//
//YAML_DECLARE(int)
//yaml_emitter_initialize(yaml_emitter_t *emitter)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    memset(emitter, 0, sizeof(yaml_emitter_t));
//    if (!BUFFER_INIT(emitter, emitter.buffer, OUTPUT_BUFFER_SIZE))
//        goto error;
//    if (!BUFFER_INIT(emitter, emitter.raw_buffer, OUTPUT_RAW_BUFFER_SIZE))
//        goto error;
//    if (!STACK_INIT(emitter, emitter.states, INITIAL_STACK_SIZE))
//        goto error;
//    if (!QUEUE_INIT(emitter, emitter.events, INITIAL_QUEUE_SIZE))
//        goto error;
//    if (!STACK_INIT(emitter, emitter.indents, INITIAL_STACK_SIZE))
//        goto error;
//    if (!STACK_INIT(emitter, emitter.tag_directives, INITIAL_STACK_SIZE))
//        goto error;
//
//    return 1;
//
//error:
//
//    BUFFER_DEL(emitter, emitter.buffer);
//    BUFFER_DEL(emitter, emitter.raw_buffer);
//    STACK_DEL(emitter, emitter.states);
//    QUEUE_DEL(emitter, emitter.events);
//    STACK_DEL(emitter, emitter.indents);
//    STACK_DEL(emitter, emitter.tag_directives);
//
//    return 0;
//}
//
///*
// * Destroy an emitter object.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_delete(yaml_emitter_t *emitter)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    BUFFER_DEL(emitter, emitter.buffer);
//    BUFFER_DEL(emitter, emitter.raw_buffer);
//    STACK_DEL(emitter, emitter.states);
//    while (!QUEUE_EMPTY(emitter, emitter.events)) {
//        yaml_event_delete(&DEQUEUE(emitter, emitter.events));
//    }
//    QUEUE_DEL(emitter, emitter.events);
//    STACK_DEL(emitter, emitter.indents);
//    while (!STACK_EMPTY(empty, emitter.tag_directives)) {
//        yaml_tag_directive_t tag_directive = POP(emitter, emitter.tag_directives);
//        yaml_free(tag_directive.handle);
//        yaml_free(tag_directive.prefix);
//    }
//    STACK_DEL(emitter, emitter.tag_directives);
//    yaml_free(emitter.anchors);
//
//    memset(emitter, 0, sizeof(yaml_emitter_t));
//}
//
///*
// * String write handler.
// */
//
//static int
//yaml_string_write_handler(void *data, unsigned char *buffer, size_t size)
//{
//    yaml_emitter_t *emitter = data;
//
//    if (emitter.output.string.size + *emitter.output.string.size_written
//            < size) {
//        memcpy(emitter.output.string.buffer
//                + *emitter.output.string.size_written,
//                buffer,
//                emitter.output.string.size
//                - *emitter.output.string.size_written);
//        *emitter.output.string.size_written = emitter.output.string.size;
//        return 0;
//    }
//
//    memcpy(emitter.output.string.buffer
//            + *emitter.output.string.size_written, buffer, size);
//    *emitter.output.string.size_written += size;
//    return 1;
//}
//
///*
// * File write handler.
// */
//
//static int
//yaml_file_write_handler(void *data, unsigned char *buffer, size_t size)
//{
//    yaml_emitter_t *emitter = data;
//
//    return (fwrite(buffer, 1, size, emitter.output.file) == size);
//}
///*
// * Set a string output.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_output_string(yaml_emitter_t *emitter,
//        unsigned char *output, size_t size, size_t *size_written)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//    assert(!emitter.write_handler);    // You can set the output only once.
//    assert(output);     // Non-NULL output string expected.
//
//    emitter.write_handler = yaml_string_write_handler;
//    emitter.write_handler_data = emitter;
//
//    emitter.output.string.buffer = output;
//    emitter.output.string.size = size;
//    emitter.output.string.size_written = size_written;
//    *size_written = 0;
//}
//
///*
// * Set a file output.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_output_file(yaml_emitter_t *emitter, FILE *file)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//    assert(!emitter.write_handler);    // You can set the output only once.
//    assert(file);       // Non-NULL file object expected.
//
//    emitter.write_handler = yaml_file_write_handler;
//    emitter.write_handler_data = emitter;
//
//    emitter.output.file = file;
//}
//
///*
// * Set a generic output handler.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_output(yaml_emitter_t *emitter,
//        yaml_write_handler_t *handler, void *data)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//    assert(!emitter.write_handler);    // You can set the output only once.
//    assert(handler);    // Non-NULL handler object expected.
//
//    emitter.write_handler = handler;
//    emitter.write_handler_data = data;
//}
//
///*
// * Set the output encoding.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_encoding(yaml_emitter_t *emitter, yaml_encoding_t encoding)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//    assert(!emitter.encoding);     // You can set encoding only once.
//
//    emitter.encoding = encoding;
//}
//
///*
// * Set the canonical output style.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    emitter.canonical = (canonical != 0);
//}
//
///*
// * Set the indentation increment.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_indent(yaml_emitter_t *emitter, int indent)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    emitter.best_indent = (1 < indent && indent < 10) ? indent : 2;
//}
//
///*
// * Set the preferred line width.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_width(yaml_emitter_t *emitter, int width)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    emitter.best_width = (width >= 0) ? width : -1;
//}
//
///*
// * Set if unescaped non-ASCII characters are allowed.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_unicode(yaml_emitter_t *emitter, int unicode)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    emitter.unicode = (unicode != 0);
//}
//
///*
// * Set the preferred line break character.
// */
//
//YAML_DECLARE(void)
//yaml_emitter_set_break(yaml_emitter_t *emitter, yaml_break_t line_break)
//{
//    assert(emitter);    // Non-NULL emitter object expected.
//
//    emitter.line_break = line_break;
//}
//
///*
// * 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:
//            yaml_free(token.data.alias.value);
//            break;
//
//        case YAML_ANCHOR_TOKEN:
//            yaml_free(token.data.anchor.value);
//            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;
//
//        default:
//            break;
//    }
//
//    memset(token, 0, sizeof(yaml_token_t));
//}
//
///*
// * Check if a string is a valid UTF-8 sequence.
// *
// * Check 'reader.c' for more details on UTF-8 encoding.
// */
//
//static int
//yaml_check_utf8(yaml_char_t *start, size_t length)
//{
//    yaml_char_t *end = start+length;
//    yaml_char_t *pointer = start;
//
//    while (pointer < end) {
//        unsigned char octet;
//        unsigned int width;
//        unsigned int value;
//        size_t k;
//
//        octet = pointer[0];
//        width = (octet & 0x80) == 0x00 ? 1 :
//                (octet & 0xE0) == 0xC0 ? 2 :
//                (octet & 0xF0) == 0xE0 ? 3 :
//                (octet & 0xF8) == 0xF0 ? 4 : 0;
//        value = (octet & 0x80) == 0x00 ? octet & 0x7F :
//                (octet & 0xE0) == 0xC0 ? octet & 0x1F :
//                (octet & 0xF0) == 0xE0 ? octet & 0x0F :
//                (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
//        if (!width) return 0;
//        if (pointer+width > end) return 0;
//        for (k = 1; k < width; k ++) {
//            octet = pointer[k];
//            if ((octet & 0xC0) != 0x80) return 0;
//            value = (value << 6) + (octet & 0x3F);
//        }
//        if (!((width == 1) ||
//            (width == 2 && value >= 0x80) ||
//            (width == 3 && value >= 0x800) ||
//            (width == 4 && value >= 0x10000))) return 0;
//
//        pointer += width;
//    }
//
//    return 1;
//}
//
///*
// * Create STREAM-START.
// */
//
//YAML_DECLARE(int)
//yaml_stream_start_event_initialize(yaml_event_t *event,
//        yaml_encoding_t encoding)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(event);  // Non-NULL event object is expected.
//
//    STREAM_START_EVENT_INIT(*event, encoding, mark, mark);
		//*event = yaml_event_t{
		//	typ:        yaml_STREAM_START_EVENT,
		//	start_mark: mark,
		//	end_mark:   mark,
		//}
		//event.stream_start.encoding = encoding
//
//    return 1;
//}
//
///*
// * Create STREAM-END.
// */
//
//YAML_DECLARE(int)
//yaml_stream_end_event_initialize(yaml_event_t *event)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(event);  // Non-NULL event object is expected.
//
//    STREAM_END_EVENT_INIT(*event, mark, mark);
	//*event = yaml_event_t{
	//	typ: yaml_STREAM_END_EVENT,
	//	start_mark: mark,
	//	end_mark: mark,
	//}
//
//    return 1;
//}
//
///*
// * Create DOCUMENT-START.
// */
//
//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)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_version_directive_t *version_directive_copy = NULL;
//    struct {
//        yaml_tag_directive_t *start;
//        yaml_tag_directive_t *end;
//        yaml_tag_directive_t *top;
//    } tag_directives_copy = { NULL, NULL, NULL };
//    yaml_tag_directive_t value = { NULL, NULL };
//
//    assert(event);          // Non-NULL event object is expected.
//    assert((tag_directives_start && tag_directives_end) ||
//            (tag_directives_start == tag_directives_end));
//                            // Valid tag directives are expected.
//
//    if (version_directive) {
//        version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t));
//        if (!version_directive_copy) goto error;
//        version_directive_copy.major = version_directive.major;
//        version_directive_copy.minor = version_directive.minor;
//    }
//
//    if (tag_directives_start != tag_directives_end) {
//        yaml_tag_directive_t *tag_directive;
//        if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
//            goto error;
//        for (tag_directive = tag_directives_start;
//                tag_directive != tag_directives_end; tag_directive ++) {
//            assert(tag_directive.handle);
//            assert(tag_directive.prefix);
//            if (!yaml_check_utf8(tag_directive.handle,
//                        strlen((char *)tag_directive.handle)))
//                goto error;
//            if (!yaml_check_utf8(tag_directive.prefix,
//                        strlen((char *)tag_directive.prefix)))
//                goto error;
//            value.handle = yaml_strdup(tag_directive.handle);
//            value.prefix = yaml_strdup(tag_directive.prefix);
//            if (!value.handle || !value.prefix) goto error;
//            if (!PUSH(&context, tag_directives_copy, value))
//                goto error;
//            value.handle = NULL;
//            value.prefix = NULL;
//        }
//    }
//
//    DOCUMENT_START_EVENT_INIT(*event, version_directive_copy,
//            tag_directives_copy.start, tag_directives_copy.top,
//            implicit, mark, mark);
	//*event = yaml_event_t{
	//	typ: yaml_DOCUMENT_START_EVENT,
	//	start_mark: mark,
	//	end_mark: mark,
	//}
	//event.document_start.version_directive = version_directive_copy
	//event.document_start.tag_directives = tag_directives
	//event.document_start.implicit = implicit
//
//    return 1;
//
//error:
//    yaml_free(version_directive_copy);
//    while (!STACK_EMPTY(context, tag_directives_copy)) {
//        yaml_tag_directive_t value = POP(context, tag_directives_copy);
//        yaml_free(value.handle);
//        yaml_free(value.prefix);
//    }
//    STACK_DEL(context, tag_directives_copy);
//    yaml_free(value.handle);
//    yaml_free(value.prefix);
//
//    return 0;
//}
//
///*
// * Create DOCUMENT-END.
// */
//
//YAML_DECLARE(int)
//yaml_document_end_event_initialize(yaml_event_t *event, int implicit)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(event);      // Non-NULL emitter object is expected.
//
//    DOCUMENT_END_EVENT_INIT(*event, implicit, mark, mark);
//
//    return 1;
//}
//
///*
// * Create ALIAS.
// */
//
//YAML_DECLARE(int)
//yaml_alias_event_initialize(yaml_event_t *event, yaml_char_t *anchor)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *anchor_copy = NULL;
//
//    assert(event);      // Non-NULL event object is expected.
//    assert(anchor);     // Non-NULL anchor is expected.
//
//    if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0;
//
//    anchor_copy = yaml_strdup(anchor);
//    if (!anchor_copy)
//        return 0;
//
//    ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark);
//
//    return 1;
//}
//
///*
// * Create SCALAR.
// */
//
//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)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *anchor_copy = NULL;
//    yaml_char_t *tag_copy = NULL;
//    yaml_char_t *value_copy = NULL;
//
//    assert(event);      // Non-NULL event object is expected.
//    assert(value);      // Non-NULL anchor is expected.
//
//    if (anchor) {
//        if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
//        anchor_copy = yaml_strdup(anchor);
//        if (!anchor_copy) goto error;
//    }
//
//    if (tag) {
//        if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//        tag_copy = yaml_strdup(tag);
//        if (!tag_copy) goto error;
//    }
//
//    if (length < 0) {
//        length = strlen((char *)value);
//    }
//
//    if (!yaml_check_utf8(value, length)) goto error;
//    value_copy = yaml_malloc(length+1);
//    if (!value_copy) goto error;
//    memcpy(value_copy, value, length);
//    value_copy[length] = '\0';
//
//    SCALAR_EVENT_INIT(*event, anchor_copy, tag_copy, value_copy, length,
//            plain_implicit, quoted_implicit, style, mark, mark);
//
//    return 1;
//
//error:
//    yaml_free(anchor_copy);
//    yaml_free(tag_copy);
//    yaml_free(value_copy);
//
//    return 0;
//}
//
///*
// * Create SEQUENCE-START.
// */
//
//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)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *anchor_copy = NULL;
//    yaml_char_t *tag_copy = NULL;
//
//    assert(event);      // Non-NULL event object is expected.
//
//    if (anchor) {
//        if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
//        anchor_copy = yaml_strdup(anchor);
//        if (!anchor_copy) goto error;
//    }
//
//    if (tag) {
//        if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//        tag_copy = yaml_strdup(tag);
//        if (!tag_copy) goto error;
//    }
//
//    SEQUENCE_START_EVENT_INIT(*event, anchor_copy, tag_copy,
//            implicit, style, mark, mark);
//
//    return 1;
//
//error:
//    yaml_free(anchor_copy);
//    yaml_free(tag_copy);
//
//    return 0;
//}
//
///*
// * Create SEQUENCE-END.
// */
//
//YAML_DECLARE(int)
//yaml_sequence_end_event_initialize(yaml_event_t *event)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(event);      // Non-NULL event object is expected.
//
//    SEQUENCE_END_EVENT_INIT(*event, mark, mark);
//
//    return 1;
//}
//
///*
// * Create MAPPING-START.
// */
//
//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)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *anchor_copy = NULL;
//    yaml_char_t *tag_copy = NULL;
//
//    assert(event);      // Non-NULL event object is expected.
//
//    if (anchor) {
//        if (!yaml_check_utf8(anchor, strlen((char *)anchor))) goto error;
//        anchor_copy = yaml_strdup(anchor);
//        if (!anchor_copy) goto error;
//    }
//
//    if (tag) {
//        if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//        tag_copy = yaml_strdup(tag);
//        if (!tag_copy) goto error;
//    }
//
//    MAPPING_START_EVENT_INIT(*event, anchor_copy, tag_copy,
//            implicit, style, mark, mark);
//
//    return 1;
//
//error:
//    yaml_free(anchor_copy);
//    yaml_free(tag_copy);
//
//    return 0;
//}
//
///*
// * Create MAPPING-END.
// */
//
//YAML_DECLARE(int)
//yaml_mapping_end_event_initialize(yaml_event_t *event)
//{
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(event);      // Non-NULL event object is expected.
//
//    MAPPING_END_EVENT_INIT(*event, mark, mark);
//
//    return 1;
//}

// Destroy an event object.
func yaml_event_delete(event *yaml_event_t) {
	*event = yaml_event_t{}
}

///*
// * Create a document object.
// */
//
//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)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    struct {
//        yaml_node_t *start;
//        yaml_node_t *end;
//        yaml_node_t *top;
//    } nodes = { NULL, NULL, NULL };
//    yaml_version_directive_t *version_directive_copy = NULL;
//    struct {
//        yaml_tag_directive_t *start;
//        yaml_tag_directive_t *end;
//        yaml_tag_directive_t *top;
//    } tag_directives_copy = { NULL, NULL, NULL };
//    yaml_tag_directive_t value = { NULL, NULL };
//    yaml_mark_t mark = { 0, 0, 0 };
//
//    assert(document);       // Non-NULL document object is expected.
//    assert((tag_directives_start && tag_directives_end) ||
//            (tag_directives_start == tag_directives_end));
//                            // Valid tag directives are expected.
//
//    if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error;
//
//    if (version_directive) {
//        version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t));
//        if (!version_directive_copy) goto error;
//        version_directive_copy.major = version_directive.major;
//        version_directive_copy.minor = version_directive.minor;
//    }
//
//    if (tag_directives_start != tag_directives_end) {
//        yaml_tag_directive_t *tag_directive;
//        if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
//            goto error;
//        for (tag_directive = tag_directives_start;
//                tag_directive != tag_directives_end; tag_directive ++) {
//            assert(tag_directive.handle);
//            assert(tag_directive.prefix);
//            if (!yaml_check_utf8(tag_directive.handle,
//                        strlen((char *)tag_directive.handle)))
//                goto error;
//            if (!yaml_check_utf8(tag_directive.prefix,
//                        strlen((char *)tag_directive.prefix)))
//                goto error;
//            value.handle = yaml_strdup(tag_directive.handle);
//            value.prefix = yaml_strdup(tag_directive.prefix);
//            if (!value.handle || !value.prefix) goto error;
//            if (!PUSH(&context, tag_directives_copy, value))
//                goto error;
//            value.handle = NULL;
//            value.prefix = NULL;
//        }
//    }
//
//    DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
//            tag_directives_copy.start, tag_directives_copy.top,
//            start_implicit, end_implicit, mark, mark);
//
//    return 1;
//
//error:
//    STACK_DEL(&context, nodes);
//    yaml_free(version_directive_copy);
//    while (!STACK_EMPTY(&context, tag_directives_copy)) {
//        yaml_tag_directive_t value = POP(&context, tag_directives_copy);
//        yaml_free(value.handle);
//        yaml_free(value.prefix);
//    }
//    STACK_DEL(&context, tag_directives_copy);
//    yaml_free(value.handle);
//    yaml_free(value.prefix);
//
//    return 0;
//}
//
///*
// * Destroy a document object.
// */
//
//YAML_DECLARE(void)
//yaml_document_delete(yaml_document_t *document)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    yaml_tag_directive_t *tag_directive;
//
//    context.error = YAML_NO_ERROR;  // Eliminate a compliler warning.
//
//    assert(document);   // Non-NULL document object is expected.
//
//    while (!STACK_EMPTY(&context, document.nodes)) {
//        yaml_node_t node = POP(&context, document.nodes);
//        yaml_free(node.tag);
//        switch (node.type) {
//            case YAML_SCALAR_NODE:
//                yaml_free(node.data.scalar.value);
//                break;
//            case YAML_SEQUENCE_NODE:
//                STACK_DEL(&context, node.data.sequence.items);
//                break;
//            case YAML_MAPPING_NODE:
//                STACK_DEL(&context, node.data.mapping.pairs);
//                break;
//            default:
//                assert(0);  // Should not happen.
//        }
//    }
//    STACK_DEL(&context, document.nodes);
//
//    yaml_free(document.version_directive);
//    for (tag_directive = document.tag_directives.start;
//            tag_directive != document.tag_directives.end;
//            tag_directive++) {
//        yaml_free(tag_directive.handle);
//        yaml_free(tag_directive.prefix);
//    }
//    yaml_free(document.tag_directives.start);
//
//    memset(document, 0, sizeof(yaml_document_t));
//}
//
///**
// * Get a document node.
// */
//
//YAML_DECLARE(yaml_node_t *)
//yaml_document_get_node(yaml_document_t *document, int index)
//{
//    assert(document);   // Non-NULL document object is expected.
//
//    if (index > 0 && document.nodes.start + index <= document.nodes.top) {
//        return document.nodes.start + index - 1;
//    }
//    return NULL;
//}
//
///**
// * Get the root object.
// */
//
//YAML_DECLARE(yaml_node_t *)
//yaml_document_get_root_node(yaml_document_t *document)
//{
//    assert(document);   // Non-NULL document object is expected.
//
//    if (document.nodes.top != document.nodes.start) {
//        return document.nodes.start;
//    }
//    return NULL;
//}
//
///*
// * Add a scalar node to a document.
// */
//
//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)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *tag_copy = NULL;
//    yaml_char_t *value_copy = NULL;
//    yaml_node_t node;
//
//    assert(document);   // Non-NULL document object is expected.
//    assert(value);      // Non-NULL value is expected.
//
//    if (!tag) {
//        tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG;
//    }
//
//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//    tag_copy = yaml_strdup(tag);
//    if (!tag_copy) goto error;
//
//    if (length < 0) {
//        length = strlen((char *)value);
//    }
//
//    if (!yaml_check_utf8(value, length)) goto error;
//    value_copy = yaml_malloc(length+1);
//    if (!value_copy) goto error;
//    memcpy(value_copy, value, length);
//    value_copy[length] = '\0';
//
//    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
//    if (!PUSH(&context, document.nodes, node)) goto error;
//
//    return document.nodes.top - document.nodes.start;
//
//error:
//    yaml_free(tag_copy);
//    yaml_free(value_copy);
//
//    return 0;
//}
//
///*
// * Add a sequence node to a document.
// */
//
//YAML_DECLARE(int)
//yaml_document_add_sequence(yaml_document_t *document,
//        yaml_char_t *tag, yaml_sequence_style_t style)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *tag_copy = NULL;
//    struct {
//        yaml_node_item_t *start;
//        yaml_node_item_t *end;
//        yaml_node_item_t *top;
//    } items = { NULL, NULL, NULL };
//    yaml_node_t node;
//
//    assert(document);   // Non-NULL document object is expected.
//
//    if (!tag) {
//        tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG;
//    }
//
//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//    tag_copy = yaml_strdup(tag);
//    if (!tag_copy) goto error;
//
//    if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error;
//
//    SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
//            style, mark, mark);
//    if (!PUSH(&context, document.nodes, node)) goto error;
//
//    return document.nodes.top - document.nodes.start;
//
//error:
//    STACK_DEL(&context, items);
//    yaml_free(tag_copy);
//
//    return 0;
//}
//
///*
// * Add a mapping node to a document.
// */
//
//YAML_DECLARE(int)
//yaml_document_add_mapping(yaml_document_t *document,
//        yaml_char_t *tag, yaml_mapping_style_t style)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//    yaml_mark_t mark = { 0, 0, 0 };
//    yaml_char_t *tag_copy = NULL;
//    struct {
//        yaml_node_pair_t *start;
//        yaml_node_pair_t *end;
//        yaml_node_pair_t *top;
//    } pairs = { NULL, NULL, NULL };
//    yaml_node_t node;
//
//    assert(document);   // Non-NULL document object is expected.
//
//    if (!tag) {
//        tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG;
//    }
//
//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error;
//    tag_copy = yaml_strdup(tag);
//    if (!tag_copy) goto error;
//
//    if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error;
//
//    MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
//            style, mark, mark);
//    if (!PUSH(&context, document.nodes, node)) goto error;
//
//    return document.nodes.top - document.nodes.start;
//
//error:
//    STACK_DEL(&context, pairs);
//    yaml_free(tag_copy);
//
//    return 0;
//}
//
///*
// * Append an item to a sequence node.
// */
//
//YAML_DECLARE(int)
//yaml_document_append_sequence_item(yaml_document_t *document,
//        int sequence, int item)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//
//    assert(document);       // Non-NULL document is required.
//    assert(sequence > 0
//            && document.nodes.start + sequence <= document.nodes.top);
//                            // Valid sequence id is required.
//    assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE);
//                            // A sequence node is required.
//    assert(item > 0 && document.nodes.start + item <= document.nodes.top);
//                            // Valid item id is required.
//
//    if (!PUSH(&context,
//                document.nodes.start[sequence-1].data.sequence.items, item))
//        return 0;
//
//    return 1;
//}
//
///*
// * Append a pair of a key and a value to a mapping node.
// */
//
//YAML_DECLARE(int)
//yaml_document_append_mapping_pair(yaml_document_t *document,
//        int mapping, int key, int value)
//{
//    struct {
//        yaml_error_type_t error;
//    } context;
//
//    yaml_node_pair_t pair;
//
//    assert(document);       // Non-NULL document is required.
//    assert(mapping > 0
//            && document.nodes.start + mapping <= document.nodes.top);
//                            // Valid mapping id is required.
//    assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE);
//                            // A mapping node is required.
//    assert(key > 0 && document.nodes.start + key <= document.nodes.top);
//                            // Valid key id is required.
//    assert(value > 0 && document.nodes.start + value <= document.nodes.top);
//                            // Valid value id is required.
//
//    pair.key = key;
//    pair.value = value;
//
//    if (!PUSH(&context,
//                document.nodes.start[mapping-1].data.mapping.pairs, pair))
//        return 0;
//
//    return 1;
//}
//
//
