diff --git a/.gitignore b/.gitignore
index b9e6052..a01d5b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@
 *.swp
 *.ta
 cscope.*
+*/out/
diff --git a/Makefile b/Makefile
index dc3795a..8be2583 100644
--- a/Makefile
+++ b/Makefile
@@ -6,20 +6,41 @@
 OBJDUMP = $(CROSS_COMPILE)objdump
 READELF = $(CROSS_COMPILE)readelf
 
-OBJS := main.o benchmark_aux.o
-
-CFLAGS += -Wall -Wextra -Werror -I$(TEEC_EXPORT)/include -I$(TEEC_INTERNAL_INCLUDES)/include
-#Add/link other required libraries here
-LDADD += -lm -lteec -lpthread -L$(TEEC_EXPORT)/lib
-
-BINARY = benchmark
-
 .PHONY: all
-all: $(BINARY)
-
-$(BINARY): $(OBJS)
-	$(CC) $(LDADD) -o $@ $^
+all: libyaml benchmark
 
 .PHONY: clean
-clean:
-	rm -f $(OBJS) $(BINARY)
+clean: libyaml-clean
+	rm -f $(OBJS) benchmark
+################################################################################
+# libYAML
+################################################################################
+LIBYAML_FLAGS ?= CROSS_COMPILE=$(CROSS_COMPILE)
+LIBYAML_SRC_DIR = $(CURDIR)/libyaml
+LIBYAML_OUT_DIR = $(LIBYAML_SRC_DIR)/out
+
+.PHONY: libyaml
+libyaml:
+	cd $(LIBYAML_SRC_DIR) && ./bootstrap && \
+	./configure --host=$(MULTIARCH) \
+	--prefix=$(LIBYAML_SRC_DIR)/out CC=$(CC) && \
+	$(MAKE) && $(MAKE) install
+
+.PHONY: libyaml-clean
+libyaml-clean:
+	cd $(LIBYAML_SRC_DIR) && \
+	$(MAKE) clean
+
+################################################################################
+# benchmark_app
+################################################################################
+OBJS := main.o benchmark_aux.o
+
+CFLAGS += -Wall -Wextra -Werror -I$(TEEC_EXPORT)/include \
+		  -I$(TEEC_INTERNAL_INCLUDES)/include -I$(LIBYAML_OUT_DIR)/include
+#Add/link other required libraries here
+LDADD += -lm -lteec -lyaml -lpthread \
+		 -L$(TEEC_EXPORT)/lib -L$(LIBYAML_OUT_DIR)/lib
+
+benchmark: $(OBJS)
+	$(CC) $(LDADD) -o $@ $^
diff --git a/benchmark_aux.c b/benchmark_aux.c
index b97c213..90e8e62 100644
--- a/benchmark_aux.c
+++ b/benchmark_aux.c
@@ -33,12 +33,12 @@
 #include <unistd.h>
 
 #include "benchmark_aux.h"
+#include "common.h"
 
 /* Misc auxilary functions */
 void tee_errx(const char *msg, TEEC_Result res)
 {
-	fprintf(stderr, "%s: 0x%08x\n", msg, res);
-	exit(1);
+	ERROR_EXIT("%s: 0x%08x\n", msg, res);
 }
 
 void tee_check_res(TEEC_Result res, const char *errmsg)
@@ -51,17 +51,15 @@
 {
 	switch (source) {
 	case TEE_BENCH_CORE:
-		return "CORE";
+		return "core";
 	case TEE_BENCH_KMOD:
-		return "KMOD";
+		return "kmodule";
 	case TEE_BENCH_CLIENT:
-		return "CLIENT";
+		return "libteec";
 	case TEE_BENCH_UTEE:
-		return "UTEE";
-	case TEE_BENCH_DUMB_TA:
-		return "DUMB_TA";
+		return "libutee";
 	default:
-		return "???";
+		return "-";
 	}
 }
 
diff --git a/common.h b/common.h
new file mode 100644
index 0000000..645ba1a
--- /dev/null
+++ b/common.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+/*
+ * Misc. output defines
+ */
+
+#define OUTPUT_APP_PREFIX "Benchmark"
+
+#ifdef DEBUG
+#define DBG(fmt, args...) printf("[" OUTPUT_APP_PREFIX \
+		"] DEBUG: %s:%d:%s(): " fmt "\n", __FILE__, __LINE__, __func__, ##args)
+#else
+#define DBG(fmt, args...)
+#endif
+
+#define INFO(fmt, args...) printf("[" OUTPUT_APP_PREFIX \
+					"] INFO: " fmt "\n", ##args)
+#define ERROR(fmt, args...) fprintf(stderr, "[" OUTPUT_APP_PREFIX \
+					"] ERROR: " fmt "\n", ##args)
+
+#define ERROR_EXIT(fmt, args...) do {		\
+					ERROR(fmt, ##args);		\
+					exit(EXIT_FAILURE);		\
+			} while(0)
+
+#define ERROR_RETURN_FALSE(fmt, args...) do {		\
+					ERROR(fmt, ##args);		\
+					return false;			\
+			} while(0)
+
+#define ERROR_GOTO(label, fmt, args...) do {		\
+					ERROR(fmt, ##args);		\
+					goto label;			\
+			} while(0)
+
+
+
+
+#define STAT_AMOUNT 				5
+#define TSFILE_NAME_SUFFIX			".ts"
+#define YAML_IMPLICIT				1
+/*
+ * Ringbuffer return codes
+ */
+#define RING_SUCCESS	0
+#define RING_BADPARM	-1
+#define RING_NODATA		-2
+
+#endif /* COMMON.H */
+
diff --git a/libyaml/.gitignore b/libyaml/.gitignore
new file mode 100644
index 0000000..5eb86f5
--- /dev/null
+++ b/libyaml/.gitignore
@@ -0,0 +1,63 @@
+.deps/
+.libs/
+*~
+*.BAK
+*.la
+*.lo
+*.o
+*.pc
+/CMakeCache.txt
+/CMakeFiles/
+/CTestTestfile.cmake
+/GNUmakefile
+/Makefile
+Makefile.in
+/Testing/
+/aclocal.m4
+/autom4te.cache
+/cmake_install.cmake
+/config
+/config.h
+/config.h.in
+/config.h.in~
+/config.log
+/config.status
+/configure
+/example-deconstructor
+/example-deconstructor-alt
+/example-reformatter
+/example-reformatter-alt
+/include/Makefile
+/libtool
+/libyaml.a
+/run-dumper
+/run-emitter
+/run-loader
+/run-parser
+/run-scanner
+/src/Makefile
+/stamp-h1
+/test-reader
+/test-version
+/tests/Makefile
+/tests/example-deconstructor
+/tests/example-deconstructor-alt
+/tests/example-reformatter
+/tests/example-reformatter-alt
+/tests/run-dumper
+/tests/run-emitter
+/tests/run-loader
+/tests/run-parser
+/tests/run-scanner
+/tests/run-test-suite/data
+tests/run-test-suite/src/libyaml/
+tests/run-test-suite/src/libyaml-emitter
+tests/run-test-suite/src/libyaml-parser
+/tests/test-reader
+/tests/test-reader.log
+/tests/test-reader.trs
+/tests/test-suite.log
+/tests/test-version
+/tests/test-version.log
+/tests/test-version.trs
+/win32/Makefile
diff --git a/libyaml/.indent.pro b/libyaml/.indent.pro
new file mode 100644
index 0000000..d647720
--- /dev/null
+++ b/libyaml/.indent.pro
@@ -0,0 +1 @@
+-kr -nut -nce -l250
diff --git a/libyaml/.makefile b/libyaml/.makefile
new file mode 100644
index 0000000..ba7c056
--- /dev/null
+++ b/libyaml/.makefile
@@ -0,0 +1,62 @@
+# This file is used for common development targets that can be done with
+# needing the cumbersome bootstrapping process.
+#
+# You can use it like this:
+#
+#   make -f .makefile indent
+#
+# If you copy or link this file to `GNUmakefile` then you can just do:
+#
+#   make indent
+#
+# When copied to `GNUmakefile`, this file is can also be used for bootstrapping
+# Makefile targets. Since GNUmakefile is loaded before Makefile, we do the
+# bootstrapping tasks need to get a Makefile first, then we use the Makefile to
+# make our target.
+
+# Remind user when they are using GNUmakefile:
+ifeq ($(lastword $(MAKEFILE_LIST)),GNUmakefile)
+    $(info *** NOTE: GNUmakefile in use. ***)
+endif
+
+MAKE_TARGETS := \
+	all \
+	all-am \
+	all-recursive \
+	install \
+	test \
+	test-all \
+	test-suite \
+
+# SOURCE_FILES := $(shell find . | grep '\.c$$')
+SOURCE_FILES := $(shell find tests/run-test-suite | grep '\.c$$')
+ifneq ($(shell which gindent),)
+INDENT := gindent
+else
+INDENT := indent
+endif
+
+#
+# Proxy make targets:
+#
+default: all
+
+# Proxy these targets to the real Makefile, after bootstrapping is necessary.
+$(MAKE_TARGETS): Makefile
+	@make -f $< $@
+
+Makefile: Makefile.in
+	./configure
+
+Makefile.in:
+	./bootstrap
+
+#
+# Development make targets:
+#
+indent:
+	$(INDENT) $(SOURCE_FILES)
+
+distclean purge:
+	rm -fr tests/run-test-suite/data
+	git clean -dxf -e GNUmakefile
diff --git a/libyaml/CMakeLists.txt b/libyaml/CMakeLists.txt
new file mode 100644
index 0000000..e47f5ef
--- /dev/null
+++ b/libyaml/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Minimal CMake project for building a static library under Windows.
+
+cmake_minimum_required (VERSION 2.8)
+project (yaml C)
+
+set (YAML_VERSION_MAJOR 0)
+set (YAML_VERSION_MINOR 1)
+set (YAML_VERSION_PATCH 7)
+set (YAML_VERSION_STRING "${YAML_VERSION_MAJOR}.${YAML_VERSION_MINOR}.${YAML_VERSION_PATCH}")
+
+file (GLOB SRC src/*.c)
+
+include_directories (include win32)
+add_library (yaml SHARED ${SRC})
+set_target_properties(yaml PROPERTIES COMPILE_FLAGS "-DYAML_DECLARE_EXPORT -DHAVE_CONFIG_H")
+
+add_library (yaml_static STATIC ${SRC})
+set_target_properties(yaml_static PROPERTIES COMPILE_FLAGS "-DYAML_DECLARE_STATIC -DHAVE_CONFIG_H")
+
+add_executable (test-version tests/test-version.c)
+target_link_libraries(test-version yaml)
+add_test(NAME version COMMAND test-version)
+
+add_executable (test-reader tests/test-reader.c)
+target_link_libraries(test-reader yaml)
+add_test(NAME reader COMMAND test-reader)
+
+enable_testing()
diff --git a/libyaml/LICENSE b/libyaml/LICENSE
new file mode 100644
index 0000000..e7b6102
--- /dev/null
+++ b/libyaml/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006-2016 Kirill Simonov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/libyaml/Makefile.am b/libyaml/Makefile.am
new file mode 100644
index 0000000..6425b6b
--- /dev/null
+++ b/libyaml/Makefile.am
@@ -0,0 +1,30 @@
+## Run `./bootstrap` to generate the "Makefile.in" files in this directory and
+## the "$SUBDIRS" subdirectories.
+
+SUBDIRS = include src . tests win32
+
+EXTRA_DIST = README LICENSE CMakeLists.txt doc/doxygen.cfg
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = yaml-0.1.pc
+
+maintainer-clean-local:
+	-rm -f aclocal.m4 config.h.in configure config/*
+	-find ${builddir} -name Makefile.in -exec rm -f '{}' ';'
+
+distclean-local:
+	-make -C tests/run-test-suite clean
+
+.PHONY: bootstrap
+bootstrap: maintainer-clean
+	./bootstrap
+	./configure
+	make
+
+test: all
+	make -C tests check-TESTS
+
+test-suite:
+	(export LIBYAML_DIR=$$PWD; make -C tests/run-test-suite test)
+
+test-all: test test-suite
diff --git a/libyaml/README b/libyaml/README
new file mode 100644
index 0000000..77f1e70
--- /dev/null
+++ b/libyaml/README
@@ -0,0 +1,27 @@
+LibYAML - A C library for parsing and emitting YAML.
+
+To build and install the library, run:
+$ ./configure
+$ make
+# make install
+
+If you checked the source code from the Mercurial repository, run
+$ ./bootstrap
+$ ./configure
+$ make
+# make install
+
+For more information, check the LibYAML homepage:
+'http://pyyaml.org/wiki/LibYAML'.
+
+Post your questions and opinions to the YAML-Core mailing list:
+'http://lists.sourceforge.net/lists/listinfo/yaml-core'.
+
+Submit bug reports and feature requests to the LibYAML bug tracker:
+'https://github.com/yaml/libyaml/issues/new'.
+
+LibYAML is written by Kirill Simonov <xi@resolvent.net>.  It is released
+under the MIT license.  See the file LICENSE for more details.
+
+This project is developed for Python Software Foundation as a part of
+Google Summer of Code under the mentorship of Clark Evans.
diff --git a/libyaml/announcement.msg b/libyaml/announcement.msg
new file mode 100644
index 0000000..4c004cd
--- /dev/null
+++ b/libyaml/announcement.msg
@@ -0,0 +1,20 @@
+From: Kirill Simonov <xi@resolvent.net>
+To: yaml-core@lists.sourceforge.net
+Subject: LibYAML-0.1.7: A minor bugfix release
+
+This is a minor bugfix release of LibYAML, a C library for parsing
+and emitting YAML.
+
+* Fixed segfault in yaml_string_write_handler.
+* Fixed invalid simple key assertion.
+* Fixed error handling in some examples (thank to Mathias Svensson).
+* Removed obsolete VS project files.
+
+LibYAML homepage:   http://pyyaml.org/wiki/LibYAML
+TAR.GZ package:     http://pyyaml.org/download/libyaml/yaml-0.1.7.tar.gz
+HG repository:      https://bitbucket.org/xi/libyaml
+Bug tracker:        https://bitbucket.org/xi/libyaml/issues/new
+
+LibYAML is written by Kirill Simonov <xi@resolvent.net> and released
+under the MIT license; see the file LICENSE for more details.
+
diff --git a/libyaml/appveyor.yml b/libyaml/appveyor.yml
new file mode 100644
index 0000000..7922b4b
--- /dev/null
+++ b/libyaml/appveyor.yml
@@ -0,0 +1,12 @@
+version: 0.1.7.{build}
+
+image:
+- Visual Studio 2015
+- Visual Studio 2013
+
+build_script:
+- cmake .
+- cmake --build . --config release --clean-first
+- ctest -C release
+- C:\cygwin\bin\sh -c "export PATH=/usr/bin:/usr/local/bin:$PATH && ./bootstrap && ./configure && make && make test && make distclean"
+- C:\cygwin64\bin\sh -c "export PATH=/usr/bin:/usr/local/bin:$PATH && ./bootstrap && ./configure && make && make test && make distclean"
diff --git a/libyaml/bootstrap b/libyaml/bootstrap
new file mode 100755
index 0000000..1745838
--- /dev/null
+++ b/libyaml/bootstrap
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exec autoreconf -fvi
diff --git a/libyaml/configure.ac b/libyaml/configure.ac
new file mode 100644
index 0000000..ba7a54e
--- /dev/null
+++ b/libyaml/configure.ac
@@ -0,0 +1,73 @@
+# Run `./bootstrap` to generate the "configure" script.
+
+# Define the package version numbers and the bug reporting link.
+m4_define([YAML_MAJOR], 0)
+m4_define([YAML_MINOR], 1)
+m4_define([YAML_PATCH], 7)
+m4_define([YAML_BUGS], [https://github.com/yaml/libyaml/issues/new])
+
+# Define the libtool version numbers; check the Autobook, Section 11.4.
+# Bump the libtool version numbers using the following algorithm:
+#   if (the current interface has not been changed):
+#       YAML_REVISION += 1
+#   else:
+#       YAML_REVISION = 0
+#       YAML_CURRENT += 1
+#       if (this release is backward compatible with the previous release):
+#           YAML_AGE += 1
+#       else:
+#           YAML_AGE = 0
+m4_define([YAML_RELEASE], 0)
+m4_define([YAML_CURRENT], 2)
+m4_define([YAML_REVISION], 5)
+m4_define([YAML_AGE], 0)
+
+# Initialize autoconf & automake.
+AC_PREREQ(2.59)
+AC_INIT([yaml], [YAML_MAJOR.YAML_MINOR.YAML_PATCH], [YAML_BUGS])
+AC_CONFIG_AUX_DIR([config])
+AC_CONFIG_HEADERS([config.h])
+AM_INIT_AUTOMAKE([1.9 foreign])
+
+# Define macro variables for the package version numbers.
+AC_DEFINE(YAML_VERSION_MAJOR, YAML_MAJOR, [Define the major version number.])
+AC_DEFINE(YAML_VERSION_MINOR, YAML_MINOR, [Define the minor version number.])
+AC_DEFINE(YAML_VERSION_PATCH, YAML_PATCH, [Define the patch version number.])
+AC_DEFINE(YAML_VERSION_STRING, "YAML_MAJOR.YAML_MINOR.YAML_PATCH", [Define the version string.])
+
+# Define substitutions for the libtool version numbers.
+YAML_LT_RELEASE=YAML_RELEASE
+YAML_LT_CURRENT=YAML_CURRENT
+YAML_LT_REVISION=YAML_REVISION
+YAML_LT_AGE=YAML_AGE
+AC_SUBST(YAML_LT_RELEASE)
+AC_SUBST(YAML_LT_CURRENT)
+AC_SUBST(YAML_LT_REVISION)
+AC_SUBST(YAML_LT_AGE)
+
+# Note: in order to update checks, run `autoscan` and look through "configure.scan".
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_LIBTOOL
+
+AC_CHECK_PROG(DOXYGEN, [doxygen], [true], [false])
+AM_CONDITIONAL(DOXYGEN, [test "$DOXYGEN" = true])
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([stdlib.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+
+# Define Makefiles.
+AC_CONFIG_FILES([yaml-0.1.pc include/Makefile src/Makefile Makefile tests/Makefile win32/Makefile])
+
+# Generate the "configure" script.
+AC_OUTPUT
diff --git a/libyaml/doc/doxygen.cfg b/libyaml/doc/doxygen.cfg
new file mode 100644
index 0000000..96f6bb0
--- /dev/null
+++ b/libyaml/doc/doxygen.cfg
@@ -0,0 +1,222 @@
+# Doxyfile 1.4.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = $(PACKAGE)
+PROJECT_NUMBER         = $(VERSION)
+OUTPUT_DIRECTORY       = $(top_builddir)/doc/
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = NO
+EXTRACT_LOCAL_METHODS  = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+FILE_VERSION_FILTER    =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = $(top_srcdir)/include/
+FILE_PATTERNS          = *.h
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 1
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = "YAML_DECLARE(type)=type"
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               =
+DOTFILE_DIRS           =
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/libyaml/dockerfiles/README.mkd b/libyaml/dockerfiles/README.mkd
new file mode 100644
index 0000000..71c13e1
--- /dev/null
+++ b/libyaml/dockerfiles/README.mkd
@@ -0,0 +1,17 @@
+# LibYAML Dockerfiles
+
+This directory is a collection of dockerfiles that can be used when developing 
+and testing LibYAML.
+
+The current list is supports:
+
+- Ubuntu 16.04
+- Ubuntu 14.04
+
+## Example Usage
+
+```bash
+$ docker pull ubuntu
+$ docker build -t libyaml-ubuntu:16.04 -f dockerfiles/ubuntu-16.04 .
+$ docker run -it libyaml-ubuntu:16.04 make test
+```
diff --git a/libyaml/dockerfiles/fedora-25 b/libyaml/dockerfiles/fedora-25
new file mode 100644
index 0000000..ae34448
--- /dev/null
+++ b/libyaml/dockerfiles/fedora-25
@@ -0,0 +1,25 @@
+# vim: ft=dockerfile
+FROM fedora:25
+MAINTAINER Ian Cordasco <graffatcolmingov@gmail.com>
+
+# NOTE(sigmavirus24): We need "perl-core" here for the "prove" binary
+# required by the test-all Makefile target
+RUN dnf install -y \
+    automake \
+    gcc \
+    git \
+    make \
+    libtool \
+    perl-core
+
+RUN mkdir /libyaml
+COPY . /libyaml/
+WORKDIR /libyaml
+
+ENV LD_LIBRARY_PATH=/libyaml/src/.libs
+
+RUN ./bootstrap
+RUN ./configure
+RUN make
+RUN make install
+CMD ["bash"]
diff --git a/libyaml/dockerfiles/ubuntu-14.04 b/libyaml/dockerfiles/ubuntu-14.04
new file mode 100644
index 0000000..b246883
--- /dev/null
+++ b/libyaml/dockerfiles/ubuntu-14.04
@@ -0,0 +1,24 @@
+# vim: ft=dockerfile
+FROM ubuntu:14.04
+MAINTAINER Ian Cordasco <graffatcolmingov@gmail.com>
+
+RUN apt-get update && \
+    apt-get install -y \
+        autoconf \
+        build-essential \
+        git \
+        libtool \
+        vim && \
+    rm -rf /var/lib/apt/lists/*
+
+RUN mkdir /libyaml
+COPY . /libyaml/
+WORKDIR /libyaml
+
+ENV LD_LIBRARY_PATH=/libyaml/src/.libs
+
+RUN ./bootstrap
+RUN ./configure
+RUN make
+RUN make install
+CMD ["bash"]
diff --git a/libyaml/dockerfiles/ubuntu-16.04 b/libyaml/dockerfiles/ubuntu-16.04
new file mode 100644
index 0000000..5c4ee17
--- /dev/null
+++ b/libyaml/dockerfiles/ubuntu-16.04
@@ -0,0 +1,24 @@
+# vim: ft=dockerfile
+FROM ubuntu:16.04
+MAINTAINER Ian Cordasco <graffatcolmingov@gmail.com>
+
+RUN apt-get update && \
+    apt-get install -y \
+        autoconf \
+        build-essential \
+        git \
+        libtool \
+        vim && \
+    rm -rf /var/lib/apt/lists/*
+
+RUN mkdir /libyaml
+COPY . /libyaml/
+WORKDIR /libyaml
+
+ENV LD_LIBRARY_PATH=/libyaml/src/.libs
+
+RUN ./bootstrap
+RUN ./configure
+RUN make
+RUN make install
+CMD ["bash"]
diff --git a/libyaml/examples/anchors.yaml b/libyaml/examples/anchors.yaml
new file mode 100644
index 0000000..8755853
--- /dev/null
+++ b/libyaml/examples/anchors.yaml
@@ -0,0 +1,10 @@
+base: &base
+    name: Everyone has same name
+
+foo: &foo
+    <<: *base
+    age: 10
+
+bar: &bar
+    <<: *base
+    age: 20
diff --git a/libyaml/examples/array.yaml b/libyaml/examples/array.yaml
new file mode 100644
index 0000000..18efd12
--- /dev/null
+++ b/libyaml/examples/array.yaml
@@ -0,0 +1,2 @@
+- member
+- member2
diff --git a/libyaml/examples/global-tag.yaml b/libyaml/examples/global-tag.yaml
new file mode 100644
index 0000000..1180757
--- /dev/null
+++ b/libyaml/examples/global-tag.yaml
@@ -0,0 +1,14 @@
+%TAG ! tag:clarkevans.com,2002:
+--- !shape
+  # Use the ! handle for presenting
+  # tag:clarkevans.com,2002:circle
+- !circle
+  center: &ORIGIN {x: 73, y: 129}
+  radius: 7
+- !line
+  start: *ORIGIN
+  finish: { x: 89, y: 102 }
+- !label
+  start: *ORIGIN
+  color: 0xFFEEBB
+  text: Pretty vector drawing.
diff --git a/libyaml/examples/json.yaml b/libyaml/examples/json.yaml
new file mode 100644
index 0000000..7822ddc
--- /dev/null
+++ b/libyaml/examples/json.yaml
@@ -0,0 +1 @@
+{"key": ["value", 3]}
diff --git a/libyaml/examples/mapping.yaml b/libyaml/examples/mapping.yaml
new file mode 100644
index 0000000..53d2567
--- /dev/null
+++ b/libyaml/examples/mapping.yaml
@@ -0,0 +1,2 @@
+key: value
+other-key: other-value
diff --git a/libyaml/examples/numbers.yaml b/libyaml/examples/numbers.yaml
new file mode 100644
index 0000000..45d2bf0
--- /dev/null
+++ b/libyaml/examples/numbers.yaml
@@ -0,0 +1 @@
+[100, 12.5, -130, 1.3e+9]
diff --git a/libyaml/examples/strings.yaml b/libyaml/examples/strings.yaml
new file mode 100644
index 0000000..31b641f
--- /dev/null
+++ b/libyaml/examples/strings.yaml
@@ -0,0 +1,7 @@
+unqouted: string
+literal-block: |
+    This entire block of text will be the value of the 'literal-block' key,
+    with line breaks being preserved.
+folded: >
+    This entire block of text will be the value of 'folded', but this
+    time, all newlines will be replaced with a single space.
diff --git a/libyaml/examples/tags.yaml b/libyaml/examples/tags.yaml
new file mode 100644
index 0000000..3d5a010
--- /dev/null
+++ b/libyaml/examples/tags.yaml
@@ -0,0 +1,7 @@
+gif_file: !!binary |
+    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
+    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
+    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
+    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
+explicit_string: !!str 0.5
+python_tag: !!python/complex '1.0+2.0j'
diff --git a/libyaml/examples/yaml-version.yaml b/libyaml/examples/yaml-version.yaml
new file mode 100644
index 0000000..122b508
--- /dev/null
+++ b/libyaml/examples/yaml-version.yaml
@@ -0,0 +1,3 @@
+%YAML 1.1
+---
+[1, 2, 3]
diff --git a/libyaml/include/Makefile.am b/libyaml/include/Makefile.am
new file mode 100644
index 0000000..3882a2f
--- /dev/null
+++ b/libyaml/include/Makefile.am
@@ -0,0 +1,17 @@
+AM_CPPFLAGS = yaml.h
+DOXYGEN_CFG = $(top_srcdir)/doc/doxygen.cfg
+
+nobase_include_HEADERS = $(AM_CPPFLAGS)
+
+if DOXYGEN
+
+html: $(AM_CPPFLAGS) $(DOXYGEN_CFG)
+	PACKAGE=$(PACKAGE) VERSION=$(VERSION) top_srcdir=$(top_srcdir) top_builddir=$(top_builddir) doxygen $(DOXYGEN_CFG)
+
+endif
+
+maintainer-clean-local:
+	-rm -rf $(top_builddir)/doc/html
+
+dist-hook: html
+	cp -a $(top_builddir)/doc/html $(top_distdir)/doc
diff --git a/libyaml/include/yaml.h b/libyaml/include/yaml.h
new file mode 100644
index 0000000..85b8650
--- /dev/null
+++ b/libyaml/include/yaml.h
@@ -0,0 +1,1973 @@
+/**
+ * @file yaml.h
+ * @brief Public interface for libyaml.
+ *
+ * Include the header file with the code:
+ * @code
+ * #include <yaml.h>
+ * @endcode
+ */
+
+#ifndef YAML_H
+#define YAML_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+/**
+ * @defgroup export Export Definitions
+ * @{
+ */
+
+/** The public API declaration. */
+
+#if defined(__MINGW32__)
+#   define  YAML_DECLARE(type)  type
+#elif defined(WIN32)
+#   if defined(YAML_DECLARE_STATIC)
+#       define  YAML_DECLARE(type)  type
+#   elif defined(YAML_DECLARE_EXPORT)
+#       define  YAML_DECLARE(type)  __declspec(dllexport) type
+#   else
+#       define  YAML_DECLARE(type)  __declspec(dllimport) type
+#   endif
+#else
+#   define  YAML_DECLARE(type)  type
+#endif
+
+/** @} */
+
+/**
+ * @defgroup version Version Information
+ * @{
+ */
+
+/**
+ * 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.
+ */
+
+YAML_DECLARE(const char *)
+yaml_get_version_string(void);
+
+/**
+ * Get the library version numbers.
+ *
+ * @param[out]      major   Major version number.
+ * @param[out]      minor   Minor version number.
+ * @param[out]      patch   Patch version number.
+ */
+
+YAML_DECLARE(void)
+yaml_get_version(int *major, int *minor, int *patch);
+
+/** @} */
+
+/**
+ * @defgroup basic Basic Types
+ * @{
+ */
+
+/** The character type (UTF-8 octet). */
+typedef unsigned char yaml_char_t;
+
+/** The version directive data. */
+typedef struct yaml_version_directive_s {
+    /** The major version number. */
+    int major;
+    /** The minor version number. */
+    int minor;
+} yaml_version_directive_t;
+
+/** The tag directive data. */
+typedef struct yaml_tag_directive_s {
+    /** The tag handle. */
+    yaml_char_t *handle;
+    /** The tag prefix. */
+    yaml_char_t *prefix;
+} yaml_tag_directive_t;
+
+/** The stream encoding. */
+typedef enum yaml_encoding_e {
+    /** Let the parser choose the encoding. */
+    YAML_ANY_ENCODING,
+    /** The default UTF-8 encoding. */
+    YAML_UTF8_ENCODING,
+    /** The UTF-16-LE encoding with BOM. */
+    YAML_UTF16LE_ENCODING,
+    /** The UTF-16-BE encoding with BOM. */
+    YAML_UTF16BE_ENCODING
+} yaml_encoding_t;
+
+/** Line break types. */
+
+typedef enum yaml_break_e {
+    /** Let the parser choose the break type. */
+    YAML_ANY_BREAK,
+    /** Use CR for line breaks (Mac style). */
+    YAML_CR_BREAK,
+    /** Use LN for line breaks (Unix style). */
+    YAML_LN_BREAK,
+    /** Use CR LN for line breaks (DOS style). */
+    YAML_CRLN_BREAK
+} yaml_break_t;
+
+/** Many bad things could happen with the parser and emitter. */
+typedef enum yaml_error_type_e {
+    /** No error is produced. */
+    YAML_NO_ERROR,
+
+    /** Cannot allocate or reallocate a block of memory. */
+    YAML_MEMORY_ERROR,
+
+    /** Cannot read or decode the input stream. */
+    YAML_READER_ERROR,
+    /** Cannot scan the input stream. */
+    YAML_SCANNER_ERROR,
+    /** Cannot parse the input stream. */
+    YAML_PARSER_ERROR,
+    /** Cannot compose a YAML document. */
+    YAML_COMPOSER_ERROR,
+
+    /** Cannot write to the output stream. */
+    YAML_WRITER_ERROR,
+    /** Cannot emit a YAML stream. */
+    YAML_EMITTER_ERROR
+} yaml_error_type_t;
+
+/** The pointer position. */
+typedef struct yaml_mark_s {
+    /** The position index. */
+    size_t index;
+
+    /** The position line. */
+    size_t line;
+
+    /** The position column. */
+    size_t column;
+} yaml_mark_t;
+
+/** @} */
+
+/**
+ * @defgroup styles Node Styles
+ * @{
+ */
+
+/** Scalar styles. */
+typedef enum yaml_scalar_style_e {
+    /** Let the emitter choose the style. */
+    YAML_ANY_SCALAR_STYLE,
+
+    /** The plain scalar style. */
+    YAML_PLAIN_SCALAR_STYLE,
+
+    /** The single-quoted scalar style. */
+    YAML_SINGLE_QUOTED_SCALAR_STYLE,
+    /** The double-quoted scalar style. */
+    YAML_DOUBLE_QUOTED_SCALAR_STYLE,
+
+    /** The literal scalar style. */
+    YAML_LITERAL_SCALAR_STYLE,
+    /** The folded scalar style. */
+    YAML_FOLDED_SCALAR_STYLE
+} yaml_scalar_style_t;
+
+/** Sequence styles. */
+typedef enum yaml_sequence_style_e {
+    /** Let the emitter choose the style. */
+    YAML_ANY_SEQUENCE_STYLE,
+
+    /** The block sequence style. */
+    YAML_BLOCK_SEQUENCE_STYLE,
+    /** The flow sequence style. */
+    YAML_FLOW_SEQUENCE_STYLE
+} yaml_sequence_style_t;
+
+/** Mapping styles. */
+typedef enum yaml_mapping_style_e {
+    /** Let the emitter choose the style. */
+    YAML_ANY_MAPPING_STYLE,
+
+    /** The block mapping style. */
+    YAML_BLOCK_MAPPING_STYLE,
+    /** The flow mapping style. */
+    YAML_FLOW_MAPPING_STYLE
+/*    YAML_FLOW_SET_MAPPING_STYLE   */
+} yaml_mapping_style_t;
+
+/** @} */
+
+/**
+ * @defgroup tokens Tokens
+ * @{
+ */
+
+/** Token types. */
+typedef enum yaml_token_type_e {
+    /** An empty token. */
+    YAML_NO_TOKEN,
+
+    /** A STREAM-START token. */
+    YAML_STREAM_START_TOKEN,
+    /** A STREAM-END token. */
+    YAML_STREAM_END_TOKEN,
+
+    /** A VERSION-DIRECTIVE token. */
+    YAML_VERSION_DIRECTIVE_TOKEN,
+    /** A TAG-DIRECTIVE token. */
+    YAML_TAG_DIRECTIVE_TOKEN,
+    /** A DOCUMENT-START token. */
+    YAML_DOCUMENT_START_TOKEN,
+    /** A DOCUMENT-END token. */
+    YAML_DOCUMENT_END_TOKEN,
+
+    /** A BLOCK-SEQUENCE-START token. */
+    YAML_BLOCK_SEQUENCE_START_TOKEN,
+    /** A BLOCK-SEQUENCE-END token. */
+    YAML_BLOCK_MAPPING_START_TOKEN,
+    /** A BLOCK-END token. */
+    YAML_BLOCK_END_TOKEN,
+
+    /** A FLOW-SEQUENCE-START token. */
+    YAML_FLOW_SEQUENCE_START_TOKEN,
+    /** A FLOW-SEQUENCE-END token. */
+    YAML_FLOW_SEQUENCE_END_TOKEN,
+    /** A FLOW-MAPPING-START token. */
+    YAML_FLOW_MAPPING_START_TOKEN,
+    /** A FLOW-MAPPING-END token. */
+    YAML_FLOW_MAPPING_END_TOKEN,
+
+    /** A BLOCK-ENTRY token. */
+    YAML_BLOCK_ENTRY_TOKEN,
+    /** A FLOW-ENTRY token. */
+    YAML_FLOW_ENTRY_TOKEN,
+    /** A KEY token. */
+    YAML_KEY_TOKEN,
+    /** A VALUE token. */
+    YAML_VALUE_TOKEN,
+
+    /** An ALIAS token. */
+    YAML_ALIAS_TOKEN,
+    /** An ANCHOR token. */
+    YAML_ANCHOR_TOKEN,
+    /** A TAG token. */
+    YAML_TAG_TOKEN,
+    /** A SCALAR token. */
+    YAML_SCALAR_TOKEN
+} yaml_token_type_t;
+
+/** The token structure. */
+typedef struct yaml_token_s {
+
+    /** The token type. */
+    yaml_token_type_t type;
+
+    /** The token data. */
+    union {
+
+        /** The stream start (for @c YAML_STREAM_START_TOKEN). */
+        struct {
+            /** The stream encoding. */
+            yaml_encoding_t encoding;
+        } stream_start;
+
+        /** The alias (for @c YAML_ALIAS_TOKEN). */
+        struct {
+            /** The alias value. */
+            yaml_char_t *value;
+        } alias;
+
+        /** The anchor (for @c YAML_ANCHOR_TOKEN). */
+        struct {
+            /** The anchor value. */
+            yaml_char_t *value;
+        } anchor;
+
+        /** The tag (for @c YAML_TAG_TOKEN). */
+        struct {
+            /** The tag handle. */
+            yaml_char_t *handle;
+            /** The tag suffix. */
+            yaml_char_t *suffix;
+        } tag;
+
+        /** The scalar value (for @c YAML_SCALAR_TOKEN). */
+        struct {
+            /** The scalar value. */
+            yaml_char_t *value;
+            /** The length of the scalar value. */
+            size_t length;
+            /** The scalar style. */
+            yaml_scalar_style_t style;
+        } scalar;
+
+        /** The version directive (for @c YAML_VERSION_DIRECTIVE_TOKEN). */
+        struct {
+            /** The major version number. */
+            int major;
+            /** The minor version number. */
+            int minor;
+        } version_directive;
+
+        /** The tag directive (for @c YAML_TAG_DIRECTIVE_TOKEN). */
+        struct {
+            /** The tag handle. */
+            yaml_char_t *handle;
+            /** The tag prefix. */
+            yaml_char_t *prefix;
+        } tag_directive;
+
+    } data;
+
+    /** The beginning of the token. */
+    yaml_mark_t start_mark;
+    /** The end of the token. */
+    yaml_mark_t end_mark;
+
+} yaml_token_t;
+
+/**
+ * Free any memory allocated for a token object.
+ *
+ * @param[in,out]   token   A token object.
+ */
+
+YAML_DECLARE(void)
+yaml_token_delete(yaml_token_t *token);
+
+/** @} */
+
+/**
+ * @defgroup events Events
+ * @{
+ */
+
+/** Event types. */
+typedef enum yaml_event_type_e {
+    /** An empty event. */
+    YAML_NO_EVENT,
+
+    /** A STREAM-START event. */
+    YAML_STREAM_START_EVENT,
+    /** A STREAM-END event. */
+    YAML_STREAM_END_EVENT,
+
+    /** A DOCUMENT-START event. */
+    YAML_DOCUMENT_START_EVENT,
+    /** A DOCUMENT-END event. */
+    YAML_DOCUMENT_END_EVENT,
+
+    /** An ALIAS event. */
+    YAML_ALIAS_EVENT,
+    /** A SCALAR event. */
+    YAML_SCALAR_EVENT,
+
+    /** A SEQUENCE-START event. */
+    YAML_SEQUENCE_START_EVENT,
+    /** A SEQUENCE-END event. */
+    YAML_SEQUENCE_END_EVENT,
+
+    /** A MAPPING-START event. */
+    YAML_MAPPING_START_EVENT,
+    /** A MAPPING-END event. */
+    YAML_MAPPING_END_EVENT
+} yaml_event_type_t;
+
+/** The event structure. */
+typedef struct yaml_event_s {
+
+    /** The event type. */
+    yaml_event_type_t type;
+
+    /** The event data. */
+    union {
+
+        /** The stream parameters (for @c YAML_STREAM_START_EVENT). */
+        struct {
+            /** The document encoding. */
+            yaml_encoding_t encoding;
+        } stream_start;
+
+        /** The document parameters (for @c YAML_DOCUMENT_START_EVENT). */
+        struct {
+            /** The version directive. */
+            yaml_version_directive_t *version_directive;
+
+            /** The list of tag directives. */
+            struct {
+                /** The beginning of the tag directives list. */
+                yaml_tag_directive_t *start;
+                /** The end of the tag directives list. */
+                yaml_tag_directive_t *end;
+            } tag_directives;
+
+            /** Is the document indicator implicit? */
+            int implicit;
+        } document_start;
+
+        /** The document end parameters (for @c YAML_DOCUMENT_END_EVENT). */
+        struct {
+            /** Is the document end indicator implicit? */
+            int implicit;
+        } document_end;
+
+        /** The alias parameters (for @c YAML_ALIAS_EVENT). */
+        struct {
+            /** The anchor. */
+            yaml_char_t *anchor;
+        } alias;
+
+        /** The scalar parameters (for @c YAML_SCALAR_EVENT). */
+        struct {
+            /** The anchor. */
+            yaml_char_t *anchor;
+            /** The tag. */
+            yaml_char_t *tag;
+            /** The scalar value. */
+            yaml_char_t *value;
+            /** The length of the scalar value. */
+            size_t length;
+            /** Is the tag optional for the plain style? */
+            int plain_implicit;
+            /** Is the tag optional for any non-plain style? */
+            int quoted_implicit;
+            /** The scalar style. */
+            yaml_scalar_style_t style;
+        } scalar;
+
+        /** The sequence parameters (for @c YAML_SEQUENCE_START_EVENT). */
+        struct {
+            /** The anchor. */
+            yaml_char_t *anchor;
+            /** The tag. */
+            yaml_char_t *tag;
+            /** Is the tag optional? */
+            int implicit;
+            /** The sequence style. */
+            yaml_sequence_style_t style;
+        } sequence_start;
+
+        /** The mapping parameters (for @c YAML_MAPPING_START_EVENT). */
+        struct {
+            /** The anchor. */
+            yaml_char_t *anchor;
+            /** The tag. */
+            yaml_char_t *tag;
+            /** Is the tag optional? */
+            int implicit;
+            /** The mapping style. */
+            yaml_mapping_style_t style;
+        } mapping_start;
+
+    } data;
+
+    /** The beginning of the event. */
+    yaml_mark_t start_mark;
+    /** The end of the event. */
+    yaml_mark_t end_mark;
+
+} yaml_event_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.
+ */
+
+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);
+
+/** @} */
+
+/**
+ * @defgroup nodes Nodes
+ * @{
+ */
+
+/** The tag @c !!null with the only possible value: @c null. */
+#define YAML_NULL_TAG       "tag:yaml.org,2002:null"
+/** The tag @c !!bool with the values: @c true and @c false. */
+#define YAML_BOOL_TAG       "tag:yaml.org,2002:bool"
+/** The tag @c !!str for string values. */
+#define YAML_STR_TAG        "tag:yaml.org,2002:str"
+/** The tag @c !!int for integer values. */
+#define YAML_INT_TAG        "tag:yaml.org,2002:int"
+/** The tag @c !!float for float values. */
+#define YAML_FLOAT_TAG      "tag:yaml.org,2002:float"
+/** The tag @c !!timestamp for date and time values. */
+#define YAML_TIMESTAMP_TAG  "tag:yaml.org,2002:timestamp"
+
+/** The tag @c !!seq is used to denote sequences. */
+#define YAML_SEQ_TAG        "tag:yaml.org,2002:seq"
+/** The tag @c !!map is used to denote mapping. */
+#define YAML_MAP_TAG        "tag:yaml.org,2002:map"
+
+/** The default scalar tag is @c !!str. */
+#define YAML_DEFAULT_SCALAR_TAG     YAML_STR_TAG
+/** The default sequence tag is @c !!seq. */
+#define YAML_DEFAULT_SEQUENCE_TAG   YAML_SEQ_TAG
+/** The default mapping tag is @c !!map. */
+#define YAML_DEFAULT_MAPPING_TAG    YAML_MAP_TAG
+
+/** Node types. */
+typedef enum yaml_node_type_e {
+    /** An empty node. */
+    YAML_NO_NODE,
+
+    /** A scalar node. */
+    YAML_SCALAR_NODE,
+    /** A sequence node. */
+    YAML_SEQUENCE_NODE,
+    /** A mapping node. */
+    YAML_MAPPING_NODE
+} yaml_node_type_t;
+
+/** 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. */
+typedef struct yaml_node_pair_s {
+    /** The key of the element. */
+    int key;
+    /** The value of the element. */
+    int value;
+} yaml_node_pair_t;
+
+/** The node structure. */
+struct yaml_node_s {
+
+    /** The node type. */
+    yaml_node_type_t type;
+
+    /** The node tag. */
+    yaml_char_t *tag;
+
+    /** The node data. */
+    union {
+
+        /** The scalar parameters (for @c YAML_SCALAR_NODE). */
+        struct {
+            /** The scalar value. */
+            yaml_char_t *value;
+            /** The length of the scalar value. */
+            size_t length;
+            /** The scalar style. */
+            yaml_scalar_style_t style;
+        } scalar;
+
+        /** The sequence parameters (for @c YAML_SEQUENCE_NODE). */
+        struct {
+            /** The stack of sequence items. */
+            struct {
+                /** The beginning of the stack. */
+                yaml_node_item_t *start;
+                /** The end of the stack. */
+                yaml_node_item_t *end;
+                /** The top of the stack. */
+                yaml_node_item_t *top;
+            } items;
+            /** The sequence style. */
+            yaml_sequence_style_t style;
+        } sequence;
+
+        /** The mapping parameters (for @c YAML_MAPPING_NODE). */
+        struct {
+            /** The stack of mapping pairs (key, value). */
+            struct {
+                /** The beginning of the stack. */
+                yaml_node_pair_t *start;
+                /** The end of the stack. */
+                yaml_node_pair_t *end;
+                /** The top of the stack. */
+                yaml_node_pair_t *top;
+            } pairs;
+            /** The mapping style. */
+            yaml_mapping_style_t style;
+        } mapping;
+
+    } data;
+
+    /** The beginning of the node. */
+    yaml_mark_t start_mark;
+    /** The end of the node. */
+    yaml_mark_t end_mark;
+
+};
+
+/** The document structure. */
+typedef struct yaml_document_s {
+
+    /** The document nodes. */
+    struct {
+        /** The beginning of the stack. */
+        yaml_node_t *start;
+        /** The end of the stack. */
+        yaml_node_t *end;
+        /** The top of the stack. */
+        yaml_node_t *top;
+    } nodes;
+
+    /** The version directive. */
+    yaml_version_directive_t *version_directive;
+
+    /** The list of tag directives. */
+    struct {
+        /** The beginning of the tag directives list. */
+        yaml_tag_directive_t *start;
+        /** The end of the tag directives list. */
+        yaml_tag_directive_t *end;
+    } tag_directives;
+
+    /** Is the document start indicator implicit? */
+    int start_implicit;
+    /** Is the document end indicator implicit? */
+    int end_implicit;
+
+    /** The beginning of the document. */
+    yaml_mark_t start_mark;
+    /** The end of the document. */
+    yaml_mark_t end_mark;
+
+} yaml_document_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.
+ */
+
+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);
+
+/** @} */
+
+/**
+ * @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.
+ */
+
+typedef int yaml_read_handler_t(void *data, unsigned char *buffer, size_t size,
+        size_t *size_read);
+
+/**
+ * This structure holds information about a potential simple key.
+ */
+
+typedef struct yaml_simple_key_s {
+    /** Is a simple key possible? */
+    int possible;
+
+    /** Is a simple key required? */
+    int required;
+
+    /** The number of the token. */
+    size_t token_number;
+
+    /** The position mark. */
+    yaml_mark_t mark;
+} yaml_simple_key_t;
+
+/**
+ * The states of the parser.
+ */
+typedef enum yaml_parser_state_e {
+    /** Expect STREAM-START. */
+    YAML_PARSE_STREAM_START_STATE,
+    /** Expect the beginning of an implicit document. */
+    YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE,
+    /** Expect DOCUMENT-START. */
+    YAML_PARSE_DOCUMENT_START_STATE,
+    /** Expect the content of a document. */
+    YAML_PARSE_DOCUMENT_CONTENT_STATE,
+    /** Expect DOCUMENT-END. */
+    YAML_PARSE_DOCUMENT_END_STATE,
+    /** Expect a block node. */
+    YAML_PARSE_BLOCK_NODE_STATE,
+    /** Expect a block node or indentless sequence. */
+    YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE,
+    /** Expect a flow node. */
+    YAML_PARSE_FLOW_NODE_STATE,
+    /** Expect the first entry of a block sequence. */
+    YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE,
+    /** Expect an entry of a block sequence. */
+    YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE,
+    /** Expect an entry of an indentless sequence. */
+    YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE,
+    /** Expect the first key of a block mapping. */
+    YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE,
+    /** Expect a block mapping key. */
+    YAML_PARSE_BLOCK_MAPPING_KEY_STATE,
+    /** Expect a block mapping value. */
+    YAML_PARSE_BLOCK_MAPPING_VALUE_STATE,
+    /** Expect the first entry of a flow sequence. */
+    YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE,
+    /** Expect an entry of a flow sequence. */
+    YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE,
+    /** Expect a key of an ordered mapping. */
+    YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE,
+    /** Expect a value of an ordered mapping. */
+    YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE,
+    /** Expect the and of an ordered mapping entry. */
+    YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE,
+    /** Expect the first key of a flow mapping. */
+    YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE,
+    /** Expect a key of a flow mapping. */
+    YAML_PARSE_FLOW_MAPPING_KEY_STATE,
+    /** Expect a value of a flow mapping. */
+    YAML_PARSE_FLOW_MAPPING_VALUE_STATE,
+    /** Expect an empty value of a flow mapping. */
+    YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE,
+    /** Expect nothing. */
+    YAML_PARSE_END_STATE
+} yaml_parser_state_t;
+
+/**
+ * This structure holds aliases data.
+ */
+
+typedef struct yaml_alias_data_s {
+    /** The anchor. */
+    yaml_char_t *anchor;
+    /** The node id. */
+    int index;
+    /** The anchor mark. */
+    yaml_mark_t mark;
+} yaml_alias_data_t;
+
+/**
+ * The parser structure.
+ *
+ * All members are internal.  Manage the structure using the @c yaml_parser_
+ * family of functions.
+ */
+
+typedef struct yaml_parser_s {
+
+    /**
+     * @name Error handling
+     * @{
+     */
+
+    /** Error type. */
+    yaml_error_type_t error;
+    /** Error description. */
+    const char *problem;
+    /** The byte about which the problem occured. */
+    size_t problem_offset;
+    /** The problematic value (@c -1 is none). */
+    int problem_value;
+    /** The problem position. */
+    yaml_mark_t problem_mark;
+    /** The error context. */
+    const char *context;
+    /** The context position. */
+    yaml_mark_t context_mark;
+
+    /**
+     * @}
+     */
+
+    /**
+     * @name Reader stuff
+     * @{
+     */
+
+    /** Read handler. */
+    yaml_read_handler_t *read_handler;
+
+    /** A pointer for passing to the read handler. */
+    void *read_handler_data;
+
+    /** Standard (string or file) input data. */
+    union {
+        /** String input data. */
+        struct {
+            /** The string start pointer. */
+            const unsigned char *start;
+            /** The string end pointer. */
+            const unsigned char *end;
+            /** The string current position. */
+            const unsigned char *current;
+        } string;
+
+        /** File input data. */
+        FILE *file;
+    } input;
+
+    /** EOF flag */
+    int eof;
+
+    /** 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 number of unread characters in the buffer. */
+    size_t unread;
+
+    /** 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 input encoding. */
+    yaml_encoding_t encoding;
+
+    /** The offset of the current position (in bytes). */
+    size_t offset;
+
+    /** The mark of the current position. */
+    yaml_mark_t mark;
+
+    /**
+     * @}
+     */
+
+    /**
+     * @name Scanner stuff
+     * @{
+     */
+
+    /** Have we started to scan the input stream? */
+    int stream_start_produced;
+
+    /** Have we reached the end of the input stream? */
+    int stream_end_produced;
+
+    /** The number of unclosed '[' and '{' indicators. */
+    int flow_level;
+
+    /** The tokens queue. */
+    struct {
+        /** The beginning of the tokens queue. */
+        yaml_token_t *start;
+        /** The end of the tokens queue. */
+        yaml_token_t *end;
+        /** The head of the tokens queue. */
+        yaml_token_t *head;
+        /** The tail of the tokens queue. */
+        yaml_token_t *tail;
+    } tokens;
+
+    /** The number of tokens fetched from the queue. */
+    size_t tokens_parsed;
+
+    /* Does the tokens queue contain a token ready for dequeueing. */
+    int token_available;
+
+    /** The indentation levels stack. */
+    struct {
+        /** The beginning of the stack. */
+        int *start;
+        /** The end of the stack. */
+        int *end;
+        /** The top of the stack. */
+        int *top;
+    } indents;
+
+    /** The current indentation level. */
+    int indent;
+
+    /** May a simple key occur at the current position? */
+    int simple_key_allowed;
+
+    /** The stack of simple keys. */
+    struct {
+        /** The beginning of the stack. */
+        yaml_simple_key_t *start;
+        /** The end of the stack. */
+        yaml_simple_key_t *end;
+        /** The top of the stack. */
+        yaml_simple_key_t *top;
+    } simple_keys;
+
+    /**
+     * @}
+     */
+
+    /**
+     * @name Parser stuff
+     * @{
+     */
+
+    /** The parser states stack. */
+    struct {
+        /** The beginning of the stack. */
+        yaml_parser_state_t *start;
+        /** The end of the stack. */
+        yaml_parser_state_t *end;
+        /** The top of the stack. */
+        yaml_parser_state_t *top;
+    } states;
+
+    /** The current parser state. */
+    yaml_parser_state_t state;
+
+    /** The stack of marks. */
+    struct {
+        /** The beginning of the stack. */
+        yaml_mark_t *start;
+        /** The end of the stack. */
+        yaml_mark_t *end;
+        /** The top of the stack. */
+        yaml_mark_t *top;
+    } marks;
+
+    /** 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;
+
+    /**
+     * @}
+     */
+
+    /**
+     * @name Dumper stuff
+     * @{
+     */
+
+    /** The alias data. */
+    struct {
+        /** The beginning of the list. */
+        yaml_alias_data_t *start;
+        /** The end of the list. */
+        yaml_alias_data_t *end;
+        /** The top of the list. */
+        yaml_alias_data_t *top;
+    } aliases;
+
+    /** The currently parsed document. */
+    yaml_document_t *document;
+
+    /**
+     * @}
+     */
+
+} yaml_parser_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.
+ */
+
+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,
+        const unsigned char *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.
+ */
+
+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
+ * @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.
+ */
+
+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
+ * @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.
+ */
+
+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, size_t 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. */
+    const 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. */
+            size_t size;
+            /** The number of written bytes. */
+            size_t *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. */
+        size_t anchor_length;
+        /** Is it an alias? */
+        int alias;
+    } anchor_data;
+
+    /** Tag analysis. */
+    struct {
+        /** The tag handle. */
+        yaml_char_t *handle;
+        /** The tag handle length. */
+        size_t handle_length;
+        /** The tag suffix. */
+        yaml_char_t *suffix;
+        /** The tag suffix length. */
+        size_t suffix_length;
+    } tag_data;
+
+    /** Scalar analysis. */
+    struct {
+        /** The scalar value. */
+        yaml_char_t *value;
+        /** The scalar length. */
+        size_t 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, 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.
+ */
+
+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 */
+
diff --git a/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml b/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml
new file mode 100644
index 0000000..72e9492
--- /dev/null
+++ b/libyaml/regression-inputs/clusterfuzz-testcase-minimized-5607885063061504.yml
@@ -0,0 +1 @@
+"(\
diff --git a/libyaml/src/Makefile.am b/libyaml/src/Makefile.am
new file mode 100644
index 0000000..7cc40e7
--- /dev/null
+++ b/libyaml/src/Makefile.am
@@ -0,0 +1,4 @@
+AM_CPPFLAGS = -I$(top_srcdir)/include -Wall
+lib_LTLIBRARIES = libyaml.la
+libyaml_la_SOURCES = yaml_private.h api.c reader.c scanner.c parser.c loader.c writer.c emitter.c dumper.c
+libyaml_la_LDFLAGS = -release $(YAML_LT_RELEASE) -version-info $(YAML_LT_CURRENT):$(YAML_LT_REVISION):$(YAML_LT_AGE)
diff --git a/libyaml/src/api.c b/libyaml/src/api.c
new file mode 100644
index 0000000..b1a8da0
--- /dev/null
+++ b/libyaml/src/api.c
@@ -0,0 +1,1392 @@
+
+#include "yaml_private.h"
+
+/*
+ * Get the library version.
+ */
+
+YAML_DECLARE(const char *)
+yaml_get_version_string(void)
+{
+    return YAML_VERSION_STRING;
+}
+
+/*
+ * Get the library version numbers.
+ */
+
+YAML_DECLARE(void)
+yaml_get_version(int *major, int *minor, int *patch)
+{
+    *major = YAML_VERSION_MAJOR;
+    *minor = YAML_VERSION_MINOR;
+    *patch = YAML_VERSION_PATCH;
+}
+
+/*
+ * Allocate a dynamic memory block.
+ */
+
+YAML_DECLARE(void *)
+yaml_malloc(size_t size)
+{
+    return malloc(size ? size : 1);
+}
+
+/*
+ * Reallocate a dynamic memory block.
+ */
+
+YAML_DECLARE(void *)
+yaml_realloc(void *ptr, size_t size)
+{
+    return ptr ? realloc(ptr, size ? size : 1) : malloc(size ? size : 1);
+}
+
+/*
+ * Free a dynamic memory block.
+ */
+
+YAML_DECLARE(void)
+yaml_free(void *ptr)
+{
+    if (ptr) free(ptr);
+}
+
+/*
+ * Duplicate a string.
+ */
+
+YAML_DECLARE(yaml_char_t *)
+yaml_strdup(const yaml_char_t *str)
+{
+    if (!str)
+        return NULL;
+
+    return (yaml_char_t *)strdup((char *)str);
+}
+
+/*
+ * 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;
+}
+
+/*
+ * Extend or move a queue.
+ */
+
+YAML_DECLARE(int)
+yaml_queue_extend(void **start, void **head, void **tail, void **end)
+{
+    /* Check if we need to resize the queue. */
+
+    if (*start == *head && *tail == *end) {
+        void *new_start = yaml_realloc(*start,
+                ((char *)*end - (char *)*start)*2);
+
+        if (!new_start) return 0;
+
+        *head = (char *)new_start + ((char *)*head - (char *)*start);
+        *tail = (char *)new_start + ((char *)*tail - (char *)*start);
+        *end = (char *)new_start + ((char *)*end - (char *)*start)*2;
+        *start = new_start;
+    }
+
+    /* Check if we need to move the queue at the beginning of the buffer. */
+
+    if (*tail == *end) {
+        if (*head != *tail) {
+            memmove(*start, *head, (char *)*tail - (char *)*head);
+        }
+        *tail = (char *)*tail - (char *)*head + (char *)*start;
+        *head = *start;
+    }
+
+    return 1;
+}
+
+
+/*
+ * Create a new parser object.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_initialize(yaml_parser_t *parser)
+{
+    assert(parser);     /* Non-NULL parser object expected. */
+
+    memset(parser, 0, sizeof(yaml_parser_t));
+    if (!BUFFER_INIT(parser, parser->raw_buffer, INPUT_RAW_BUFFER_SIZE))
+        goto error;
+    if (!BUFFER_INIT(parser, parser->buffer, INPUT_BUFFER_SIZE))
+        goto error;
+    if (!QUEUE_INIT(parser, parser->tokens, INITIAL_QUEUE_SIZE))
+        goto error;
+    if (!STACK_INIT(parser, parser->indents, INITIAL_STACK_SIZE))
+        goto error;
+    if (!STACK_INIT(parser, parser->simple_keys, INITIAL_STACK_SIZE))
+        goto error;
+    if (!STACK_INIT(parser, parser->states, INITIAL_STACK_SIZE))
+        goto error;
+    if (!STACK_INIT(parser, parser->marks, INITIAL_STACK_SIZE))
+        goto error;
+    if (!STACK_INIT(parser, parser->tag_directives, INITIAL_STACK_SIZE))
+        goto error;
+
+    return 1;
+
+error:
+
+    BUFFER_DEL(parser, parser->raw_buffer);
+    BUFFER_DEL(parser, parser->buffer);
+    QUEUE_DEL(parser, parser->tokens);
+    STACK_DEL(parser, parser->indents);
+    STACK_DEL(parser, parser->simple_keys);
+    STACK_DEL(parser, parser->states);
+    STACK_DEL(parser, parser->marks);
+    STACK_DEL(parser, parser->tag_directives);
+
+    return 0;
+}
+
+/*
+ * Destroy a parser object.
+ */
+
+YAML_DECLARE(void)
+yaml_parser_delete(yaml_parser_t *parser)
+{
+    assert(parser); /* Non-NULL parser object expected. */
+
+    BUFFER_DEL(parser, parser->raw_buffer);
+    BUFFER_DEL(parser, parser->buffer);
+    while (!QUEUE_EMPTY(parser, parser->tokens)) {
+        yaml_token_delete(&DEQUEUE(parser, parser->tokens));
+    }
+    QUEUE_DEL(parser, parser->tokens);
+    STACK_DEL(parser, parser->indents);
+    STACK_DEL(parser, parser->simple_keys);
+    STACK_DEL(parser, parser->states);
+    STACK_DEL(parser, parser->marks);
+    while (!STACK_EMPTY(parser, parser->tag_directives)) {
+        yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
+        yaml_free(tag_directive.handle);
+        yaml_free(tag_directive.prefix);
+    }
+    STACK_DEL(parser, parser->tag_directives);
+
+    memset(parser, 0, sizeof(yaml_parser_t));
+}
+
+/*
+ * String read handler.
+ */
+
+static int
+yaml_string_read_handler(void *data, unsigned char *buffer, size_t size,
+        size_t *size_read)
+{
+    yaml_parser_t *parser = data;
+
+    if (parser->input.string.current == parser->input.string.end) {
+        *size_read = 0;
+        return 1;
+    }
+
+    if (size > (size_t)(parser->input.string.end
+                - parser->input.string.current)) {
+        size = parser->input.string.end - parser->input.string.current;
+    }
+
+    memcpy(buffer, parser->input.string.current, size);
+    parser->input.string.current += size;
+    *size_read = size;
+    return 1;
+}
+
+/*
+ * File read handler.
+ */
+
+static int
+yaml_file_read_handler(void *data, unsigned char *buffer, size_t size,
+        size_t *size_read)
+{
+    yaml_parser_t *parser = data;
+
+    *size_read = fread(buffer, 1, size, parser->input.file);
+    return !ferror(parser->input.file);
+}
+
+/*
+ * Set a string input.
+ */
+
+YAML_DECLARE(void)
+yaml_parser_set_input_string(yaml_parser_t *parser,
+        const unsigned char *input, size_t size)
+{
+    assert(parser); /* Non-NULL parser object expected. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
+    assert(input);  /* Non-NULL input string expected. */
+
+    parser->read_handler = yaml_string_read_handler;
+    parser->read_handler_data = parser;
+
+    parser->input.string.start = input;
+    parser->input.string.current = input;
+    parser->input.string.end = input+size;
+}
+
+/*
+ * Set a file input.
+ */
+
+YAML_DECLARE(void)
+yaml_parser_set_input_file(yaml_parser_t *parser, FILE *file)
+{
+    assert(parser); /* Non-NULL parser object expected. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
+    assert(file);   /* Non-NULL file object expected. */
+
+    parser->read_handler = yaml_file_read_handler;
+    parser->read_handler_data = parser;
+
+    parser->input.file = file;
+}
+
+/*
+ * Set a generic input.
+ */
+
+YAML_DECLARE(void)
+yaml_parser_set_input(yaml_parser_t *parser,
+        yaml_read_handler_t *handler, void *data)
+{
+    assert(parser); /* Non-NULL parser object expected. */
+    assert(!parser->read_handler);  /* You can set the source only once. */
+    assert(handler);    /* Non-NULL read handler expected. */
+
+    parser->read_handler = handler;
+    parser->read_handler_data = data;
+}
+
+/*
+ * 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);
+
+    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);
+
+    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);
+
+    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.
+ */
+
+YAML_DECLARE(void)
+yaml_event_delete(yaml_event_t *event)
+{
+    yaml_tag_directive_t *tag_directive;
+
+    assert(event);  /* Non-NULL event object expected. */
+
+    switch (event->type)
+    {
+        case YAML_DOCUMENT_START_EVENT:
+            yaml_free(event->data.document_start.version_directive);
+            for (tag_directive = event->data.document_start.tag_directives.start;
+                    tag_directive != event->data.document_start.tag_directives.end;
+                    tag_directive++) {
+                yaml_free(tag_directive->handle);
+                yaml_free(tag_directive->prefix);
+            }
+            yaml_free(event->data.document_start.tag_directives.start);
+            break;
+
+        case YAML_ALIAS_EVENT:
+            yaml_free(event->data.alias.anchor);
+            break;
+
+        case YAML_SCALAR_EVENT:
+            yaml_free(event->data.scalar.anchor);
+            yaml_free(event->data.scalar.tag);
+            yaml_free(event->data.scalar.value);
+            break;
+
+        case YAML_SEQUENCE_START_EVENT:
+            yaml_free(event->data.sequence_start.anchor);
+            yaml_free(event->data.sequence_start.tag);
+            break;
+
+        case YAML_MAPPING_START_EVENT:
+            yaml_free(event->data.mapping_start.anchor);
+            yaml_free(event->data.mapping_start.tag);
+            break;
+
+        default:
+            break;
+    }
+
+    memset(event, 0, sizeof(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;
+}
+
+
diff --git a/libyaml/src/dumper.c b/libyaml/src/dumper.c
new file mode 100644
index 0000000..203c6a7
--- /dev/null
+++ b/libyaml/src/dumper.c
@@ -0,0 +1,394 @@
+
+#include "yaml_private.h"
+
+/*
+ * API functions.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_open(yaml_emitter_t *emitter);
+
+YAML_DECLARE(int)
+yaml_emitter_close(yaml_emitter_t *emitter);
+
+YAML_DECLARE(int)
+yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document);
+
+/*
+ * Clean up functions.
+ */
+
+static void
+yaml_emitter_delete_document_and_anchors(yaml_emitter_t *emitter);
+
+/*
+ * Anchor functions.
+ */
+
+static void
+yaml_emitter_anchor_node(yaml_emitter_t *emitter, int index);
+
+static yaml_char_t *
+yaml_emitter_generate_anchor(yaml_emitter_t *emitter, int anchor_id);
+
+
+/*
+ * Serialize functions.
+ */
+
+static int
+yaml_emitter_dump_node(yaml_emitter_t *emitter, int index);
+
+static int
+yaml_emitter_dump_alias(yaml_emitter_t *emitter, yaml_char_t *anchor);
+
+static int
+yaml_emitter_dump_scalar(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor);
+
+static int
+yaml_emitter_dump_sequence(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor);
+
+static int
+yaml_emitter_dump_mapping(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor);
+
+/*
+ * Issue a STREAM-START event.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_open(yaml_emitter_t *emitter)
+{
+    yaml_event_t event;
+    yaml_mark_t mark = { 0, 0, 0 };
+
+    assert(emitter);            /* Non-NULL emitter object is required. */
+    assert(!emitter->opened);   /* Emitter should not be opened yet. */
+
+    STREAM_START_EVENT_INIT(event, YAML_ANY_ENCODING, mark, mark);
+
+    if (!yaml_emitter_emit(emitter, &event)) {
+        return 0;
+    }
+
+    emitter->opened = 1;
+
+    return 1;
+}
+
+/*
+ * Issue a STREAM-END event.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_close(yaml_emitter_t *emitter)
+{
+    yaml_event_t event;
+    yaml_mark_t mark = { 0, 0, 0 };
+
+    assert(emitter);            /* Non-NULL emitter object is required. */
+    assert(emitter->opened);    /* Emitter should be opened. */
+
+    if (emitter->closed) return 1;
+
+    STREAM_END_EVENT_INIT(event, mark, mark);
+
+    if (!yaml_emitter_emit(emitter, &event)) {
+        return 0;
+    }
+
+    emitter->closed = 1;
+
+    return 1;
+}
+
+/*
+ * Dump a YAML document.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document)
+{
+    yaml_event_t event;
+    yaml_mark_t mark = { 0, 0, 0 };
+
+    assert(emitter);            /* Non-NULL emitter object is required. */
+    assert(document);           /* Non-NULL emitter object is expected. */
+
+    emitter->document = document;
+
+    if (!emitter->opened) {
+        if (!yaml_emitter_open(emitter)) goto error;
+    }
+
+    if (STACK_EMPTY(emitter, document->nodes)) {
+        if (!yaml_emitter_close(emitter)) goto error;
+        yaml_emitter_delete_document_and_anchors(emitter);
+        return 1;
+    }
+
+    assert(emitter->opened);    /* Emitter should be opened. */
+
+    emitter->anchors = yaml_malloc(sizeof(*(emitter->anchors))
+            * (document->nodes.top - document->nodes.start));
+    if (!emitter->anchors) goto error;
+    memset(emitter->anchors, 0, sizeof(*(emitter->anchors))
+            * (document->nodes.top - document->nodes.start));
+
+    DOCUMENT_START_EVENT_INIT(event, document->version_directive,
+            document->tag_directives.start, document->tag_directives.end,
+            document->start_implicit, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) goto error;
+
+    yaml_emitter_anchor_node(emitter, 1);
+    if (!yaml_emitter_dump_node(emitter, 1)) goto error;
+
+    DOCUMENT_END_EVENT_INIT(event, document->end_implicit, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) goto error;
+
+    yaml_emitter_delete_document_and_anchors(emitter);
+
+    return 1;
+
+error:
+
+    yaml_emitter_delete_document_and_anchors(emitter);
+
+    return 0;
+}
+
+/*
+ * Clean up the emitter object after a document is dumped.
+ */
+
+static void
+yaml_emitter_delete_document_and_anchors(yaml_emitter_t *emitter)
+{
+    int index;
+
+    if (!emitter->anchors) {
+        yaml_document_delete(emitter->document);
+        emitter->document = NULL;
+        return;
+    }
+
+    for (index = 0; emitter->document->nodes.start + index
+            < emitter->document->nodes.top; index ++) {
+        yaml_node_t node = emitter->document->nodes.start[index];
+        if (!emitter->anchors[index].serialized) {
+            yaml_free(node.tag);
+            if (node.type == YAML_SCALAR_NODE) {
+                yaml_free(node.data.scalar.value);
+            }
+        }
+        if (node.type == YAML_SEQUENCE_NODE) {
+            STACK_DEL(emitter, node.data.sequence.items);
+        }
+        if (node.type == YAML_MAPPING_NODE) {
+            STACK_DEL(emitter, node.data.mapping.pairs);
+        }
+    }
+
+    STACK_DEL(emitter, emitter->document->nodes);
+    yaml_free(emitter->anchors);
+
+    emitter->anchors = NULL;
+    emitter->last_anchor_id = 0;
+    emitter->document = NULL;
+}
+
+/*
+ * Check the references of a node and assign the anchor id if needed.
+ */
+
+static void
+yaml_emitter_anchor_node(yaml_emitter_t *emitter, int index)
+{
+    yaml_node_t *node = emitter->document->nodes.start + index - 1;
+    yaml_node_item_t *item;
+    yaml_node_pair_t *pair;
+
+    emitter->anchors[index-1].references ++;
+
+    if (emitter->anchors[index-1].references == 1) {
+        switch (node->type) {
+            case YAML_SEQUENCE_NODE:
+                for (item = node->data.sequence.items.start;
+                        item < node->data.sequence.items.top; item ++) {
+                    yaml_emitter_anchor_node(emitter, *item);
+                }
+                break;
+            case YAML_MAPPING_NODE:
+                for (pair = node->data.mapping.pairs.start;
+                        pair < node->data.mapping.pairs.top; pair ++) {
+                    yaml_emitter_anchor_node(emitter, pair->key);
+                    yaml_emitter_anchor_node(emitter, pair->value);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    else if (emitter->anchors[index-1].references == 2) {
+        emitter->anchors[index-1].anchor = (++ emitter->last_anchor_id);
+    }
+}
+
+/*
+ * Generate a textual representation for an anchor.
+ */
+
+#define ANCHOR_TEMPLATE         "id%03d"
+#define ANCHOR_TEMPLATE_LENGTH  16
+
+static yaml_char_t *
+yaml_emitter_generate_anchor(yaml_emitter_t *emitter, int anchor_id)
+{
+    yaml_char_t *anchor = yaml_malloc(ANCHOR_TEMPLATE_LENGTH);
+
+    if (!anchor) return NULL;
+
+    sprintf((char *)anchor, ANCHOR_TEMPLATE, anchor_id);
+
+    return anchor;
+}
+
+/*
+ * Serialize a node.
+ */
+
+static int
+yaml_emitter_dump_node(yaml_emitter_t *emitter, int index)
+{
+    yaml_node_t *node = emitter->document->nodes.start + index - 1;
+    int anchor_id = emitter->anchors[index-1].anchor;
+    yaml_char_t *anchor = NULL;
+
+    if (anchor_id) {
+        anchor = yaml_emitter_generate_anchor(emitter, anchor_id);
+        if (!anchor) return 0;
+    }
+
+    if (emitter->anchors[index-1].serialized) {
+        return yaml_emitter_dump_alias(emitter, anchor);
+    }
+
+    emitter->anchors[index-1].serialized = 1;
+
+    switch (node->type) {
+        case YAML_SCALAR_NODE:
+            return yaml_emitter_dump_scalar(emitter, node, anchor);
+        case YAML_SEQUENCE_NODE:
+            return yaml_emitter_dump_sequence(emitter, node, anchor);
+        case YAML_MAPPING_NODE:
+            return yaml_emitter_dump_mapping(emitter, node, anchor);
+        default:
+            assert(0);      /* Could not happen. */
+            break;
+    }
+
+    return 0;       /* Could not happen. */
+}
+
+/*
+ * Serialize an alias.
+ */
+
+static int
+yaml_emitter_dump_alias(yaml_emitter_t *emitter, yaml_char_t *anchor)
+{
+    yaml_event_t event;
+    yaml_mark_t mark  = { 0, 0, 0 };
+
+    ALIAS_EVENT_INIT(event, anchor, mark, mark);
+
+    return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Serialize a scalar.
+ */
+
+static int
+yaml_emitter_dump_scalar(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor)
+{
+    yaml_event_t event;
+    yaml_mark_t mark  = { 0, 0, 0 };
+
+    int plain_implicit = (strcmp((char *)node->tag,
+                YAML_DEFAULT_SCALAR_TAG) == 0);
+    int quoted_implicit = (strcmp((char *)node->tag,
+                YAML_DEFAULT_SCALAR_TAG) == 0);
+
+    SCALAR_EVENT_INIT(event, anchor, node->tag, node->data.scalar.value,
+            node->data.scalar.length, plain_implicit, quoted_implicit,
+            node->data.scalar.style, mark, mark);
+
+    return yaml_emitter_emit(emitter, &event);
+}
+
+/*
+ * Serialize a sequence.
+ */
+
+static int
+yaml_emitter_dump_sequence(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor)
+{
+    yaml_event_t event;
+    yaml_mark_t mark  = { 0, 0, 0 };
+
+    int implicit = (strcmp((char *)node->tag, YAML_DEFAULT_SEQUENCE_TAG) == 0);
+
+    yaml_node_item_t *item;
+
+    SEQUENCE_START_EVENT_INIT(event, anchor, node->tag, implicit,
+            node->data.sequence.style, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) return 0;
+
+    for (item = node->data.sequence.items.start;
+            item < node->data.sequence.items.top; item ++) {
+        if (!yaml_emitter_dump_node(emitter, *item)) return 0;
+    }
+
+    SEQUENCE_END_EVENT_INIT(event, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) return 0;
+
+    return 1;
+}
+
+/*
+ * Serialize a mapping.
+ */
+
+static int
+yaml_emitter_dump_mapping(yaml_emitter_t *emitter, yaml_node_t *node,
+        yaml_char_t *anchor)
+{
+    yaml_event_t event;
+    yaml_mark_t mark  = { 0, 0, 0 };
+
+    int implicit = (strcmp((char *)node->tag, YAML_DEFAULT_MAPPING_TAG) == 0);
+
+    yaml_node_pair_t *pair;
+
+    MAPPING_START_EVENT_INIT(event, anchor, node->tag, implicit,
+            node->data.mapping.style, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) return 0;
+
+    for (pair = node->data.mapping.pairs.start;
+            pair < node->data.mapping.pairs.top; pair ++) {
+        if (!yaml_emitter_dump_node(emitter, pair->key)) return 0;
+        if (!yaml_emitter_dump_node(emitter, pair->value)) return 0;
+    }
+
+    MAPPING_END_EVENT_INIT(event, mark, mark);
+    if (!yaml_emitter_emit(emitter, &event)) return 0;
+
+    return 1;
+}
+
diff --git a/libyaml/src/emitter.c b/libyaml/src/emitter.c
new file mode 100644
index 0000000..a5b7ff8
--- /dev/null
+++ b/libyaml/src/emitter.c
@@ -0,0 +1,2324 @@
+
+#include "yaml_private.h"
+
+/*
+ * Flush the buffer if needed.
+ */
+
+#define FLUSH(emitter)                                                          \
+    ((emitter->buffer.pointer+5 < emitter->buffer.end)                          \
+     || yaml_emitter_flush(emitter))
+
+/*
+ * Put a character to the output buffer.
+ */
+
+#define PUT(emitter,value)                                                      \
+    (FLUSH(emitter)                                                             \
+     && (*(emitter->buffer.pointer++) = (yaml_char_t)(value),                   \
+         emitter->column ++,                                                    \
+         1))
+
+/*
+ * Put a line break to the output buffer.
+ */
+
+#define PUT_BREAK(emitter)                                                      \
+    (FLUSH(emitter)                                                             \
+     && ((emitter->line_break == YAML_CR_BREAK ?                                \
+             (*(emitter->buffer.pointer++) = (yaml_char_t) '\r') :              \
+          emitter->line_break == YAML_LN_BREAK ?                                \
+             (*(emitter->buffer.pointer++) = (yaml_char_t) '\n') :              \
+          emitter->line_break == YAML_CRLN_BREAK ?                              \
+             (*(emitter->buffer.pointer++) = (yaml_char_t) '\r',                \
+              *(emitter->buffer.pointer++) = (yaml_char_t) '\n') : 0),          \
+         emitter->column = 0,                                                   \
+         emitter->line ++,                                                      \
+         1))
+
+/*
+ * Copy a character from a string into buffer.
+ */
+
+#define WRITE(emitter,string)                                                   \
+    (FLUSH(emitter)                                                             \
+     && (COPY(emitter->buffer,string),                                          \
+         emitter->column ++,                                                    \
+         1))
+
+/*
+ * Copy a line break character from a string into buffer.
+ */
+
+#define WRITE_BREAK(emitter,string)                                             \
+    (FLUSH(emitter)                                                             \
+     && (CHECK(string,'\n') ?                                                   \
+         (PUT_BREAK(emitter),                                                   \
+          string.pointer ++,                                                    \
+          1) :                                                                  \
+         (COPY(emitter->buffer,string),                                         \
+          emitter->column = 0,                                                  \
+          emitter->line ++,                                                     \
+          1)))
+
+/*
+ * API functions.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event);
+
+/*
+ * Utility functions.
+ */
+
+static int
+yaml_emitter_set_emitter_error(yaml_emitter_t *emitter, const char *problem);
+
+static int
+yaml_emitter_need_more_events(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_append_tag_directive(yaml_emitter_t *emitter,
+        yaml_tag_directive_t value, int allow_duplicates);
+
+static int
+yaml_emitter_increase_indent(yaml_emitter_t *emitter,
+        int flow, int indentless);
+
+/*
+ * State functions.
+ */
+
+static int
+yaml_emitter_state_machine(yaml_emitter_t *emitter, yaml_event_t *event);
+
+static int
+yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
+        yaml_event_t *event);
+
+static int
+yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first);
+
+static int
+yaml_emitter_emit_document_content(yaml_emitter_t *emitter,
+        yaml_event_t *event);
+
+static int
+yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
+        yaml_event_t *event);
+
+static int
+yaml_emitter_emit_flow_sequence_item(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first);
+
+static int
+yaml_emitter_emit_flow_mapping_key(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first);
+
+static int
+yaml_emitter_emit_flow_mapping_value(yaml_emitter_t *emitter,
+        yaml_event_t *event, int simple);
+
+static int
+yaml_emitter_emit_block_sequence_item(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first);
+
+static int
+yaml_emitter_emit_block_mapping_key(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first);
+
+static int
+yaml_emitter_emit_block_mapping_value(yaml_emitter_t *emitter,
+        yaml_event_t *event, int simple);
+
+static int
+yaml_emitter_emit_node(yaml_emitter_t *emitter, yaml_event_t *event,
+        int root, int sequence, int mapping, int simple_key);
+
+static int
+yaml_emitter_emit_alias(yaml_emitter_t *emitter, yaml_event_t *event);
+
+static int
+yaml_emitter_emit_scalar(yaml_emitter_t *emitter, yaml_event_t *event);
+
+static int
+yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter, yaml_event_t *event);
+
+static int
+yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter, yaml_event_t *event);
+
+/*
+ * Checkers.
+ */
+
+static int
+yaml_emitter_check_empty_document(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_check_empty_sequence(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_check_empty_mapping(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_check_simple_key(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event);
+
+/*
+ * Processors.
+ */
+
+static int
+yaml_emitter_process_anchor(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_process_tag(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_process_scalar(yaml_emitter_t *emitter);
+
+/*
+ * Analyzers.
+ */
+
+static int
+yaml_emitter_analyze_version_directive(yaml_emitter_t *emitter,
+        yaml_version_directive_t version_directive);
+
+static int
+yaml_emitter_analyze_tag_directive(yaml_emitter_t *emitter,
+        yaml_tag_directive_t tag_directive);
+
+static int
+yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
+        yaml_char_t *anchor, int alias);
+
+static int
+yaml_emitter_analyze_tag(yaml_emitter_t *emitter,
+        yaml_char_t *tag);
+
+static int
+yaml_emitter_analyze_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length);
+
+static int
+yaml_emitter_analyze_event(yaml_emitter_t *emitter,
+        yaml_event_t *event);
+
+/*
+ * Writers.
+ */
+
+static int
+yaml_emitter_write_bom(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_write_indent(yaml_emitter_t *emitter);
+
+static int
+yaml_emitter_write_indicator(yaml_emitter_t *emitter,
+        char *indicator, int need_whitespace,
+        int is_whitespace, int is_indention);
+
+static int
+yaml_emitter_write_anchor(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length);
+
+static int
+yaml_emitter_write_tag_handle(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length);
+
+static int
+yaml_emitter_write_tag_content(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int need_whitespace);
+
+static int
+yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks);
+
+static int
+yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks);
+
+static int
+yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks);
+
+static int
+yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
+        yaml_string_t string);
+
+static int
+yaml_emitter_write_literal_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length);
+
+static int
+yaml_emitter_write_folded_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length);
+
+/*
+ * Set an emitter error and return 0.
+ */
+
+static int
+yaml_emitter_set_emitter_error(yaml_emitter_t *emitter, const char *problem)
+{
+    emitter->error = YAML_EMITTER_ERROR;
+    emitter->problem = problem;
+
+    return 0;
+}
+
+/*
+ * Emit an event.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    if (!ENQUEUE(emitter, emitter->events, *event)) {
+        yaml_event_delete(event);
+        return 0;
+    }
+
+    while (!yaml_emitter_need_more_events(emitter)) {
+        if (!yaml_emitter_analyze_event(emitter, emitter->events.head))
+            return 0;
+        if (!yaml_emitter_state_machine(emitter, emitter->events.head))
+            return 0;
+        yaml_event_delete(&DEQUEUE(emitter, emitter->events));
+    }
+
+    return 1;
+}
+
+/*
+ * Check if we need to accumulate more events before emitting.
+ *
+ * We accumulate extra
+ *  - 1 event for DOCUMENT-START
+ *  - 2 events for SEQUENCE-START
+ *  - 3 events for MAPPING-START
+ */
+
+static int
+yaml_emitter_need_more_events(yaml_emitter_t *emitter)
+{
+    int level = 0;
+    int accumulate = 0;
+    yaml_event_t *event;
+
+    if (QUEUE_EMPTY(emitter, emitter->events))
+        return 1;
+
+    switch (emitter->events.head->type) {
+        case YAML_DOCUMENT_START_EVENT:
+            accumulate = 1;
+            break;
+        case YAML_SEQUENCE_START_EVENT:
+            accumulate = 2;
+            break;
+        case YAML_MAPPING_START_EVENT:
+            accumulate = 3;
+            break;
+        default:
+            return 0;
+    }
+
+    if (emitter->events.tail - emitter->events.head > accumulate)
+        return 0;
+
+    for (event = emitter->events.head; event != emitter->events.tail; event ++) {
+        switch (event->type) {
+            case YAML_STREAM_START_EVENT:
+            case YAML_DOCUMENT_START_EVENT:
+            case YAML_SEQUENCE_START_EVENT:
+            case YAML_MAPPING_START_EVENT:
+                level += 1;
+                break;
+            case YAML_STREAM_END_EVENT:
+            case YAML_DOCUMENT_END_EVENT:
+            case YAML_SEQUENCE_END_EVENT:
+            case YAML_MAPPING_END_EVENT:
+                level -= 1;
+                break;
+            default:
+                break;
+        }
+        if (!level)
+            return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Append a directive to the directives stack.
+ */
+
+static int
+yaml_emitter_append_tag_directive(yaml_emitter_t *emitter,
+        yaml_tag_directive_t value, int allow_duplicates)
+{
+    yaml_tag_directive_t *tag_directive;
+    yaml_tag_directive_t copy = { NULL, NULL };
+
+    for (tag_directive = emitter->tag_directives.start;
+            tag_directive != emitter->tag_directives.top; tag_directive ++) {
+        if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
+            if (allow_duplicates)
+                return 1;
+            return yaml_emitter_set_emitter_error(emitter,
+                    "duplicate %TAG directive");
+        }
+    }
+
+    copy.handle = yaml_strdup(value.handle);
+    copy.prefix = yaml_strdup(value.prefix);
+    if (!copy.handle || !copy.prefix) {
+        emitter->error = YAML_MEMORY_ERROR;
+        goto error;
+    }
+
+    if (!PUSH(emitter, emitter->tag_directives, copy))
+        goto error;
+
+    return 1;
+
+error:
+    yaml_free(copy.handle);
+    yaml_free(copy.prefix);
+    return 0;
+}
+
+/*
+ * Increase the indentation level.
+ */
+
+static int
+yaml_emitter_increase_indent(yaml_emitter_t *emitter,
+        int flow, int indentless)
+{
+    if (!PUSH(emitter, emitter->indents, emitter->indent))
+        return 0;
+
+    if (emitter->indent < 0) {
+        emitter->indent = flow ? emitter->best_indent : 0;
+    }
+    else if (!indentless) {
+        emitter->indent += emitter->best_indent;
+    }
+
+    return 1;
+}
+
+/*
+ * State dispatcher.
+ */
+
+static int
+yaml_emitter_state_machine(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    switch (emitter->state)
+    {
+        case YAML_EMIT_STREAM_START_STATE:
+            return yaml_emitter_emit_stream_start(emitter, event);
+
+        case YAML_EMIT_FIRST_DOCUMENT_START_STATE:
+            return yaml_emitter_emit_document_start(emitter, event, 1);
+
+        case YAML_EMIT_DOCUMENT_START_STATE:
+            return yaml_emitter_emit_document_start(emitter, event, 0);
+
+        case YAML_EMIT_DOCUMENT_CONTENT_STATE:
+            return yaml_emitter_emit_document_content(emitter, event);
+
+        case YAML_EMIT_DOCUMENT_END_STATE:
+            return yaml_emitter_emit_document_end(emitter, event);
+
+        case YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
+            return yaml_emitter_emit_flow_sequence_item(emitter, event, 1);
+
+        case YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE:
+            return yaml_emitter_emit_flow_sequence_item(emitter, event, 0);
+
+        case YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
+            return yaml_emitter_emit_flow_mapping_key(emitter, event, 1);
+
+        case YAML_EMIT_FLOW_MAPPING_KEY_STATE:
+            return yaml_emitter_emit_flow_mapping_key(emitter, event, 0);
+
+        case YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
+            return yaml_emitter_emit_flow_mapping_value(emitter, event, 1);
+
+        case YAML_EMIT_FLOW_MAPPING_VALUE_STATE:
+            return yaml_emitter_emit_flow_mapping_value(emitter, event, 0);
+
+        case YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
+            return yaml_emitter_emit_block_sequence_item(emitter, event, 1);
+
+        case YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
+            return yaml_emitter_emit_block_sequence_item(emitter, event, 0);
+
+        case YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
+            return yaml_emitter_emit_block_mapping_key(emitter, event, 1);
+
+        case YAML_EMIT_BLOCK_MAPPING_KEY_STATE:
+            return yaml_emitter_emit_block_mapping_key(emitter, event, 0);
+
+        case YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
+            return yaml_emitter_emit_block_mapping_value(emitter, event, 1);
+
+        case YAML_EMIT_BLOCK_MAPPING_VALUE_STATE:
+            return yaml_emitter_emit_block_mapping_value(emitter, event, 0);
+
+        case YAML_EMIT_END_STATE:
+            return yaml_emitter_set_emitter_error(emitter,
+                    "expected nothing after STREAM-END");
+
+        default:
+            assert(1);      /* Invalid state. */
+    }
+
+    return 0;
+}
+
+/*
+ * Expect STREAM-START.
+ */
+
+static int
+yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
+        yaml_event_t *event)
+{
+    if (event->type == YAML_STREAM_START_EVENT)
+    {
+        if (!emitter->encoding) {
+            emitter->encoding = event->data.stream_start.encoding;
+        }
+
+        if (!emitter->encoding) {
+            emitter->encoding = YAML_UTF8_ENCODING;
+        }
+
+        if (emitter->best_indent < 2 || emitter->best_indent > 9) {
+            emitter->best_indent  = 2;
+        }
+
+        if (emitter->best_width >= 0
+                && emitter->best_width <= emitter->best_indent*2) {
+            emitter->best_width = 80;
+        }
+
+        if (emitter->best_width < 0) {
+            emitter->best_width = INT_MAX;
+        }
+
+        if (!emitter->line_break) {
+            emitter->line_break = YAML_LN_BREAK;
+        }
+
+        emitter->indent = -1;
+
+        emitter->line = 0;
+        emitter->column = 0;
+        emitter->whitespace = 1;
+        emitter->indention = 1;
+
+        if (emitter->encoding != YAML_UTF8_ENCODING) {
+            if (!yaml_emitter_write_bom(emitter))
+                return 0;
+        }
+
+        emitter->state = YAML_EMIT_FIRST_DOCUMENT_START_STATE;
+
+        return 1;
+    }
+
+    return yaml_emitter_set_emitter_error(emitter,
+            "expected STREAM-START");
+}
+
+/*
+ * Expect DOCUMENT-START or STREAM-END.
+ */
+
+static int
+yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first)
+{
+    if (event->type == YAML_DOCUMENT_START_EVENT)
+    {
+        yaml_tag_directive_t default_tag_directives[] = {
+            {(yaml_char_t *)"!", (yaml_char_t *)"!"},
+            {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
+            {NULL, NULL}
+        };
+        yaml_tag_directive_t *tag_directive;
+        int implicit;
+
+        if (event->data.document_start.version_directive) {
+            if (!yaml_emitter_analyze_version_directive(emitter,
+                        *event->data.document_start.version_directive))
+                return 0;
+        }
+
+        for (tag_directive = event->data.document_start.tag_directives.start;
+                tag_directive != event->data.document_start.tag_directives.end;
+                tag_directive ++) {
+            if (!yaml_emitter_analyze_tag_directive(emitter, *tag_directive))
+                return 0;
+            if (!yaml_emitter_append_tag_directive(emitter, *tag_directive, 0))
+                return 0;
+        }
+
+        for (tag_directive = default_tag_directives;
+                tag_directive->handle; tag_directive ++) {
+            if (!yaml_emitter_append_tag_directive(emitter, *tag_directive, 1))
+                return 0;
+        }
+
+        implicit = event->data.document_start.implicit;
+        if (!first || emitter->canonical) {
+            implicit = 0;
+        }
+
+        if ((event->data.document_start.version_directive ||
+                    (event->data.document_start.tag_directives.start
+                     != event->data.document_start.tag_directives.end)) &&
+                emitter->open_ended)
+        {
+            if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+
+        if (event->data.document_start.version_directive) {
+            implicit = 0;
+            if (!yaml_emitter_write_indicator(emitter, "%YAML", 1, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indicator(emitter, "1.1", 1, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+
+        if (event->data.document_start.tag_directives.start
+                != event->data.document_start.tag_directives.end) {
+            implicit = 0;
+            for (tag_directive = event->data.document_start.tag_directives.start;
+                    tag_directive != event->data.document_start.tag_directives.end;
+                    tag_directive ++) {
+                if (!yaml_emitter_write_indicator(emitter, "%TAG", 1, 0, 0))
+                    return 0;
+                if (!yaml_emitter_write_tag_handle(emitter, tag_directive->handle,
+                            strlen((char *)tag_directive->handle)))
+                    return 0;
+                if (!yaml_emitter_write_tag_content(emitter, tag_directive->prefix,
+                            strlen((char *)tag_directive->prefix), 1))
+                    return 0;
+                if (!yaml_emitter_write_indent(emitter))
+                    return 0;
+            }
+        }
+
+        if (yaml_emitter_check_empty_document(emitter)) {
+            implicit = 0;
+        }
+
+        if (!implicit) {
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+            if (!yaml_emitter_write_indicator(emitter, "---", 1, 0, 0))
+                return 0;
+            if (emitter->canonical) {
+                if (!yaml_emitter_write_indent(emitter))
+                    return 0;
+            }
+        }
+
+        emitter->state = YAML_EMIT_DOCUMENT_CONTENT_STATE;
+
+        return 1;
+    }
+
+    else if (event->type == YAML_STREAM_END_EVENT)
+    {
+        if (emitter->open_ended)
+        {
+            if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+
+        if (!yaml_emitter_flush(emitter))
+            return 0;
+
+        emitter->state = YAML_EMIT_END_STATE;
+
+        return 1;
+    }
+
+    return yaml_emitter_set_emitter_error(emitter,
+            "expected DOCUMENT-START or STREAM-END");
+}
+
+/*
+ * Expect the root node.
+ */
+
+static int
+yaml_emitter_emit_document_content(yaml_emitter_t *emitter,
+        yaml_event_t *event)
+{
+    if (!PUSH(emitter, emitter->states, YAML_EMIT_DOCUMENT_END_STATE))
+        return 0;
+
+    return yaml_emitter_emit_node(emitter, event, 1, 0, 0, 0);
+}
+
+/*
+ * Expect DOCUMENT-END.
+ */
+
+static int
+yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
+        yaml_event_t *event)
+{
+    if (event->type == YAML_DOCUMENT_END_EVENT)
+    {
+        if (!yaml_emitter_write_indent(emitter))
+            return 0;
+        if (!event->data.document_end.implicit) {
+            if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+        if (!yaml_emitter_flush(emitter))
+            return 0;
+
+        emitter->state = YAML_EMIT_DOCUMENT_START_STATE;
+
+        while (!STACK_EMPTY(emitter, emitter->tag_directives)) {
+            yaml_tag_directive_t tag_directive = POP(emitter,
+                    emitter->tag_directives);
+            yaml_free(tag_directive.handle);
+            yaml_free(tag_directive.prefix);
+        }
+
+        return 1;
+    }
+
+    return yaml_emitter_set_emitter_error(emitter,
+            "expected DOCUMENT-END");
+}
+
+/*
+ *
+ * Expect a flow item node.
+ */
+
+static int
+yaml_emitter_emit_flow_sequence_item(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first)
+{
+    if (first)
+    {
+        if (!yaml_emitter_write_indicator(emitter, "[", 1, 1, 0))
+            return 0;
+        if (!yaml_emitter_increase_indent(emitter, 1, 0))
+            return 0;
+        emitter->flow_level ++;
+    }
+
+    if (event->type == YAML_SEQUENCE_END_EVENT)
+    {
+        emitter->flow_level --;
+        emitter->indent = POP(emitter, emitter->indents);
+        if (emitter->canonical && !first) {
+            if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+        if (!yaml_emitter_write_indicator(emitter, "]", 0, 0, 0))
+            return 0;
+        emitter->state = POP(emitter, emitter->states);
+
+        return 1;
+    }
+
+    if (!first) {
+        if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
+            return 0;
+    }
+
+    if (emitter->canonical || emitter->column > emitter->best_width) {
+        if (!yaml_emitter_write_indent(emitter))
+            return 0;
+    }
+    if (!PUSH(emitter, emitter->states, YAML_EMIT_FLOW_SEQUENCE_ITEM_STATE))
+        return 0;
+
+    return yaml_emitter_emit_node(emitter, event, 0, 1, 0, 0);
+}
+
+/*
+ * Expect a flow key node.
+ */
+
+static int
+yaml_emitter_emit_flow_mapping_key(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first)
+{
+    if (first)
+    {
+        if (!yaml_emitter_write_indicator(emitter, "{", 1, 1, 0))
+            return 0;
+        if (!yaml_emitter_increase_indent(emitter, 1, 0))
+            return 0;
+        emitter->flow_level ++;
+    }
+
+    if (event->type == YAML_MAPPING_END_EVENT)
+    {
+        emitter->flow_level --;
+        emitter->indent = POP(emitter, emitter->indents);
+        if (emitter->canonical && !first) {
+            if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
+                return 0;
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+        if (!yaml_emitter_write_indicator(emitter, "}", 0, 0, 0))
+            return 0;
+        emitter->state = POP(emitter, emitter->states);
+
+        return 1;
+    }
+
+    if (!first) {
+        if (!yaml_emitter_write_indicator(emitter, ",", 0, 0, 0))
+            return 0;
+    }
+    if (emitter->canonical || emitter->column > emitter->best_width) {
+        if (!yaml_emitter_write_indent(emitter))
+            return 0;
+    }
+
+    if (!emitter->canonical && yaml_emitter_check_simple_key(emitter))
+    {
+        if (!PUSH(emitter, emitter->states,
+                    YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE))
+            return 0;
+
+        return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 1);
+    }
+    else
+    {
+        if (!yaml_emitter_write_indicator(emitter, "?", 1, 0, 0))
+            return 0;
+        if (!PUSH(emitter, emitter->states,
+                    YAML_EMIT_FLOW_MAPPING_VALUE_STATE))
+            return 0;
+
+        return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
+    }
+}
+
+/*
+ * Expect a flow value node.
+ */
+
+static int
+yaml_emitter_emit_flow_mapping_value(yaml_emitter_t *emitter,
+        yaml_event_t *event, int simple)
+{
+    if (simple) {
+        if (!yaml_emitter_write_indicator(emitter, ":", 0, 0, 0))
+            return 0;
+    }
+    else {
+        if (emitter->canonical || emitter->column > emitter->best_width) {
+            if (!yaml_emitter_write_indent(emitter))
+                return 0;
+        }
+        if (!yaml_emitter_write_indicator(emitter, ":", 1, 0, 0))
+            return 0;
+    }
+    if (!PUSH(emitter, emitter->states, YAML_EMIT_FLOW_MAPPING_KEY_STATE))
+        return 0;
+    return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
+}
+
+/*
+ * Expect a block item node.
+ */
+
+static int
+yaml_emitter_emit_block_sequence_item(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first)
+{
+    if (first)
+    {
+        if (!yaml_emitter_increase_indent(emitter, 0,
+                    (emitter->mapping_context && !emitter->indention)))
+            return 0;
+    }
+
+    if (event->type == YAML_SEQUENCE_END_EVENT)
+    {
+        emitter->indent = POP(emitter, emitter->indents);
+        emitter->state = POP(emitter, emitter->states);
+
+        return 1;
+    }
+
+    if (!yaml_emitter_write_indent(emitter))
+        return 0;
+    if (!yaml_emitter_write_indicator(emitter, "-", 1, 0, 1))
+        return 0;
+    if (!PUSH(emitter, emitter->states,
+                YAML_EMIT_BLOCK_SEQUENCE_ITEM_STATE))
+        return 0;
+
+    return yaml_emitter_emit_node(emitter, event, 0, 1, 0, 0);
+}
+
+/*
+ * Expect a block key node.
+ */
+
+static int
+yaml_emitter_emit_block_mapping_key(yaml_emitter_t *emitter,
+        yaml_event_t *event, int first)
+{
+    if (first)
+    {
+        if (!yaml_emitter_increase_indent(emitter, 0, 0))
+            return 0;
+    }
+
+    if (event->type == YAML_MAPPING_END_EVENT)
+    {
+        emitter->indent = POP(emitter, emitter->indents);
+        emitter->state = POP(emitter, emitter->states);
+
+        return 1;
+    }
+
+    if (!yaml_emitter_write_indent(emitter))
+        return 0;
+
+    if (yaml_emitter_check_simple_key(emitter))
+    {
+        if (!PUSH(emitter, emitter->states,
+                    YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE))
+            return 0;
+
+        return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 1);
+    }
+    else
+    {
+        if (!yaml_emitter_write_indicator(emitter, "?", 1, 0, 1))
+            return 0;
+        if (!PUSH(emitter, emitter->states,
+                    YAML_EMIT_BLOCK_MAPPING_VALUE_STATE))
+            return 0;
+
+        return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
+    }
+}
+
+/*
+ * Expect a block value node.
+ */
+
+static int
+yaml_emitter_emit_block_mapping_value(yaml_emitter_t *emitter,
+        yaml_event_t *event, int simple)
+{
+    if (simple) {
+        if (!yaml_emitter_write_indicator(emitter, ":", 0, 0, 0))
+            return 0;
+    }
+    else {
+        if (!yaml_emitter_write_indent(emitter))
+            return 0;
+        if (!yaml_emitter_write_indicator(emitter, ":", 1, 0, 1))
+            return 0;
+    }
+    if (!PUSH(emitter, emitter->states,
+                YAML_EMIT_BLOCK_MAPPING_KEY_STATE))
+        return 0;
+
+    return yaml_emitter_emit_node(emitter, event, 0, 0, 1, 0);
+}
+
+/*
+ * Expect a node.
+ */
+
+static int
+yaml_emitter_emit_node(yaml_emitter_t *emitter, yaml_event_t *event,
+        int root, int sequence, int mapping, int simple_key)
+{
+    emitter->root_context = root;
+    emitter->sequence_context = sequence;
+    emitter->mapping_context = mapping;
+    emitter->simple_key_context = simple_key;
+
+    switch (event->type)
+    {
+        case YAML_ALIAS_EVENT:
+            return yaml_emitter_emit_alias(emitter, event);
+
+        case YAML_SCALAR_EVENT:
+            return yaml_emitter_emit_scalar(emitter, event);
+
+        case YAML_SEQUENCE_START_EVENT:
+            return yaml_emitter_emit_sequence_start(emitter, event);
+
+        case YAML_MAPPING_START_EVENT:
+            return yaml_emitter_emit_mapping_start(emitter, event);
+
+        default:
+            return yaml_emitter_set_emitter_error(emitter,
+                    "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS");
+    }
+
+    return 0;
+}
+
+/*
+ * Expect ALIAS.
+ */
+
+static int
+yaml_emitter_emit_alias(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    if (!yaml_emitter_process_anchor(emitter))
+        return 0;
+    emitter->state = POP(emitter, emitter->states);
+
+    return 1;
+}
+
+/*
+ * Expect SCALAR.
+ */
+
+static int
+yaml_emitter_emit_scalar(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    if (!yaml_emitter_select_scalar_style(emitter, event))
+        return 0;
+    if (!yaml_emitter_process_anchor(emitter))
+        return 0;
+    if (!yaml_emitter_process_tag(emitter))
+        return 0;
+    if (!yaml_emitter_increase_indent(emitter, 1, 0))
+        return 0;
+    if (!yaml_emitter_process_scalar(emitter))
+        return 0;
+    emitter->indent = POP(emitter, emitter->indents);
+    emitter->state = POP(emitter, emitter->states);
+
+    return 1;
+}
+
+/*
+ * Expect SEQUENCE-START.
+ */
+
+static int
+yaml_emitter_emit_sequence_start(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    if (!yaml_emitter_process_anchor(emitter))
+        return 0;
+    if (!yaml_emitter_process_tag(emitter))
+        return 0;
+
+    if (emitter->flow_level || emitter->canonical
+            || event->data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE
+            || yaml_emitter_check_empty_sequence(emitter)) {
+        emitter->state = YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE;
+    }
+    else {
+        emitter->state = YAML_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE;
+    }
+
+    return 1;
+}
+
+/*
+ * Expect MAPPING-START.
+ */
+
+static int
+yaml_emitter_emit_mapping_start(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    if (!yaml_emitter_process_anchor(emitter))
+        return 0;
+    if (!yaml_emitter_process_tag(emitter))
+        return 0;
+
+    if (emitter->flow_level || emitter->canonical
+            || event->data.mapping_start.style == YAML_FLOW_MAPPING_STYLE
+            || yaml_emitter_check_empty_mapping(emitter)) {
+        emitter->state = YAML_EMIT_FLOW_MAPPING_FIRST_KEY_STATE;
+    }
+    else {
+        emitter->state = YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE;
+    }
+
+    return 1;
+}
+
+/*
+ * Check if the document content is an empty scalar.
+ */
+
+static int
+yaml_emitter_check_empty_document(yaml_emitter_t *emitter)
+{
+    return 0;
+}
+
+/*
+ * Check if the next events represent an empty sequence.
+ */
+
+static int
+yaml_emitter_check_empty_sequence(yaml_emitter_t *emitter)
+{
+    if (emitter->events.tail - emitter->events.head < 2)
+        return 0;
+
+    return (emitter->events.head[0].type == YAML_SEQUENCE_START_EVENT
+            && emitter->events.head[1].type == YAML_SEQUENCE_END_EVENT);
+}
+
+/*
+ * Check if the next events represent an empty mapping.
+ */
+
+static int
+yaml_emitter_check_empty_mapping(yaml_emitter_t *emitter)
+{
+    if (emitter->events.tail - emitter->events.head < 2)
+        return 0;
+
+    return (emitter->events.head[0].type == YAML_MAPPING_START_EVENT
+            && emitter->events.head[1].type == YAML_MAPPING_END_EVENT);
+}
+
+/*
+ * Check if the next node can be expressed as a simple key.
+ */
+
+static int
+yaml_emitter_check_simple_key(yaml_emitter_t *emitter)
+{
+    yaml_event_t *event = emitter->events.head;
+    size_t length = 0;
+
+    switch (event->type)
+    {
+        case YAML_ALIAS_EVENT:
+            length += emitter->anchor_data.anchor_length;
+            break;
+
+        case YAML_SCALAR_EVENT:
+            if (emitter->scalar_data.multiline)
+                return 0;
+            length += emitter->anchor_data.anchor_length
+                + emitter->tag_data.handle_length
+                + emitter->tag_data.suffix_length
+                + emitter->scalar_data.length;
+            break;
+
+        case YAML_SEQUENCE_START_EVENT:
+            if (!yaml_emitter_check_empty_sequence(emitter))
+                return 0;
+            length += emitter->anchor_data.anchor_length
+                + emitter->tag_data.handle_length
+                + emitter->tag_data.suffix_length;
+            break;
+
+        case YAML_MAPPING_START_EVENT:
+            if (!yaml_emitter_check_empty_mapping(emitter))
+                return 0;
+            length += emitter->anchor_data.anchor_length
+                + emitter->tag_data.handle_length
+                + emitter->tag_data.suffix_length;
+            break;
+
+        default:
+            return 0;
+    }
+
+    if (length > 128)
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Determine an acceptable scalar style.
+ */
+
+static int
+yaml_emitter_select_scalar_style(yaml_emitter_t *emitter, yaml_event_t *event)
+{
+    yaml_scalar_style_t style = event->data.scalar.style;
+    int no_tag = (!emitter->tag_data.handle && !emitter->tag_data.suffix);
+
+    if (no_tag && !event->data.scalar.plain_implicit
+            && !event->data.scalar.quoted_implicit) {
+        return yaml_emitter_set_emitter_error(emitter,
+                "neither tag nor implicit flags are specified");
+    }
+
+    if (style == YAML_ANY_SCALAR_STYLE)
+        style = YAML_PLAIN_SCALAR_STYLE;
+
+    if (emitter->canonical)
+        style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+
+    if (emitter->simple_key_context && emitter->scalar_data.multiline)
+        style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+
+    if (style == YAML_PLAIN_SCALAR_STYLE)
+    {
+        if ((emitter->flow_level && !emitter->scalar_data.flow_plain_allowed)
+                || (!emitter->flow_level && !emitter->scalar_data.block_plain_allowed))
+            style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
+        if (!emitter->scalar_data.length
+                && (emitter->flow_level || emitter->simple_key_context))
+            style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
+        if (no_tag && !event->data.scalar.plain_implicit)
+            style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
+    }
+
+    if (style == YAML_SINGLE_QUOTED_SCALAR_STYLE)
+    {
+        if (!emitter->scalar_data.single_quoted_allowed)
+            style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+    }
+
+    if (style == YAML_LITERAL_SCALAR_STYLE || style == YAML_FOLDED_SCALAR_STYLE)
+    {
+        if (!emitter->scalar_data.block_allowed
+                || emitter->flow_level || emitter->simple_key_context)
+            style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+    }
+
+    if (no_tag && !event->data.scalar.quoted_implicit
+            && style != YAML_PLAIN_SCALAR_STYLE)
+    {
+        emitter->tag_data.handle = (yaml_char_t *)"!";
+        emitter->tag_data.handle_length = 1;
+    }
+
+    emitter->scalar_data.style = style;
+
+    return 1;
+}
+
+/*
+ * Write an achor.
+ */
+
+static int
+yaml_emitter_process_anchor(yaml_emitter_t *emitter)
+{
+    if (!emitter->anchor_data.anchor)
+        return 1;
+
+    if (!yaml_emitter_write_indicator(emitter,
+                (emitter->anchor_data.alias ? "*" : "&"), 1, 0, 0))
+        return 0;
+
+    return yaml_emitter_write_anchor(emitter,
+            emitter->anchor_data.anchor, emitter->anchor_data.anchor_length);
+}
+
+/*
+ * Write a tag.
+ */
+
+static int
+yaml_emitter_process_tag(yaml_emitter_t *emitter)
+{
+    if (!emitter->tag_data.handle && !emitter->tag_data.suffix)
+        return 1;
+
+    if (emitter->tag_data.handle)
+    {
+        if (!yaml_emitter_write_tag_handle(emitter, emitter->tag_data.handle,
+                    emitter->tag_data.handle_length))
+            return 0;
+        if (emitter->tag_data.suffix) {
+            if (!yaml_emitter_write_tag_content(emitter, emitter->tag_data.suffix,
+                        emitter->tag_data.suffix_length, 0))
+                return 0;
+        }
+    }
+    else
+    {
+        if (!yaml_emitter_write_indicator(emitter, "!<", 1, 0, 0))
+            return 0;
+        if (!yaml_emitter_write_tag_content(emitter, emitter->tag_data.suffix,
+                    emitter->tag_data.suffix_length, 0))
+            return 0;
+        if (!yaml_emitter_write_indicator(emitter, ">", 0, 0, 0))
+            return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Write a scalar.
+ */
+
+static int
+yaml_emitter_process_scalar(yaml_emitter_t *emitter)
+{
+    switch (emitter->scalar_data.style)
+    {
+        case YAML_PLAIN_SCALAR_STYLE:
+            return yaml_emitter_write_plain_scalar(emitter,
+                    emitter->scalar_data.value, emitter->scalar_data.length,
+                    !emitter->simple_key_context);
+
+        case YAML_SINGLE_QUOTED_SCALAR_STYLE:
+            return yaml_emitter_write_single_quoted_scalar(emitter,
+                    emitter->scalar_data.value, emitter->scalar_data.length,
+                    !emitter->simple_key_context);
+
+        case YAML_DOUBLE_QUOTED_SCALAR_STYLE:
+            return yaml_emitter_write_double_quoted_scalar(emitter,
+                    emitter->scalar_data.value, emitter->scalar_data.length,
+                    !emitter->simple_key_context);
+
+        case YAML_LITERAL_SCALAR_STYLE:
+            return yaml_emitter_write_literal_scalar(emitter,
+                    emitter->scalar_data.value, emitter->scalar_data.length);
+
+        case YAML_FOLDED_SCALAR_STYLE:
+            return yaml_emitter_write_folded_scalar(emitter,
+                    emitter->scalar_data.value, emitter->scalar_data.length);
+
+        default:
+            assert(1);      /* Impossible. */
+    }
+
+    return 0;
+}
+
+/*
+ * Check if a %YAML directive is valid.
+ */
+
+static int
+yaml_emitter_analyze_version_directive(yaml_emitter_t *emitter,
+        yaml_version_directive_t version_directive)
+{
+    if (version_directive.major != 1 || version_directive.minor != 1) {
+        return yaml_emitter_set_emitter_error(emitter,
+                "incompatible %YAML directive");
+    }
+
+    return 1;
+}
+
+/*
+ * Check if a %TAG directive is valid.
+ */
+
+static int
+yaml_emitter_analyze_tag_directive(yaml_emitter_t *emitter,
+        yaml_tag_directive_t tag_directive)
+{
+    yaml_string_t handle;
+    yaml_string_t prefix;
+    size_t handle_length;
+    size_t prefix_length;
+
+    handle_length = strlen((char *)tag_directive.handle);
+    prefix_length = strlen((char *)tag_directive.prefix);
+    STRING_ASSIGN(handle, tag_directive.handle, handle_length);
+    STRING_ASSIGN(prefix, tag_directive.prefix, prefix_length);
+
+    if (handle.start == handle.end) {
+        return yaml_emitter_set_emitter_error(emitter,
+                "tag handle must not be empty");
+    }
+
+    if (handle.start[0] != '!') {
+        return yaml_emitter_set_emitter_error(emitter,
+                "tag handle must start with '!'");
+    }
+
+    if (handle.end[-1] != '!') {
+        return yaml_emitter_set_emitter_error(emitter,
+                "tag handle must end with '!'");
+    }
+
+    handle.pointer ++;
+
+    while (handle.pointer < handle.end-1) {
+        if (!IS_ALPHA(handle)) {
+            return yaml_emitter_set_emitter_error(emitter,
+                    "tag handle must contain alphanumerical characters only");
+        }
+        MOVE(handle);
+    }
+
+    if (prefix.start == prefix.end) {
+        return yaml_emitter_set_emitter_error(emitter,
+                "tag prefix must not be empty");
+    }
+
+    return 1;
+}
+
+/*
+ * Check if an anchor is valid.
+ */
+
+static int
+yaml_emitter_analyze_anchor(yaml_emitter_t *emitter,
+        yaml_char_t *anchor, int alias)
+{
+    size_t anchor_length;
+    yaml_string_t string;
+
+    anchor_length = strlen((char *)anchor);
+    STRING_ASSIGN(string, anchor, anchor_length);
+
+    if (string.start == string.end) {
+        return yaml_emitter_set_emitter_error(emitter, alias ?
+                "alias value must not be empty" :
+                "anchor value must not be empty");
+    }
+
+    while (string.pointer != string.end) {
+        if (!IS_ALPHA(string)) {
+            return yaml_emitter_set_emitter_error(emitter, alias ?
+                    "alias value must contain alphanumerical characters only" :
+                    "anchor value must contain alphanumerical characters only");
+        }
+        MOVE(string);
+    }
+
+    emitter->anchor_data.anchor = string.start;
+    emitter->anchor_data.anchor_length = string.end - string.start;
+    emitter->anchor_data.alias = alias;
+
+    return 1;
+}
+
+/*
+ * Check if a tag is valid.
+ */
+
+static int
+yaml_emitter_analyze_tag(yaml_emitter_t *emitter,
+        yaml_char_t *tag)
+{
+    size_t tag_length;
+    yaml_string_t string;
+    yaml_tag_directive_t *tag_directive;
+
+    tag_length = strlen((char *)tag);
+    STRING_ASSIGN(string, tag, tag_length);
+
+    if (string.start == string.end) {
+        return yaml_emitter_set_emitter_error(emitter,
+                "tag value must not be empty");
+    }
+
+    for (tag_directive = emitter->tag_directives.start;
+            tag_directive != emitter->tag_directives.top; tag_directive ++) {
+        size_t prefix_length = strlen((char *)tag_directive->prefix);
+        if (prefix_length < (size_t)(string.end - string.start)
+                && strncmp((char *)tag_directive->prefix, (char *)string.start,
+                    prefix_length) == 0)
+        {
+            emitter->tag_data.handle = tag_directive->handle;
+            emitter->tag_data.handle_length =
+                strlen((char *)tag_directive->handle);
+            emitter->tag_data.suffix = string.start + prefix_length;
+            emitter->tag_data.suffix_length =
+                (string.end - string.start) - prefix_length;
+            return 1;
+        }
+    }
+
+    emitter->tag_data.suffix = string.start;
+    emitter->tag_data.suffix_length = string.end - string.start;
+
+    return 1;
+}
+
+/*
+ * Check if a scalar is valid.
+ */
+
+static int
+yaml_emitter_analyze_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length)
+{
+    yaml_string_t string;
+
+    int block_indicators = 0;
+    int flow_indicators = 0;
+    int line_breaks = 0;
+    int special_characters = 0;
+
+    int leading_space = 0;
+    int leading_break = 0;
+    int trailing_space = 0;
+    int trailing_break = 0;
+    int break_space = 0;
+    int space_break = 0;
+
+    int preceded_by_whitespace = 0;
+    int followed_by_whitespace = 0;
+    int previous_space = 0;
+    int previous_break = 0;
+
+    STRING_ASSIGN(string, value, length);
+
+    emitter->scalar_data.value = value;
+    emitter->scalar_data.length = length;
+
+    if (string.start == string.end)
+    {
+        emitter->scalar_data.multiline = 0;
+        emitter->scalar_data.flow_plain_allowed = 0;
+        emitter->scalar_data.block_plain_allowed = 1;
+        emitter->scalar_data.single_quoted_allowed = 1;
+        emitter->scalar_data.block_allowed = 0;
+
+        return 1;
+    }
+
+    if ((CHECK_AT(string, '-', 0)
+                && CHECK_AT(string, '-', 1)
+                && CHECK_AT(string, '-', 2))
+            || (CHECK_AT(string, '.', 0)
+                && CHECK_AT(string, '.', 1)
+                && CHECK_AT(string, '.', 2))) {
+        block_indicators = 1;
+        flow_indicators = 1;
+    }
+
+    preceded_by_whitespace = 1;
+    followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
+
+    while (string.pointer != string.end)
+    {
+        if (string.start == string.pointer)
+        {
+            if (CHECK(string, '#') || CHECK(string, ',')
+                    || CHECK(string, '[') || CHECK(string, ']')
+                    || CHECK(string, '{') || CHECK(string, '}')
+                    || CHECK(string, '&') || CHECK(string, '*')
+                    || CHECK(string, '!') || CHECK(string, '|')
+                    || CHECK(string, '>') || CHECK(string, '\'')
+                    || CHECK(string, '"') || CHECK(string, '%')
+                    || CHECK(string, '@') || CHECK(string, '`')) {
+                flow_indicators = 1;
+                block_indicators = 1;
+            }
+
+            if (CHECK(string, '?') || CHECK(string, ':')) {
+                flow_indicators = 1;
+                if (followed_by_whitespace) {
+                    block_indicators = 1;
+                }
+            }
+
+            if (CHECK(string, '-') && followed_by_whitespace) {
+                flow_indicators = 1;
+                block_indicators = 1;
+            }
+        }
+        else
+        {
+            if (CHECK(string, ',') || CHECK(string, '?')
+                    || CHECK(string, '[') || CHECK(string, ']')
+                    || CHECK(string, '{') || CHECK(string, '}')) {
+                flow_indicators = 1;
+            }
+
+            if (CHECK(string, ':')) {
+                flow_indicators = 1;
+                if (followed_by_whitespace) {
+                    block_indicators = 1;
+                }
+            }
+
+            if (CHECK(string, '#') && preceded_by_whitespace) {
+                flow_indicators = 1;
+                block_indicators = 1;
+            }
+        }
+
+        if (!IS_PRINTABLE(string)
+                || (!IS_ASCII(string) && !emitter->unicode)) {
+            special_characters = 1;
+        }
+
+        if (IS_BREAK(string)) {
+            line_breaks = 1;
+        }
+
+        if (IS_SPACE(string))
+        {
+            if (string.start == string.pointer) {
+                leading_space = 1;
+            }
+            if (string.pointer+WIDTH(string) == string.end) {
+                trailing_space = 1;
+            }
+            if (previous_break) {
+                break_space = 1;
+            }
+            previous_space = 1;
+            previous_break = 0;
+        }
+        else if (IS_BREAK(string))
+        {
+            if (string.start == string.pointer) {
+                leading_break = 1;
+            }
+            if (string.pointer+WIDTH(string) == string.end) {
+                trailing_break = 1;
+            }
+            if (previous_space) {
+                space_break = 1;
+            }
+            previous_space = 0;
+            previous_break = 1;
+        }
+        else
+        {
+            previous_space = 0;
+            previous_break = 0;
+        }
+
+        preceded_by_whitespace = IS_BLANKZ(string);
+        MOVE(string);
+        if (string.pointer != string.end) {
+            followed_by_whitespace = IS_BLANKZ_AT(string, WIDTH(string));
+        }
+    }
+
+    emitter->scalar_data.multiline = line_breaks;
+
+    emitter->scalar_data.flow_plain_allowed = 1;
+    emitter->scalar_data.block_plain_allowed = 1;
+    emitter->scalar_data.single_quoted_allowed = 1;
+    emitter->scalar_data.block_allowed = 1;
+
+    if (leading_space || leading_break || trailing_space || trailing_break) {
+        emitter->scalar_data.flow_plain_allowed = 0;
+        emitter->scalar_data.block_plain_allowed = 0;
+    }
+
+    if (trailing_space) {
+        emitter->scalar_data.block_allowed = 0;
+    }
+
+    if (break_space) {
+        emitter->scalar_data.flow_plain_allowed = 0;
+        emitter->scalar_data.block_plain_allowed = 0;
+        emitter->scalar_data.single_quoted_allowed = 0;
+    }
+
+    if (space_break || special_characters) {
+        emitter->scalar_data.flow_plain_allowed = 0;
+        emitter->scalar_data.block_plain_allowed = 0;
+        emitter->scalar_data.single_quoted_allowed = 0;
+        emitter->scalar_data.block_allowed = 0;
+    }
+
+    if (line_breaks) {
+        emitter->scalar_data.flow_plain_allowed = 0;
+        emitter->scalar_data.block_plain_allowed = 0;
+    }
+
+    if (flow_indicators) {
+        emitter->scalar_data.flow_plain_allowed = 0;
+    }
+
+    if (block_indicators) {
+        emitter->scalar_data.block_plain_allowed = 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Check if the event data is valid.
+ */
+
+static int
+yaml_emitter_analyze_event(yaml_emitter_t *emitter,
+        yaml_event_t *event)
+{
+    emitter->anchor_data.anchor = NULL;
+    emitter->anchor_data.anchor_length = 0;
+    emitter->tag_data.handle = NULL;
+    emitter->tag_data.handle_length = 0;
+    emitter->tag_data.suffix = NULL;
+    emitter->tag_data.suffix_length = 0;
+    emitter->scalar_data.value = NULL;
+    emitter->scalar_data.length = 0;
+
+    switch (event->type)
+    {
+        case YAML_ALIAS_EVENT:
+            if (!yaml_emitter_analyze_anchor(emitter,
+                        event->data.alias.anchor, 1))
+                return 0;
+            return 1;
+
+        case YAML_SCALAR_EVENT:
+            if (event->data.scalar.anchor) {
+                if (!yaml_emitter_analyze_anchor(emitter,
+                            event->data.scalar.anchor, 0))
+                    return 0;
+            }
+            if (event->data.scalar.tag && (emitter->canonical ||
+                        (!event->data.scalar.plain_implicit
+                         && !event->data.scalar.quoted_implicit))) {
+                if (!yaml_emitter_analyze_tag(emitter, event->data.scalar.tag))
+                    return 0;
+            }
+            if (!yaml_emitter_analyze_scalar(emitter,
+                        event->data.scalar.value, event->data.scalar.length))
+                return 0;
+            return 1;
+
+        case YAML_SEQUENCE_START_EVENT:
+            if (event->data.sequence_start.anchor) {
+                if (!yaml_emitter_analyze_anchor(emitter,
+                            event->data.sequence_start.anchor, 0))
+                    return 0;
+            }
+            if (event->data.sequence_start.tag && (emitter->canonical ||
+                        !event->data.sequence_start.implicit)) {
+                if (!yaml_emitter_analyze_tag(emitter,
+                            event->data.sequence_start.tag))
+                    return 0;
+            }
+            return 1;
+
+        case YAML_MAPPING_START_EVENT:
+            if (event->data.mapping_start.anchor) {
+                if (!yaml_emitter_analyze_anchor(emitter,
+                            event->data.mapping_start.anchor, 0))
+                    return 0;
+            }
+            if (event->data.mapping_start.tag && (emitter->canonical ||
+                        !event->data.mapping_start.implicit)) {
+                if (!yaml_emitter_analyze_tag(emitter,
+                            event->data.mapping_start.tag))
+                    return 0;
+            }
+            return 1;
+
+        default:
+            return 1;
+    }
+}
+
+/*
+ * Write the BOM character.
+ */
+
+static int
+yaml_emitter_write_bom(yaml_emitter_t *emitter)
+{
+    if (!FLUSH(emitter)) return 0;
+
+    *(emitter->buffer.pointer++) = (yaml_char_t) '\xEF';
+    *(emitter->buffer.pointer++) = (yaml_char_t) '\xBB';
+    *(emitter->buffer.pointer++) = (yaml_char_t) '\xBF';
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_indent(yaml_emitter_t *emitter)
+{
+    int indent = (emitter->indent >= 0) ? emitter->indent : 0;
+
+    if (!emitter->indention || emitter->column > indent
+            || (emitter->column == indent && !emitter->whitespace)) {
+        if (!PUT_BREAK(emitter)) return 0;
+    }
+
+    while (emitter->column < indent) {
+        if (!PUT(emitter, ' ')) return 0;
+    }
+
+    emitter->whitespace = 1;
+    emitter->indention = 1;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_indicator(yaml_emitter_t *emitter,
+        char *indicator, int need_whitespace,
+        int is_whitespace, int is_indention)
+{
+    size_t indicator_length;
+    yaml_string_t string;
+
+    indicator_length = strlen(indicator);
+    STRING_ASSIGN(string, (yaml_char_t *)indicator, indicator_length);
+
+    if (need_whitespace && !emitter->whitespace) {
+        if (!PUT(emitter, ' ')) return 0;
+    }
+
+    while (string.pointer != string.end) {
+        if (!WRITE(emitter, string)) return 0;
+    }
+
+    emitter->whitespace = is_whitespace;
+    emitter->indention = (emitter->indention && is_indention);
+    emitter->open_ended = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_anchor(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length)
+{
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
+
+    while (string.pointer != string.end) {
+        if (!WRITE(emitter, string)) return 0;
+    }
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_tag_handle(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length)
+{
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
+
+    if (!emitter->whitespace) {
+        if (!PUT(emitter, ' ')) return 0;
+    }
+
+    while (string.pointer != string.end) {
+        if (!WRITE(emitter, string)) return 0;
+    }
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_tag_content(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length,
+        int need_whitespace)
+{
+    yaml_string_t string;
+    STRING_ASSIGN(string, value, length);
+
+    if (need_whitespace && !emitter->whitespace) {
+        if (!PUT(emitter, ' ')) return 0;
+    }
+
+    while (string.pointer != string.end) {
+        if (IS_ALPHA(string)
+                || CHECK(string, ';') || CHECK(string, '/')
+                || CHECK(string, '?') || CHECK(string, ':')
+                || CHECK(string, '@') || CHECK(string, '&')
+                || CHECK(string, '=') || CHECK(string, '+')
+                || CHECK(string, '$') || CHECK(string, ',')
+                || CHECK(string, '_') || CHECK(string, '.')
+                || CHECK(string, '~') || CHECK(string, '*')
+                || CHECK(string, '\'') || CHECK(string, '(')
+                || CHECK(string, ')') || CHECK(string, '[')
+                || CHECK(string, ']')) {
+            if (!WRITE(emitter, string)) return 0;
+        }
+        else {
+            int width = WIDTH(string);
+            unsigned int value;
+            while (width --) {
+                value = *(string.pointer++);
+                if (!PUT(emitter, '%')) return 0;
+                if (!PUT(emitter, (value >> 4)
+                            + ((value >> 4) < 10 ? '0' : 'A' - 10)))
+                    return 0;
+                if (!PUT(emitter, (value & 0x0F)
+                            + ((value & 0x0F) < 10 ? '0' : 'A' - 10)))
+                    return 0;
+            }
+        }
+    }
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks)
+{
+    yaml_string_t string;
+    int spaces = 0;
+    int breaks = 0;
+
+    STRING_ASSIGN(string, value, length);
+
+    if (!emitter->whitespace) {
+        if (!PUT(emitter, ' ')) return 0;
+    }
+
+    while (string.pointer != string.end)
+    {
+        if (IS_SPACE(string))
+        {
+            if (allow_breaks && !spaces
+                    && emitter->column > emitter->best_width
+                    && !IS_SPACE_AT(string, 1)) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+                MOVE(string);
+            }
+            else {
+                if (!WRITE(emitter, string)) return 0;
+            }
+            spaces = 1;
+        }
+        else if (IS_BREAK(string))
+        {
+            if (!breaks && CHECK(string, '\n')) {
+                if (!PUT_BREAK(emitter)) return 0;
+            }
+            if (!WRITE_BREAK(emitter, string)) return 0;
+            emitter->indention = 1;
+            breaks = 1;
+        }
+        else
+        {
+            if (breaks) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+            }
+            if (!WRITE(emitter, string)) return 0;
+            emitter->indention = 0;
+            spaces = 0;
+            breaks = 0;
+        }
+    }
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks)
+{
+    yaml_string_t string;
+    int spaces = 0;
+    int breaks = 0;
+
+    STRING_ASSIGN(string, value, length);
+
+    if (!yaml_emitter_write_indicator(emitter, "'", 1, 0, 0))
+        return 0;
+
+    while (string.pointer != string.end)
+    {
+        if (IS_SPACE(string))
+        {
+            if (allow_breaks && !spaces
+                    && emitter->column > emitter->best_width
+                    && string.pointer != string.start
+                    && string.pointer != string.end - 1
+                    && !IS_SPACE_AT(string, 1)) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+                MOVE(string);
+            }
+            else {
+                if (!WRITE(emitter, string)) return 0;
+            }
+            spaces = 1;
+        }
+        else if (IS_BREAK(string))
+        {
+            if (!breaks && CHECK(string, '\n')) {
+                if (!PUT_BREAK(emitter)) return 0;
+            }
+            if (!WRITE_BREAK(emitter, string)) return 0;
+            emitter->indention = 1;
+            breaks = 1;
+        }
+        else
+        {
+            if (breaks) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+            }
+            if (CHECK(string, '\'')) {
+                if (!PUT(emitter, '\'')) return 0;
+            }
+            if (!WRITE(emitter, string)) return 0;
+            emitter->indention = 0;
+            spaces = 0;
+            breaks = 0;
+        }
+    }
+
+    if (!yaml_emitter_write_indicator(emitter, "'", 0, 0, 0))
+        return 0;
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_double_quoted_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length, int allow_breaks)
+{
+    yaml_string_t string;
+    int spaces = 0;
+
+    STRING_ASSIGN(string, value, length);
+
+    if (!yaml_emitter_write_indicator(emitter, "\"", 1, 0, 0))
+        return 0;
+
+    while (string.pointer != string.end)
+    {
+        if (!IS_PRINTABLE(string) || (!emitter->unicode && !IS_ASCII(string))
+                || IS_BOM(string) || IS_BREAK(string)
+                || CHECK(string, '"') || CHECK(string, '\\'))
+        {
+            unsigned char octet;
+            unsigned int width;
+            unsigned int value;
+            int k;
+
+            octet = string.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;
+            for (k = 1; k < (int)width; k ++) {
+                octet = string.pointer[k];
+                value = (value << 6) + (octet & 0x3F);
+            }
+            string.pointer += width;
+
+            if (!PUT(emitter, '\\')) return 0;
+
+            switch (value)
+            {
+                case 0x00:
+                    if (!PUT(emitter, '0')) return 0;
+                    break;
+
+                case 0x07:
+                    if (!PUT(emitter, 'a')) return 0;
+                    break;
+
+                case 0x08:
+                    if (!PUT(emitter, 'b')) return 0;
+                    break;
+
+                case 0x09:
+                    if (!PUT(emitter, 't')) return 0;
+                    break;
+
+                case 0x0A:
+                    if (!PUT(emitter, 'n')) return 0;
+                    break;
+
+                case 0x0B:
+                    if (!PUT(emitter, 'v')) return 0;
+                    break;
+
+                case 0x0C:
+                    if (!PUT(emitter, 'f')) return 0;
+                    break;
+
+                case 0x0D:
+                    if (!PUT(emitter, 'r')) return 0;
+                    break;
+
+                case 0x1B:
+                    if (!PUT(emitter, 'e')) return 0;
+                    break;
+
+                case 0x22:
+                    if (!PUT(emitter, '\"')) return 0;
+                    break;
+
+                case 0x5C:
+                    if (!PUT(emitter, '\\')) return 0;
+                    break;
+
+                case 0x85:
+                    if (!PUT(emitter, 'N')) return 0;
+                    break;
+
+                case 0xA0:
+                    if (!PUT(emitter, '_')) return 0;
+                    break;
+
+                case 0x2028:
+                    if (!PUT(emitter, 'L')) return 0;
+                    break;
+
+                case 0x2029:
+                    if (!PUT(emitter, 'P')) return 0;
+                    break;
+
+                default:
+                    if (value <= 0xFF) {
+                        if (!PUT(emitter, 'x')) return 0;
+                        width = 2;
+                    }
+                    else if (value <= 0xFFFF) {
+                        if (!PUT(emitter, 'u')) return 0;
+                        width = 4;
+                    }
+                    else {
+                        if (!PUT(emitter, 'U')) return 0;
+                        width = 8;
+                    }
+                    for (k = (width-1)*4; k >= 0; k -= 4) {
+                        int digit = (value >> k) & 0x0F;
+                        if (!PUT(emitter, digit + (digit < 10 ? '0' : 'A'-10)))
+                            return 0;
+                    }
+            }
+            spaces = 0;
+        }
+        else if (IS_SPACE(string))
+        {
+            if (allow_breaks && !spaces
+                    && emitter->column > emitter->best_width
+                    && string.pointer != string.start
+                    && string.pointer != string.end - 1) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+                if (IS_SPACE_AT(string, 1)) {
+                    if (!PUT(emitter, '\\')) return 0;
+                }
+                MOVE(string);
+            }
+            else {
+                if (!WRITE(emitter, string)) return 0;
+            }
+            spaces = 1;
+        }
+        else
+        {
+            if (!WRITE(emitter, string)) return 0;
+            spaces = 0;
+        }
+    }
+
+    if (!yaml_emitter_write_indicator(emitter, "\"", 0, 0, 0))
+        return 0;
+
+    emitter->whitespace = 0;
+    emitter->indention = 0;
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
+        yaml_string_t string)
+{
+    char indent_hint[2];
+    char *chomp_hint = NULL;
+
+    if (IS_SPACE(string) || IS_BREAK(string))
+    {
+        indent_hint[0] = '0' + (char)emitter->best_indent;
+        indent_hint[1] = '\0';
+        if (!yaml_emitter_write_indicator(emitter, indent_hint, 0, 0, 0))
+            return 0;
+    }
+
+    emitter->open_ended = 0;
+
+    string.pointer = string.end;
+    if (string.start == string.pointer)
+    {
+        chomp_hint = "-";
+    }
+    else
+    {
+        do {
+            string.pointer --;
+        } while ((*string.pointer & 0xC0) == 0x80);
+        if (!IS_BREAK(string))
+        {
+            chomp_hint = "-";
+        }
+        else if (string.start == string.pointer)
+        {
+            chomp_hint = "+";
+            emitter->open_ended = 1;
+        }
+        else
+        {
+            do {
+                string.pointer --;
+            } while ((*string.pointer & 0xC0) == 0x80);
+            if (IS_BREAK(string))
+            {
+                chomp_hint = "+";
+                emitter->open_ended = 1;
+            }
+        }
+    }
+
+    if (chomp_hint)
+    {
+        if (!yaml_emitter_write_indicator(emitter, chomp_hint, 0, 0, 0))
+            return 0;
+    }
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_literal_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length)
+{
+    yaml_string_t string;
+    int breaks = 1;
+
+    STRING_ASSIGN(string, value, length);
+
+    if (!yaml_emitter_write_indicator(emitter, "|", 1, 0, 0))
+        return 0;
+    if (!yaml_emitter_write_block_scalar_hints(emitter, string))
+        return 0;
+    if (!PUT_BREAK(emitter)) return 0;
+    emitter->indention = 1;
+    emitter->whitespace = 1;
+
+    while (string.pointer != string.end)
+    {
+        if (IS_BREAK(string))
+        {
+            if (!WRITE_BREAK(emitter, string)) return 0;
+            emitter->indention = 1;
+            breaks = 1;
+        }
+        else
+        {
+            if (breaks) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+            }
+            if (!WRITE(emitter, string)) return 0;
+            emitter->indention = 0;
+            breaks = 0;
+        }
+    }
+
+    return 1;
+}
+
+static int
+yaml_emitter_write_folded_scalar(yaml_emitter_t *emitter,
+        yaml_char_t *value, size_t length)
+{
+    yaml_string_t string;
+    int breaks = 1;
+    int leading_spaces = 1;
+
+    STRING_ASSIGN(string, value, length);
+
+    if (!yaml_emitter_write_indicator(emitter, ">", 1, 0, 0))
+        return 0;
+    if (!yaml_emitter_write_block_scalar_hints(emitter, string))
+        return 0;
+    if (!PUT_BREAK(emitter)) return 0;
+    emitter->indention = 1;
+    emitter->whitespace = 1;
+
+    while (string.pointer != string.end)
+    {
+        if (IS_BREAK(string))
+        {
+            if (!breaks && !leading_spaces && CHECK(string, '\n')) {
+                int k = 0;
+                while (IS_BREAK_AT(string, k)) {
+                    k += WIDTH_AT(string, k);
+                }
+                if (!IS_BLANKZ_AT(string, k)) {
+                    if (!PUT_BREAK(emitter)) return 0;
+                }
+            }
+            if (!WRITE_BREAK(emitter, string)) return 0;
+            emitter->indention = 1;
+            breaks = 1;
+        }
+        else
+        {
+            if (breaks) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+                leading_spaces = IS_BLANK(string);
+            }
+            if (!breaks && IS_SPACE(string) && !IS_SPACE_AT(string, 1)
+                    && emitter->column > emitter->best_width) {
+                if (!yaml_emitter_write_indent(emitter)) return 0;
+                MOVE(string);
+            }
+            else {
+                if (!WRITE(emitter, string)) return 0;
+            }
+            emitter->indention = 0;
+            breaks = 0;
+        }
+    }
+
+    return 1;
+}
diff --git a/libyaml/src/loader.c b/libyaml/src/loader.c
new file mode 100644
index 0000000..3ba99f0
--- /dev/null
+++ b/libyaml/src/loader.c
@@ -0,0 +1,444 @@
+
+#include "yaml_private.h"
+
+/*
+ * API functions.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document);
+
+/*
+ * Error handling.
+ */
+
+static int
+yaml_parser_set_composer_error(yaml_parser_t *parser,
+        const char *problem, yaml_mark_t problem_mark);
+
+static int
+yaml_parser_set_composer_error_context(yaml_parser_t *parser,
+        const char *context, yaml_mark_t context_mark,
+        const char *problem, yaml_mark_t problem_mark);
+
+
+/*
+ * Alias handling.
+ */
+
+static int
+yaml_parser_register_anchor(yaml_parser_t *parser,
+        int index, yaml_char_t *anchor);
+
+/*
+ * Clean up functions.
+ */
+
+static void
+yaml_parser_delete_aliases(yaml_parser_t *parser);
+
+/*
+ * Composer functions.
+ */
+
+static int
+yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event);
+
+static int
+yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event);
+
+static int
+yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event);
+
+static int
+yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event);
+
+static int
+yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event);
+
+static int
+yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event);
+
+/*
+ * Load the next document of the stream.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_load(yaml_parser_t *parser, yaml_document_t *document)
+{
+    yaml_event_t event;
+
+    assert(parser);     /* Non-NULL parser object is expected. */
+    assert(document);   /* Non-NULL document object is expected. */
+
+    memset(document, 0, sizeof(yaml_document_t));
+    if (!STACK_INIT(parser, document->nodes, INITIAL_STACK_SIZE))
+        goto error;
+
+    if (!parser->stream_start_produced) {
+        if (!yaml_parser_parse(parser, &event)) goto error;
+        assert(event.type == YAML_STREAM_START_EVENT);
+                        /* STREAM-START is expected. */
+    }
+
+    if (parser->stream_end_produced) {
+        return 1;
+    }
+
+    if (!yaml_parser_parse(parser, &event)) goto error;
+    if (event.type == YAML_STREAM_END_EVENT) {
+        return 1;
+    }
+
+    if (!STACK_INIT(parser, parser->aliases, INITIAL_STACK_SIZE))
+        goto error;
+
+    parser->document = document;
+
+    if (!yaml_parser_load_document(parser, &event)) goto error;
+
+    yaml_parser_delete_aliases(parser);
+    parser->document = NULL;
+
+    return 1;
+
+error:
+
+    yaml_parser_delete_aliases(parser);
+    yaml_document_delete(document);
+    parser->document = NULL;
+
+    return 0;
+}
+
+/*
+ * Set composer error.
+ */
+
+static int
+yaml_parser_set_composer_error(yaml_parser_t *parser,
+        const char *problem, yaml_mark_t problem_mark)
+{
+    parser->error = YAML_COMPOSER_ERROR;
+    parser->problem = problem;
+    parser->problem_mark = problem_mark;
+
+    return 0;
+}
+
+/*
+ * Set composer error with context.
+ */
+
+static int
+yaml_parser_set_composer_error_context(yaml_parser_t *parser,
+        const char *context, yaml_mark_t context_mark,
+        const char *problem, yaml_mark_t problem_mark)
+{
+    parser->error = YAML_COMPOSER_ERROR;
+    parser->context = context;
+    parser->context_mark = context_mark;
+    parser->problem = problem;
+    parser->problem_mark = problem_mark;
+
+    return 0;
+}
+
+/*
+ * Delete the stack of aliases.
+ */
+
+static void
+yaml_parser_delete_aliases(yaml_parser_t *parser)
+{
+    while (!STACK_EMPTY(parser, parser->aliases)) {
+        yaml_free(POP(parser, parser->aliases).anchor);
+    }
+    STACK_DEL(parser, parser->aliases);
+}
+
+/*
+ * Compose a document object.
+ */
+
+static int
+yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    yaml_event_t event;
+
+    assert(first_event->type == YAML_DOCUMENT_START_EVENT);
+                        /* DOCUMENT-START is expected. */
+
+    parser->document->version_directive
+        = first_event->data.document_start.version_directive;
+    parser->document->tag_directives.start
+        = first_event->data.document_start.tag_directives.start;
+    parser->document->tag_directives.end
+        = first_event->data.document_start.tag_directives.end;
+    parser->document->start_implicit
+        = first_event->data.document_start.implicit;
+    parser->document->start_mark = first_event->start_mark;
+
+    if (!yaml_parser_parse(parser, &event)) return 0;
+
+    if (!yaml_parser_load_node(parser, &event)) return 0;
+
+    if (!yaml_parser_parse(parser, &event)) return 0;
+    assert(event.type == YAML_DOCUMENT_END_EVENT);
+                        /* DOCUMENT-END is expected. */
+
+    parser->document->end_implicit = event.data.document_end.implicit;
+    parser->document->end_mark = event.end_mark;
+
+    return 1;
+}
+
+/*
+ * Compose a node.
+ */
+
+static int
+yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    switch (first_event->type) {
+        case YAML_ALIAS_EVENT:
+            return yaml_parser_load_alias(parser, first_event);
+        case YAML_SCALAR_EVENT:
+            return yaml_parser_load_scalar(parser, first_event);
+        case YAML_SEQUENCE_START_EVENT:
+            return yaml_parser_load_sequence(parser, first_event);
+        case YAML_MAPPING_START_EVENT:
+            return yaml_parser_load_mapping(parser, first_event);
+        default:
+            assert(0);  /* Could not happen. */
+            return 0;
+    }
+
+    return 0;
+}
+
+/*
+ * Add an anchor.
+ */
+
+static int
+yaml_parser_register_anchor(yaml_parser_t *parser,
+        int index, yaml_char_t *anchor)
+{
+    yaml_alias_data_t data;
+    yaml_alias_data_t *alias_data;
+
+    if (!anchor) return 1;
+
+    data.anchor = anchor;
+    data.index = index;
+    data.mark = parser->document->nodes.start[index-1].start_mark;
+
+    for (alias_data = parser->aliases.start;
+            alias_data != parser->aliases.top; alias_data ++) {
+        if (strcmp((char *)alias_data->anchor, (char *)anchor) == 0) {
+            yaml_free(anchor);
+            return yaml_parser_set_composer_error_context(parser,
+                    "found duplicate anchor; first occurrence",
+                    alias_data->mark, "second occurrence", data.mark);
+        }
+    }
+
+    if (!PUSH(parser, parser->aliases, data)) {
+        yaml_free(anchor);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Compose a node corresponding to an alias.
+ */
+
+static int
+yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    yaml_char_t *anchor = first_event->data.alias.anchor;
+    yaml_alias_data_t *alias_data;
+
+    for (alias_data = parser->aliases.start;
+            alias_data != parser->aliases.top; alias_data ++) {
+        if (strcmp((char *)alias_data->anchor, (char *)anchor) == 0) {
+            yaml_free(anchor);
+            return alias_data->index;
+        }
+    }
+
+    yaml_free(anchor);
+    return yaml_parser_set_composer_error(parser, "found undefined alias",
+            first_event->start_mark);
+}
+
+/*
+ * Compose a scalar node.
+ */
+
+static int
+yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    yaml_node_t node;
+    int index;
+    yaml_char_t *tag = first_event->data.scalar.tag;
+
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
+    if (!tag || strcmp((char *)tag, "!") == 0) {
+        yaml_free(tag);
+        tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SCALAR_TAG);
+        if (!tag) goto error;
+    }
+
+    SCALAR_NODE_INIT(node, tag, first_event->data.scalar.value,
+            first_event->data.scalar.length, first_event->data.scalar.style,
+            first_event->start_mark, first_event->end_mark);
+
+    if (!PUSH(parser, parser->document->nodes, node)) goto error;
+
+    index = parser->document->nodes.top - parser->document->nodes.start;
+
+    if (!yaml_parser_register_anchor(parser, index,
+                first_event->data.scalar.anchor)) return 0;
+
+    return index;
+
+error:
+    yaml_free(tag);
+    yaml_free(first_event->data.scalar.anchor);
+    yaml_free(first_event->data.scalar.value);
+    return 0;
+}
+
+/*
+ * Compose a sequence node.
+ */
+
+static int
+yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    yaml_event_t event;
+    yaml_node_t node;
+    struct {
+        yaml_node_item_t *start;
+        yaml_node_item_t *end;
+        yaml_node_item_t *top;
+    } items = { NULL, NULL, NULL };
+    int index, item_index;
+    yaml_char_t *tag = first_event->data.sequence_start.tag;
+
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
+    if (!tag || strcmp((char *)tag, "!") == 0) {
+        yaml_free(tag);
+        tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG);
+        if (!tag) goto error;
+    }
+
+    if (!STACK_INIT(parser, items, INITIAL_STACK_SIZE)) goto error;
+
+    SEQUENCE_NODE_INIT(node, tag, items.start, items.end,
+            first_event->data.sequence_start.style,
+            first_event->start_mark, first_event->end_mark);
+
+    if (!PUSH(parser, parser->document->nodes, node)) goto error;
+
+    index = parser->document->nodes.top - parser->document->nodes.start;
+
+    if (!yaml_parser_register_anchor(parser, index,
+                first_event->data.sequence_start.anchor)) return 0;
+
+    if (!yaml_parser_parse(parser, &event)) return 0;
+
+    while (event.type != YAML_SEQUENCE_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    INT_MAX-1)) return 0;
+        item_index = yaml_parser_load_node(parser, &event);
+        if (!item_index) return 0;
+        if (!PUSH(parser,
+                    parser->document->nodes.start[index-1].data.sequence.items,
+                    item_index)) return 0;
+        if (!yaml_parser_parse(parser, &event)) return 0;
+    }
+
+    parser->document->nodes.start[index-1].end_mark = event.end_mark;
+
+    return index;
+
+error:
+    yaml_free(tag);
+    yaml_free(first_event->data.sequence_start.anchor);
+    return 0;
+}
+
+/*
+ * Compose a mapping node.
+ */
+
+static int
+yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
+{
+    yaml_event_t event;
+    yaml_node_t node;
+    struct {
+        yaml_node_pair_t *start;
+        yaml_node_pair_t *end;
+        yaml_node_pair_t *top;
+    } pairs = { NULL, NULL, NULL };
+    int index;
+    yaml_node_pair_t pair;
+    yaml_char_t *tag = first_event->data.mapping_start.tag;
+
+    if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
+
+    if (!tag || strcmp((char *)tag, "!") == 0) {
+        yaml_free(tag);
+        tag = yaml_strdup((yaml_char_t *)YAML_DEFAULT_MAPPING_TAG);
+        if (!tag) goto error;
+    }
+
+    if (!STACK_INIT(parser, pairs, INITIAL_STACK_SIZE)) goto error;
+
+    MAPPING_NODE_INIT(node, tag, pairs.start, pairs.end,
+            first_event->data.mapping_start.style,
+            first_event->start_mark, first_event->end_mark);
+
+    if (!PUSH(parser, parser->document->nodes, node)) goto error;
+
+    index = parser->document->nodes.top - parser->document->nodes.start;
+
+    if (!yaml_parser_register_anchor(parser, index,
+                first_event->data.mapping_start.anchor)) return 0;
+
+    if (!yaml_parser_parse(parser, &event)) return 0;
+
+    while (event.type != YAML_MAPPING_END_EVENT) {
+        if (!STACK_LIMIT(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    INT_MAX-1)) return 0;
+        pair.key = yaml_parser_load_node(parser, &event);
+        if (!pair.key) return 0;
+        if (!yaml_parser_parse(parser, &event)) return 0;
+        pair.value = yaml_parser_load_node(parser, &event);
+        if (!pair.value) return 0;
+        if (!PUSH(parser,
+                    parser->document->nodes.start[index-1].data.mapping.pairs,
+                    pair)) return 0;
+        if (!yaml_parser_parse(parser, &event)) return 0;
+    }
+
+    parser->document->nodes.start[index-1].end_mark = event.end_mark;
+
+    return index;
+
+error:
+    yaml_free(tag);
+    yaml_free(first_event->data.mapping_start.anchor);
+    return 0;
+}
+
diff --git a/libyaml/src/parser.c b/libyaml/src/parser.c
new file mode 100644
index 0000000..dc5430b
--- /dev/null
+++ b/libyaml/src/parser.c
@@ -0,0 +1,1374 @@
+
+/*
+ * The parser implements the following grammar:
+ *
+ * stream               ::= STREAM-START implicit_document? explicit_document* STREAM-END
+ * implicit_document    ::= block_node DOCUMENT-END*
+ * explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+ * block_node_or_indentless_sequence    ::=
+ *                          ALIAS
+ *                          | properties (block_content | indentless_block_sequence)?
+ *                          | block_content
+ *                          | indentless_block_sequence
+ * block_node           ::= ALIAS
+ *                          | properties block_content?
+ *                          | block_content
+ * flow_node            ::= ALIAS
+ *                          | properties flow_content?
+ *                          | flow_content
+ * properties           ::= TAG ANCHOR? | ANCHOR TAG?
+ * block_content        ::= block_collection | flow_collection | SCALAR
+ * flow_content         ::= flow_collection | SCALAR
+ * block_collection     ::= block_sequence | block_mapping
+ * flow_collection      ::= flow_sequence | flow_mapping
+ * block_sequence       ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+ * indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
+ * block_mapping        ::= BLOCK-MAPPING_START
+ *                          ((KEY block_node_or_indentless_sequence?)?
+ *                          (VALUE block_node_or_indentless_sequence?)?)*
+ *                          BLOCK-END
+ * flow_sequence        ::= FLOW-SEQUENCE-START
+ *                          (flow_sequence_entry FLOW-ENTRY)*
+ *                          flow_sequence_entry?
+ *                          FLOW-SEQUENCE-END
+ * flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ * flow_mapping         ::= FLOW-MAPPING-START
+ *                          (flow_mapping_entry FLOW-ENTRY)*
+ *                          flow_mapping_entry?
+ *                          FLOW-MAPPING-END
+ * flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ */
+
+#include "yaml_private.h"
+
+/*
+ * Peek the next token in the token queue.
+ */
+
+#define PEEK_TOKEN(parser)                                                      \
+    ((parser->token_available || yaml_parser_fetch_more_tokens(parser)) ?       \
+        parser->tokens.head : NULL)
+
+/*
+ * Remove the next token from the queue (must be called after PEEK_TOKEN).
+ */
+
+#define SKIP_TOKEN(parser)                                                      \
+    (parser->token_available = 0,                                               \
+     parser->tokens_parsed ++,                                                  \
+     parser->stream_end_produced =                                              \
+        (parser->tokens.head->type == YAML_STREAM_END_TOKEN),                   \
+     parser->tokens.head ++)
+
+/*
+ * Public API declarations.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
+
+/*
+ * Error handling.
+ */
+
+static int
+yaml_parser_set_parser_error(yaml_parser_t *parser,
+        const char *problem, yaml_mark_t problem_mark);
+
+static int
+yaml_parser_set_parser_error_context(yaml_parser_t *parser,
+        const char *context, yaml_mark_t context_mark,
+        const char *problem, yaml_mark_t problem_mark);
+
+/*
+ * State functions.
+ */
+
+static int
+yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event);
+
+static int
+yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event);
+
+static int
+yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
+        int implicit);
+
+static int
+yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event);
+
+static int
+yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event);
+
+static int
+yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
+        int block, int indentless_sequence);
+
+static int
+yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event, int first);
+
+static int
+yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event);
+
+static int
+yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event, int first);
+
+static int
+yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event);
+
+static int
+yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event, int first);
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event);
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event);
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
+        yaml_event_t *event);
+
+static int
+yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event, int first);
+
+static int
+yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event, int empty);
+
+/*
+ * Utility functions.
+ */
+
+static int
+yaml_parser_process_empty_scalar(yaml_parser_t *parser,
+        yaml_event_t *event, yaml_mark_t mark);
+
+static int
+yaml_parser_process_directives(yaml_parser_t *parser,
+        yaml_version_directive_t **version_directive_ref,
+        yaml_tag_directive_t **tag_directives_start_ref,
+        yaml_tag_directive_t **tag_directives_end_ref);
+
+static int
+yaml_parser_append_tag_directive(yaml_parser_t *parser,
+        yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark);
+
+/*
+ * Get the next event.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event)
+{
+    assert(parser);     /* Non-NULL parser object is expected. */
+    assert(event);      /* Non-NULL event object is expected. */
+
+    /* Erase the event object. */
+
+    memset(event, 0, sizeof(yaml_event_t));
+
+    /* No events after the end of the stream or error. */
+
+    if (parser->stream_end_produced || parser->error ||
+            parser->state == YAML_PARSE_END_STATE) {
+        return 1;
+    }
+
+    /* Generate the next event. */
+
+    return yaml_parser_state_machine(parser, event);
+}
+
+/*
+ * Set parser error.
+ */
+
+static int
+yaml_parser_set_parser_error(yaml_parser_t *parser,
+        const char *problem, yaml_mark_t problem_mark)
+{
+    parser->error = YAML_PARSER_ERROR;
+    parser->problem = problem;
+    parser->problem_mark = problem_mark;
+
+    return 0;
+}
+
+static int
+yaml_parser_set_parser_error_context(yaml_parser_t *parser,
+        const char *context, yaml_mark_t context_mark,
+        const char *problem, yaml_mark_t problem_mark)
+{
+    parser->error = YAML_PARSER_ERROR;
+    parser->context = context;
+    parser->context_mark = context_mark;
+    parser->problem = problem;
+    parser->problem_mark = problem_mark;
+
+    return 0;
+}
+
+
+/*
+ * State dispatcher.
+ */
+
+static int
+yaml_parser_state_machine(yaml_parser_t *parser, yaml_event_t *event)
+{
+    switch (parser->state)
+    {
+        case YAML_PARSE_STREAM_START_STATE:
+            return yaml_parser_parse_stream_start(parser, event);
+
+        case YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE:
+            return yaml_parser_parse_document_start(parser, event, 1);
+
+        case YAML_PARSE_DOCUMENT_START_STATE:
+            return yaml_parser_parse_document_start(parser, event, 0);
+
+        case YAML_PARSE_DOCUMENT_CONTENT_STATE:
+            return yaml_parser_parse_document_content(parser, event);
+
+        case YAML_PARSE_DOCUMENT_END_STATE:
+            return yaml_parser_parse_document_end(parser, event);
+
+        case YAML_PARSE_BLOCK_NODE_STATE:
+            return yaml_parser_parse_node(parser, event, 1, 0);
+
+        case YAML_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
+            return yaml_parser_parse_node(parser, event, 1, 1);
+
+        case YAML_PARSE_FLOW_NODE_STATE:
+            return yaml_parser_parse_node(parser, event, 0, 0);
+
+        case YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
+            return yaml_parser_parse_block_sequence_entry(parser, event, 1);
+
+        case YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
+            return yaml_parser_parse_block_sequence_entry(parser, event, 0);
+
+        case YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
+            return yaml_parser_parse_indentless_sequence_entry(parser, event);
+
+        case YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
+            return yaml_parser_parse_block_mapping_key(parser, event, 1);
+
+        case YAML_PARSE_BLOCK_MAPPING_KEY_STATE:
+            return yaml_parser_parse_block_mapping_key(parser, event, 0);
+
+        case YAML_PARSE_BLOCK_MAPPING_VALUE_STATE:
+            return yaml_parser_parse_block_mapping_value(parser, event);
+
+        case YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
+            return yaml_parser_parse_flow_sequence_entry(parser, event, 1);
+
+        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
+            return yaml_parser_parse_flow_sequence_entry(parser, event, 0);
+
+        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
+            return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event);
+
+        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
+            return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event);
+
+        case YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
+            return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event);
+
+        case YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
+            return yaml_parser_parse_flow_mapping_key(parser, event, 1);
+
+        case YAML_PARSE_FLOW_MAPPING_KEY_STATE:
+            return yaml_parser_parse_flow_mapping_key(parser, event, 0);
+
+        case YAML_PARSE_FLOW_MAPPING_VALUE_STATE:
+            return yaml_parser_parse_flow_mapping_value(parser, event, 0);
+
+        case YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
+            return yaml_parser_parse_flow_mapping_value(parser, event, 1);
+
+        default:
+            assert(1);      /* Invalid state. */
+    }
+
+    return 0;
+}
+
+/*
+ * Parse the production:
+ * stream   ::= STREAM-START implicit_document? explicit_document* STREAM-END
+ *              ************
+ */
+
+static int
+yaml_parser_parse_stream_start(yaml_parser_t *parser, yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type != YAML_STREAM_START_TOKEN) {
+        return yaml_parser_set_parser_error(parser,
+                "did not find expected <stream-start>", token->start_mark);
+    }
+
+    parser->state = YAML_PARSE_IMPLICIT_DOCUMENT_START_STATE;
+    STREAM_START_EVENT_INIT(*event, token->data.stream_start.encoding,
+            token->start_mark, token->start_mark);
+    SKIP_TOKEN(parser);
+
+    return 1;
+}
+
+/*
+ * Parse the productions:
+ * implicit_document    ::= block_node DOCUMENT-END*
+ *                          *
+ * explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+ *                          *************************
+ */
+
+static int
+yaml_parser_parse_document_start(yaml_parser_t *parser, yaml_event_t *event,
+        int implicit)
+{
+    yaml_token_t *token;
+    yaml_version_directive_t *version_directive = NULL;
+    struct {
+        yaml_tag_directive_t *start;
+        yaml_tag_directive_t *end;
+    } tag_directives = { NULL, NULL };
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    /* Parse extra document end indicators. */
+
+    if (!implicit)
+    {
+        while (token->type == YAML_DOCUMENT_END_TOKEN) {
+            SKIP_TOKEN(parser);
+            token = PEEK_TOKEN(parser);
+            if (!token) return 0;
+        }
+    }
+
+    /* Parse an implicit document. */
+
+    if (implicit && token->type != YAML_VERSION_DIRECTIVE_TOKEN &&
+            token->type != YAML_TAG_DIRECTIVE_TOKEN &&
+            token->type != YAML_DOCUMENT_START_TOKEN &&
+            token->type != YAML_STREAM_END_TOKEN)
+    {
+        if (!yaml_parser_process_directives(parser, NULL, NULL, NULL))
+            return 0;
+        if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
+            return 0;
+        parser->state = YAML_PARSE_BLOCK_NODE_STATE;
+        DOCUMENT_START_EVENT_INIT(*event, NULL, NULL, NULL, 1,
+                token->start_mark, token->start_mark);
+        return 1;
+    }
+
+    /* Parse an explicit document. */
+
+    else if (token->type != YAML_STREAM_END_TOKEN)
+    {
+        yaml_mark_t start_mark, end_mark;
+        start_mark = token->start_mark;
+        if (!yaml_parser_process_directives(parser, &version_directive,
+                    &tag_directives.start, &tag_directives.end))
+            return 0;
+        token = PEEK_TOKEN(parser);
+        if (!token) goto error;
+        if (token->type != YAML_DOCUMENT_START_TOKEN) {
+            yaml_parser_set_parser_error(parser,
+                    "did not find expected <document start>", token->start_mark);
+            goto error;
+        }
+        if (!PUSH(parser, parser->states, YAML_PARSE_DOCUMENT_END_STATE))
+            goto error;
+        parser->state = YAML_PARSE_DOCUMENT_CONTENT_STATE;
+        end_mark = token->end_mark;
+        DOCUMENT_START_EVENT_INIT(*event, version_directive,
+                tag_directives.start, tag_directives.end, 0,
+                start_mark, end_mark);
+        SKIP_TOKEN(parser);
+        version_directive = NULL;
+        tag_directives.start = tag_directives.end = NULL;
+        return 1;
+    }
+
+    /* Parse the stream end. */
+
+    else
+    {
+        parser->state = YAML_PARSE_END_STATE;
+        STREAM_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
+        SKIP_TOKEN(parser);
+        return 1;
+    }
+
+error:
+    yaml_free(version_directive);
+    while (tag_directives.start != tag_directives.end) {
+        yaml_free(tag_directives.end[-1].handle);
+        yaml_free(tag_directives.end[-1].prefix);
+        tag_directives.end --;
+    }
+    yaml_free(tag_directives.start);
+    return 0;
+}
+
+/*
+ * Parse the productions:
+ * explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+ *                                                    ***********
+ */
+
+static int
+yaml_parser_parse_document_content(yaml_parser_t *parser, yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
+            token->type == YAML_TAG_DIRECTIVE_TOKEN ||
+            token->type == YAML_DOCUMENT_START_TOKEN ||
+            token->type == YAML_DOCUMENT_END_TOKEN ||
+            token->type == YAML_STREAM_END_TOKEN) {
+        parser->state = POP(parser, parser->states);
+        return yaml_parser_process_empty_scalar(parser, event,
+                token->start_mark);
+    }
+    else {
+        return yaml_parser_parse_node(parser, event, 1, 0);
+    }
+}
+
+/*
+ * Parse the productions:
+ * implicit_document    ::= block_node DOCUMENT-END*
+ *                                     *************
+ * explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
+ *                                                                *************
+ */
+
+static int
+yaml_parser_parse_document_end(yaml_parser_t *parser, yaml_event_t *event)
+{
+    yaml_token_t *token;
+    yaml_mark_t start_mark, end_mark;
+    int implicit = 1;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    start_mark = end_mark = token->start_mark;
+
+    if (token->type == YAML_DOCUMENT_END_TOKEN) {
+        end_mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        implicit = 0;
+    }
+
+    while (!STACK_EMPTY(parser, parser->tag_directives)) {
+        yaml_tag_directive_t tag_directive = POP(parser, parser->tag_directives);
+        yaml_free(tag_directive.handle);
+        yaml_free(tag_directive.prefix);
+    }
+
+    parser->state = YAML_PARSE_DOCUMENT_START_STATE;
+    DOCUMENT_END_EVENT_INIT(*event, implicit, start_mark, end_mark);
+
+    return 1;
+}
+
+/*
+ * Parse the productions:
+ * block_node_or_indentless_sequence    ::=
+ *                          ALIAS
+ *                          *****
+ *                          | properties (block_content | indentless_block_sequence)?
+ *                            **********  *
+ *                          | block_content | indentless_block_sequence
+ *                            *
+ * block_node           ::= ALIAS
+ *                          *****
+ *                          | properties block_content?
+ *                            ********** *
+ *                          | block_content
+ *                            *
+ * flow_node            ::= ALIAS
+ *                          *****
+ *                          | properties flow_content?
+ *                            ********** *
+ *                          | flow_content
+ *                            *
+ * properties           ::= TAG ANCHOR? | ANCHOR TAG?
+ *                          *************************
+ * block_content        ::= block_collection | flow_collection | SCALAR
+ *                                                               ******
+ * flow_content         ::= flow_collection | SCALAR
+ *                                            ******
+ */
+
+static int
+yaml_parser_parse_node(yaml_parser_t *parser, yaml_event_t *event,
+        int block, int indentless_sequence)
+{
+    yaml_token_t *token;
+    yaml_char_t *anchor = NULL;
+    yaml_char_t *tag_handle = NULL;
+    yaml_char_t *tag_suffix = NULL;
+    yaml_char_t *tag = NULL;
+    yaml_mark_t start_mark, end_mark, tag_mark;
+    int implicit;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_ALIAS_TOKEN)
+    {
+        parser->state = POP(parser, parser->states);
+        ALIAS_EVENT_INIT(*event, token->data.alias.value,
+                token->start_mark, token->end_mark);
+        SKIP_TOKEN(parser);
+        return 1;
+    }
+
+    else
+    {
+        start_mark = end_mark = token->start_mark;
+
+        if (token->type == YAML_ANCHOR_TOKEN)
+        {
+            anchor = token->data.anchor.value;
+            start_mark = token->start_mark;
+            end_mark = token->end_mark;
+            SKIP_TOKEN(parser);
+            token = PEEK_TOKEN(parser);
+            if (!token) goto error;
+            if (token->type == YAML_TAG_TOKEN)
+            {
+                tag_handle = token->data.tag.handle;
+                tag_suffix = token->data.tag.suffix;
+                tag_mark = token->start_mark;
+                end_mark = token->end_mark;
+                SKIP_TOKEN(parser);
+                token = PEEK_TOKEN(parser);
+                if (!token) goto error;
+            }
+        }
+        else if (token->type == YAML_TAG_TOKEN)
+        {
+            tag_handle = token->data.tag.handle;
+            tag_suffix = token->data.tag.suffix;
+            start_mark = tag_mark = token->start_mark;
+            end_mark = token->end_mark;
+            SKIP_TOKEN(parser);
+            token = PEEK_TOKEN(parser);
+            if (!token) goto error;
+            if (token->type == YAML_ANCHOR_TOKEN)
+            {
+                anchor = token->data.anchor.value;
+                end_mark = token->end_mark;
+                SKIP_TOKEN(parser);
+                token = PEEK_TOKEN(parser);
+                if (!token) goto error;
+            }
+        }
+
+        if (tag_handle) {
+            if (!*tag_handle) {
+                tag = tag_suffix;
+                yaml_free(tag_handle);
+                tag_handle = tag_suffix = NULL;
+            }
+            else {
+                yaml_tag_directive_t *tag_directive;
+                for (tag_directive = parser->tag_directives.start;
+                        tag_directive != parser->tag_directives.top;
+                        tag_directive ++) {
+                    if (strcmp((char *)tag_directive->handle, (char *)tag_handle) == 0) {
+                        size_t prefix_len = strlen((char *)tag_directive->prefix);
+                        size_t suffix_len = strlen((char *)tag_suffix);
+                        tag = yaml_malloc(prefix_len+suffix_len+1);
+                        if (!tag) {
+                            parser->error = YAML_MEMORY_ERROR;
+                            goto error;
+                        }
+                        memcpy(tag, tag_directive->prefix, prefix_len);
+                        memcpy(tag+prefix_len, tag_suffix, suffix_len);
+                        tag[prefix_len+suffix_len] = '\0';
+                        yaml_free(tag_handle);
+                        yaml_free(tag_suffix);
+                        tag_handle = tag_suffix = NULL;
+                        break;
+                    }
+                }
+                if (!tag) {
+                    yaml_parser_set_parser_error_context(parser,
+                            "while parsing a node", start_mark,
+                            "found undefined tag handle", tag_mark);
+                    goto error;
+                }
+            }
+        }
+
+        implicit = (!tag || !*tag);
+        if (indentless_sequence && token->type == YAML_BLOCK_ENTRY_TOKEN) {
+            end_mark = token->end_mark;
+            parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
+            SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
+                    YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
+            return 1;
+        }
+        else {
+            if (token->type == YAML_SCALAR_TOKEN) {
+                int plain_implicit = 0;
+                int quoted_implicit = 0;
+                end_mark = token->end_mark;
+                if ((token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE && !tag)
+                        || (tag && strcmp((char *)tag, "!") == 0)) {
+                    plain_implicit = 1;
+                }
+                else if (!tag) {
+                    quoted_implicit = 1;
+                }
+                parser->state = POP(parser, parser->states);
+                SCALAR_EVENT_INIT(*event, anchor, tag,
+                        token->data.scalar.value, token->data.scalar.length,
+                        plain_implicit, quoted_implicit,
+                        token->data.scalar.style, start_mark, end_mark);
+                SKIP_TOKEN(parser);
+                return 1;
+            }
+            else if (token->type == YAML_FLOW_SEQUENCE_START_TOKEN) {
+                end_mark = token->end_mark;
+                parser->state = YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE;
+                SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
+                        YAML_FLOW_SEQUENCE_STYLE, start_mark, end_mark);
+                return 1;
+            }
+            else if (token->type == YAML_FLOW_MAPPING_START_TOKEN) {
+                end_mark = token->end_mark;
+                parser->state = YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE;
+                MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
+                        YAML_FLOW_MAPPING_STYLE, start_mark, end_mark);
+                return 1;
+            }
+            else if (block && token->type == YAML_BLOCK_SEQUENCE_START_TOKEN) {
+                end_mark = token->end_mark;
+                parser->state = YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE;
+                SEQUENCE_START_EVENT_INIT(*event, anchor, tag, implicit,
+                        YAML_BLOCK_SEQUENCE_STYLE, start_mark, end_mark);
+                return 1;
+            }
+            else if (block && token->type == YAML_BLOCK_MAPPING_START_TOKEN) {
+                end_mark = token->end_mark;
+                parser->state = YAML_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE;
+                MAPPING_START_EVENT_INIT(*event, anchor, tag, implicit,
+                        YAML_BLOCK_MAPPING_STYLE, start_mark, end_mark);
+                return 1;
+            }
+            else if (anchor || tag) {
+                yaml_char_t *value = yaml_malloc(1);
+                if (!value) {
+                    parser->error = YAML_MEMORY_ERROR;
+                    goto error;
+                }
+                value[0] = '\0';
+                parser->state = POP(parser, parser->states);
+                SCALAR_EVENT_INIT(*event, anchor, tag, value, 0,
+                        implicit, 0, YAML_PLAIN_SCALAR_STYLE,
+                        start_mark, end_mark);
+                return 1;
+            }
+            else {
+                yaml_parser_set_parser_error_context(parser,
+                        (block ? "while parsing a block node"
+                         : "while parsing a flow node"), start_mark,
+                        "did not find expected node content", token->start_mark);
+                goto error;
+            }
+        }
+    }
+
+error:
+    yaml_free(anchor);
+    yaml_free(tag_handle);
+    yaml_free(tag_suffix);
+    yaml_free(tag);
+
+    return 0;
+}
+
+/*
+ * Parse the productions:
+ * block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
+ *                    ********************  *********** *             *********
+ */
+
+static int
+yaml_parser_parse_block_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event, int first)
+{
+    yaml_token_t *token;
+
+    if (first) {
+        token = PEEK_TOKEN(parser);
+        if (!PUSH(parser, parser->marks, token->start_mark))
+            return 0;
+        SKIP_TOKEN(parser);
+    }
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_BLOCK_ENTRY_TOKEN)
+    {
+        yaml_mark_t mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
+                token->type != YAML_BLOCK_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 1, 0);
+        }
+        else {
+            parser->state = YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE;
+            return yaml_parser_process_empty_scalar(parser, event, mark);
+        }
+    }
+
+    else if (token->type == YAML_BLOCK_END_TOKEN)
+    {
+        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
+        parser->state = POP(parser, parser->states);
+        dummy_mark = POP(parser, parser->marks);
+        SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
+        SKIP_TOKEN(parser);
+        return 1;
+    }
+
+    else
+    {
+        return yaml_parser_set_parser_error_context(parser,
+                "while parsing a block collection", POP(parser, parser->marks),
+                "did not find expected '-' indicator", token->start_mark);
+    }
+}
+
+/*
+ * Parse the productions:
+ * indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
+ *                           *********** *
+ */
+
+static int
+yaml_parser_parse_indentless_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_BLOCK_ENTRY_TOKEN)
+    {
+        yaml_mark_t mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_BLOCK_ENTRY_TOKEN &&
+                token->type != YAML_KEY_TOKEN &&
+                token->type != YAML_VALUE_TOKEN &&
+                token->type != YAML_BLOCK_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 1, 0);
+        }
+        else {
+            parser->state = YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE;
+            return yaml_parser_process_empty_scalar(parser, event, mark);
+        }
+    }
+
+    else
+    {
+        parser->state = POP(parser, parser->states);
+        SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
+        return 1;
+    }
+}
+
+/*
+ * Parse the productions:
+ * block_mapping        ::= BLOCK-MAPPING_START
+ *                          *******************
+ *                          ((KEY block_node_or_indentless_sequence?)?
+ *                            *** *
+ *                          (VALUE block_node_or_indentless_sequence?)?)*
+ *
+ *                          BLOCK-END
+ *                          *********
+ */
+
+static int
+yaml_parser_parse_block_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event, int first)
+{
+    yaml_token_t *token;
+
+    if (first) {
+        token = PEEK_TOKEN(parser);
+        if (!PUSH(parser, parser->marks, token->start_mark))
+            return 0;
+        SKIP_TOKEN(parser);
+    }
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_KEY_TOKEN)
+    {
+        yaml_mark_t mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_KEY_TOKEN &&
+                token->type != YAML_VALUE_TOKEN &&
+                token->type != YAML_BLOCK_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_BLOCK_MAPPING_VALUE_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 1, 1);
+        }
+        else {
+            parser->state = YAML_PARSE_BLOCK_MAPPING_VALUE_STATE;
+            return yaml_parser_process_empty_scalar(parser, event, mark);
+        }
+    }
+
+    else if (token->type == YAML_BLOCK_END_TOKEN)
+    {
+        yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
+        parser->state = POP(parser, parser->states);
+        dummy_mark = POP(parser, parser->marks);
+        MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
+        SKIP_TOKEN(parser);
+        return 1;
+    }
+
+    else
+    {
+        return yaml_parser_set_parser_error_context(parser,
+                "while parsing a block mapping", POP(parser, parser->marks),
+                "did not find expected key", token->start_mark);
+    }
+}
+
+/*
+ * Parse the productions:
+ * block_mapping        ::= BLOCK-MAPPING_START
+ *
+ *                          ((KEY block_node_or_indentless_sequence?)?
+ *
+ *                          (VALUE block_node_or_indentless_sequence?)?)*
+ *                           ***** *
+ *                          BLOCK-END
+ *
+ */
+
+static int
+yaml_parser_parse_block_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_VALUE_TOKEN)
+    {
+        yaml_mark_t mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_KEY_TOKEN &&
+                token->type != YAML_VALUE_TOKEN &&
+                token->type != YAML_BLOCK_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_BLOCK_MAPPING_KEY_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 1, 1);
+        }
+        else {
+            parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
+            return yaml_parser_process_empty_scalar(parser, event, mark);
+        }
+    }
+
+    else
+    {
+        parser->state = YAML_PARSE_BLOCK_MAPPING_KEY_STATE;
+        return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
+    }
+}
+
+/*
+ * Parse the productions:
+ * flow_sequence        ::= FLOW-SEQUENCE-START
+ *                          *******************
+ *                          (flow_sequence_entry FLOW-ENTRY)*
+ *                           *                   **********
+ *                          flow_sequence_entry?
+ *                          *
+ *                          FLOW-SEQUENCE-END
+ *                          *****************
+ * flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                          *
+ */
+
+static int
+yaml_parser_parse_flow_sequence_entry(yaml_parser_t *parser,
+        yaml_event_t *event, int first)
+{
+    yaml_token_t *token;
+    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
+
+    if (first) {
+        token = PEEK_TOKEN(parser);
+        if (!PUSH(parser, parser->marks, token->start_mark))
+            return 0;
+        SKIP_TOKEN(parser);
+    }
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN)
+    {
+        if (!first) {
+            if (token->type == YAML_FLOW_ENTRY_TOKEN) {
+                SKIP_TOKEN(parser);
+                token = PEEK_TOKEN(parser);
+                if (!token) return 0;
+            }
+            else {
+                return yaml_parser_set_parser_error_context(parser,
+                        "while parsing a flow sequence", POP(parser, parser->marks),
+                        "did not find expected ',' or ']'", token->start_mark);
+            }
+        }
+
+        if (token->type == YAML_KEY_TOKEN) {
+            parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE;
+            MAPPING_START_EVENT_INIT(*event, NULL, NULL,
+                    1, YAML_FLOW_MAPPING_STYLE,
+                    token->start_mark, token->end_mark);
+            SKIP_TOKEN(parser);
+            return 1;
+        }
+
+        else if (token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 0, 0);
+        }
+    }
+
+    parser->state = POP(parser, parser->states);
+    dummy_mark = POP(parser, parser->marks);
+    SEQUENCE_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
+    SKIP_TOKEN(parser);
+    return 1;
+}
+
+/*
+ * Parse the productions:
+ * flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                                      *** *
+ */
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type != YAML_VALUE_TOKEN && token->type != YAML_FLOW_ENTRY_TOKEN
+            && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
+        if (!PUSH(parser, parser->states,
+                    YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE))
+            return 0;
+        return yaml_parser_parse_node(parser, event, 0, 0);
+    }
+    else {
+        yaml_mark_t mark = token->end_mark;
+        SKIP_TOKEN(parser);
+        parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE;
+        return yaml_parser_process_empty_scalar(parser, event, mark);
+    }
+}
+
+/*
+ * Parse the productions:
+ * flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                                                      ***** *
+ */
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type == YAML_VALUE_TOKEN) {
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_FLOW_ENTRY_TOKEN
+                && token->type != YAML_FLOW_SEQUENCE_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 0, 0);
+        }
+    }
+    parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE;
+    return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
+}
+
+/*
+ * Parse the productions:
+ * flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                                                                      *
+ */
+
+static int
+yaml_parser_parse_flow_sequence_entry_mapping_end(yaml_parser_t *parser,
+        yaml_event_t *event)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    parser->state = YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE;
+
+    MAPPING_END_EVENT_INIT(*event, token->start_mark, token->start_mark);
+    return 1;
+}
+
+/*
+ * Parse the productions:
+ * flow_mapping         ::= FLOW-MAPPING-START
+ *                          ******************
+ *                          (flow_mapping_entry FLOW-ENTRY)*
+ *                           *                  **********
+ *                          flow_mapping_entry?
+ *                          ******************
+ *                          FLOW-MAPPING-END
+ *                          ****************
+ * flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                          *           *** *
+ */
+
+static int
+yaml_parser_parse_flow_mapping_key(yaml_parser_t *parser,
+        yaml_event_t *event, int first)
+{
+    yaml_token_t *token;
+    yaml_mark_t dummy_mark;     /* Used to eliminate a compiler warning. */
+
+    if (first) {
+        token = PEEK_TOKEN(parser);
+        if (!PUSH(parser, parser->marks, token->start_mark))
+            return 0;
+        SKIP_TOKEN(parser);
+    }
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (token->type != YAML_FLOW_MAPPING_END_TOKEN)
+    {
+        if (!first) {
+            if (token->type == YAML_FLOW_ENTRY_TOKEN) {
+                SKIP_TOKEN(parser);
+                token = PEEK_TOKEN(parser);
+                if (!token) return 0;
+            }
+            else {
+                return yaml_parser_set_parser_error_context(parser,
+                        "while parsing a flow mapping", POP(parser, parser->marks),
+                        "did not find expected ',' or '}'", token->start_mark);
+            }
+        }
+
+        if (token->type == YAML_KEY_TOKEN) {
+            SKIP_TOKEN(parser);
+            token = PEEK_TOKEN(parser);
+            if (!token) return 0;
+            if (token->type != YAML_VALUE_TOKEN
+                    && token->type != YAML_FLOW_ENTRY_TOKEN
+                    && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
+                if (!PUSH(parser, parser->states,
+                            YAML_PARSE_FLOW_MAPPING_VALUE_STATE))
+                    return 0;
+                return yaml_parser_parse_node(parser, event, 0, 0);
+            }
+            else {
+                parser->state = YAML_PARSE_FLOW_MAPPING_VALUE_STATE;
+                return yaml_parser_process_empty_scalar(parser, event,
+                        token->start_mark);
+            }
+        }
+        else if (token->type != YAML_FLOW_MAPPING_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 0, 0);
+        }
+    }
+
+    parser->state = POP(parser, parser->states);
+    dummy_mark = POP(parser, parser->marks);
+    MAPPING_END_EVENT_INIT(*event, token->start_mark, token->end_mark);
+    SKIP_TOKEN(parser);
+    return 1;
+}
+
+/*
+ * Parse the productions:
+ * flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
+ *                                   *                  ***** *
+ */
+
+static int
+yaml_parser_parse_flow_mapping_value(yaml_parser_t *parser,
+        yaml_event_t *event, int empty)
+{
+    yaml_token_t *token;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) return 0;
+
+    if (empty) {
+        parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
+        return yaml_parser_process_empty_scalar(parser, event,
+                token->start_mark);
+    }
+
+    if (token->type == YAML_VALUE_TOKEN) {
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) return 0;
+        if (token->type != YAML_FLOW_ENTRY_TOKEN
+                && token->type != YAML_FLOW_MAPPING_END_TOKEN) {
+            if (!PUSH(parser, parser->states,
+                        YAML_PARSE_FLOW_MAPPING_KEY_STATE))
+                return 0;
+            return yaml_parser_parse_node(parser, event, 0, 0);
+        }
+    }
+
+    parser->state = YAML_PARSE_FLOW_MAPPING_KEY_STATE;
+    return yaml_parser_process_empty_scalar(parser, event, token->start_mark);
+}
+
+/*
+ * Generate an empty scalar event.
+ */
+
+static int
+yaml_parser_process_empty_scalar(yaml_parser_t *parser, yaml_event_t *event,
+        yaml_mark_t mark)
+{
+    yaml_char_t *value;
+
+    value = yaml_malloc(1);
+    if (!value) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+    value[0] = '\0';
+
+    SCALAR_EVENT_INIT(*event, NULL, NULL, value, 0,
+            1, 0, YAML_PLAIN_SCALAR_STYLE, mark, mark);
+
+    return 1;
+}
+
+/*
+ * Parse directives.
+ */
+
+static int
+yaml_parser_process_directives(yaml_parser_t *parser,
+        yaml_version_directive_t **version_directive_ref,
+        yaml_tag_directive_t **tag_directives_start_ref,
+        yaml_tag_directive_t **tag_directives_end_ref)
+{
+    yaml_tag_directive_t default_tag_directives[] = {
+        {(yaml_char_t *)"!", (yaml_char_t *)"!"},
+        {(yaml_char_t *)"!!", (yaml_char_t *)"tag:yaml.org,2002:"},
+        {NULL, NULL}
+    };
+    yaml_tag_directive_t *default_tag_directive;
+    yaml_version_directive_t *version_directive = NULL;
+    struct {
+        yaml_tag_directive_t *start;
+        yaml_tag_directive_t *end;
+        yaml_tag_directive_t *top;
+    } tag_directives = { NULL, NULL, NULL };
+    yaml_token_t *token;
+
+    if (!STACK_INIT(parser, tag_directives, INITIAL_STACK_SIZE))
+        goto error;
+
+    token = PEEK_TOKEN(parser);
+    if (!token) goto error;
+
+    while (token->type == YAML_VERSION_DIRECTIVE_TOKEN ||
+            token->type == YAML_TAG_DIRECTIVE_TOKEN)
+    {
+        if (token->type == YAML_VERSION_DIRECTIVE_TOKEN) {
+            if (version_directive) {
+                yaml_parser_set_parser_error(parser,
+                        "found duplicate %YAML directive", token->start_mark);
+                goto error;
+            }
+            if (token->data.version_directive.major != 1
+                    || token->data.version_directive.minor != 1) {
+                yaml_parser_set_parser_error(parser,
+                        "found incompatible YAML document", token->start_mark);
+                goto error;
+            }
+            version_directive = yaml_malloc(sizeof(yaml_version_directive_t));
+            if (!version_directive) {
+                parser->error = YAML_MEMORY_ERROR;
+                goto error;
+            }
+            version_directive->major = token->data.version_directive.major;
+            version_directive->minor = token->data.version_directive.minor;
+        }
+
+        else if (token->type == YAML_TAG_DIRECTIVE_TOKEN) {
+            yaml_tag_directive_t value;
+            value.handle = token->data.tag_directive.handle;
+            value.prefix = token->data.tag_directive.prefix;
+
+            if (!yaml_parser_append_tag_directive(parser, value, 0,
+                        token->start_mark))
+                goto error;
+            if (!PUSH(parser, tag_directives, value))
+                goto error;
+        }
+
+        SKIP_TOKEN(parser);
+        token = PEEK_TOKEN(parser);
+        if (!token) goto error;
+    }
+
+    for (default_tag_directive = default_tag_directives;
+            default_tag_directive->handle; default_tag_directive++) {
+        if (!yaml_parser_append_tag_directive(parser, *default_tag_directive, 1,
+                    token->start_mark))
+            goto error;
+    }
+
+    if (version_directive_ref) {
+        *version_directive_ref = version_directive;
+    }
+    if (tag_directives_start_ref) {
+        if (STACK_EMPTY(parser, tag_directives)) {
+            *tag_directives_start_ref = *tag_directives_end_ref = NULL;
+            STACK_DEL(parser, tag_directives);
+        }
+        else {
+            *tag_directives_start_ref = tag_directives.start;
+            *tag_directives_end_ref = tag_directives.top;
+        }
+    }
+    else {
+        STACK_DEL(parser, tag_directives);
+    }
+
+    return 1;
+
+error:
+    yaml_free(version_directive);
+    while (!STACK_EMPTY(parser, tag_directives)) {
+        yaml_tag_directive_t tag_directive = POP(parser, tag_directives);
+        yaml_free(tag_directive.handle);
+        yaml_free(tag_directive.prefix);
+    }
+    STACK_DEL(parser, tag_directives);
+    return 0;
+}
+
+/*
+ * Append a tag directive to the directives stack.
+ */
+
+static int
+yaml_parser_append_tag_directive(yaml_parser_t *parser,
+        yaml_tag_directive_t value, int allow_duplicates, yaml_mark_t mark)
+{
+    yaml_tag_directive_t *tag_directive;
+    yaml_tag_directive_t copy = { NULL, NULL };
+
+    for (tag_directive = parser->tag_directives.start;
+            tag_directive != parser->tag_directives.top; tag_directive ++) {
+        if (strcmp((char *)value.handle, (char *)tag_directive->handle) == 0) {
+            if (allow_duplicates)
+                return 1;
+            return yaml_parser_set_parser_error(parser,
+                    "found duplicate %TAG directive", mark);
+        }
+    }
+
+    copy.handle = yaml_strdup(value.handle);
+    copy.prefix = yaml_strdup(value.prefix);
+    if (!copy.handle || !copy.prefix) {
+        parser->error = YAML_MEMORY_ERROR;
+        goto error;
+    }
+
+    if (!PUSH(parser, parser->tag_directives, copy))
+        goto error;
+
+    return 1;
+
+error:
+    yaml_free(copy.handle);
+    yaml_free(copy.prefix);
+    return 0;
+}
+
diff --git a/libyaml/src/reader.c b/libyaml/src/reader.c
new file mode 100644
index 0000000..f1a06de
--- /dev/null
+++ b/libyaml/src/reader.c
@@ -0,0 +1,469 @@
+
+#include "yaml_private.h"
+
+/*
+ * Declarations.
+ */
+
+static int
+yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,
+        size_t offset, int value);
+
+static int
+yaml_parser_update_raw_buffer(yaml_parser_t *parser);
+
+static int
+yaml_parser_determine_encoding(yaml_parser_t *parser);
+
+YAML_DECLARE(int)
+yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
+
+/*
+ * Set the reader error and return 0.
+ */
+
+static int
+yaml_parser_set_reader_error(yaml_parser_t *parser, const char *problem,
+        size_t offset, int value)
+{
+    parser->error = YAML_READER_ERROR;
+    parser->problem = problem;
+    parser->problem_offset = offset;
+    parser->problem_value = value;
+
+    return 0;
+}
+
+/*
+ * Byte order marks.
+ */
+
+#define BOM_UTF8    "\xef\xbb\xbf"
+#define BOM_UTF16LE "\xff\xfe"
+#define BOM_UTF16BE "\xfe\xff"
+
+/*
+ * Determine the input stream encoding by checking the BOM symbol. If no BOM is
+ * found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
+ */
+
+static int
+yaml_parser_determine_encoding(yaml_parser_t *parser)
+{
+    /* Ensure that we had enough bytes in the raw buffer. */
+
+    while (!parser->eof
+            && parser->raw_buffer.last - parser->raw_buffer.pointer < 3) {
+        if (!yaml_parser_update_raw_buffer(parser)) {
+            return 0;
+        }
+    }
+
+    /* Determine the encoding. */
+
+    if (parser->raw_buffer.last - parser->raw_buffer.pointer >= 2
+            && !memcmp(parser->raw_buffer.pointer, BOM_UTF16LE, 2)) {
+        parser->encoding = YAML_UTF16LE_ENCODING;
+        parser->raw_buffer.pointer += 2;
+        parser->offset += 2;
+    }
+    else if (parser->raw_buffer.last - parser->raw_buffer.pointer >= 2
+            && !memcmp(parser->raw_buffer.pointer, BOM_UTF16BE, 2)) {
+        parser->encoding = YAML_UTF16BE_ENCODING;
+        parser->raw_buffer.pointer += 2;
+        parser->offset += 2;
+    }
+    else if (parser->raw_buffer.last - parser->raw_buffer.pointer >= 3
+            && !memcmp(parser->raw_buffer.pointer, BOM_UTF8, 3)) {
+        parser->encoding = YAML_UTF8_ENCODING;
+        parser->raw_buffer.pointer += 3;
+        parser->offset += 3;
+    }
+    else {
+        parser->encoding = YAML_UTF8_ENCODING;
+    }
+
+    return 1;
+}
+
+/*
+ * Update the raw buffer.
+ */
+
+static int
+yaml_parser_update_raw_buffer(yaml_parser_t *parser)
+{
+    size_t size_read = 0;
+
+    /* Return if the raw buffer is full. */
+
+    if (parser->raw_buffer.start == parser->raw_buffer.pointer
+            && parser->raw_buffer.last == parser->raw_buffer.end)
+        return 1;
+
+    /* Return on EOF. */
+
+    if (parser->eof) return 1;
+
+    /* Move the remaining bytes in the raw buffer to the beginning. */
+
+    if (parser->raw_buffer.start < parser->raw_buffer.pointer
+            && parser->raw_buffer.pointer < parser->raw_buffer.last) {
+        memmove(parser->raw_buffer.start, parser->raw_buffer.pointer,
+                parser->raw_buffer.last - parser->raw_buffer.pointer);
+    }
+    parser->raw_buffer.last -=
+        parser->raw_buffer.pointer - parser->raw_buffer.start;
+    parser->raw_buffer.pointer = parser->raw_buffer.start;
+
+    /* Call the read handler to fill the buffer. */
+
+    if (!parser->read_handler(parser->read_handler_data, parser->raw_buffer.last,
+                parser->raw_buffer.end - parser->raw_buffer.last, &size_read)) {
+        return yaml_parser_set_reader_error(parser, "input error",
+                parser->offset, -1);
+    }
+    parser->raw_buffer.last += size_read;
+    if (!size_read) {
+        parser->eof = 1;
+    }
+
+    return 1;
+}
+
+/*
+ * Ensure that the buffer contains at least `length` characters.
+ * Return 1 on success, 0 on failure.
+ *
+ * The length is supposed to be significantly less that the buffer size.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_update_buffer(yaml_parser_t *parser, size_t length)
+{
+    int first = 1;
+
+    assert(parser->read_handler);   /* Read handler must be set. */
+
+    /* If the EOF flag is set and the raw buffer is empty, do nothing. */
+
+    if (parser->eof && parser->raw_buffer.pointer == parser->raw_buffer.last)
+        return 1;
+
+    /* Return if the buffer contains enough characters. */
+
+    if (parser->unread >= length)
+        return 1;
+
+    /* Determine the input encoding if it is not known yet. */
+
+    if (!parser->encoding) {
+        if (!yaml_parser_determine_encoding(parser))
+            return 0;
+    }
+
+    /* Move the unread characters to the beginning of the buffer. */
+
+    if (parser->buffer.start < parser->buffer.pointer
+            && parser->buffer.pointer < parser->buffer.last) {
+        size_t size = parser->buffer.last - parser->buffer.pointer;
+        memmove(parser->buffer.start, parser->buffer.pointer, size);
+        parser->buffer.pointer = parser->buffer.start;
+        parser->buffer.last = parser->buffer.start + size;
+    }
+    else if (parser->buffer.pointer == parser->buffer.last) {
+        parser->buffer.pointer = parser->buffer.start;
+        parser->buffer.last = parser->buffer.start;
+    }
+
+    /* Fill the buffer until it has enough characters. */
+
+    while (parser->unread < length)
+    {
+        /* Fill the raw buffer if necessary. */
+
+        if (!first || parser->raw_buffer.pointer == parser->raw_buffer.last) {
+            if (!yaml_parser_update_raw_buffer(parser)) return 0;
+        }
+        first = 0;
+
+        /* Decode the raw buffer. */
+
+        while (parser->raw_buffer.pointer != parser->raw_buffer.last)
+        {
+            unsigned int value = 0, value2 = 0;
+            int incomplete = 0;
+            unsigned char octet;
+            unsigned int width = 0;
+            int low, high;
+            size_t k;
+            size_t raw_unread = parser->raw_buffer.last - parser->raw_buffer.pointer;
+
+            /* Decode the next character. */
+
+            switch (parser->encoding)
+            {
+                case YAML_UTF8_ENCODING:
+
+                    /*
+                     * Decode a UTF-8 character.  Check RFC 3629
+                     * (http://www.ietf.org/rfc/rfc3629.txt) for more details.
+                     *
+                     * The following table (taken from the RFC) is used for
+                     * decoding.
+                     *
+                     *    Char. number range |        UTF-8 octet sequence
+                     *      (hexadecimal)    |              (binary)
+                     *   --------------------+------------------------------------
+                     *   0000 0000-0000 007F | 0xxxxxxx
+                     *   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+                     *   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+                     *   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+                     *
+                     * Additionally, the characters in the range 0xD800-0xDFFF
+                     * are prohibited as they are reserved for use with UTF-16
+                     * surrogate pairs.
+                     */
+
+                    /* Determine the length of the UTF-8 sequence. */
+
+                    octet = parser->raw_buffer.pointer[0];
+                    width = (octet & 0x80) == 0x00 ? 1 :
+                            (octet & 0xE0) == 0xC0 ? 2 :
+                            (octet & 0xF0) == 0xE0 ? 3 :
+                            (octet & 0xF8) == 0xF0 ? 4 : 0;
+
+                    /* Check if the leading octet is valid. */
+
+                    if (!width)
+                        return yaml_parser_set_reader_error(parser,
+                                "invalid leading UTF-8 octet",
+                                parser->offset, octet);
+
+                    /* Check if the raw buffer contains an incomplete character. */
+
+                    if (width > raw_unread) {
+                        if (parser->eof) {
+                            return yaml_parser_set_reader_error(parser,
+                                    "incomplete UTF-8 octet sequence",
+                                    parser->offset, -1);
+                        }
+                        incomplete = 1;
+                        break;
+                    }
+
+                    /* Decode the leading octet. */
+
+                    value = (octet & 0x80) == 0x00 ? octet & 0x7F :
+                            (octet & 0xE0) == 0xC0 ? octet & 0x1F :
+                            (octet & 0xF0) == 0xE0 ? octet & 0x0F :
+                            (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
+
+                    /* Check and decode the trailing octets. */
+
+                    for (k = 1; k < width; k ++)
+                    {
+                        octet = parser->raw_buffer.pointer[k];
+
+                        /* Check if the octet is valid. */
+
+                        if ((octet & 0xC0) != 0x80)
+                            return yaml_parser_set_reader_error(parser,
+                                    "invalid trailing UTF-8 octet",
+                                    parser->offset+k, octet);
+
+                        /* Decode the octet. */
+
+                        value = (value << 6) + (octet & 0x3F);
+                    }
+
+                    /* Check the length of the sequence against the value. */
+
+                    if (!((width == 1) ||
+                            (width == 2 && value >= 0x80) ||
+                            (width == 3 && value >= 0x800) ||
+                            (width == 4 && value >= 0x10000)))
+                        return yaml_parser_set_reader_error(parser,
+                                "invalid length of a UTF-8 sequence",
+                                parser->offset, -1);
+
+                    /* Check the range of the value. */
+
+                    if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF)
+                        return yaml_parser_set_reader_error(parser,
+                                "invalid Unicode character",
+                                parser->offset, value);
+
+                    break;
+
+                case YAML_UTF16LE_ENCODING:
+                case YAML_UTF16BE_ENCODING:
+
+                    low = (parser->encoding == YAML_UTF16LE_ENCODING ? 0 : 1);
+                    high = (parser->encoding == YAML_UTF16LE_ENCODING ? 1 : 0);
+
+                    /*
+                     * The UTF-16 encoding is not as simple as one might
+                     * naively think.  Check RFC 2781
+                     * (http://www.ietf.org/rfc/rfc2781.txt).
+                     *
+                     * Normally, two subsequent bytes describe a Unicode
+                     * character.  However a special technique (called a
+                     * surrogate pair) is used for specifying character
+                     * values larger than 0xFFFF.
+                     *
+                     * A surrogate pair consists of two pseudo-characters:
+                     *      high surrogate area (0xD800-0xDBFF)
+                     *      low surrogate area (0xDC00-0xDFFF)
+                     *
+                     * The following formulas are used for decoding
+                     * and encoding characters using surrogate pairs:
+                     *
+                     *  U  = U' + 0x10000   (0x01 00 00 <= U <= 0x10 FF FF)
+                     *  U' = yyyyyyyyyyxxxxxxxxxx   (0 <= U' <= 0x0F FF FF)
+                     *  W1 = 110110yyyyyyyyyy
+                     *  W2 = 110111xxxxxxxxxx
+                     *
+                     * where U is the character value, W1 is the high surrogate
+                     * area, W2 is the low surrogate area.
+                     */
+
+                    /* Check for incomplete UTF-16 character. */
+
+                    if (raw_unread < 2) {
+                        if (parser->eof) {
+                            return yaml_parser_set_reader_error(parser,
+                                    "incomplete UTF-16 character",
+                                    parser->offset, -1);
+                        }
+                        incomplete = 1;
+                        break;
+                    }
+
+                    /* Get the character. */
+
+                    value = parser->raw_buffer.pointer[low]
+                        + (parser->raw_buffer.pointer[high] << 8);
+
+                    /* Check for unexpected low surrogate area. */
+
+                    if ((value & 0xFC00) == 0xDC00)
+                        return yaml_parser_set_reader_error(parser,
+                                "unexpected low surrogate area",
+                                parser->offset, value);
+
+                    /* Check for a high surrogate area. */
+
+                    if ((value & 0xFC00) == 0xD800) {
+
+                        width = 4;
+
+                        /* Check for incomplete surrogate pair. */
+
+                        if (raw_unread < 4) {
+                            if (parser->eof) {
+                                return yaml_parser_set_reader_error(parser,
+                                        "incomplete UTF-16 surrogate pair",
+                                        parser->offset, -1);
+                            }
+                            incomplete = 1;
+                            break;
+                        }
+
+                        /* Get the next character. */
+
+                        value2 = parser->raw_buffer.pointer[low+2]
+                            + (parser->raw_buffer.pointer[high+2] << 8);
+
+                        /* Check for a low surrogate area. */
+
+                        if ((value2 & 0xFC00) != 0xDC00)
+                            return yaml_parser_set_reader_error(parser,
+                                    "expected low surrogate area",
+                                    parser->offset+2, value2);
+
+                        /* Generate the value of the surrogate pair. */
+
+                        value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF);
+                    }
+
+                    else {
+                        width = 2;
+                    }
+
+                    break;
+
+                default:
+                    assert(1);      /* Impossible. */
+            }
+
+            /* Check if the raw buffer contains enough bytes to form a character. */
+
+            if (incomplete) break;
+
+            /*
+             * Check if the character is in the allowed range:
+             *      #x9 | #xA | #xD | [#x20-#x7E]               (8 bit)
+             *      | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD]    (16 bit)
+             *      | [#x10000-#x10FFFF]                        (32 bit)
+             */
+
+            if (! (value == 0x09 || value == 0x0A || value == 0x0D
+                        || (value >= 0x20 && value <= 0x7E)
+                        || (value == 0x85) || (value >= 0xA0 && value <= 0xD7FF)
+                        || (value >= 0xE000 && value <= 0xFFFD)
+                        || (value >= 0x10000 && value <= 0x10FFFF)))
+                return yaml_parser_set_reader_error(parser,
+                        "control characters are not allowed",
+                        parser->offset, value);
+
+            /* Move the raw pointers. */
+
+            parser->raw_buffer.pointer += width;
+            parser->offset += width;
+
+            /* Finally put the character into the buffer. */
+
+            /* 0000 0000-0000 007F -> 0xxxxxxx */
+            if (value <= 0x7F) {
+                *(parser->buffer.last++) = value;
+            }
+            /* 0000 0080-0000 07FF -> 110xxxxx 10xxxxxx */
+            else if (value <= 0x7FF) {
+                *(parser->buffer.last++) = 0xC0 + (value >> 6);
+                *(parser->buffer.last++) = 0x80 + (value & 0x3F);
+            }
+            /* 0000 0800-0000 FFFF -> 1110xxxx 10xxxxxx 10xxxxxx */
+            else if (value <= 0xFFFF) {
+                *(parser->buffer.last++) = 0xE0 + (value >> 12);
+                *(parser->buffer.last++) = 0x80 + ((value >> 6) & 0x3F);
+                *(parser->buffer.last++) = 0x80 + (value & 0x3F);
+            }
+            /* 0001 0000-0010 FFFF -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+            else {
+                *(parser->buffer.last++) = 0xF0 + (value >> 18);
+                *(parser->buffer.last++) = 0x80 + ((value >> 12) & 0x3F);
+                *(parser->buffer.last++) = 0x80 + ((value >> 6) & 0x3F);
+                *(parser->buffer.last++) = 0x80 + (value & 0x3F);
+            }
+
+            parser->unread ++;
+        }
+
+        /* On EOF, put NUL into the buffer and return. */
+
+        if (parser->eof) {
+            *(parser->buffer.last++) = '\0';
+            parser->unread ++;
+            return 1;
+        }
+
+    }
+
+    if (parser->offset >= PTRDIFF_MAX)
+        return yaml_parser_set_reader_error(parser, "input is too long",
+                PTRDIFF_MAX, -1);
+
+    return 1;
+}
+
diff --git a/libyaml/src/scanner.c b/libyaml/src/scanner.c
new file mode 100644
index 0000000..8e2334f
--- /dev/null
+++ b/libyaml/src/scanner.c
@@ -0,0 +1,3584 @@
+
+/*
+ * Introduction
+ * ************
+ *
+ * The following notes assume that you are familiar with the YAML specification
+ * (http://yaml.org/spec/cvs/current.html).  We mostly follow it, although in
+ * some cases we are less restrictive that it requires.
+ *
+ * The process of transforming a YAML stream into a sequence of events is
+ * divided on two steps: Scanning and Parsing.
+ *
+ * The Scanner transforms the input stream into a sequence of tokens, while the
+ * parser transform the sequence of tokens produced by the Scanner into a
+ * sequence of parsing events.
+ *
+ * The Scanner is rather clever and complicated. The Parser, on the contrary,
+ * is a straightforward implementation of a recursive-descendant parser (or,
+ * LL(1) parser, as it is usually called).
+ *
+ * Actually there are two issues of Scanning that might be called "clever", the
+ * rest is quite straightforward.  The issues are "block collection start" and
+ * "simple keys".  Both issues are explained below in details.
+ *
+ * Here the Scanning step is explained and implemented.  We start with the list
+ * of all the tokens produced by the Scanner together with short descriptions.
+ *
+ * Now, tokens:
+ *
+ *      STREAM-START(encoding)          # The stream start.
+ *      STREAM-END                      # The stream end.
+ *      VERSION-DIRECTIVE(major,minor)  # The '%YAML' directive.
+ *      TAG-DIRECTIVE(handle,prefix)    # The '%TAG' directive.
+ *      DOCUMENT-START                  # '---'
+ *      DOCUMENT-END                    # '...'
+ *      BLOCK-SEQUENCE-START            # Indentation increase denoting a block
+ *      BLOCK-MAPPING-START             # sequence or a block mapping.
+ *      BLOCK-END                       # Indentation decrease.
+ *      FLOW-SEQUENCE-START             # '['
+ *      FLOW-SEQUENCE-END               # ']'
+ *      BLOCK-SEQUENCE-START            # '{'
+ *      BLOCK-SEQUENCE-END              # '}'
+ *      BLOCK-ENTRY                     # '-'
+ *      FLOW-ENTRY                      # ','
+ *      KEY                             # '?' or nothing (simple keys).
+ *      VALUE                           # ':'
+ *      ALIAS(anchor)                   # '*anchor'
+ *      ANCHOR(anchor)                  # '&anchor'
+ *      TAG(handle,suffix)              # '!handle!suffix'
+ *      SCALAR(value,style)             # A scalar.
+ *
+ * The following two tokens are "virtual" tokens denoting the beginning and the
+ * end of the stream:
+ *
+ *      STREAM-START(encoding)
+ *      STREAM-END
+ *
+ * We pass the information about the input stream encoding with the
+ * STREAM-START token.
+ *
+ * The next two tokens are responsible for tags:
+ *
+ *      VERSION-DIRECTIVE(major,minor)
+ *      TAG-DIRECTIVE(handle,prefix)
+ *
+ * Example:
+ *
+ *      %YAML   1.1
+ *      %TAG    !   !foo
+ *      %TAG    !yaml!  tag:yaml.org,2002:
+ *      ---
+ *
+ * The corresponding sequence of tokens:
+ *
+ *      STREAM-START(utf-8)
+ *      VERSION-DIRECTIVE(1,1)
+ *      TAG-DIRECTIVE("!","!foo")
+ *      TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
+ *      DOCUMENT-START
+ *      STREAM-END
+ *
+ * Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
+ * line.
+ *
+ * The document start and end indicators are represented by:
+ *
+ *      DOCUMENT-START
+ *      DOCUMENT-END
+ *
+ * Note that if a YAML stream contains an implicit document (without '---'
+ * and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
+ * produced.
+ *
+ * In the following examples, we present whole documents together with the
+ * produced tokens.
+ *
+ *      1. An implicit document:
+ *
+ *          'a scalar'
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          SCALAR("a scalar",single-quoted)
+ *          STREAM-END
+ *
+ *      2. An explicit document:
+ *
+ *          ---
+ *          'a scalar'
+ *          ...
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          DOCUMENT-START
+ *          SCALAR("a scalar",single-quoted)
+ *          DOCUMENT-END
+ *          STREAM-END
+ *
+ *      3. Several documents in a stream:
+ *
+ *          'a scalar'
+ *          ---
+ *          'another scalar'
+ *          ---
+ *          'yet another scalar'
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          SCALAR("a scalar",single-quoted)
+ *          DOCUMENT-START
+ *          SCALAR("another scalar",single-quoted)
+ *          DOCUMENT-START
+ *          SCALAR("yet another scalar",single-quoted)
+ *          STREAM-END
+ *
+ * We have already introduced the SCALAR token above.  The following tokens are
+ * used to describe aliases, anchors, tag, and scalars:
+ *
+ *      ALIAS(anchor)
+ *      ANCHOR(anchor)
+ *      TAG(handle,suffix)
+ *      SCALAR(value,style)
+ *
+ * The following series of examples illustrate the usage of these tokens:
+ *
+ *      1. A recursive sequence:
+ *
+ *          &A [ *A ]
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          ANCHOR("A")
+ *          FLOW-SEQUENCE-START
+ *          ALIAS("A")
+ *          FLOW-SEQUENCE-END
+ *          STREAM-END
+ *
+ *      2. A tagged scalar:
+ *
+ *          !!float "3.14"  # A good approximation.
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          TAG("!!","float")
+ *          SCALAR("3.14",double-quoted)
+ *          STREAM-END
+ *
+ *      3. Various scalar styles:
+ *
+ *          --- # Implicit empty plain scalars do not produce tokens.
+ *          --- a plain scalar
+ *          --- 'a single-quoted scalar'
+ *          --- "a double-quoted scalar"
+ *          --- |-
+ *            a literal scalar
+ *          --- >-
+ *            a folded
+ *            scalar
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          DOCUMENT-START
+ *          DOCUMENT-START
+ *          SCALAR("a plain scalar",plain)
+ *          DOCUMENT-START
+ *          SCALAR("a single-quoted scalar",single-quoted)
+ *          DOCUMENT-START
+ *          SCALAR("a double-quoted scalar",double-quoted)
+ *          DOCUMENT-START
+ *          SCALAR("a literal scalar",literal)
+ *          DOCUMENT-START
+ *          SCALAR("a folded scalar",folded)
+ *          STREAM-END
+ *
+ * Now it's time to review collection-related tokens. We will start with
+ * flow collections:
+ *
+ *      FLOW-SEQUENCE-START
+ *      FLOW-SEQUENCE-END
+ *      FLOW-MAPPING-START
+ *      FLOW-MAPPING-END
+ *      FLOW-ENTRY
+ *      KEY
+ *      VALUE
+ *
+ * The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
+ * FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
+ * correspondingly.  FLOW-ENTRY represent the ',' indicator.  Finally the
+ * indicators '?' and ':', which are used for denoting mapping keys and values,
+ * are represented by the KEY and VALUE tokens.
+ *
+ * The following examples show flow collections:
+ *
+ *      1. A flow sequence:
+ *
+ *          [item 1, item 2, item 3]
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          FLOW-SEQUENCE-START
+ *          SCALAR("item 1",plain)
+ *          FLOW-ENTRY
+ *          SCALAR("item 2",plain)
+ *          FLOW-ENTRY
+ *          SCALAR("item 3",plain)
+ *          FLOW-SEQUENCE-END
+ *          STREAM-END
+ *
+ *      2. A flow mapping:
+ *
+ *          {
+ *              a simple key: a value,  # Note that the KEY token is produced.
+ *              ? a complex key: another value,
+ *          }
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          FLOW-MAPPING-START
+ *          KEY
+ *          SCALAR("a simple key",plain)
+ *          VALUE
+ *          SCALAR("a value",plain)
+ *          FLOW-ENTRY
+ *          KEY
+ *          SCALAR("a complex key",plain)
+ *          VALUE
+ *          SCALAR("another value",plain)
+ *          FLOW-ENTRY
+ *          FLOW-MAPPING-END
+ *          STREAM-END
+ *
+ * A simple key is a key which is not denoted by the '?' indicator.  Note that
+ * the Scanner still produce the KEY token whenever it encounters a simple key.
+ *
+ * For scanning block collections, the following tokens are used (note that we
+ * repeat KEY and VALUE here):
+ *
+ *      BLOCK-SEQUENCE-START
+ *      BLOCK-MAPPING-START
+ *      BLOCK-END
+ *      BLOCK-ENTRY
+ *      KEY
+ *      VALUE
+ *
+ * The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
+ * increase that precedes a block collection (cf. the INDENT token in Python).
+ * The token BLOCK-END denote indentation decrease that ends a block collection
+ * (cf. the DEDENT token in Python).  However YAML has some syntax pecularities
+ * that makes detections of these tokens more complex.
+ *
+ * The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
+ * '-', '?', and ':' correspondingly.
+ *
+ * The following examples show how the tokens BLOCK-SEQUENCE-START,
+ * BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
+ *
+ *      1. Block sequences:
+ *
+ *          - item 1
+ *          - item 2
+ *          -
+ *            - item 3.1
+ *            - item 3.2
+ *          -
+ *            key 1: value 1
+ *            key 2: value 2
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          SCALAR("item 1",plain)
+ *          BLOCK-ENTRY
+ *          SCALAR("item 2",plain)
+ *          BLOCK-ENTRY
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          SCALAR("item 3.1",plain)
+ *          BLOCK-ENTRY
+ *          SCALAR("item 3.2",plain)
+ *          BLOCK-END
+ *          BLOCK-ENTRY
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("key 1",plain)
+ *          VALUE
+ *          SCALAR("value 1",plain)
+ *          KEY
+ *          SCALAR("key 2",plain)
+ *          VALUE
+ *          SCALAR("value 2",plain)
+ *          BLOCK-END
+ *          BLOCK-END
+ *          STREAM-END
+ *
+ *      2. Block mappings:
+ *
+ *          a simple key: a value   # The KEY token is produced here.
+ *          ? a complex key
+ *          : another value
+ *          a mapping:
+ *            key 1: value 1
+ *            key 2: value 2
+ *          a sequence:
+ *            - item 1
+ *            - item 2
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("a simple key",plain)
+ *          VALUE
+ *          SCALAR("a value",plain)
+ *          KEY
+ *          SCALAR("a complex key",plain)
+ *          VALUE
+ *          SCALAR("another value",plain)
+ *          KEY
+ *          SCALAR("a mapping",plain)
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("key 1",plain)
+ *          VALUE
+ *          SCALAR("value 1",plain)
+ *          KEY
+ *          SCALAR("key 2",plain)
+ *          VALUE
+ *          SCALAR("value 2",plain)
+ *          BLOCK-END
+ *          KEY
+ *          SCALAR("a sequence",plain)
+ *          VALUE
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          SCALAR("item 1",plain)
+ *          BLOCK-ENTRY
+ *          SCALAR("item 2",plain)
+ *          BLOCK-END
+ *          BLOCK-END
+ *          STREAM-END
+ *
+ * YAML does not always require to start a new block collection from a new
+ * line.  If the current line contains only '-', '?', and ':' indicators, a new
+ * block collection may start at the current line.  The following examples
+ * illustrate this case:
+ *
+ *      1. Collections in a sequence:
+ *
+ *          - - item 1
+ *            - item 2
+ *          - key 1: value 1
+ *            key 2: value 2
+ *          - ? complex key
+ *            : complex value
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          SCALAR("item 1",plain)
+ *          BLOCK-ENTRY
+ *          SCALAR("item 2",plain)
+ *          BLOCK-END
+ *          BLOCK-ENTRY
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("key 1",plain)
+ *          VALUE
+ *          SCALAR("value 1",plain)
+ *          KEY
+ *          SCALAR("key 2",plain)
+ *          VALUE
+ *          SCALAR("value 2",plain)
+ *          BLOCK-END
+ *          BLOCK-ENTRY
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("complex key")
+ *          VALUE
+ *          SCALAR("complex value")
+ *          BLOCK-END
+ *          BLOCK-END
+ *          STREAM-END
+ *
+ *      2. Collections in a mapping:
+ *
+ *          ? a sequence
+ *          : - item 1
+ *            - item 2
+ *          ? a mapping
+ *          : key 1: value 1
+ *            key 2: value 2
+ *
+ *      Tokens:
+ *
+ *          STREAM-START(utf-8)
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("a sequence",plain)
+ *          VALUE
+ *          BLOCK-SEQUENCE-START
+ *          BLOCK-ENTRY
+ *          SCALAR("item 1",plain)
+ *          BLOCK-ENTRY
+ *          SCALAR("item 2",plain)
+ *          BLOCK-END
+ *          KEY
+ *          SCALAR("a mapping",plain)
+ *          VALUE
+ *          BLOCK-MAPPING-START
+ *          KEY
+ *          SCALAR("key 1",plain)
+ *          VALUE
+ *          SCALAR("value 1",plain)
+ *          KEY
+ *          SCALAR("key 2",plain)
+ *          VALUE
+ *          SCALAR("value 2",plain)
+ *          BLOCK-END
+ *          BLOCK-END
+ *          STREAM-END
+ *
+ * YAML also permits non-indented sequences if they are included into a block
+ * mapping.  In this case, the token BLOCK-SEQUENCE-START is not produced:
+ *
+ *      key:
+ *      - item 1    # BLOCK-SEQUENCE-START is NOT produced here.
+ *      - item 2
+ *
+ * Tokens:
+ *
+ *      STREAM-START(utf-8)
+ *      BLOCK-MAPPING-START
+ *      KEY
+ *      SCALAR("key",plain)
+ *      VALUE
+ *      BLOCK-ENTRY
+ *      SCALAR("item 1",plain)
+ *      BLOCK-ENTRY
+ *      SCALAR("item 2",plain)
+ *      BLOCK-END
+ */
+
+#include "yaml_private.h"
+
+/*
+ * Ensure that the buffer contains the required number of characters.
+ * Return 1 on success, 0 on failure (reader error or memory error).
+ */
+
+#define CACHE(parser,length)                                                    \
+    (parser->unread >= (length)                                                 \
+        ? 1                                                                     \
+        : yaml_parser_update_buffer(parser, (length)))
+
+/*
+ * Advance the buffer pointer.
+ */
+
+#define SKIP(parser)                                                            \
+     (parser->mark.index ++,                                                    \
+      parser->mark.column ++,                                                   \
+      parser->unread --,                                                        \
+      parser->buffer.pointer += WIDTH(parser->buffer))
+
+#define SKIP_LINE(parser)                                                       \
+     (IS_CRLF(parser->buffer) ?                                                 \
+      (parser->mark.index += 2,                                                 \
+       parser->mark.column = 0,                                                 \
+       parser->mark.line ++,                                                    \
+       parser->unread -= 2,                                                     \
+       parser->buffer.pointer += 2) :                                           \
+      IS_BREAK(parser->buffer) ?                                                \
+      (parser->mark.index ++,                                                   \
+       parser->mark.column = 0,                                                 \
+       parser->mark.line ++,                                                    \
+       parser->unread --,                                                       \
+       parser->buffer.pointer += WIDTH(parser->buffer)) : 0)
+
+/*
+ * Copy a character to a string buffer and advance pointers.
+ */
+
+#define READ(parser,string)                                                     \
+     (STRING_EXTEND(parser,string) ?                                            \
+         (COPY(string,parser->buffer),                                          \
+          parser->mark.index ++,                                                \
+          parser->mark.column ++,                                               \
+          parser->unread --,                                                    \
+          1) : 0)
+
+/*
+ * Copy a line break character to a string buffer and advance pointers.
+ */
+
+#define READ_LINE(parser,string)                                                \
+    (STRING_EXTEND(parser,string) ?                                             \
+    (((CHECK_AT(parser->buffer,'\r',0)                                          \
+       && CHECK_AT(parser->buffer,'\n',1)) ?        /* CR LF -> LF */           \
+     (*((string).pointer++) = (yaml_char_t) '\n',                               \
+      parser->buffer.pointer += 2,                                              \
+      parser->mark.index += 2,                                                  \
+      parser->mark.column = 0,                                                  \
+      parser->mark.line ++,                                                     \
+      parser->unread -= 2) :                                                    \
+     (CHECK_AT(parser->buffer,'\r',0)                                           \
+      || CHECK_AT(parser->buffer,'\n',0)) ?         /* CR|LF -> LF */           \
+     (*((string).pointer++) = (yaml_char_t) '\n',                               \
+      parser->buffer.pointer ++,                                                \
+      parser->mark.index ++,                                                    \
+      parser->mark.column = 0,                                                  \
+      parser->mark.line ++,                                                     \
+      parser->unread --) :                                                      \
+     (CHECK_AT(parser->buffer,'\xC2',0)                                         \
+      && CHECK_AT(parser->buffer,'\x85',1)) ?       /* NEL -> LF */             \
+     (*((string).pointer++) = (yaml_char_t) '\n',                               \
+      parser->buffer.pointer += 2,                                              \
+      parser->mark.index ++,                                                    \
+      parser->mark.column = 0,                                                  \
+      parser->mark.line ++,                                                     \
+      parser->unread --) :                                                      \
+     (CHECK_AT(parser->buffer,'\xE2',0) &&                                      \
+      CHECK_AT(parser->buffer,'\x80',1) &&                                      \
+      (CHECK_AT(parser->buffer,'\xA8',2) ||                                     \
+       CHECK_AT(parser->buffer,'\xA9',2))) ?        /* LS|PS -> LS|PS */        \
+     (*((string).pointer++) = *(parser->buffer.pointer++),                      \
+      *((string).pointer++) = *(parser->buffer.pointer++),                      \
+      *((string).pointer++) = *(parser->buffer.pointer++),                      \
+      parser->mark.index ++,                                                    \
+      parser->mark.column = 0,                                                  \
+      parser->mark.line ++,                                                     \
+      parser->unread --) : 0),                                                  \
+    1) : 0)
+
+/*
+ * Public API declarations.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token);
+
+/*
+ * Error handling.
+ */
+
+static int
+yaml_parser_set_scanner_error(yaml_parser_t *parser, const char *context,
+        yaml_mark_t context_mark, const char *problem);
+
+/*
+ * High-level token API.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_fetch_more_tokens(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_next_token(yaml_parser_t *parser);
+
+/*
+ * Potential simple keys.
+ */
+
+static int
+yaml_parser_stale_simple_keys(yaml_parser_t *parser);
+
+static int
+yaml_parser_save_simple_key(yaml_parser_t *parser);
+
+static int
+yaml_parser_remove_simple_key(yaml_parser_t *parser);
+
+static int
+yaml_parser_increase_flow_level(yaml_parser_t *parser);
+
+static int
+yaml_parser_decrease_flow_level(yaml_parser_t *parser);
+
+/*
+ * Indentation treatment.
+ */
+
+static int
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark);
+
+static int
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column);
+
+/*
+ * Token fetchers.
+ */
+
+static int
+yaml_parser_fetch_stream_start(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_stream_end(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_directive(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_document_indicator(yaml_parser_t *parser,
+        yaml_token_type_t type);
+
+static int
+yaml_parser_fetch_flow_collection_start(yaml_parser_t *parser,
+        yaml_token_type_t type);
+
+static int
+yaml_parser_fetch_flow_collection_end(yaml_parser_t *parser,
+        yaml_token_type_t type);
+
+static int
+yaml_parser_fetch_flow_entry(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_block_entry(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_key(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_value(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_anchor(yaml_parser_t *parser, yaml_token_type_t type);
+
+static int
+yaml_parser_fetch_tag(yaml_parser_t *parser);
+
+static int
+yaml_parser_fetch_block_scalar(yaml_parser_t *parser, int literal);
+
+static int
+yaml_parser_fetch_flow_scalar(yaml_parser_t *parser, int single);
+
+static int
+yaml_parser_fetch_plain_scalar(yaml_parser_t *parser);
+
+/*
+ * Token scanners.
+ */
+
+static int
+yaml_parser_scan_to_next_token(yaml_parser_t *parser);
+
+static int
+yaml_parser_scan_directive(yaml_parser_t *parser, yaml_token_t *token);
+
+static int
+yaml_parser_scan_directive_name(yaml_parser_t *parser,
+        yaml_mark_t start_mark, yaml_char_t **name);
+
+static int
+yaml_parser_scan_version_directive_value(yaml_parser_t *parser,
+        yaml_mark_t start_mark, int *major, int *minor);
+
+static int
+yaml_parser_scan_version_directive_number(yaml_parser_t *parser,
+        yaml_mark_t start_mark, int *number);
+
+static int
+yaml_parser_scan_tag_directive_value(yaml_parser_t *parser,
+        yaml_mark_t mark, yaml_char_t **handle, yaml_char_t **prefix);
+
+static int
+yaml_parser_scan_anchor(yaml_parser_t *parser, yaml_token_t *token,
+        yaml_token_type_t type);
+
+static int
+yaml_parser_scan_tag(yaml_parser_t *parser, yaml_token_t *token);
+
+static int
+yaml_parser_scan_tag_handle(yaml_parser_t *parser, int directive,
+        yaml_mark_t start_mark, yaml_char_t **handle);
+
+static int
+yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
+        yaml_char_t *head, yaml_mark_t start_mark, yaml_char_t **uri);
+
+static int
+yaml_parser_scan_uri_escapes(yaml_parser_t *parser, int directive,
+        yaml_mark_t start_mark, yaml_string_t *string);
+
+static int
+yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
+        int literal);
+
+static int
+yaml_parser_scan_block_scalar_breaks(yaml_parser_t *parser,
+        int *indent, yaml_string_t *breaks,
+        yaml_mark_t start_mark, yaml_mark_t *end_mark);
+
+static int
+yaml_parser_scan_flow_scalar(yaml_parser_t *parser, yaml_token_t *token,
+        int single);
+
+static int
+yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token);
+
+/*
+ * Get the next token.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token)
+{
+    assert(parser); /* Non-NULL parser object is expected. */
+    assert(token);  /* Non-NULL token object is expected. */
+
+    /* Erase the token object. */
+
+    memset(token, 0, sizeof(yaml_token_t));
+
+    /* No tokens after STREAM-END or error. */
+
+    if (parser->stream_end_produced || parser->error) {
+        return 1;
+    }
+
+    /* Ensure that the tokens queue contains enough tokens. */
+
+    if (!parser->token_available) {
+        if (!yaml_parser_fetch_more_tokens(parser))
+            return 0;
+    }
+
+    /* Fetch the next token from the queue. */
+
+    *token = DEQUEUE(parser, parser->tokens);
+    parser->token_available = 0;
+    parser->tokens_parsed ++;
+
+    if (token->type == YAML_STREAM_END_TOKEN) {
+        parser->stream_end_produced = 1;
+    }
+
+    return 1;
+}
+
+/*
+ * Set the scanner error and return 0.
+ */
+
+static int
+yaml_parser_set_scanner_error(yaml_parser_t *parser, const char *context,
+        yaml_mark_t context_mark, const char *problem)
+{
+    parser->error = YAML_SCANNER_ERROR;
+    parser->context = context;
+    parser->context_mark = context_mark;
+    parser->problem = problem;
+    parser->problem_mark = parser->mark;
+
+    return 0;
+}
+
+/*
+ * Ensure that the tokens queue contains at least one token which can be
+ * returned to the Parser.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_fetch_more_tokens(yaml_parser_t *parser)
+{
+    int need_more_tokens;
+
+    /* While we need more tokens to fetch, do it. */
+
+    while (1)
+    {
+        /*
+         * Check if we really need to fetch more tokens.
+         */
+
+        need_more_tokens = 0;
+
+        if (parser->tokens.head == parser->tokens.tail)
+        {
+            /* Queue is empty. */
+
+            need_more_tokens = 1;
+        }
+        else
+        {
+            yaml_simple_key_t *simple_key;
+
+            /* Check if any potential simple key may occupy the head position. */
+
+            if (!yaml_parser_stale_simple_keys(parser))
+                return 0;
+
+            for (simple_key = parser->simple_keys.start;
+                    simple_key != parser->simple_keys.top; simple_key++) {
+                if (simple_key->possible
+                        && simple_key->token_number == parser->tokens_parsed) {
+                    need_more_tokens = 1;
+                    break;
+                }
+            }
+        }
+
+        /* We are finished. */
+
+        if (!need_more_tokens)
+            break;
+
+        /* Fetch the next token. */
+
+        if (!yaml_parser_fetch_next_token(parser))
+            return 0;
+    }
+
+    parser->token_available = 1;
+
+    return 1;
+}
+
+/*
+ * The dispatcher for token fetchers.
+ */
+
+static int
+yaml_parser_fetch_next_token(yaml_parser_t *parser)
+{
+    /* Ensure that the buffer is initialized. */
+
+    if (!CACHE(parser, 1))
+        return 0;
+
+    /* Check if we just started scanning.  Fetch STREAM-START then. */
+
+    if (!parser->stream_start_produced)
+        return yaml_parser_fetch_stream_start(parser);
+
+    /* Eat whitespaces and comments until we reach the next token. */
+
+    if (!yaml_parser_scan_to_next_token(parser))
+        return 0;
+
+    /* Remove obsolete potential simple keys. */
+
+    if (!yaml_parser_stale_simple_keys(parser))
+        return 0;
+
+    /* Check the indentation level against the current column. */
+
+    if (!yaml_parser_unroll_indent(parser, parser->mark.column))
+        return 0;
+
+    /*
+     * Ensure that the buffer contains at least 4 characters.  4 is the length
+     * of the longest indicators ('--- ' and '... ').
+     */
+
+    if (!CACHE(parser, 4))
+        return 0;
+
+    /* Is it the end of the stream? */
+
+    if (IS_Z(parser->buffer))
+        return yaml_parser_fetch_stream_end(parser);
+
+    /* Is it a directive? */
+
+    if (parser->mark.column == 0 && CHECK(parser->buffer, '%'))
+        return yaml_parser_fetch_directive(parser);
+
+    /* Is it the document start indicator? */
+
+    if (parser->mark.column == 0
+            && CHECK_AT(parser->buffer, '-', 0)
+            && CHECK_AT(parser->buffer, '-', 1)
+            && CHECK_AT(parser->buffer, '-', 2)
+            && IS_BLANKZ_AT(parser->buffer, 3))
+        return yaml_parser_fetch_document_indicator(parser,
+                YAML_DOCUMENT_START_TOKEN);
+
+    /* Is it the document end indicator? */
+
+    if (parser->mark.column == 0
+            && CHECK_AT(parser->buffer, '.', 0)
+            && CHECK_AT(parser->buffer, '.', 1)
+            && CHECK_AT(parser->buffer, '.', 2)
+            && IS_BLANKZ_AT(parser->buffer, 3))
+        return yaml_parser_fetch_document_indicator(parser,
+                YAML_DOCUMENT_END_TOKEN);
+
+    /* Is it the flow sequence start indicator? */
+
+    if (CHECK(parser->buffer, '['))
+        return yaml_parser_fetch_flow_collection_start(parser,
+                YAML_FLOW_SEQUENCE_START_TOKEN);
+
+    /* Is it the flow mapping start indicator? */
+
+    if (CHECK(parser->buffer, '{'))
+        return yaml_parser_fetch_flow_collection_start(parser,
+                YAML_FLOW_MAPPING_START_TOKEN);
+
+    /* Is it the flow sequence end indicator? */
+
+    if (CHECK(parser->buffer, ']'))
+        return yaml_parser_fetch_flow_collection_end(parser,
+                YAML_FLOW_SEQUENCE_END_TOKEN);
+
+    /* Is it the flow mapping end indicator? */
+
+    if (CHECK(parser->buffer, '}'))
+        return yaml_parser_fetch_flow_collection_end(parser,
+                YAML_FLOW_MAPPING_END_TOKEN);
+
+    /* Is it the flow entry indicator? */
+
+    if (CHECK(parser->buffer, ','))
+        return yaml_parser_fetch_flow_entry(parser);
+
+    /* Is it the block entry indicator? */
+
+    if (CHECK(parser->buffer, '-') && IS_BLANKZ_AT(parser->buffer, 1))
+        return yaml_parser_fetch_block_entry(parser);
+
+    /* Is it the key indicator? */
+
+    if (CHECK(parser->buffer, '?')
+            && (parser->flow_level || IS_BLANKZ_AT(parser->buffer, 1)))
+        return yaml_parser_fetch_key(parser);
+
+    /* Is it the value indicator? */
+
+    if (CHECK(parser->buffer, ':')
+            && (parser->flow_level || IS_BLANKZ_AT(parser->buffer, 1)))
+        return yaml_parser_fetch_value(parser);
+
+    /* Is it an alias? */
+
+    if (CHECK(parser->buffer, '*'))
+        return yaml_parser_fetch_anchor(parser, YAML_ALIAS_TOKEN);
+
+    /* Is it an anchor? */
+
+    if (CHECK(parser->buffer, '&'))
+        return yaml_parser_fetch_anchor(parser, YAML_ANCHOR_TOKEN);
+
+    /* Is it a tag? */
+
+    if (CHECK(parser->buffer, '!'))
+        return yaml_parser_fetch_tag(parser);
+
+    /* Is it a literal scalar? */
+
+    if (CHECK(parser->buffer, '|') && !parser->flow_level)
+        return yaml_parser_fetch_block_scalar(parser, 1);
+
+    /* Is it a folded scalar? */
+
+    if (CHECK(parser->buffer, '>') && !parser->flow_level)
+        return yaml_parser_fetch_block_scalar(parser, 0);
+
+    /* Is it a single-quoted scalar? */
+
+    if (CHECK(parser->buffer, '\''))
+        return yaml_parser_fetch_flow_scalar(parser, 1);
+
+    /* Is it a double-quoted scalar? */
+
+    if (CHECK(parser->buffer, '"'))
+        return yaml_parser_fetch_flow_scalar(parser, 0);
+
+    /*
+     * Is it a plain scalar?
+     *
+     * A plain scalar may start with any non-blank characters except
+     *
+     *      '-', '?', ':', ',', '[', ']', '{', '}',
+     *      '#', '&', '*', '!', '|', '>', '\'', '\"',
+     *      '%', '@', '`'.
+     *
+     * In the block context (and, for the '-' indicator, in the flow context
+     * too), it may also start with the characters
+     *
+     *      '-', '?', ':'
+     *
+     * if it is followed by a non-space character.
+     *
+     * The last rule is more restrictive than the specification requires.
+     */
+
+    if (!(IS_BLANKZ(parser->buffer) || CHECK(parser->buffer, '-')
+                || CHECK(parser->buffer, '?') || CHECK(parser->buffer, ':')
+                || CHECK(parser->buffer, ',') || CHECK(parser->buffer, '[')
+                || CHECK(parser->buffer, ']') || CHECK(parser->buffer, '{')
+                || CHECK(parser->buffer, '}') || CHECK(parser->buffer, '#')
+                || CHECK(parser->buffer, '&') || CHECK(parser->buffer, '*')
+                || CHECK(parser->buffer, '!') || CHECK(parser->buffer, '|')
+                || CHECK(parser->buffer, '>') || CHECK(parser->buffer, '\'')
+                || CHECK(parser->buffer, '"') || CHECK(parser->buffer, '%')
+                || CHECK(parser->buffer, '@') || CHECK(parser->buffer, '`')) ||
+            (CHECK(parser->buffer, '-') && !IS_BLANK_AT(parser->buffer, 1)) ||
+            (!parser->flow_level &&
+             (CHECK(parser->buffer, '?') || CHECK(parser->buffer, ':'))
+             && !IS_BLANKZ_AT(parser->buffer, 1)))
+        return yaml_parser_fetch_plain_scalar(parser);
+
+    /*
+     * If we don't determine the token type so far, it is an error.
+     */
+
+    return yaml_parser_set_scanner_error(parser,
+            "while scanning for the next token", parser->mark,
+            "found character that cannot start any token");
+}
+
+/*
+ * Check the list of potential simple keys and remove the positions that
+ * cannot contain simple keys anymore.
+ */
+
+static int
+yaml_parser_stale_simple_keys(yaml_parser_t *parser)
+{
+    yaml_simple_key_t *simple_key;
+
+    /* Check for a potential simple key for each flow level. */
+
+    for (simple_key = parser->simple_keys.start;
+            simple_key != parser->simple_keys.top; simple_key ++)
+    {
+        /*
+         * The specification requires that a simple key
+         *
+         *  - is limited to a single line,
+         *  - is shorter than 1024 characters.
+         */
+
+        if (simple_key->possible
+                && (simple_key->mark.line < parser->mark.line
+                    || simple_key->mark.index+1024 < parser->mark.index)) {
+
+            /* Check if the potential simple key to be removed is required. */
+
+            if (simple_key->required) {
+                return yaml_parser_set_scanner_error(parser,
+                        "while scanning a simple key", simple_key->mark,
+                        "could not find expected ':'");
+            }
+
+            simple_key->possible = 0;
+        }
+    }
+
+    return 1;
+}
+
+/*
+ * Check if a simple key may start at the current position and add it if
+ * needed.
+ */
+
+static int
+yaml_parser_save_simple_key(yaml_parser_t *parser)
+{
+    /*
+     * A simple key is required at the current position if the scanner is in
+     * the block context and the current column coincides with the indentation
+     * level.
+     */
+
+    int required = (!parser->flow_level
+            && parser->indent == (ptrdiff_t)parser->mark.column);
+
+    /*
+     * If the current position may start a simple key, save it.
+     */
+
+    if (parser->simple_key_allowed)
+    {
+        yaml_simple_key_t simple_key;
+        simple_key.possible = 1;
+        simple_key.required = required;
+        simple_key.token_number =
+            parser->tokens_parsed + (parser->tokens.tail - parser->tokens.head);
+        simple_key.mark = parser->mark;
+
+        if (!yaml_parser_remove_simple_key(parser)) return 0;
+
+        *(parser->simple_keys.top-1) = simple_key;
+    }
+
+    return 1;
+}
+
+/*
+ * Remove a potential simple key at the current flow level.
+ */
+
+static int
+yaml_parser_remove_simple_key(yaml_parser_t *parser)
+{
+    yaml_simple_key_t *simple_key = parser->simple_keys.top-1;
+
+    if (simple_key->possible)
+    {
+        /* If the key is required, it is an error. */
+
+        if (simple_key->required) {
+            return yaml_parser_set_scanner_error(parser,
+                    "while scanning a simple key", simple_key->mark,
+                    "could not find expected ':'");
+        }
+    }
+
+    /* Remove the key from the stack. */
+
+    simple_key->possible = 0;
+
+    return 1;
+}
+
+/*
+ * Increase the flow level and resize the simple key list if needed.
+ */
+
+static int
+yaml_parser_increase_flow_level(yaml_parser_t *parser)
+{
+    yaml_simple_key_t empty_simple_key = { 0, 0, 0, { 0, 0, 0 } };
+
+    /* Reset the simple key on the next level. */
+
+    if (!PUSH(parser, parser->simple_keys, empty_simple_key))
+        return 0;
+
+    /* Increase the flow level. */
+
+    if (parser->flow_level == INT_MAX) {
+        parser->error = YAML_MEMORY_ERROR;
+        return 0;
+    }
+
+    parser->flow_level++;
+
+    return 1;
+}
+
+/*
+ * Decrease the flow level.
+ */
+
+static int
+yaml_parser_decrease_flow_level(yaml_parser_t *parser)
+{
+    yaml_simple_key_t dummy_key;    /* Used to eliminate a compiler warning. */
+
+    if (parser->flow_level) {
+        parser->flow_level --;
+        dummy_key = POP(parser, parser->simple_keys);
+    }
+
+    return 1;
+}
+
+/*
+ * Push the current indentation level to the stack and set the new level
+ * the current column is greater than the indentation level.  In this case,
+ * append or insert the specified token into the token queue.
+ *
+ */
+
+static int
+yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
+        ptrdiff_t number, yaml_token_type_t type, yaml_mark_t mark)
+{
+    yaml_token_t token;
+
+    /* In the flow context, do nothing. */
+
+    if (parser->flow_level)
+        return 1;
+
+    if (parser->indent < column)
+    {
+        /*
+         * Push the current indentation level to the stack and set the new
+         * indentation level.
+         */
+
+        if (!PUSH(parser, parser->indents, parser->indent))
+            return 0;
+
+        if (column > INT_MAX) {
+            parser->error = YAML_MEMORY_ERROR;
+            return 0;
+        }
+
+        parser->indent = column;
+
+        /* Create a token and insert it into the queue. */
+
+        TOKEN_INIT(token, type, mark, mark);
+
+        if (number == -1) {
+            if (!ENQUEUE(parser, parser->tokens, token))
+                return 0;
+        }
+        else {
+            if (!QUEUE_INSERT(parser,
+                        parser->tokens, number - parser->tokens_parsed, token))
+                return 0;
+        }
+    }
+
+    return 1;
+}
+
+/*
+ * Pop indentation levels from the indents stack until the current level
+ * becomes less or equal to the column.  For each indentation level, append
+ * the BLOCK-END token.
+ */
+
+
+static int
+yaml_parser_unroll_indent(yaml_parser_t *parser, ptrdiff_t column)
+{
+    yaml_token_t token;
+
+    /* In the flow context, do nothing. */
+
+    if (parser->flow_level)
+        return 1;
+
+    /* Loop through the indentation levels in the stack. */
+
+    while (parser->indent > column)
+    {
+        /* Create a token and append it to the queue. */
+
+        TOKEN_INIT(token, YAML_BLOCK_END_TOKEN, parser->mark, parser->mark);
+
+        if (!ENQUEUE(parser, parser->tokens, token))
+            return 0;
+
+        /* Pop the indentation level. */
+
+        parser->indent = POP(parser, parser->indents);
+    }
+
+    return 1;
+}
+
+/*
+ * Initialize the scanner and produce the STREAM-START token.
+ */
+
+static int
+yaml_parser_fetch_stream_start(yaml_parser_t *parser)
+{
+    yaml_simple_key_t simple_key = { 0, 0, 0, { 0, 0, 0 } };
+    yaml_token_t token;
+
+    /* Set the initial indentation. */
+
+    parser->indent = -1;
+
+    /* Initialize the simple key stack. */
+
+    if (!PUSH(parser, parser->simple_keys, simple_key))
+        return 0;
+
+    /* A simple key is allowed at the beginning of the stream. */
+
+    parser->simple_key_allowed = 1;
+
+    /* We have started. */
+
+    parser->stream_start_produced = 1;
+
+    /* Create the STREAM-START token and append it to the queue. */
+
+    STREAM_START_TOKEN_INIT(token, parser->encoding,
+            parser->mark, parser->mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the STREAM-END token and shut down the scanner.
+ */
+
+static int
+yaml_parser_fetch_stream_end(yaml_parser_t *parser)
+{
+    yaml_token_t token;
+
+    /* Force new line. */
+
+    if (parser->mark.column != 0) {
+        parser->mark.column = 0;
+        parser->mark.line ++;
+    }
+
+    /* Reset the indentation level. */
+
+    if (!yaml_parser_unroll_indent(parser, -1))
+        return 0;
+
+    /* Reset simple keys. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the STREAM-END token and append it to the queue. */
+
+    STREAM_END_TOKEN_INIT(token, parser->mark, parser->mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
+ */
+
+static int
+yaml_parser_fetch_directive(yaml_parser_t *parser)
+{
+    yaml_token_t token;
+
+    /* Reset the indentation level. */
+
+    if (!yaml_parser_unroll_indent(parser, -1))
+        return 0;
+
+    /* Reset simple keys. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. */
+
+    if (!yaml_parser_scan_directive(parser, &token))
+        return 0;
+
+    /* Append the token to the queue. */
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Produce the DOCUMENT-START or DOCUMENT-END token.
+ */
+
+static int
+yaml_parser_fetch_document_indicator(yaml_parser_t *parser,
+        yaml_token_type_t type)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* Reset the indentation level. */
+
+    if (!yaml_parser_unroll_indent(parser, -1))
+        return 0;
+
+    /* Reset simple keys. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    parser->simple_key_allowed = 0;
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+
+    SKIP(parser);
+    SKIP(parser);
+    SKIP(parser);
+
+    end_mark = parser->mark;
+
+    /* Create the DOCUMENT-START or DOCUMENT-END token. */
+
+    TOKEN_INIT(token, type, start_mark, end_mark);
+
+    /* Append the token to the queue. */
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
+ */
+
+static int
+yaml_parser_fetch_flow_collection_start(yaml_parser_t *parser,
+        yaml_token_type_t type)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* The indicators '[' and '{' may start a simple key. */
+
+    if (!yaml_parser_save_simple_key(parser))
+        return 0;
+
+    /* Increase the flow level. */
+
+    if (!yaml_parser_increase_flow_level(parser))
+        return 0;
+
+    /* A simple key may follow the indicators '[' and '{'. */
+
+    parser->simple_key_allowed = 1;
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. */
+
+    TOKEN_INIT(token, type, start_mark, end_mark);
+
+    /* Append the token to the queue. */
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
+ */
+
+static int
+yaml_parser_fetch_flow_collection_end(yaml_parser_t *parser,
+        yaml_token_type_t type)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* Reset any potential simple key on the current flow level. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    /* Decrease the flow level. */
+
+    if (!yaml_parser_decrease_flow_level(parser))
+        return 0;
+
+    /* No simple keys after the indicators ']' and '}'. */
+
+    parser->simple_key_allowed = 0;
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. */
+
+    TOKEN_INIT(token, type, start_mark, end_mark);
+
+    /* Append the token to the queue. */
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the FLOW-ENTRY token.
+ */
+
+static int
+yaml_parser_fetch_flow_entry(yaml_parser_t *parser)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* Reset any potential simple keys on the current flow level. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    /* Simple keys are allowed after ','. */
+
+    parser->simple_key_allowed = 1;
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the FLOW-ENTRY token and append it to the queue. */
+
+    TOKEN_INIT(token, YAML_FLOW_ENTRY_TOKEN, start_mark, end_mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the BLOCK-ENTRY token.
+ */
+
+static int
+yaml_parser_fetch_block_entry(yaml_parser_t *parser)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* Check if the scanner is in the block context. */
+
+    if (!parser->flow_level)
+    {
+        /* Check if we are allowed to start a new entry. */
+
+        if (!parser->simple_key_allowed) {
+            return yaml_parser_set_scanner_error(parser, NULL, parser->mark,
+                    "block sequence entries are not allowed in this context");
+        }
+
+        /* Add the BLOCK-SEQUENCE-START token if needed. */
+
+        if (!yaml_parser_roll_indent(parser, parser->mark.column, -1,
+                    YAML_BLOCK_SEQUENCE_START_TOKEN, parser->mark))
+            return 0;
+    }
+    else
+    {
+        /*
+         * It is an error for the '-' indicator to occur in the flow context,
+         * but we let the Parser detect and report about it because the Parser
+         * is able to point to the context.
+         */
+    }
+
+    /* Reset any potential simple keys on the current flow level. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    /* Simple keys are allowed after '-'. */
+
+    parser->simple_key_allowed = 1;
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the BLOCK-ENTRY token and append it to the queue. */
+
+    TOKEN_INIT(token, YAML_BLOCK_ENTRY_TOKEN, start_mark, end_mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the KEY token.
+ */
+
+static int
+yaml_parser_fetch_key(yaml_parser_t *parser)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+
+    /* In the block context, additional checks are required. */
+
+    if (!parser->flow_level)
+    {
+        /* Check if we are allowed to start a new key (not nessesary simple). */
+
+        if (!parser->simple_key_allowed) {
+            return yaml_parser_set_scanner_error(parser, NULL, parser->mark,
+                    "mapping keys are not allowed in this context");
+        }
+
+        /* Add the BLOCK-MAPPING-START token if needed. */
+
+        if (!yaml_parser_roll_indent(parser, parser->mark.column, -1,
+                    YAML_BLOCK_MAPPING_START_TOKEN, parser->mark))
+            return 0;
+    }
+
+    /* Reset any potential simple keys on the current flow level. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    /* Simple keys are allowed after '?' in the block context. */
+
+    parser->simple_key_allowed = (!parser->flow_level);
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the KEY token and append it to the queue. */
+
+    TOKEN_INIT(token, YAML_KEY_TOKEN, start_mark, end_mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the VALUE token.
+ */
+
+static int
+yaml_parser_fetch_value(yaml_parser_t *parser)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_token_t token;
+    yaml_simple_key_t *simple_key = parser->simple_keys.top-1;
+
+    /* Have we found a simple key? */
+
+    if (simple_key->possible)
+    {
+
+        /* Create the KEY token and insert it into the queue. */
+
+        TOKEN_INIT(token, YAML_KEY_TOKEN, simple_key->mark, simple_key->mark);
+
+        if (!QUEUE_INSERT(parser, parser->tokens,
+                    simple_key->token_number - parser->tokens_parsed, token))
+            return 0;
+
+        /* In the block context, we may need to add the BLOCK-MAPPING-START token. */
+
+        if (!yaml_parser_roll_indent(parser, simple_key->mark.column,
+                    simple_key->token_number,
+                    YAML_BLOCK_MAPPING_START_TOKEN, simple_key->mark))
+            return 0;
+
+        /* Remove the simple key. */
+
+        simple_key->possible = 0;
+
+        /* A simple key cannot follow another simple key. */
+
+        parser->simple_key_allowed = 0;
+    }
+    else
+    {
+        /* The ':' indicator follows a complex key. */
+
+        /* In the block context, extra checks are required. */
+
+        if (!parser->flow_level)
+        {
+            /* Check if we are allowed to start a complex value. */
+
+            if (!parser->simple_key_allowed) {
+                return yaml_parser_set_scanner_error(parser, NULL, parser->mark,
+                        "mapping values are not allowed in this context");
+            }
+
+            /* Add the BLOCK-MAPPING-START token if needed. */
+
+            if (!yaml_parser_roll_indent(parser, parser->mark.column, -1,
+                        YAML_BLOCK_MAPPING_START_TOKEN, parser->mark))
+                return 0;
+        }
+
+        /* Simple keys after ':' are allowed in the block context. */
+
+        parser->simple_key_allowed = (!parser->flow_level);
+    }
+
+    /* Consume the token. */
+
+    start_mark = parser->mark;
+    SKIP(parser);
+    end_mark = parser->mark;
+
+    /* Create the VALUE token and append it to the queue. */
+
+    TOKEN_INIT(token, YAML_VALUE_TOKEN, start_mark, end_mark);
+
+    if (!ENQUEUE(parser, parser->tokens, token))
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Produce the ALIAS or ANCHOR token.
+ */
+
+static int
+yaml_parser_fetch_anchor(yaml_parser_t *parser, yaml_token_type_t type)
+{
+    yaml_token_t token;
+
+    /* An anchor or an alias could be a simple key. */
+
+    if (!yaml_parser_save_simple_key(parser))
+        return 0;
+
+    /* A simple key cannot follow an anchor or an alias. */
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the ALIAS or ANCHOR token and append it to the queue. */
+
+    if (!yaml_parser_scan_anchor(parser, &token, type))
+        return 0;
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+    return 1;
+}
+
+/*
+ * Produce the TAG token.
+ */
+
+static int
+yaml_parser_fetch_tag(yaml_parser_t *parser)
+{
+    yaml_token_t token;
+
+    /* A tag could be a simple key. */
+
+    if (!yaml_parser_save_simple_key(parser))
+        return 0;
+
+    /* A simple key cannot follow a tag. */
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the TAG token and append it to the queue. */
+
+    if (!yaml_parser_scan_tag(parser, &token))
+        return 0;
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
+ */
+
+static int
+yaml_parser_fetch_block_scalar(yaml_parser_t *parser, int literal)
+{
+    yaml_token_t token;
+
+    /* Remove any potential simple keys. */
+
+    if (!yaml_parser_remove_simple_key(parser))
+        return 0;
+
+    /* A simple key may follow a block scalar. */
+
+    parser->simple_key_allowed = 1;
+
+    /* Create the SCALAR token and append it to the queue. */
+
+    if (!yaml_parser_scan_block_scalar(parser, &token, literal))
+        return 0;
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
+ */
+
+static int
+yaml_parser_fetch_flow_scalar(yaml_parser_t *parser, int single)
+{
+    yaml_token_t token;
+
+    /* A plain scalar could be a simple key. */
+
+    if (!yaml_parser_save_simple_key(parser))
+        return 0;
+
+    /* A simple key cannot follow a flow scalar. */
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the SCALAR token and append it to the queue. */
+
+    if (!yaml_parser_scan_flow_scalar(parser, &token, single))
+        return 0;
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Produce the SCALAR(...,plain) token.
+ */
+
+static int
+yaml_parser_fetch_plain_scalar(yaml_parser_t *parser)
+{
+    yaml_token_t token;
+
+    /* A plain scalar could be a simple key. */
+
+    if (!yaml_parser_save_simple_key(parser))
+        return 0;
+
+    /* A simple key cannot follow a flow scalar. */
+
+    parser->simple_key_allowed = 0;
+
+    /* Create the SCALAR token and append it to the queue. */
+
+    if (!yaml_parser_scan_plain_scalar(parser, &token))
+        return 0;
+
+    if (!ENQUEUE(parser, parser->tokens, token)) {
+        yaml_token_delete(&token);
+        return 0;
+    }
+
+    return 1;
+}
+
+/*
+ * Eat whitespaces and comments until the next token is found.
+ */
+
+static int
+yaml_parser_scan_to_next_token(yaml_parser_t *parser)
+{
+    /* Until the next token is not found. */
+
+    while (1)
+    {
+        /* Allow the BOM mark to start a line. */
+
+        if (!CACHE(parser, 1)) return 0;
+
+        if (parser->mark.column == 0 && IS_BOM(parser->buffer))
+            SKIP(parser);
+
+        /*
+         * Eat whitespaces.
+         *
+         * Tabs are allowed:
+         *
+         *  - in the flow context;
+         *  - in the block context, but not at the beginning of the line or
+         *  after '-', '?', or ':' (complex value).
+         */
+
+        if (!CACHE(parser, 1)) return 0;
+
+        while (CHECK(parser->buffer,' ') ||
+                ((parser->flow_level || !parser->simple_key_allowed) &&
+                 CHECK(parser->buffer, '\t'))) {
+            SKIP(parser);
+            if (!CACHE(parser, 1)) return 0;
+        }
+
+        /* Eat a comment until a line break. */
+
+        if (CHECK(parser->buffer, '#')) {
+            while (!IS_BREAKZ(parser->buffer)) {
+                SKIP(parser);
+                if (!CACHE(parser, 1)) return 0;
+            }
+        }
+
+        /* If it is a line break, eat it. */
+
+        if (IS_BREAK(parser->buffer))
+        {
+            if (!CACHE(parser, 2)) return 0;
+            SKIP_LINE(parser);
+
+            /* In the block context, a new line may start a simple key. */
+
+            if (!parser->flow_level) {
+                parser->simple_key_allowed = 1;
+            }
+        }
+        else
+        {
+            /* We have found a token. */
+
+            break;
+        }
+    }
+
+    return 1;
+}
+
+/*
+ * Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
+ *
+ * Scope:
+ *      %YAML    1.1    # a comment \n
+ *      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ *      %TAG    !yaml!  tag:yaml.org,2002:  \n
+ *      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ */
+
+int
+yaml_parser_scan_directive(yaml_parser_t *parser, yaml_token_t *token)
+{
+    yaml_mark_t start_mark, end_mark;
+    yaml_char_t *name = NULL;
+    int major, minor;
+    yaml_char_t *handle = NULL, *prefix = NULL;
+
+    /* Eat '%'. */
+
+    start_mark = parser->mark;
+
+    SKIP(parser);
+
+    /* Scan the directive name. */
+
+    if (!yaml_parser_scan_directive_name(parser, start_mark, &name))
+        goto error;
+
+    /* Is it a YAML directive? */
+
+    if (strcmp((char *)name, "YAML") == 0)
+    {
+        /* Scan the VERSION directive value. */
+
+        if (!yaml_parser_scan_version_directive_value(parser, start_mark,
+                    &major, &minor))
+            goto error;
+
+        end_mark = parser->mark;
+
+        /* Create a VERSION-DIRECTIVE token. */
+
+        VERSION_DIRECTIVE_TOKEN_INIT(*token, major, minor,
+                start_mark, end_mark);
+    }
+
+    /* Is it a TAG directive? */
+
+    else if (strcmp((char *)name, "TAG") == 0)
+    {
+        /* Scan the TAG directive value. */
+
+        if (!yaml_parser_scan_tag_directive_value(parser, start_mark,
+                    &handle, &prefix))
+            goto error;
+
+        end_mark = parser->mark;
+
+        /* Create a TAG-DIRECTIVE token. */
+
+        TAG_DIRECTIVE_TOKEN_INIT(*token, handle, prefix,
+                start_mark, end_mark);
+    }
+
+    /* Unknown directive. */
+
+    else
+    {
+        yaml_parser_set_scanner_error(parser, "while scanning a directive",
+                start_mark, "found unknown directive name");
+        goto error;
+    }
+
+    /* Eat the rest of the line including any comments. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_BLANK(parser->buffer)) {
+        SKIP(parser);
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    if (CHECK(parser->buffer, '#')) {
+        while (!IS_BREAKZ(parser->buffer)) {
+            SKIP(parser);
+            if (!CACHE(parser, 1)) goto error;
+        }
+    }
+
+    /* Check if we are at the end of the line. */
+
+    if (!IS_BREAKZ(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a directive",
+                start_mark, "did not find expected comment or line break");
+        goto error;
+    }
+
+    /* Eat a line break. */
+
+    if (IS_BREAK(parser->buffer)) {
+        if (!CACHE(parser, 2)) goto error;
+        SKIP_LINE(parser);
+    }
+
+    yaml_free(name);
+
+    return 1;
+
+error:
+    yaml_free(prefix);
+    yaml_free(handle);
+    yaml_free(name);
+    return 0;
+}
+
+/*
+ * Scan the directive name.
+ *
+ * Scope:
+ *      %YAML   1.1     # a comment \n
+ *       ^^^^
+ *      %TAG    !yaml!  tag:yaml.org,2002:  \n
+ *       ^^^
+ */
+
+static int
+yaml_parser_scan_directive_name(yaml_parser_t *parser,
+        yaml_mark_t start_mark, yaml_char_t **name)
+{
+    yaml_string_t string = NULL_STRING;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+
+    /* Consume the directive name. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_ALPHA(parser->buffer))
+    {
+        if (!READ(parser, string)) goto error;
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    /* Check if the name is empty. */
+
+    if (string.start == string.pointer) {
+        yaml_parser_set_scanner_error(parser, "while scanning a directive",
+                start_mark, "could not find expected directive name");
+        goto error;
+    }
+
+    /* Check for an blank character after the name. */
+
+    if (!IS_BLANKZ(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a directive",
+                start_mark, "found unexpected non-alphabetical character");
+        goto error;
+    }
+
+    *name = string.start;
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    return 0;
+}
+
+/*
+ * Scan the value of VERSION-DIRECTIVE.
+ *
+ * Scope:
+ *      %YAML   1.1     # a comment \n
+ *           ^^^^^^
+ */
+
+static int
+yaml_parser_scan_version_directive_value(yaml_parser_t *parser,
+        yaml_mark_t start_mark, int *major, int *minor)
+{
+    /* Eat whitespaces. */
+
+    if (!CACHE(parser, 1)) return 0;
+
+    while (IS_BLANK(parser->buffer)) {
+        SKIP(parser);
+        if (!CACHE(parser, 1)) return 0;
+    }
+
+    /* Consume the major version number. */
+
+    if (!yaml_parser_scan_version_directive_number(parser, start_mark, major))
+        return 0;
+
+    /* Eat '.'. */
+
+    if (!CHECK(parser->buffer, '.')) {
+        return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+                start_mark, "did not find expected digit or '.' character");
+    }
+
+    SKIP(parser);
+
+    /* Consume the minor version number. */
+
+    if (!yaml_parser_scan_version_directive_number(parser, start_mark, minor))
+        return 0;
+
+    return 1;
+}
+
+#define MAX_NUMBER_LENGTH   9
+
+/*
+ * Scan the version number of VERSION-DIRECTIVE.
+ *
+ * Scope:
+ *      %YAML   1.1     # a comment \n
+ *              ^
+ *      %YAML   1.1     # a comment \n
+ *                ^
+ */
+
+static int
+yaml_parser_scan_version_directive_number(yaml_parser_t *parser,
+        yaml_mark_t start_mark, int *number)
+{
+    int value = 0;
+    size_t length = 0;
+
+    /* Repeat while the next character is digit. */
+
+    if (!CACHE(parser, 1)) return 0;
+
+    while (IS_DIGIT(parser->buffer))
+    {
+        /* Check if the number is too long. */
+
+        if (++length > MAX_NUMBER_LENGTH) {
+            return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+                    start_mark, "found extremely long version number");
+        }
+
+        value = value*10 + AS_DIGIT(parser->buffer);
+
+        SKIP(parser);
+
+        if (!CACHE(parser, 1)) return 0;
+    }
+
+    /* Check if the number was present. */
+
+    if (!length) {
+        return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
+                start_mark, "did not find expected version number");
+    }
+
+    *number = value;
+
+    return 1;
+}
+
+/*
+ * Scan the value of a TAG-DIRECTIVE token.
+ *
+ * Scope:
+ *      %TAG    !yaml!  tag:yaml.org,2002:  \n
+ *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ */
+
+static int
+yaml_parser_scan_tag_directive_value(yaml_parser_t *parser,
+        yaml_mark_t start_mark, yaml_char_t **handle, yaml_char_t **prefix)
+{
+    yaml_char_t *handle_value = NULL;
+    yaml_char_t *prefix_value = NULL;
+
+    /* Eat whitespaces. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_BLANK(parser->buffer)) {
+        SKIP(parser);
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    /* Scan a handle. */
+
+    if (!yaml_parser_scan_tag_handle(parser, 1, start_mark, &handle_value))
+        goto error;
+
+    /* Expect a whitespace. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    if (!IS_BLANK(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+                start_mark, "did not find expected whitespace");
+        goto error;
+    }
+
+    /* Eat whitespaces. */
+
+    while (IS_BLANK(parser->buffer)) {
+        SKIP(parser);
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    /* Scan a prefix. */
+
+    if (!yaml_parser_scan_tag_uri(parser, 1, NULL, start_mark, &prefix_value))
+        goto error;
+
+    /* Expect a whitespace or line break. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    if (!IS_BLANKZ(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
+                start_mark, "did not find expected whitespace or line break");
+        goto error;
+    }
+
+    *handle = handle_value;
+    *prefix = prefix_value;
+
+    return 1;
+
+error:
+    yaml_free(handle_value);
+    yaml_free(prefix_value);
+    return 0;
+}
+
+static int
+yaml_parser_scan_anchor(yaml_parser_t *parser, yaml_token_t *token,
+        yaml_token_type_t type)
+{
+    int length = 0;
+    yaml_mark_t start_mark, end_mark;
+    yaml_string_t string = NULL_STRING;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+
+    /* Eat the indicator character. */
+
+    start_mark = parser->mark;
+
+    SKIP(parser);
+
+    /* Consume the value. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_ALPHA(parser->buffer)) {
+        if (!READ(parser, string)) goto error;
+        if (!CACHE(parser, 1)) goto error;
+        length ++;
+    }
+
+    end_mark = parser->mark;
+
+    /*
+     * Check if length of the anchor is greater than 0 and it is followed by
+     * a whitespace character or one of the indicators:
+     *
+     *      '?', ':', ',', ']', '}', '%', '@', '`'.
+     */
+
+    if (!length || !(IS_BLANKZ(parser->buffer) || CHECK(parser->buffer, '?')
+                || CHECK(parser->buffer, ':') || CHECK(parser->buffer, ',')
+                || CHECK(parser->buffer, ']') || CHECK(parser->buffer, '}')
+                || CHECK(parser->buffer, '%') || CHECK(parser->buffer, '@')
+                || CHECK(parser->buffer, '`'))) {
+        yaml_parser_set_scanner_error(parser, type == YAML_ANCHOR_TOKEN ?
+                "while scanning an anchor" : "while scanning an alias", start_mark,
+                "did not find expected alphabetic or numeric character");
+        goto error;
+    }
+
+    /* Create a token. */
+
+    if (type == YAML_ANCHOR_TOKEN) {
+        ANCHOR_TOKEN_INIT(*token, string.start, start_mark, end_mark);
+    }
+    else {
+        ALIAS_TOKEN_INIT(*token, string.start, start_mark, end_mark);
+    }
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    return 0;
+}
+
+/*
+ * Scan a TAG token.
+ */
+
+static int
+yaml_parser_scan_tag(yaml_parser_t *parser, yaml_token_t *token)
+{
+    yaml_char_t *handle = NULL;
+    yaml_char_t *suffix = NULL;
+    yaml_mark_t start_mark, end_mark;
+
+    start_mark = parser->mark;
+
+    /* Check if the tag is in the canonical form. */
+
+    if (!CACHE(parser, 2)) goto error;
+
+    if (CHECK_AT(parser->buffer, '<', 1))
+    {
+        /* Set the handle to '' */
+
+        handle = yaml_malloc(1);
+        if (!handle) goto error;
+        handle[0] = '\0';
+
+        /* Eat '!<' */
+
+        SKIP(parser);
+        SKIP(parser);
+
+        /* Consume the tag value. */
+
+        if (!yaml_parser_scan_tag_uri(parser, 0, NULL, start_mark, &suffix))
+            goto error;
+
+        /* Check for '>' and eat it. */
+
+        if (!CHECK(parser->buffer, '>')) {
+            yaml_parser_set_scanner_error(parser, "while scanning a tag",
+                    start_mark, "did not find the expected '>'");
+            goto error;
+        }
+
+        SKIP(parser);
+    }
+    else
+    {
+        /* The tag has either the '!suffix' or the '!handle!suffix' form. */
+
+        /* First, try to scan a handle. */
+
+        if (!yaml_parser_scan_tag_handle(parser, 0, start_mark, &handle))
+            goto error;
+
+        /* Check if it is, indeed, handle. */
+
+        if (handle[0] == '!' && handle[1] != '\0' && handle[strlen((char *)handle)-1] == '!')
+        {
+            /* Scan the suffix now. */
+
+            if (!yaml_parser_scan_tag_uri(parser, 0, NULL, start_mark, &suffix))
+                goto error;
+        }
+        else
+        {
+            /* It wasn't a handle after all.  Scan the rest of the tag. */
+
+            if (!yaml_parser_scan_tag_uri(parser, 0, handle, start_mark, &suffix))
+                goto error;
+
+            /* Set the handle to '!'. */
+
+            yaml_free(handle);
+            handle = yaml_malloc(2);
+            if (!handle) goto error;
+            handle[0] = '!';
+            handle[1] = '\0';
+
+            /*
+             * A special case: the '!' tag.  Set the handle to '' and the
+             * suffix to '!'.
+             */
+
+            if (suffix[0] == '\0') {
+                yaml_char_t *tmp = handle;
+                handle = suffix;
+                suffix = tmp;
+            }
+        }
+    }
+
+    /* Check the character which ends the tag. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    if (!IS_BLANKZ(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a tag",
+                start_mark, "did not find expected whitespace or line break");
+        goto error;
+    }
+
+    end_mark = parser->mark;
+
+    /* Create a token. */
+
+    TAG_TOKEN_INIT(*token, handle, suffix, start_mark, end_mark);
+
+    return 1;
+
+error:
+    yaml_free(handle);
+    yaml_free(suffix);
+    return 0;
+}
+
+/*
+ * Scan a tag handle.
+ */
+
+static int
+yaml_parser_scan_tag_handle(yaml_parser_t *parser, int directive,
+        yaml_mark_t start_mark, yaml_char_t **handle)
+{
+    yaml_string_t string = NULL_STRING;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+
+    /* Check the initial '!' character. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    if (!CHECK(parser->buffer, '!')) {
+        yaml_parser_set_scanner_error(parser, directive ?
+                "while scanning a tag directive" : "while scanning a tag",
+                start_mark, "did not find expected '!'");
+        goto error;
+    }
+
+    /* Copy the '!' character. */
+
+    if (!READ(parser, string)) goto error;
+
+    /* Copy all subsequent alphabetical and numerical characters. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_ALPHA(parser->buffer))
+    {
+        if (!READ(parser, string)) goto error;
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    /* Check if the trailing character is '!' and copy it. */
+
+    if (CHECK(parser->buffer, '!'))
+    {
+        if (!READ(parser, string)) goto error;
+    }
+    else
+    {
+        /*
+         * It's either the '!' tag or not really a tag handle.  If it's a %TAG
+         * directive, it's an error.  If it's a tag token, it must be a part of
+         * URI.
+         */
+
+        if (directive && !(string.start[0] == '!' && string.start[1] == '\0')) {
+            yaml_parser_set_scanner_error(parser, "while parsing a tag directive",
+                    start_mark, "did not find expected '!'");
+            goto error;
+        }
+    }
+
+    *handle = string.start;
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    return 0;
+}
+
+/*
+ * Scan a tag.
+ */
+
+static int
+yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
+        yaml_char_t *head, yaml_mark_t start_mark, yaml_char_t **uri)
+{
+    size_t length = head ? strlen((char *)head) : 0;
+    yaml_string_t string = NULL_STRING;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+
+    /* Resize the string to include the head. */
+
+    while ((size_t)(string.end - string.start) <= length) {
+        if (!yaml_string_extend(&string.start, &string.pointer, &string.end)) {
+            parser->error = YAML_MEMORY_ERROR;
+            goto error;
+        }
+    }
+
+    /*
+     * Copy the head if needed.
+     *
+     * Note that we don't copy the leading '!' character.
+     */
+
+    if (length > 1) {
+        memcpy(string.start, head+1, length-1);
+        string.pointer += length-1;
+    }
+
+    /* Scan the tag. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    /*
+     * The set of characters that may appear in URI is as follows:
+     *
+     *      '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
+     *      '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
+     *      '%'.
+     */
+
+    while (IS_ALPHA(parser->buffer) || CHECK(parser->buffer, ';')
+            || CHECK(parser->buffer, '/') || CHECK(parser->buffer, '?')
+            || CHECK(parser->buffer, ':') || CHECK(parser->buffer, '@')
+            || CHECK(parser->buffer, '&') || CHECK(parser->buffer, '=')
+            || CHECK(parser->buffer, '+') || CHECK(parser->buffer, '$')
+            || CHECK(parser->buffer, ',') || CHECK(parser->buffer, '.')
+            || CHECK(parser->buffer, '!') || CHECK(parser->buffer, '~')
+            || CHECK(parser->buffer, '*') || CHECK(parser->buffer, '\'')
+            || CHECK(parser->buffer, '(') || CHECK(parser->buffer, ')')
+            || CHECK(parser->buffer, '[') || CHECK(parser->buffer, ']')
+            || CHECK(parser->buffer, '%'))
+    {
+        /* Check if it is a URI-escape sequence. */
+
+        if (CHECK(parser->buffer, '%')) {
+            if (!STRING_EXTEND(parser, string))
+                goto error;
+
+            if (!yaml_parser_scan_uri_escapes(parser,
+                        directive, start_mark, &string)) goto error;
+        }
+        else {
+            if (!READ(parser, string)) goto error;
+        }
+
+        length ++;
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    /* Check if the tag is non-empty. */
+
+    if (!length) {
+        if (!STRING_EXTEND(parser, string))
+            goto error;
+
+        yaml_parser_set_scanner_error(parser, directive ?
+                "while parsing a %TAG directive" : "while parsing a tag",
+                start_mark, "did not find expected tag URI");
+        goto error;
+    }
+
+    *uri = string.start;
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    return 0;
+}
+
+/*
+ * Decode an URI-escape sequence corresponding to a single UTF-8 character.
+ */
+
+static int
+yaml_parser_scan_uri_escapes(yaml_parser_t *parser, int directive,
+        yaml_mark_t start_mark, yaml_string_t *string)
+{
+    int width = 0;
+
+    /* Decode the required number of characters. */
+
+    do {
+
+        unsigned char octet = 0;
+
+        /* Check for a URI-escaped octet. */
+
+        if (!CACHE(parser, 3)) return 0;
+
+        if (!(CHECK(parser->buffer, '%')
+                    && IS_HEX_AT(parser->buffer, 1)
+                    && IS_HEX_AT(parser->buffer, 2))) {
+            return yaml_parser_set_scanner_error(parser, directive ?
+                    "while parsing a %TAG directive" : "while parsing a tag",
+                    start_mark, "did not find URI escaped octet");
+        }
+
+        /* Get the octet. */
+
+        octet = (AS_HEX_AT(parser->buffer, 1) << 4) + AS_HEX_AT(parser->buffer, 2);
+
+        /* If it is the leading octet, determine the length of the UTF-8 sequence. */
+
+        if (!width)
+        {
+            width = (octet & 0x80) == 0x00 ? 1 :
+                    (octet & 0xE0) == 0xC0 ? 2 :
+                    (octet & 0xF0) == 0xE0 ? 3 :
+                    (octet & 0xF8) == 0xF0 ? 4 : 0;
+            if (!width) {
+                return yaml_parser_set_scanner_error(parser, directive ?
+                        "while parsing a %TAG directive" : "while parsing a tag",
+                        start_mark, "found an incorrect leading UTF-8 octet");
+            }
+        }
+        else
+        {
+            /* Check if the trailing octet is correct. */
+
+            if ((octet & 0xC0) != 0x80) {
+                return yaml_parser_set_scanner_error(parser, directive ?
+                        "while parsing a %TAG directive" : "while parsing a tag",
+                        start_mark, "found an incorrect trailing UTF-8 octet");
+            }
+        }
+
+        /* Copy the octet and move the pointers. */
+
+        *(string->pointer++) = octet;
+        SKIP(parser);
+        SKIP(parser);
+        SKIP(parser);
+
+    } while (--width);
+
+    return 1;
+}
+
+/*
+ * Scan a block scalar.
+ */
+
+static int
+yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
+        int literal)
+{
+    yaml_mark_t start_mark;
+    yaml_mark_t end_mark;
+    yaml_string_t string = NULL_STRING;
+    yaml_string_t leading_break = NULL_STRING;
+    yaml_string_t trailing_breaks = NULL_STRING;
+    int chomping = 0;
+    int increment = 0;
+    int indent = 0;
+    int leading_blank = 0;
+    int trailing_blank = 0;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, leading_break, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, trailing_breaks, INITIAL_STRING_SIZE)) goto error;
+
+    /* Eat the indicator '|' or '>'. */
+
+    start_mark = parser->mark;
+
+    SKIP(parser);
+
+    /* Scan the additional block scalar indicators. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    /* Check for a chomping indicator. */
+
+    if (CHECK(parser->buffer, '+') || CHECK(parser->buffer, '-'))
+    {
+        /* Set the chomping method and eat the indicator. */
+
+        chomping = CHECK(parser->buffer, '+') ? +1 : -1;
+
+        SKIP(parser);
+
+        /* Check for an indentation indicator. */
+
+        if (!CACHE(parser, 1)) goto error;
+
+        if (IS_DIGIT(parser->buffer))
+        {
+            /* Check that the indentation is greater than 0. */
+
+            if (CHECK(parser->buffer, '0')) {
+                yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+                        start_mark, "found an indentation indicator equal to 0");
+                goto error;
+            }
+
+            /* Get the indentation level and eat the indicator. */
+
+            increment = AS_DIGIT(parser->buffer);
+
+            SKIP(parser);
+        }
+    }
+
+    /* Do the same as above, but in the opposite order. */
+
+    else if (IS_DIGIT(parser->buffer))
+    {
+        if (CHECK(parser->buffer, '0')) {
+            yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+                    start_mark, "found an indentation indicator equal to 0");
+            goto error;
+        }
+
+        increment = AS_DIGIT(parser->buffer);
+
+        SKIP(parser);
+
+        if (!CACHE(parser, 1)) goto error;
+
+        if (CHECK(parser->buffer, '+') || CHECK(parser->buffer, '-')) {
+            chomping = CHECK(parser->buffer, '+') ? +1 : -1;
+
+            SKIP(parser);
+        }
+    }
+
+    /* Eat whitespaces and comments to the end of the line. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while (IS_BLANK(parser->buffer)) {
+        SKIP(parser);
+        if (!CACHE(parser, 1)) goto error;
+    }
+
+    if (CHECK(parser->buffer, '#')) {
+        while (!IS_BREAKZ(parser->buffer)) {
+            SKIP(parser);
+            if (!CACHE(parser, 1)) goto error;
+        }
+    }
+
+    /* Check if we are at the end of the line. */
+
+    if (!IS_BREAKZ(parser->buffer)) {
+        yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+                start_mark, "did not find expected comment or line break");
+        goto error;
+    }
+
+    /* Eat a line break. */
+
+    if (IS_BREAK(parser->buffer)) {
+        if (!CACHE(parser, 2)) goto error;
+        SKIP_LINE(parser);
+    }
+
+    end_mark = parser->mark;
+
+    /* Set the indentation level if it was specified. */
+
+    if (increment) {
+        indent = parser->indent >= 0 ? parser->indent+increment : increment;
+    }
+
+    /* Scan the leading line breaks and determine the indentation level if needed. */
+
+    if (!yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks,
+                start_mark, &end_mark)) goto error;
+
+    /* Scan the block scalar content. */
+
+    if (!CACHE(parser, 1)) goto error;
+
+    while ((int)parser->mark.column == indent && !IS_Z(parser->buffer))
+    {
+        /*
+         * We are at the beginning of a non-empty line.
+         */
+
+        /* Is it a trailing whitespace? */
+
+        trailing_blank = IS_BLANK(parser->buffer);
+
+        /* Check if we need to fold the leading line break. */
+
+        if (!literal && (*leading_break.start == '\n')
+                && !leading_blank && !trailing_blank)
+        {
+            /* Do we need to join the lines by space? */
+
+            if (*trailing_breaks.start == '\0') {
+                if (!STRING_EXTEND(parser, string)) goto error;
+                *(string.pointer ++) = ' ';
+            }
+
+            CLEAR(parser, leading_break);
+        }
+        else {
+            if (!JOIN(parser, string, leading_break)) goto error;
+            CLEAR(parser, leading_break);
+        }
+
+        /* Append the remaining line breaks. */
+
+        if (!JOIN(parser, string, trailing_breaks)) goto error;
+        CLEAR(parser, trailing_breaks);
+
+        /* Is it a leading whitespace? */
+
+        leading_blank = IS_BLANK(parser->buffer);
+
+        /* Consume the current line. */
+
+        while (!IS_BREAKZ(parser->buffer)) {
+            if (!READ(parser, string)) goto error;
+            if (!CACHE(parser, 1)) goto error;
+        }
+
+        /* Consume the line break. */
+
+        if (!CACHE(parser, 2)) goto error;
+
+        if (!READ_LINE(parser, leading_break)) goto error;
+
+        /* Eat the following indentation spaces and line breaks. */
+
+        if (!yaml_parser_scan_block_scalar_breaks(parser,
+                    &indent, &trailing_breaks, start_mark, &end_mark)) goto error;
+    }
+
+    /* Chomp the tail. */
+
+    if (chomping != -1) {
+        if (!JOIN(parser, string, leading_break)) goto error;
+    }
+    if (chomping == 1) {
+        if (!JOIN(parser, string, trailing_breaks)) goto error;
+    }
+
+    /* Create a token. */
+
+    SCALAR_TOKEN_INIT(*token, string.start, string.pointer-string.start,
+            literal ? YAML_LITERAL_SCALAR_STYLE : YAML_FOLDED_SCALAR_STYLE,
+            start_mark, end_mark);
+
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+
+    return 0;
+}
+
+/*
+ * Scan indentation spaces and line breaks for a block scalar.  Determine the
+ * indentation level if needed.
+ */
+
+static int
+yaml_parser_scan_block_scalar_breaks(yaml_parser_t *parser,
+        int *indent, yaml_string_t *breaks,
+        yaml_mark_t start_mark, yaml_mark_t *end_mark)
+{
+    int max_indent = 0;
+
+    *end_mark = parser->mark;
+
+    /* Eat the indentation spaces and line breaks. */
+
+    while (1)
+    {
+        /* Eat the indentation spaces. */
+
+        if (!CACHE(parser, 1)) return 0;
+
+        while ((!*indent || (int)parser->mark.column < *indent)
+                && IS_SPACE(parser->buffer)) {
+            SKIP(parser);
+            if (!CACHE(parser, 1)) return 0;
+        }
+
+        if ((int)parser->mark.column > max_indent)
+            max_indent = (int)parser->mark.column;
+
+        /* Check for a tab character messing the indentation. */
+
+        if ((!*indent || (int)parser->mark.column < *indent)
+                && IS_TAB(parser->buffer)) {
+            return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
+                    start_mark, "found a tab character where an indentation space is expected");
+        }
+
+        /* Have we found a non-empty line? */
+
+        if (!IS_BREAK(parser->buffer)) break;
+
+        /* Consume the line break. */
+
+        if (!CACHE(parser, 2)) return 0;
+        if (!READ_LINE(parser, *breaks)) return 0;
+        *end_mark = parser->mark;
+    }
+
+    /* Determine the indentation level if needed. */
+
+    if (!*indent) {
+        *indent = max_indent;
+        if (*indent < parser->indent + 1)
+            *indent = parser->indent + 1;
+        if (*indent < 1)
+            *indent = 1;
+    }
+
+   return 1;
+}
+
+/*
+ * Scan a quoted scalar.
+ */
+
+static int
+yaml_parser_scan_flow_scalar(yaml_parser_t *parser, yaml_token_t *token,
+        int single)
+{
+    yaml_mark_t start_mark;
+    yaml_mark_t end_mark;
+    yaml_string_t string = NULL_STRING;
+    yaml_string_t leading_break = NULL_STRING;
+    yaml_string_t trailing_breaks = NULL_STRING;
+    yaml_string_t whitespaces = NULL_STRING;
+    int leading_blanks;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, leading_break, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, trailing_breaks, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, whitespaces, INITIAL_STRING_SIZE)) goto error;
+
+    /* Eat the left quote. */
+
+    start_mark = parser->mark;
+
+    SKIP(parser);
+
+    /* Consume the content of the quoted scalar. */
+
+    while (1)
+    {
+        /* Check that there are no document indicators at the beginning of the line. */
+
+        if (!CACHE(parser, 4)) goto error;
+
+        if (parser->mark.column == 0 &&
+            ((CHECK_AT(parser->buffer, '-', 0) &&
+              CHECK_AT(parser->buffer, '-', 1) &&
+              CHECK_AT(parser->buffer, '-', 2)) ||
+             (CHECK_AT(parser->buffer, '.', 0) &&
+              CHECK_AT(parser->buffer, '.', 1) &&
+              CHECK_AT(parser->buffer, '.', 2))) &&
+            IS_BLANKZ_AT(parser->buffer, 3))
+        {
+            yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+                    start_mark, "found unexpected document indicator");
+            goto error;
+        }
+
+        /* Check for EOF. */
+
+        if (IS_Z(parser->buffer)) {
+            yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
+                    start_mark, "found unexpected end of stream");
+            goto error;
+        }
+
+        /* Consume non-blank characters. */
+
+        if (!CACHE(parser, 2)) goto error;
+
+        leading_blanks = 0;
+
+        while (!IS_BLANKZ(parser->buffer))
+        {
+            /* Check for an escaped single quote. */
+
+            if (single && CHECK_AT(parser->buffer, '\'', 0)
+                    && CHECK_AT(parser->buffer, '\'', 1))
+            {
+                if (!STRING_EXTEND(parser, string)) goto error;
+                *(string.pointer++) = '\'';
+                SKIP(parser);
+                SKIP(parser);
+            }
+
+            /* Check for the right quote. */
+
+            else if (CHECK(parser->buffer, single ? '\'' : '"'))
+            {
+                break;
+            }
+
+            /* Check for an escaped line break. */
+
+            else if (!single && CHECK(parser->buffer, '\\')
+                    && IS_BREAK_AT(parser->buffer, 1))
+            {
+                if (!CACHE(parser, 3)) goto error;
+                SKIP(parser);
+                SKIP_LINE(parser);
+                leading_blanks = 1;
+                break;
+            }
+
+            /* Check for an escape sequence. */
+
+            else if (!single && CHECK(parser->buffer, '\\'))
+            {
+                size_t code_length = 0;
+
+                if (!STRING_EXTEND(parser, string)) goto error;
+
+                /* Check the escape character. */
+
+                switch (parser->buffer.pointer[1])
+                {
+                    case '0':
+                        *(string.pointer++) = '\0';
+                        break;
+
+                    case 'a':
+                        *(string.pointer++) = '\x07';
+                        break;
+
+                    case 'b':
+                        *(string.pointer++) = '\x08';
+                        break;
+
+                    case 't':
+                    case '\t':
+                        *(string.pointer++) = '\x09';
+                        break;
+
+                    case 'n':
+                        *(string.pointer++) = '\x0A';
+                        break;
+
+                    case 'v':
+                        *(string.pointer++) = '\x0B';
+                        break;
+
+                    case 'f':
+                        *(string.pointer++) = '\x0C';
+                        break;
+
+                    case 'r':
+                        *(string.pointer++) = '\x0D';
+                        break;
+
+                    case 'e':
+                        *(string.pointer++) = '\x1B';
+                        break;
+
+                    case ' ':
+                        *(string.pointer++) = '\x20';
+                        break;
+
+                    case '"':
+                        *(string.pointer++) = '"';
+                        break;
+
+                    case '/':
+                        *(string.pointer++) = '/';
+                        break;
+
+                    case '\'':
+                        *(string.pointer++) = '\'';
+                        break;
+
+                    case '\\':
+                        *(string.pointer++) = '\\';
+                        break;
+
+                    case 'N':   /* NEL (#x85) */
+                        *(string.pointer++) = '\xC2';
+                        *(string.pointer++) = '\x85';
+                        break;
+
+                    case '_':   /* #xA0 */
+                        *(string.pointer++) = '\xC2';
+                        *(string.pointer++) = '\xA0';
+                        break;
+
+                    case 'L':   /* LS (#x2028) */
+                        *(string.pointer++) = '\xE2';
+                        *(string.pointer++) = '\x80';
+                        *(string.pointer++) = '\xA8';
+                        break;
+
+                    case 'P':   /* PS (#x2029) */
+                        *(string.pointer++) = '\xE2';
+                        *(string.pointer++) = '\x80';
+                        *(string.pointer++) = '\xA9';
+                        break;
+
+                    case 'x':
+                        code_length = 2;
+                        break;
+
+                    case 'u':
+                        code_length = 4;
+                        break;
+
+                    case 'U':
+                        code_length = 8;
+                        break;
+
+                    default:
+                        yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+                                start_mark, "found unknown escape character");
+                        goto error;
+                }
+
+                SKIP(parser);
+                SKIP(parser);
+
+                /* Consume an arbitrary escape code. */
+
+                if (code_length)
+                {
+                    unsigned int value = 0;
+                    size_t k;
+
+                    /* Scan the character value. */
+
+                    if (!CACHE(parser, code_length)) goto error;
+
+                    for (k = 0; k < code_length; k ++) {
+                        if (!IS_HEX_AT(parser->buffer, k)) {
+                            yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+                                    start_mark, "did not find expected hexdecimal number");
+                            goto error;
+                        }
+                        value = (value << 4) + AS_HEX_AT(parser->buffer, k);
+                    }
+
+                    /* Check the value and write the character. */
+
+                    if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) {
+                        yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
+                                start_mark, "found invalid Unicode character escape code");
+                        goto error;
+                    }
+
+                    if (value <= 0x7F) {
+                        *(string.pointer++) = value;
+                    }
+                    else if (value <= 0x7FF) {
+                        *(string.pointer++) = 0xC0 + (value >> 6);
+                        *(string.pointer++) = 0x80 + (value & 0x3F);
+                    }
+                    else if (value <= 0xFFFF) {
+                        *(string.pointer++) = 0xE0 + (value >> 12);
+                        *(string.pointer++) = 0x80 + ((value >> 6) & 0x3F);
+                        *(string.pointer++) = 0x80 + (value & 0x3F);
+                    }
+                    else {
+                        *(string.pointer++) = 0xF0 + (value >> 18);
+                        *(string.pointer++) = 0x80 + ((value >> 12) & 0x3F);
+                        *(string.pointer++) = 0x80 + ((value >> 6) & 0x3F);
+                        *(string.pointer++) = 0x80 + (value & 0x3F);
+                    }
+
+                    /* Advance the pointer. */
+
+                    for (k = 0; k < code_length; k ++) {
+                        SKIP(parser);
+                    }
+                }
+            }
+
+            else
+            {
+                /* It is a non-escaped non-blank character. */
+
+                if (!READ(parser, string)) goto error;
+            }
+
+            if (!CACHE(parser, 2)) goto error;
+        }
+
+        /* Check if we are at the end of the scalar. */
+
+        /* Fix for crash unitialized value crash
+         * Credit for the bug and input is to OSS Fuzz
+         * Credit for the fix to Alex Gaynor
+         */
+        if (!CACHE(parser, 1)) goto error;
+        if (CHECK(parser->buffer, single ? '\'' : '"'))
+            break;
+
+        /* Consume blank characters. */
+
+        if (!CACHE(parser, 1)) goto error;
+
+        while (IS_BLANK(parser->buffer) || IS_BREAK(parser->buffer))
+        {
+            if (IS_BLANK(parser->buffer))
+            {
+                /* Consume a space or a tab character. */
+
+                if (!leading_blanks) {
+                    if (!READ(parser, whitespaces)) goto error;
+                }
+                else {
+                    SKIP(parser);
+                }
+            }
+            else
+            {
+                if (!CACHE(parser, 2)) goto error;
+
+                /* Check if it is a first line break. */
+
+                if (!leading_blanks)
+                {
+                    CLEAR(parser, whitespaces);
+                    if (!READ_LINE(parser, leading_break)) goto error;
+                    leading_blanks = 1;
+                }
+                else
+                {
+                    if (!READ_LINE(parser, trailing_breaks)) goto error;
+                }
+            }
+            if (!CACHE(parser, 1)) goto error;
+        }
+
+        /* Join the whitespaces or fold line breaks. */
+
+        if (leading_blanks)
+        {
+            /* Do we need to fold line breaks? */
+
+            if (leading_break.start[0] == '\n') {
+                if (trailing_breaks.start[0] == '\0') {
+                    if (!STRING_EXTEND(parser, string)) goto error;
+                    *(string.pointer++) = ' ';
+                }
+                else {
+                    if (!JOIN(parser, string, trailing_breaks)) goto error;
+                    CLEAR(parser, trailing_breaks);
+                }
+                CLEAR(parser, leading_break);
+            }
+            else {
+                if (!JOIN(parser, string, leading_break)) goto error;
+                if (!JOIN(parser, string, trailing_breaks)) goto error;
+                CLEAR(parser, leading_break);
+                CLEAR(parser, trailing_breaks);
+            }
+        }
+        else
+        {
+            if (!JOIN(parser, string, whitespaces)) goto error;
+            CLEAR(parser, whitespaces);
+        }
+    }
+
+    /* Eat the right quote. */
+
+    SKIP(parser);
+
+    end_mark = parser->mark;
+
+    /* Create a token. */
+
+    SCALAR_TOKEN_INIT(*token, string.start, string.pointer-string.start,
+            single ? YAML_SINGLE_QUOTED_SCALAR_STYLE : YAML_DOUBLE_QUOTED_SCALAR_STYLE,
+            start_mark, end_mark);
+
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+    STRING_DEL(parser, whitespaces);
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+    STRING_DEL(parser, whitespaces);
+
+    return 0;
+}
+
+/*
+ * Scan a plain scalar.
+ */
+
+static int
+yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
+{
+    yaml_mark_t start_mark;
+    yaml_mark_t end_mark;
+    yaml_string_t string = NULL_STRING;
+    yaml_string_t leading_break = NULL_STRING;
+    yaml_string_t trailing_breaks = NULL_STRING;
+    yaml_string_t whitespaces = NULL_STRING;
+    int leading_blanks = 0;
+    int indent = parser->indent+1;
+
+    if (!STRING_INIT(parser, string, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, leading_break, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, trailing_breaks, INITIAL_STRING_SIZE)) goto error;
+    if (!STRING_INIT(parser, whitespaces, INITIAL_STRING_SIZE)) goto error;
+
+    start_mark = end_mark = parser->mark;
+
+    /* Consume the content of the plain scalar. */
+
+    while (1)
+    {
+        /* Check for a document indicator. */
+
+        if (!CACHE(parser, 4)) goto error;
+
+        if (parser->mark.column == 0 &&
+            ((CHECK_AT(parser->buffer, '-', 0) &&
+              CHECK_AT(parser->buffer, '-', 1) &&
+              CHECK_AT(parser->buffer, '-', 2)) ||
+             (CHECK_AT(parser->buffer, '.', 0) &&
+              CHECK_AT(parser->buffer, '.', 1) &&
+              CHECK_AT(parser->buffer, '.', 2))) &&
+            IS_BLANKZ_AT(parser->buffer, 3)) break;
+
+        /* Check for a comment. */
+
+        if (CHECK(parser->buffer, '#'))
+            break;
+
+        /* Consume non-blank characters. */
+
+        while (!IS_BLANKZ(parser->buffer))
+        {
+            /* Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". */
+
+            if (parser->flow_level
+                    && CHECK(parser->buffer, ':')
+                    && !IS_BLANKZ_AT(parser->buffer, 1)) {
+                yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
+                        start_mark, "found unexpected ':'");
+                goto error;
+            }
+
+            /* Check for indicators that may end a plain scalar. */
+
+            if ((CHECK(parser->buffer, ':') && IS_BLANKZ_AT(parser->buffer, 1))
+                    || (parser->flow_level &&
+                        (CHECK(parser->buffer, ',') || CHECK(parser->buffer, ':')
+                         || CHECK(parser->buffer, '?') || CHECK(parser->buffer, '[')
+                         || CHECK(parser->buffer, ']') || CHECK(parser->buffer, '{')
+                         || CHECK(parser->buffer, '}'))))
+                break;
+
+            /* Check if we need to join whitespaces and breaks. */
+
+            if (leading_blanks || whitespaces.start != whitespaces.pointer)
+            {
+                if (leading_blanks)
+                {
+                    /* Do we need to fold line breaks? */
+
+                    if (leading_break.start[0] == '\n') {
+                        if (trailing_breaks.start[0] == '\0') {
+                            if (!STRING_EXTEND(parser, string)) goto error;
+                            *(string.pointer++) = ' ';
+                        }
+                        else {
+                            if (!JOIN(parser, string, trailing_breaks)) goto error;
+                            CLEAR(parser, trailing_breaks);
+                        }
+                        CLEAR(parser, leading_break);
+                    }
+                    else {
+                        if (!JOIN(parser, string, leading_break)) goto error;
+                        if (!JOIN(parser, string, trailing_breaks)) goto error;
+                        CLEAR(parser, leading_break);
+                        CLEAR(parser, trailing_breaks);
+                    }
+
+                    leading_blanks = 0;
+                }
+                else
+                {
+                    if (!JOIN(parser, string, whitespaces)) goto error;
+                    CLEAR(parser, whitespaces);
+                }
+            }
+
+            /* Copy the character. */
+
+            if (!READ(parser, string)) goto error;
+
+            end_mark = parser->mark;
+
+            if (!CACHE(parser, 2)) goto error;
+        }
+
+        /* Is it the end? */
+
+        if (!(IS_BLANK(parser->buffer) || IS_BREAK(parser->buffer)))
+            break;
+
+        /* Consume blank characters. */
+
+        if (!CACHE(parser, 1)) goto error;
+
+        while (IS_BLANK(parser->buffer) || IS_BREAK(parser->buffer))
+        {
+            if (IS_BLANK(parser->buffer))
+            {
+                /* Check for tab character that abuse indentation. */
+
+                if (leading_blanks && (int)parser->mark.column < indent
+                        && IS_TAB(parser->buffer)) {
+                    yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
+                            start_mark, "found a tab character that violate indentation");
+                    goto error;
+                }
+
+                /* Consume a space or a tab character. */
+
+                if (!leading_blanks) {
+                    if (!READ(parser, whitespaces)) goto error;
+                }
+                else {
+                    SKIP(parser);
+                }
+            }
+            else
+            {
+                if (!CACHE(parser, 2)) goto error;
+
+                /* Check if it is a first line break. */
+
+                if (!leading_blanks)
+                {
+                    CLEAR(parser, whitespaces);
+                    if (!READ_LINE(parser, leading_break)) goto error;
+                    leading_blanks = 1;
+                }
+                else
+                {
+                    if (!READ_LINE(parser, trailing_breaks)) goto error;
+                }
+            }
+            if (!CACHE(parser, 1)) goto error;
+        }
+
+        /* Check indentation level. */
+
+        if (!parser->flow_level && (int)parser->mark.column < indent)
+            break;
+    }
+
+    /* Create a token. */
+
+    SCALAR_TOKEN_INIT(*token, string.start, string.pointer-string.start,
+            YAML_PLAIN_SCALAR_STYLE, start_mark, end_mark);
+
+    /* Note that we change the 'simple_key_allowed' flag. */
+
+    if (leading_blanks) {
+        parser->simple_key_allowed = 1;
+    }
+
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+    STRING_DEL(parser, whitespaces);
+
+    return 1;
+
+error:
+    STRING_DEL(parser, string);
+    STRING_DEL(parser, leading_break);
+    STRING_DEL(parser, trailing_breaks);
+    STRING_DEL(parser, whitespaces);
+
+    return 0;
+}
diff --git a/libyaml/src/writer.c b/libyaml/src/writer.c
new file mode 100644
index 0000000..5d57f39
--- /dev/null
+++ b/libyaml/src/writer.c
@@ -0,0 +1,141 @@
+
+#include "yaml_private.h"
+
+/*
+ * Declarations.
+ */
+
+static int
+yaml_emitter_set_writer_error(yaml_emitter_t *emitter, const char *problem);
+
+YAML_DECLARE(int)
+yaml_emitter_flush(yaml_emitter_t *emitter);
+
+/*
+ * Set the writer error and return 0.
+ */
+
+static int
+yaml_emitter_set_writer_error(yaml_emitter_t *emitter, const char *problem)
+{
+    emitter->error = YAML_WRITER_ERROR;
+    emitter->problem = problem;
+
+    return 0;
+}
+
+/*
+ * Flush the output buffer.
+ */
+
+YAML_DECLARE(int)
+yaml_emitter_flush(yaml_emitter_t *emitter)
+{
+    int low, high;
+
+    assert(emitter);    /* Non-NULL emitter object is expected. */
+    assert(emitter->write_handler); /* Write handler must be set. */
+    assert(emitter->encoding);  /* Output encoding must be set. */
+
+    emitter->buffer.last = emitter->buffer.pointer;
+    emitter->buffer.pointer = emitter->buffer.start;
+
+    /* Check if the buffer is empty. */
+
+    if (emitter->buffer.start == emitter->buffer.last) {
+        return 1;
+    }
+
+    /* If the output encoding is UTF-8, we don't need to recode the buffer. */
+
+    if (emitter->encoding == YAML_UTF8_ENCODING)
+    {
+        if (emitter->write_handler(emitter->write_handler_data,
+                    emitter->buffer.start,
+                    emitter->buffer.last - emitter->buffer.start)) {
+            emitter->buffer.last = emitter->buffer.start;
+            emitter->buffer.pointer = emitter->buffer.start;
+            return 1;
+        }
+        else {
+            return yaml_emitter_set_writer_error(emitter, "write error");
+        }
+    }
+
+    /* Recode the buffer into the raw buffer. */
+
+    low = (emitter->encoding == YAML_UTF16LE_ENCODING ? 0 : 1);
+    high = (emitter->encoding == YAML_UTF16LE_ENCODING ? 1 : 0);
+
+    while (emitter->buffer.pointer != emitter->buffer.last)
+    {
+        unsigned char octet;
+        unsigned int width;
+        unsigned int value;
+        size_t k;
+
+        /*
+         * See the "reader.c" code for more details on UTF-8 encoding.  Note
+         * that we assume that the buffer contains a valid UTF-8 sequence.
+         */
+
+        /* Read the next UTF-8 character. */
+
+        octet = emitter->buffer.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;
+
+        for (k = 1; k < width; k ++) {
+            octet = emitter->buffer.pointer[k];
+            value = (value << 6) + (octet & 0x3F);
+        }
+
+        emitter->buffer.pointer += width;
+
+        /* Write the character. */
+
+        if (value < 0x10000)
+        {
+            emitter->raw_buffer.last[high] = value >> 8;
+            emitter->raw_buffer.last[low] = value & 0xFF;
+
+            emitter->raw_buffer.last += 2;
+        }
+        else
+        {
+            /* Write the character using a surrogate pair (check "reader.c"). */
+
+            value -= 0x10000;
+            emitter->raw_buffer.last[high] = 0xD8 + (value >> 18);
+            emitter->raw_buffer.last[low] = (value >> 10) & 0xFF;
+            emitter->raw_buffer.last[high+2] = 0xDC + ((value >> 8) & 0xFF);
+            emitter->raw_buffer.last[low+2] = value & 0xFF;
+
+            emitter->raw_buffer.last += 4;
+        }
+    }
+
+    /* Write the raw buffer. */
+
+    if (emitter->write_handler(emitter->write_handler_data,
+                emitter->raw_buffer.start,
+                emitter->raw_buffer.last - emitter->raw_buffer.start)) {
+        emitter->buffer.last = emitter->buffer.start;
+        emitter->buffer.pointer = emitter->buffer.start;
+        emitter->raw_buffer.last = emitter->raw_buffer.start;
+        emitter->raw_buffer.pointer = emitter->raw_buffer.start;
+        return 1;
+    }
+    else {
+        return yaml_emitter_set_writer_error(emitter, "write error");
+    }
+}
+
diff --git a/libyaml/src/yaml_private.h b/libyaml/src/yaml_private.h
new file mode 100644
index 0000000..faa28ea
--- /dev/null
+++ b/libyaml/src/yaml_private.h
@@ -0,0 +1,658 @@
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaml.h>
+
+#include <assert.h>
+#include <limits.h>
+#include <stddef.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+#ifdef _WIN64
+#define PTRDIFF_MAX _I64_MAX
+#else
+#define PTRDIFF_MAX INT_MAX
+#endif
+#endif
+
+/*
+ * Memory management.
+ */
+
+YAML_DECLARE(void *)
+yaml_malloc(size_t size);
+
+YAML_DECLARE(void *)
+yaml_realloc(void *ptr, size_t size);
+
+YAML_DECLARE(void)
+yaml_free(void *ptr);
+
+YAML_DECLARE(yaml_char_t *)
+yaml_strdup(const yaml_char_t *);
+
+/*
+ * Reader: Ensure that the buffer contains at least `length` characters.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
+
+/*
+ * Scanner: Ensure that the token stack contains at least one token ready.
+ */
+
+YAML_DECLARE(int)
+yaml_parser_fetch_more_tokens(yaml_parser_t *parser);
+
+/*
+ * The size of the input raw buffer.
+ */
+
+#define INPUT_RAW_BUFFER_SIZE   16384
+
+/*
+ * The size of the input buffer.
+ *
+ * It should be possible to decode the whole raw buffer.
+ */
+
+#define INPUT_BUFFER_SIZE       (INPUT_RAW_BUFFER_SIZE*3)
+
+/*
+ * The size of the output buffer.
+ */
+
+#define OUTPUT_BUFFER_SIZE      16384
+
+/*
+ * The size of the output raw buffer.
+ *
+ * It should be possible to encode the whole output buffer.
+ */
+
+#define OUTPUT_RAW_BUFFER_SIZE  (OUTPUT_BUFFER_SIZE*2+2)
+
+/*
+ * The size of other stacks and queues.
+ */
+
+#define INITIAL_STACK_SIZE  16
+#define INITIAL_QUEUE_SIZE  16
+#define INITIAL_STRING_SIZE 16
+
+/*
+ * Buffer management.
+ */
+
+#define BUFFER_INIT(context,buffer,size)                                        \
+    (((buffer).start = yaml_malloc(size)) ?                                     \
+        ((buffer).last = (buffer).pointer = (buffer).start,                     \
+         (buffer).end = (buffer).start+(size),                                  \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define BUFFER_DEL(context,buffer)                                              \
+    (yaml_free((buffer).start),                                                 \
+     (buffer).start = (buffer).pointer = (buffer).end = 0)
+
+/*
+ * String management.
+ */
+
+typedef struct {
+    yaml_char_t *start;
+    yaml_char_t *end;
+    yaml_char_t *pointer;
+} yaml_string_t;
+
+YAML_DECLARE(int)
+yaml_string_extend(yaml_char_t **start,
+        yaml_char_t **pointer, yaml_char_t **end);
+
+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);
+
+#define NULL_STRING { NULL, NULL, NULL }
+
+#define STRING(string,length)   { (string), (string)+(length), (string) }
+
+#define STRING_ASSIGN(value,string,length)                                      \
+    ((value).start = (string),                                                  \
+     (value).end = (string)+(length),                                           \
+     (value).pointer = (string))
+
+#define STRING_INIT(context,string,size)                                        \
+    (((string).start = yaml_malloc(size)) ?                                     \
+        ((string).pointer = (string).start,                                     \
+         (string).end = (string).start+(size),                                  \
+         memset((string).start, 0, (size)),                                     \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define STRING_DEL(context,string)                                              \
+    (yaml_free((string).start),                                                 \
+     (string).start = (string).pointer = (string).end = 0)
+
+#define STRING_EXTEND(context,string)                                           \
+    ((((string).pointer+5 < (string).end)                                       \
+        || yaml_string_extend(&(string).start,                                  \
+            &(string).pointer, &(string).end)) ?                                \
+         1 :                                                                    \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define CLEAR(context,string)                                                   \
+    ((string).pointer = (string).start,                                         \
+     memset((string).start, 0, (string).end-(string).start))
+
+#define JOIN(context,string_a,string_b)                                         \
+    ((yaml_string_join(&(string_a).start, &(string_a).pointer,                  \
+                       &(string_a).end, &(string_b).start,                      \
+                       &(string_b).pointer, &(string_b).end)) ?                 \
+        ((string_b).pointer = (string_b).start,                                 \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+/*
+ * String check operations.
+ */
+
+/*
+ * Check the octet at the specified position.
+ */
+
+#define CHECK_AT(string,octet,offset)                                           \
+    ((string).pointer[offset] == (yaml_char_t)(octet))
+
+/*
+ * Check the current octet in the buffer.
+ */
+
+#define CHECK(string,octet) CHECK_AT((string),(octet),0)
+
+/*
+ * Check if the character at the specified position is an alphabetical
+ * character, a digit, '_', or '-'.
+ */
+
+#define IS_ALPHA_AT(string,offset)                                              \
+     (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) '9') ||                        \
+      ((string).pointer[offset] >= (yaml_char_t) 'A' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) 'Z') ||                        \
+      ((string).pointer[offset] >= (yaml_char_t) 'a' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) 'z') ||                        \
+      (string).pointer[offset] == '_' ||                                        \
+      (string).pointer[offset] == '-')
+
+#define IS_ALPHA(string)    IS_ALPHA_AT((string),0)
+
+/*
+ * Check if the character at the specified position is a digit.
+ */
+
+#define IS_DIGIT_AT(string,offset)                                              \
+     (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) '9'))
+
+#define IS_DIGIT(string)    IS_DIGIT_AT((string),0)
+
+/*
+ * Get the value of a digit.
+ */
+
+#define AS_DIGIT_AT(string,offset)                                              \
+     ((string).pointer[offset] - (yaml_char_t) '0')
+
+#define AS_DIGIT(string)    AS_DIGIT_AT((string),0)
+
+/*
+ * Check if the character at the specified position is a hex-digit.
+ */
+
+#define IS_HEX_AT(string,offset)                                                \
+     (((string).pointer[offset] >= (yaml_char_t) '0' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) '9') ||                        \
+      ((string).pointer[offset] >= (yaml_char_t) 'A' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) 'F') ||                        \
+      ((string).pointer[offset] >= (yaml_char_t) 'a' &&                         \
+       (string).pointer[offset] <= (yaml_char_t) 'f'))
+
+#define IS_HEX(string)    IS_HEX_AT((string),0)
+
+/*
+ * Get the value of a hex-digit.
+ */
+
+#define AS_HEX_AT(string,offset)                                                \
+      (((string).pointer[offset] >= (yaml_char_t) 'A' &&                        \
+        (string).pointer[offset] <= (yaml_char_t) 'F') ?                        \
+       ((string).pointer[offset] - (yaml_char_t) 'A' + 10) :                    \
+       ((string).pointer[offset] >= (yaml_char_t) 'a' &&                        \
+        (string).pointer[offset] <= (yaml_char_t) 'f') ?                        \
+       ((string).pointer[offset] - (yaml_char_t) 'a' + 10) :                    \
+       ((string).pointer[offset] - (yaml_char_t) '0'))
+
+#define AS_HEX(string)  AS_HEX_AT((string),0)
+
+/*
+ * Check if the character is ASCII.
+ */
+
+#define IS_ASCII_AT(string,offset)                                              \
+    ((string).pointer[offset] <= (yaml_char_t) '\x7F')
+
+#define IS_ASCII(string)    IS_ASCII_AT((string),0)
+
+/*
+ * Check if the character can be printed unescaped.
+ */
+
+#define IS_PRINTABLE_AT(string,offset)                                          \
+    (((string).pointer[offset] == 0x0A)         /* . == #x0A */                 \
+     || ((string).pointer[offset] >= 0x20       /* #x20 <= . <= #x7E */         \
+         && (string).pointer[offset] <= 0x7E)                                   \
+     || ((string).pointer[offset] == 0xC2       /* #0xA0 <= . <= #xD7FF */      \
+         && (string).pointer[offset+1] >= 0xA0)                                 \
+     || ((string).pointer[offset] > 0xC2                                        \
+         && (string).pointer[offset] < 0xED)                                    \
+     || ((string).pointer[offset] == 0xED                                       \
+         && (string).pointer[offset+1] < 0xA0)                                  \
+     || ((string).pointer[offset] == 0xEE)                                      \
+     || ((string).pointer[offset] == 0xEF      /* #xE000 <= . <= #xFFFD */      \
+         && !((string).pointer[offset+1] == 0xBB        /* && . != #xFEFF */    \
+             && (string).pointer[offset+2] == 0xBF)                             \
+         && !((string).pointer[offset+1] == 0xBF                                \
+             && ((string).pointer[offset+2] == 0xBE                             \
+                 || (string).pointer[offset+2] == 0xBF))))
+
+#define IS_PRINTABLE(string)    IS_PRINTABLE_AT((string),0)
+
+/*
+ * Check if the character at the specified position is NUL.
+ */
+
+#define IS_Z_AT(string,offset)    CHECK_AT((string),'\0',(offset))
+
+#define IS_Z(string)    IS_Z_AT((string),0)
+
+/*
+ * Check if the character at the specified position is BOM.
+ */
+
+#define IS_BOM_AT(string,offset)                                                \
+     (CHECK_AT((string),'\xEF',(offset))                                        \
+      && CHECK_AT((string),'\xBB',(offset)+1)                                   \
+      && CHECK_AT((string),'\xBF',(offset)+2))  /* BOM (#xFEFF) */
+
+#define IS_BOM(string)  IS_BOM_AT(string,0)
+
+/*
+ * Check if the character at the specified position is space.
+ */
+
+#define IS_SPACE_AT(string,offset)  CHECK_AT((string),' ',(offset))
+
+#define IS_SPACE(string)    IS_SPACE_AT((string),0)
+
+/*
+ * Check if the character at the specified position is tab.
+ */
+
+#define IS_TAB_AT(string,offset)    CHECK_AT((string),'\t',(offset))
+
+#define IS_TAB(string)  IS_TAB_AT((string),0)
+
+/*
+ * Check if the character at the specified position is blank (space or tab).
+ */
+
+#define IS_BLANK_AT(string,offset)                                              \
+    (IS_SPACE_AT((string),(offset)) || IS_TAB_AT((string),(offset)))
+
+#define IS_BLANK(string)    IS_BLANK_AT((string),0)
+
+/*
+ * Check if the character at the specified position is a line break.
+ */
+
+#define IS_BREAK_AT(string,offset)                                              \
+    (CHECK_AT((string),'\r',(offset))               /* CR (#xD)*/               \
+     || CHECK_AT((string),'\n',(offset))            /* LF (#xA) */              \
+     || (CHECK_AT((string),'\xC2',(offset))                                     \
+         && CHECK_AT((string),'\x85',(offset)+1))   /* NEL (#x85) */            \
+     || (CHECK_AT((string),'\xE2',(offset))                                     \
+         && CHECK_AT((string),'\x80',(offset)+1)                                \
+         && CHECK_AT((string),'\xA8',(offset)+2))   /* LS (#x2028) */           \
+     || (CHECK_AT((string),'\xE2',(offset))                                     \
+         && CHECK_AT((string),'\x80',(offset)+1)                                \
+         && CHECK_AT((string),'\xA9',(offset)+2)))  /* PS (#x2029) */
+
+#define IS_BREAK(string)    IS_BREAK_AT((string),0)
+
+#define IS_CRLF_AT(string,offset)                                               \
+     (CHECK_AT((string),'\r',(offset)) && CHECK_AT((string),'\n',(offset)+1))
+
+#define IS_CRLF(string) IS_CRLF_AT((string),0)
+
+/*
+ * Check if the character is a line break or NUL.
+ */
+
+#define IS_BREAKZ_AT(string,offset)                                             \
+    (IS_BREAK_AT((string),(offset)) || IS_Z_AT((string),(offset)))
+
+#define IS_BREAKZ(string)   IS_BREAKZ_AT((string),0)
+
+/*
+ * Check if the character is a line break, space, or NUL.
+ */
+
+#define IS_SPACEZ_AT(string,offset)                                             \
+    (IS_SPACE_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset)))
+
+#define IS_SPACEZ(string)   IS_SPACEZ_AT((string),0)
+
+/*
+ * Check if the character is a line break, space, tab, or NUL.
+ */
+
+#define IS_BLANKZ_AT(string,offset)                                             \
+    (IS_BLANK_AT((string),(offset)) || IS_BREAKZ_AT((string),(offset)))
+
+#define IS_BLANKZ(string)   IS_BLANKZ_AT((string),0)
+
+/*
+ * Determine the width of the character.
+ */
+
+#define WIDTH_AT(string,offset)                                                 \
+     (((string).pointer[offset] & 0x80) == 0x00 ? 1 :                           \
+      ((string).pointer[offset] & 0xE0) == 0xC0 ? 2 :                           \
+      ((string).pointer[offset] & 0xF0) == 0xE0 ? 3 :                           \
+      ((string).pointer[offset] & 0xF8) == 0xF0 ? 4 : 0)
+
+#define WIDTH(string)   WIDTH_AT((string),0)
+
+/*
+ * Move the string pointer to the next character.
+ */
+
+#define MOVE(string)    ((string).pointer += WIDTH((string)))
+
+/*
+ * Copy a character and move the pointers of both strings.
+ */
+
+#define COPY(string_a,string_b)                                                 \
+    ((*(string_b).pointer & 0x80) == 0x00 ?                                     \
+     (*((string_a).pointer++) = *((string_b).pointer++)) :                      \
+     (*(string_b).pointer & 0xE0) == 0xC0 ?                                     \
+     (*((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++)) :                      \
+     (*(string_b).pointer & 0xF0) == 0xE0 ?                                     \
+     (*((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++)) :                      \
+     (*(string_b).pointer & 0xF8) == 0xF0 ?                                     \
+     (*((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++),                        \
+      *((string_a).pointer++) = *((string_b).pointer++)) : 0)
+
+/*
+ * Stack and queue management.
+ */
+
+YAML_DECLARE(int)
+yaml_stack_extend(void **start, void **top, void **end);
+
+YAML_DECLARE(int)
+yaml_queue_extend(void **start, void **head, void **tail, void **end);
+
+#define STACK_INIT(context,stack,size)                                          \
+    (((stack).start = yaml_malloc((size)*sizeof(*(stack).start))) ?             \
+        ((stack).top = (stack).start,                                           \
+         (stack).end = (stack).start+(size),                                    \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define STACK_DEL(context,stack)                                                \
+    (yaml_free((stack).start),                                                  \
+     (stack).start = (stack).top = (stack).end = 0)
+
+#define STACK_EMPTY(context,stack)                                              \
+    ((stack).start == (stack).top)
+
+#define STACK_LIMIT(context,stack,size)                                         \
+    ((stack).top - (stack).start < (size) ?                                     \
+        1 :                                                                     \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define PUSH(context,stack,value)                                               \
+    (((stack).top != (stack).end                                                \
+      || yaml_stack_extend((void **)&(stack).start,                             \
+              (void **)&(stack).top, (void **)&(stack).end)) ?                  \
+        (*((stack).top++) = value,                                              \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define POP(context,stack)                                                      \
+    (*(--(stack).top))
+
+#define QUEUE_INIT(context,queue,size)                                          \
+    (((queue).start = yaml_malloc((size)*sizeof(*(queue).start))) ?             \
+        ((queue).head = (queue).tail = (queue).start,                           \
+         (queue).end = (queue).start+(size),                                    \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define QUEUE_DEL(context,queue)                                                \
+    (yaml_free((queue).start),                                                  \
+     (queue).start = (queue).head = (queue).tail = (queue).end = 0)
+
+#define QUEUE_EMPTY(context,queue)                                              \
+    ((queue).head == (queue).tail)
+
+#define ENQUEUE(context,queue,value)                                            \
+    (((queue).tail != (queue).end                                               \
+      || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head,     \
+            (void **)&(queue).tail, (void **)&(queue).end)) ?                   \
+        (*((queue).tail++) = value,                                             \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+#define DEQUEUE(context,queue)                                                  \
+    (*((queue).head++))
+
+#define QUEUE_INSERT(context,queue,index,value)                                 \
+    (((queue).tail != (queue).end                                               \
+      || yaml_queue_extend((void **)&(queue).start, (void **)&(queue).head,     \
+            (void **)&(queue).tail, (void **)&(queue).end)) ?                   \
+        (memmove((queue).head+(index)+1,(queue).head+(index),                   \
+            ((queue).tail-(queue).head-(index))*sizeof(*(queue).start)),        \
+         *((queue).head+(index)) = value,                                       \
+         (queue).tail++,                                                        \
+         1) :                                                                   \
+        ((context)->error = YAML_MEMORY_ERROR,                                  \
+         0))
+
+/*
+ * Token initializers.
+ */
+
+#define TOKEN_INIT(token,token_type,token_start_mark,token_end_mark)            \
+    (memset(&(token), 0, sizeof(yaml_token_t)),                                 \
+     (token).type = (token_type),                                               \
+     (token).start_mark = (token_start_mark),                                   \
+     (token).end_mark = (token_end_mark))
+
+#define STREAM_START_TOKEN_INIT(token,token_encoding,start_mark,end_mark)       \
+    (TOKEN_INIT((token),YAML_STREAM_START_TOKEN,(start_mark),(end_mark)),       \
+     (token).data.stream_start.encoding = (token_encoding))
+
+#define STREAM_END_TOKEN_INIT(token,start_mark,end_mark)                        \
+    (TOKEN_INIT((token),YAML_STREAM_END_TOKEN,(start_mark),(end_mark)))
+
+#define ALIAS_TOKEN_INIT(token,token_value,start_mark,end_mark)                 \
+    (TOKEN_INIT((token),YAML_ALIAS_TOKEN,(start_mark),(end_mark)),              \
+     (token).data.alias.value = (token_value))
+
+#define ANCHOR_TOKEN_INIT(token,token_value,start_mark,end_mark)                \
+    (TOKEN_INIT((token),YAML_ANCHOR_TOKEN,(start_mark),(end_mark)),             \
+     (token).data.anchor.value = (token_value))
+
+#define TAG_TOKEN_INIT(token,token_handle,token_suffix,start_mark,end_mark)     \
+    (TOKEN_INIT((token),YAML_TAG_TOKEN,(start_mark),(end_mark)),                \
+     (token).data.tag.handle = (token_handle),                                  \
+     (token).data.tag.suffix = (token_suffix))
+
+#define SCALAR_TOKEN_INIT(token,token_value,token_length,token_style,start_mark,end_mark)   \
+    (TOKEN_INIT((token),YAML_SCALAR_TOKEN,(start_mark),(end_mark)),             \
+     (token).data.scalar.value = (token_value),                                 \
+     (token).data.scalar.length = (token_length),                               \
+     (token).data.scalar.style = (token_style))
+
+#define VERSION_DIRECTIVE_TOKEN_INIT(token,token_major,token_minor,start_mark,end_mark)     \
+    (TOKEN_INIT((token),YAML_VERSION_DIRECTIVE_TOKEN,(start_mark),(end_mark)),  \
+     (token).data.version_directive.major = (token_major),                      \
+     (token).data.version_directive.minor = (token_minor))
+
+#define TAG_DIRECTIVE_TOKEN_INIT(token,token_handle,token_prefix,start_mark,end_mark)       \
+    (TOKEN_INIT((token),YAML_TAG_DIRECTIVE_TOKEN,(start_mark),(end_mark)),      \
+     (token).data.tag_directive.handle = (token_handle),                        \
+     (token).data.tag_directive.prefix = (token_prefix))
+
+/*
+ * Event initializers.
+ */
+
+#define EVENT_INIT(event,event_type,event_start_mark,event_end_mark)            \
+    (memset(&(event), 0, sizeof(yaml_event_t)),                                 \
+     (event).type = (event_type),                                               \
+     (event).start_mark = (event_start_mark),                                   \
+     (event).end_mark = (event_end_mark))
+
+#define STREAM_START_EVENT_INIT(event,event_encoding,start_mark,end_mark)       \
+    (EVENT_INIT((event),YAML_STREAM_START_EVENT,(start_mark),(end_mark)),       \
+     (event).data.stream_start.encoding = (event_encoding))
+
+#define STREAM_END_EVENT_INIT(event,start_mark,end_mark)                        \
+    (EVENT_INIT((event),YAML_STREAM_END_EVENT,(start_mark),(end_mark)))
+
+#define DOCUMENT_START_EVENT_INIT(event,event_version_directive,                \
+        event_tag_directives_start,event_tag_directives_end,event_implicit,start_mark,end_mark) \
+    (EVENT_INIT((event),YAML_DOCUMENT_START_EVENT,(start_mark),(end_mark)),     \
+     (event).data.document_start.version_directive = (event_version_directive), \
+     (event).data.document_start.tag_directives.start = (event_tag_directives_start),   \
+     (event).data.document_start.tag_directives.end = (event_tag_directives_end),   \
+     (event).data.document_start.implicit = (event_implicit))
+
+#define DOCUMENT_END_EVENT_INIT(event,event_implicit,start_mark,end_mark)       \
+    (EVENT_INIT((event),YAML_DOCUMENT_END_EVENT,(start_mark),(end_mark)),       \
+     (event).data.document_end.implicit = (event_implicit))
+
+#define ALIAS_EVENT_INIT(event,event_anchor,start_mark,end_mark)                \
+    (EVENT_INIT((event),YAML_ALIAS_EVENT,(start_mark),(end_mark)),              \
+     (event).data.alias.anchor = (event_anchor))
+
+#define SCALAR_EVENT_INIT(event,event_anchor,event_tag,event_value,event_length,    \
+        event_plain_implicit, event_quoted_implicit,event_style,start_mark,end_mark)    \
+    (EVENT_INIT((event),YAML_SCALAR_EVENT,(start_mark),(end_mark)),             \
+     (event).data.scalar.anchor = (event_anchor),                               \
+     (event).data.scalar.tag = (event_tag),                                     \
+     (event).data.scalar.value = (event_value),                                 \
+     (event).data.scalar.length = (event_length),                               \
+     (event).data.scalar.plain_implicit = (event_plain_implicit),               \
+     (event).data.scalar.quoted_implicit = (event_quoted_implicit),             \
+     (event).data.scalar.style = (event_style))
+
+#define SEQUENCE_START_EVENT_INIT(event,event_anchor,event_tag,                 \
+        event_implicit,event_style,start_mark,end_mark)                         \
+    (EVENT_INIT((event),YAML_SEQUENCE_START_EVENT,(start_mark),(end_mark)),     \
+     (event).data.sequence_start.anchor = (event_anchor),                       \
+     (event).data.sequence_start.tag = (event_tag),                             \
+     (event).data.sequence_start.implicit = (event_implicit),                   \
+     (event).data.sequence_start.style = (event_style))
+
+#define SEQUENCE_END_EVENT_INIT(event,start_mark,end_mark)                      \
+    (EVENT_INIT((event),YAML_SEQUENCE_END_EVENT,(start_mark),(end_mark)))
+
+#define MAPPING_START_EVENT_INIT(event,event_anchor,event_tag,                  \
+        event_implicit,event_style,start_mark,end_mark)                         \
+    (EVENT_INIT((event),YAML_MAPPING_START_EVENT,(start_mark),(end_mark)),      \
+     (event).data.mapping_start.anchor = (event_anchor),                        \
+     (event).data.mapping_start.tag = (event_tag),                              \
+     (event).data.mapping_start.implicit = (event_implicit),                    \
+     (event).data.mapping_start.style = (event_style))
+
+#define MAPPING_END_EVENT_INIT(event,start_mark,end_mark)                       \
+    (EVENT_INIT((event),YAML_MAPPING_END_EVENT,(start_mark),(end_mark)))
+
+/*
+ * Document initializer.
+ */
+
+#define DOCUMENT_INIT(document,document_nodes_start,document_nodes_end,         \
+        document_version_directive,document_tag_directives_start,               \
+        document_tag_directives_end,document_start_implicit,                    \
+        document_end_implicit,document_start_mark,document_end_mark)            \
+    (memset(&(document), 0, sizeof(yaml_document_t)),                           \
+     (document).nodes.start = (document_nodes_start),                           \
+     (document).nodes.end = (document_nodes_end),                               \
+     (document).nodes.top = (document_nodes_start),                             \
+     (document).version_directive = (document_version_directive),               \
+     (document).tag_directives.start = (document_tag_directives_start),         \
+     (document).tag_directives.end = (document_tag_directives_end),             \
+     (document).start_implicit = (document_start_implicit),                     \
+     (document).end_implicit = (document_end_implicit),                         \
+     (document).start_mark = (document_start_mark),                             \
+     (document).end_mark = (document_end_mark))
+
+/*
+ * Node initializers.
+ */
+
+#define NODE_INIT(node,node_type,node_tag,node_start_mark,node_end_mark)        \
+    (memset(&(node), 0, sizeof(yaml_node_t)),                                   \
+     (node).type = (node_type),                                                 \
+     (node).tag = (node_tag),                                                   \
+     (node).start_mark = (node_start_mark),                                     \
+     (node).end_mark = (node_end_mark))
+
+#define SCALAR_NODE_INIT(node,node_tag,node_value,node_length,                  \
+        node_style,start_mark,end_mark)                                         \
+    (NODE_INIT((node),YAML_SCALAR_NODE,(node_tag),(start_mark),(end_mark)),     \
+     (node).data.scalar.value = (node_value),                                   \
+     (node).data.scalar.length = (node_length),                                 \
+     (node).data.scalar.style = (node_style))
+
+#define SEQUENCE_NODE_INIT(node,node_tag,node_items_start,node_items_end,       \
+        node_style,start_mark,end_mark)                                         \
+    (NODE_INIT((node),YAML_SEQUENCE_NODE,(node_tag),(start_mark),(end_mark)),   \
+     (node).data.sequence.items.start = (node_items_start),                     \
+     (node).data.sequence.items.end = (node_items_end),                         \
+     (node).data.sequence.items.top = (node_items_start),                       \
+     (node).data.sequence.style = (node_style))
+
+#define MAPPING_NODE_INIT(node,node_tag,node_pairs_start,node_pairs_end,        \
+        node_style,start_mark,end_mark)                                         \
+    (NODE_INIT((node),YAML_MAPPING_NODE,(node_tag),(start_mark),(end_mark)),    \
+     (node).data.mapping.pairs.start = (node_pairs_start),                      \
+     (node).data.mapping.pairs.end = (node_pairs_end),                          \
+     (node).data.mapping.pairs.top = (node_pairs_start),                        \
+     (node).data.mapping.style = (node_style))
diff --git a/libyaml/tests/Makefile.am b/libyaml/tests/Makefile.am
new file mode 100644
index 0000000..81decb4
--- /dev/null
+++ b/libyaml/tests/Makefile.am
@@ -0,0 +1,8 @@
+AM_CPPFLAGS = -I$(top_srcdir)/include -Wall
+#AM_CFLAGS = -Wno-pointer-sign
+LDADD = $(top_builddir)/src/libyaml.la
+TESTS = test-version test-reader
+check_PROGRAMS = test-version test-reader
+noinst_PROGRAMS = run-scanner run-parser run-loader run-emitter run-dumper	\
+				  example-reformatter example-reformatter-alt	\
+				  example-deconstructor example-deconstructor-alt
diff --git a/libyaml/tests/example-deconstructor-alt.c b/libyaml/tests/example-deconstructor-alt.c
new file mode 100644
index 0000000..de7a3fb
--- /dev/null
+++ b/libyaml/tests/example-deconstructor-alt.c
@@ -0,0 +1,800 @@
+
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+    int help = 0;
+    int canonical = 0;
+    int unicode = 0;
+    int k;
+    int done = 0;
+
+    yaml_parser_t parser;
+    yaml_emitter_t emitter;
+    yaml_event_t input_event;
+    yaml_document_t output_document;
+
+    int root;
+
+    /* Clear the objects. */
+
+    memset(&parser, 0, sizeof(parser));
+    memset(&emitter, 0, sizeof(emitter));
+    memset(&input_event, 0, sizeof(input_event));
+    memset(&output_document, 0, sizeof(output_document));
+
+    /* Analyze command line options. */
+
+    for (k = 1; k < argc; k ++)
+    {
+        if (strcmp(argv[k], "-h") == 0
+                || strcmp(argv[k], "--help") == 0) {
+            help = 1;
+        }
+
+        else if (strcmp(argv[k], "-c") == 0
+                || strcmp(argv[k], "--canonical") == 0) {
+            canonical = 1;
+        }
+
+        else if (strcmp(argv[k], "-u") == 0
+                || strcmp(argv[k], "--unicode") == 0) {
+            unicode = 1;
+        }
+
+        else {
+            fprintf(stderr, "Unrecognized option: %s\n"
+                    "Try `%s --help` for more information.\n",
+                    argv[k], argv[0]);
+            return 1;
+        }
+    }
+
+    /* Display the help string. */
+
+    if (help)
+    {
+        printf("%s <input\n"
+                "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n"
+                "-h, --help\t\tdisplay this help and exit\n"
+                "-c, --canonical\t\toutput in the canonical YAML format\n"
+                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
+                argv[0], argv[0]);
+        return 0;
+    }
+
+    /* Initialize the parser and emitter objects. */
+
+    if (!yaml_parser_initialize(&parser)) {
+        fprintf(stderr, "Could not initialize the parser object\n");
+        return 1;
+    }
+
+    if (!yaml_emitter_initialize(&emitter)) {
+        yaml_parser_delete(&parser);
+        fprintf(stderr, "Could not inialize the emitter object\n");
+        return 1;
+    }
+
+    /* Set the parser parameters. */
+
+    yaml_parser_set_input_file(&parser, stdin);
+
+    /* Set the emitter parameters. */
+
+    yaml_emitter_set_output_file(&emitter, stdout);
+
+    yaml_emitter_set_canonical(&emitter, canonical);
+    yaml_emitter_set_unicode(&emitter, unicode);
+
+    /* Create and emit the STREAM-START event. */
+
+    if (!yaml_emitter_open(&emitter))
+        goto emitter_error;
+
+    /* Create a output_document object. */
+
+    if (!yaml_document_initialize(&output_document, NULL, NULL, NULL, 0, 0))
+        goto document_error;
+
+    /* Create the root sequence. */
+
+    root = yaml_document_add_sequence(&output_document, NULL,
+            YAML_BLOCK_SEQUENCE_STYLE);
+    if (!root) goto document_error;
+
+    /* Loop through the input events. */
+
+    while (!done)
+    {
+        int properties, key, value, map, seq;
+
+        /* Get the next event. */
+
+        if (!yaml_parser_parse(&parser, &input_event))
+            goto parser_error;
+
+        /* Check if this is the stream end. */
+
+        if (input_event.type == YAML_STREAM_END_EVENT) {
+            done = 1;
+        }
+
+        /* Create a mapping node and attach it to the root sequence. */
+
+        properties = yaml_document_add_mapping(&output_document, NULL,
+                YAML_BLOCK_MAPPING_STYLE);
+        if (!properties) goto document_error;
+        if (!yaml_document_append_sequence_item(&output_document,
+                    root, properties)) goto document_error;
+
+        /* Analyze the event. */
+
+        switch (input_event.type)
+        {
+            case YAML_STREAM_START_EVENT:
+
+                /* Add 'type': 'STREAM-START'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"STREAM-START", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'encoding': <encoding>. */
+
+                if (input_event.data.stream_start.encoding)
+                {
+                    yaml_encoding_t encoding
+                        = input_event.data.stream_start.encoding;
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"encoding", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)(encoding == YAML_UTF8_ENCODING ? "utf-8" :
+                             encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" :
+                             encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" :
+                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                break;
+
+            case YAML_STREAM_END_EVENT:
+
+                /* Add 'type': 'STREAM-END'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"STREAM-END", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            case YAML_DOCUMENT_START_EVENT:
+
+                /* Add 'type': 'DOCUMENT-START'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"DOCUMENT-START", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Display the output_document version numbers. */
+
+                if (input_event.data.document_start.version_directive)
+                {
+                    yaml_version_directive_t *version
+                        = input_event.data.document_start.version_directive;
+                    char number[64];
+
+                    /* Add 'version': {}. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"version", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    map = yaml_document_add_mapping(&output_document, NULL,
+                            YAML_FLOW_MAPPING_STYLE);
+                    if (!map) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, map)) goto document_error;
+
+                    /* Add 'major': <number>. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"major", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    sprintf(number, "%d", version->major);
+                    value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_INT_TAG,
+                        (yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                map, key, value)) goto document_error;
+
+                    /* Add 'minor': <number>. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"minor", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    sprintf(number, "%d", version->minor);
+                    value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_INT_TAG,
+                        (yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                map, key, value)) goto document_error;
+                }
+
+                /* Display the output_document tag directives. */
+
+                if (input_event.data.document_start.tag_directives.start
+                        != input_event.data.document_start.tag_directives.end)
+                {
+                    yaml_tag_directive_t *tag;
+
+                    /* Add 'tags': []. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"tags", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    seq = yaml_document_add_sequence(&output_document, NULL,
+                            YAML_BLOCK_SEQUENCE_STYLE);
+                    if (!seq) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, seq)) goto document_error;
+
+                    for (tag = input_event.data.document_start.tag_directives.start;
+                            tag != input_event.data.document_start.tag_directives.end;
+                            tag ++)
+                    {
+                        /* Add {}. */
+
+                        map = yaml_document_add_mapping(&output_document, NULL,
+                                YAML_FLOW_MAPPING_STYLE);
+                        if (!map) goto document_error;
+                        if (!yaml_document_append_sequence_item(&output_document,
+                                    seq, map)) goto document_error;
+
+                        /* Add 'handle': <handle>. */
+
+                        key = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)"handle", -1, YAML_PLAIN_SCALAR_STYLE);
+                        if (!key) goto document_error;
+                        value = yaml_document_add_scalar(&output_document, NULL,
+                            tag->handle, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                        if (!value) goto document_error;
+                        if (!yaml_document_append_mapping_pair(&output_document,
+                                    map, key, value)) goto document_error;
+
+                        /* Add 'prefix': <prefix>. */
+
+                        key = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)"prefix", -1, YAML_PLAIN_SCALAR_STYLE);
+                        if (!key) goto document_error;
+                        value = yaml_document_add_scalar(&output_document, NULL,
+                            tag->prefix, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                        if (!value) goto document_error;
+                        if (!yaml_document_append_mapping_pair(&output_document,
+                                    map, key, value)) goto document_error;
+                    }
+                }
+
+                /* Add 'implicit': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.document_start.implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            case YAML_DOCUMENT_END_EVENT:
+
+                /* Add 'type': 'DOCUMENT-END'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"DOCUMENT-END", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'implicit': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.document_end.implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            case YAML_ALIAS_EVENT:
+
+                /* Add 'type': 'ALIAS'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"ALIAS", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'anchor': <anchor>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                        input_event.data.alias.anchor, -1,
+                        YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            case YAML_SCALAR_EVENT:
+
+                /* Add 'type': 'SCALAR'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"SCALAR", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'anchor': <anchor>. */
+
+                if (input_event.data.scalar.anchor)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.scalar.anchor, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'tag': <tag>. */
+
+                if (input_event.data.scalar.tag)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.scalar.tag, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'value': <value>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"value", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                        input_event.data.scalar.value,
+                        input_event.data.scalar.length,
+                        YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Display if the scalar tag is implicit. */
+
+                /* Add 'implicit': {} */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"version", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                map = yaml_document_add_mapping(&output_document, NULL,
+                        YAML_FLOW_MAPPING_STYLE);
+                if (!map) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, map)) goto document_error;
+
+                /* Add 'plain': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"plain", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.scalar.plain_implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            map, key, value)) goto document_error;
+
+                /* Add 'quoted': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"quoted", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.scalar.quoted_implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            map, key, value)) goto document_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.scalar.style)
+                {
+                    yaml_scalar_style_t style = input_event.data.scalar.style;
+
+                    /* Add 'style': <style>. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)(style == YAML_PLAIN_SCALAR_STYLE ? "plain" :
+                             style == YAML_SINGLE_QUOTED_SCALAR_STYLE ?
+                                    "single-quoted" :
+                             style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ?
+                                    "double-quoted" :
+                             style == YAML_LITERAL_SCALAR_STYLE ? "literal" :
+                             style == YAML_FOLDED_SCALAR_STYLE ? "folded" :
+                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                break;
+
+            case YAML_SEQUENCE_START_EVENT:
+
+                /* Add 'type': 'SEQUENCE-START'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"SEQUENCE-START", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'anchor': <anchor>. */
+
+                if (input_event.data.sequence_start.anchor)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.sequence_start.anchor, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'tag': <tag>. */
+
+                if (input_event.data.sequence_start.tag)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.sequence_start.tag, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'implicit': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.sequence_start.implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.sequence_start.style)
+                {
+                    yaml_sequence_style_t style
+                        = input_event.data.sequence_start.style;
+
+                    /* Add 'style': <style>. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)(style == YAML_BLOCK_SEQUENCE_STYLE ? "block" :
+                             style == YAML_FLOW_SEQUENCE_STYLE ? "flow" :
+                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                break;
+
+            case YAML_SEQUENCE_END_EVENT:
+
+                /* Add 'type': 'SEQUENCE-END'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"SEQUENCE-END", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            case YAML_MAPPING_START_EVENT:
+
+                /* Add 'type': 'MAPPING-START'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"MAPPING-START", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Add 'anchor': <anchor>. */
+
+                if (input_event.data.mapping_start.anchor)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.mapping_start.anchor, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'tag': <tag>. */
+
+                if (input_event.data.mapping_start.tag)
+                {
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            input_event.data.mapping_start.tag, -1,
+                            YAML_DOUBLE_QUOTED_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                /* Add 'implicit': <flag>. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG,
+                        (yaml_char_t *)(input_event.data.mapping_start.implicit ?
+                         "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.sequence_start.style)
+                {
+                    yaml_sequence_style_t style
+                        = (yaml_sequence_style_t) input_event.data.mapping_start.style;
+
+                    /* Add 'style': <style>. */
+
+                    key = yaml_document_add_scalar(&output_document, NULL,
+                        (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!key) goto document_error;
+                    value = yaml_document_add_scalar(&output_document, NULL,
+                            (yaml_char_t *)(style == YAML_BLOCK_MAPPING_STYLE ? "block" :
+                             style == YAML_FLOW_MAPPING_STYLE ? "flow" :
+                             "unknown"), -1, YAML_PLAIN_SCALAR_STYLE);
+                    if (!value) goto document_error;
+                    if (!yaml_document_append_mapping_pair(&output_document,
+                                properties, key, value)) goto document_error;
+                }
+
+                break;
+
+            case YAML_MAPPING_END_EVENT:
+
+                /* Add 'type': 'MAPPING-END'. */
+
+                key = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!key) goto document_error;
+                value = yaml_document_add_scalar(&output_document, NULL,
+                    (yaml_char_t *)"MAPPING-END", -1, YAML_PLAIN_SCALAR_STYLE);
+                if (!value) goto document_error;
+                if (!yaml_document_append_mapping_pair(&output_document,
+                            properties, key, value)) goto document_error;
+
+                break;
+
+            default:
+                /* It couldn't really happen. */
+                break;
+        }
+
+        /* Delete the event object. */
+
+        yaml_event_delete(&input_event);
+    }
+
+    if (!yaml_emitter_dump(&emitter, &output_document))
+        goto emitter_error;
+    if (!yaml_emitter_close(&emitter))
+        goto emitter_error;
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 0;
+
+parser_error:
+
+    /* Display a parser error message. */
+
+    switch (parser.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
+            break;
+
+        case YAML_READER_ERROR:
+            if (parser.problem_value != -1) {
+                fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem,
+                        parser.problem_value, parser.problem_offset);
+            }
+            else {
+                fprintf(stderr, "Reader error: %s at %zd\n", parser.problem,
+                        parser.problem_offset);
+            }
+            break;
+
+        case YAML_SCANNER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        case YAML_PARSER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_event_delete(&input_event);
+    yaml_document_delete(&output_document);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+emitter_error:
+
+    /* Display an emitter error message. */
+
+    switch (emitter.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+            break;
+
+        case YAML_WRITER_ERROR:
+            fprintf(stderr, "Writer error: %s\n", emitter.problem);
+            break;
+
+        case YAML_EMITTER_ERROR:
+            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_event_delete(&input_event);
+    yaml_document_delete(&output_document);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+document_error:
+
+    fprintf(stderr, "Memory error: Not enough memory for creating a document\n");
+
+    yaml_event_delete(&input_event);
+    yaml_document_delete(&output_document);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+}
+
diff --git a/libyaml/tests/example-deconstructor.c b/libyaml/tests/example-deconstructor.c
new file mode 100644
index 0000000..0770606
--- /dev/null
+++ b/libyaml/tests/example-deconstructor.c
@@ -0,0 +1,1127 @@
+
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+    int help = 0;
+    int canonical = 0;
+    int unicode = 0;
+    int k;
+    int done = 0;
+
+    yaml_parser_t parser;
+    yaml_emitter_t emitter;
+    yaml_event_t input_event;
+    yaml_event_t output_event;
+
+    /* Clear the objects. */
+
+    memset(&parser, 0, sizeof(parser));
+    memset(&emitter, 0, sizeof(emitter));
+    memset(&input_event, 0, sizeof(input_event));
+    memset(&output_event, 0, sizeof(output_event));
+
+    /* Analyze command line options. */
+
+    for (k = 1; k < argc; k ++)
+    {
+        if (strcmp(argv[k], "-h") == 0
+                || strcmp(argv[k], "--help") == 0) {
+            help = 1;
+        }
+
+        else if (strcmp(argv[k], "-c") == 0
+                || strcmp(argv[k], "--canonical") == 0) {
+            canonical = 1;
+        }
+
+        else if (strcmp(argv[k], "-u") == 0
+                || strcmp(argv[k], "--unicode") == 0) {
+            unicode = 1;
+        }
+
+        else {
+            fprintf(stderr, "Unrecognized option: %s\n"
+                    "Try `%s --help` for more information.\n",
+                    argv[k], argv[0]);
+            return 1;
+        }
+    }
+
+    /* Display the help string. */
+
+    if (help)
+    {
+        printf("%s <input\n"
+                "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n"
+                "-h, --help\t\tdisplay this help and exit\n"
+                "-c, --canonical\t\toutput in the canonical YAML format\n"
+                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
+                argv[0], argv[0]);
+        return 0;
+    }
+
+    /* Initialize the parser and emitter objects. */
+
+    if (!yaml_parser_initialize(&parser)) {
+        fprintf(stderr, "Could not initialize the parser object\n");
+        return 1;
+    }
+
+    if (!yaml_emitter_initialize(&emitter)) {
+        yaml_parser_delete(&parser);
+        fprintf(stderr, "Could not inialize the emitter object\n");
+        return 1;
+    }
+
+    /* Set the parser parameters. */
+
+    yaml_parser_set_input_file(&parser, stdin);
+
+    /* Set the emitter parameters. */
+
+    yaml_emitter_set_output_file(&emitter, stdout);
+
+    yaml_emitter_set_canonical(&emitter, canonical);
+    yaml_emitter_set_unicode(&emitter, unicode);
+
+    /* Create and emit the STREAM-START event. */
+
+    if (!yaml_stream_start_event_initialize(&output_event, YAML_UTF8_ENCODING))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    /* Create and emit the DOCUMENT-START event. */
+
+    if (!yaml_document_start_event_initialize(&output_event,
+                NULL, NULL, NULL, 0))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    /* Create and emit the SEQUENCE-START event. */
+
+    if (!yaml_sequence_start_event_initialize(&output_event,
+                NULL, (yaml_char_t *)"tag:yaml.org,2002:seq", 1,
+                YAML_BLOCK_SEQUENCE_STYLE))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    /* Loop through the input events. */
+
+    while (!done)
+    {
+        /* Get the next event. */
+
+        if (!yaml_parser_parse(&parser, &input_event))
+            goto parser_error;
+
+        /* Check if this is the stream end. */
+
+        if (input_event.type == YAML_STREAM_END_EVENT) {
+            done = 1;
+        }
+
+        /* Create and emit a MAPPING-START event. */
+
+        if (!yaml_mapping_start_event_initialize(&output_event,
+                    NULL, (yaml_char_t *)"tag:yaml.org,2002:map", 1,
+                    YAML_BLOCK_MAPPING_STYLE))
+            goto event_error;
+        if (!yaml_emitter_emit(&emitter, &output_event))
+            goto emitter_error;
+
+        /* Analyze the event. */
+
+        switch (input_event.type)
+        {
+            case YAML_STREAM_START_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'STREAM-START'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"STREAM-START", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display encoding information. */
+
+                if (input_event.data.stream_start.encoding)
+                {
+                    yaml_encoding_t encoding
+                        = input_event.data.stream_start.encoding;
+
+                    /* Write 'encoding'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"encoding", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the stream encoding. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                (yaml_char_t *)(encoding == YAML_UTF8_ENCODING ? "utf-8" :
+                                 encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" :
+                                 encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" :
+                                 "unknown"), -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                break;
+
+            case YAML_STREAM_END_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'STREAM-END'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"STREAM-END", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            case YAML_DOCUMENT_START_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'DOCUMENT-START'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"DOCUMENT-START", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the document version numbers. */
+
+                if (input_event.data.document_start.version_directive)
+                {
+                    yaml_version_directive_t *version
+                        = input_event.data.document_start.version_directive;
+                    char number[64];
+
+                    /* Write 'version'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"version", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write '{'. */
+
+                    if (!yaml_mapping_start_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:map", 1,
+                                YAML_FLOW_MAPPING_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write 'major'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"major", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write a number. */
+
+                    sprintf(number, "%d", version->major);
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:int", (yaml_char_t *)number, -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write 'minor'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"minor", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write a number. */
+
+                    sprintf(number, "%d", version->minor);
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:int", (yaml_char_t *)number, -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write '}'. */
+
+                    if (!yaml_mapping_end_event_initialize(&output_event))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Display the document tag directives. */
+
+                if (input_event.data.document_start.tag_directives.start
+                        != input_event.data.document_start.tag_directives.end)
+                {
+                    yaml_tag_directive_t *tag;
+
+                    /* Write 'tags'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"tags", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Start a block sequence. */
+
+                    if (!yaml_sequence_start_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:seq", 1,
+                                YAML_BLOCK_SEQUENCE_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    for (tag = input_event.data.document_start.tag_directives.start;
+                            tag != input_event.data.document_start.tag_directives.end;
+                            tag ++)
+                    {
+                        /* Write '{'. */
+
+                        if (!yaml_mapping_start_event_initialize(&output_event,
+                                    NULL, (yaml_char_t *)"tag:yaml.org,2002:map", 1,
+                                    YAML_FLOW_MAPPING_STYLE))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+
+                        /* Write 'handle'. */
+
+                        if (!yaml_scalar_event_initialize(&output_event,
+                                    NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"handle", -1,
+                                    1, 1, YAML_PLAIN_SCALAR_STYLE))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+
+                        /* Write the tag directive handle. */
+
+                        if (!yaml_scalar_event_initialize(&output_event,
+                                    NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                    tag->handle, -1,
+                                    0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+
+                        /* Write 'prefix'. */
+
+                        if (!yaml_scalar_event_initialize(&output_event,
+                                    NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"prefix", -1,
+                                    1, 1, YAML_PLAIN_SCALAR_STYLE))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+
+                        /* Write the tag directive prefix. */
+
+                        if (!yaml_scalar_event_initialize(&output_event,
+                                    NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                    tag->prefix, -1,
+                                    0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+
+                        /* Write '}'. */
+
+                        if (!yaml_mapping_end_event_initialize(&output_event))
+                            goto event_error;
+                        if (!yaml_emitter_emit(&emitter, &output_event))
+                            goto emitter_error;
+                    }
+
+                    /* End a block sequence. */
+
+                    if (!yaml_sequence_end_event_initialize(&output_event))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Write 'implicit'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"implicit", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the document is implicit. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t *)(input_event.data.document_start.implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            case YAML_DOCUMENT_END_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'DOCUMENT-END'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"DOCUMENT-END", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'implicit'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"implicit", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the document is implicit. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t *)(input_event.data.document_end.implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            case YAML_ALIAS_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'ALIAS'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"ALIAS", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'anchor'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"anchor", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write the alias anchor. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                            input_event.data.alias.anchor, -1,
+                            0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            case YAML_SCALAR_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'SCALAR'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"SCALAR", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the scalar anchor. */
+
+                if (input_event.data.scalar.anchor)
+                {
+                    /* Write 'anchor'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"anchor", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the scalar anchor. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.scalar.anchor, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Display the scalar tag. */
+
+                if (input_event.data.scalar.tag)
+                {
+                    /* Write 'tag'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"tag", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the scalar tag. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.scalar.tag, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Display the scalar value. */
+
+                /* Write 'value'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"value", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write the scalar value. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                            input_event.data.scalar.value,
+                            input_event.data.scalar.length,
+                            0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display if the scalar tag is implicit. */
+
+                /* Write 'implicit'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"implicit", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write '{'. */
+
+                if (!yaml_mapping_start_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:map", 1,
+                            YAML_FLOW_MAPPING_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'plain'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"plain", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the scalar is implicit in the plain style. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t * )(input_event.data.scalar.plain_implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'quoted'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"non-plain", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the scalar is implicit in a non-plain style. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t *)(input_event.data.scalar.quoted_implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write '}'. */
+
+                if (!yaml_mapping_end_event_initialize(&output_event))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.scalar.style)
+                {
+                    yaml_scalar_style_t style = input_event.data.scalar.style;
+
+                    /* Write 'style'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"style", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the scalar style. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                (yaml_char_t *)(style == YAML_PLAIN_SCALAR_STYLE ? "plain" :
+                                 style == YAML_SINGLE_QUOTED_SCALAR_STYLE ?
+                                        "single-quoted" :
+                                 style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ?
+                                        "double-quoted" :
+                                 style == YAML_LITERAL_SCALAR_STYLE ? "literal" :
+                                 style == YAML_FOLDED_SCALAR_STYLE ? "folded" :
+                                 "unknown"), -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                break;
+
+            case YAML_SEQUENCE_START_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'SEQUENCE-START'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"SEQUENCE-START", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the sequence anchor. */
+
+                if (input_event.data.sequence_start.anchor)
+                {
+                    /* Write 'anchor'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"anchor", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the sequence anchor. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.sequence_start.anchor, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Display the sequence tag. */
+
+                if (input_event.data.sequence_start.tag)
+                {
+                    /* Write 'tag'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"tag", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the sequence tag. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.sequence_start.tag, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Write 'implicit'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"implicit", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the sequence tag is implicit. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t *)(input_event.data.sequence_start.implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.sequence_start.style)
+                {
+                    yaml_sequence_style_t style
+                        = input_event.data.sequence_start.style;
+
+                    /* Write 'style'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"style", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the scalar style. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                (yaml_char_t *)(style == YAML_BLOCK_SEQUENCE_STYLE ? "block" :
+                                 style == YAML_FLOW_SEQUENCE_STYLE ? "flow" :
+                                 "unknown"), -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                break;
+
+            case YAML_SEQUENCE_END_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'SEQUENCE-END'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"SEQUENCE-END", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            case YAML_MAPPING_START_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'MAPPING-START'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"MAPPING-START", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the mapping anchor. */
+
+                if (input_event.data.mapping_start.anchor)
+                {
+                    /* Write 'anchor'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"anchor", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the mapping anchor. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.mapping_start.anchor, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Display the mapping tag. */
+
+                if (input_event.data.mapping_start.tag)
+                {
+                    /* Write 'tag'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"tag", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the mapping tag. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                input_event.data.mapping_start.tag, -1,
+                                0, 1, YAML_DOUBLE_QUOTED_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                /* Write 'implicit'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"implicit", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write if the mapping tag is implicit. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:bool",
+                            (yaml_char_t *)(input_event.data.mapping_start.implicit ?
+                             "true" : "false"), -1,
+                            1, 0, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Display the style information. */
+
+                if (input_event.data.mapping_start.style)
+                {
+                    yaml_mapping_style_t style
+                        = input_event.data.mapping_start.style;
+
+                    /* Write 'style'. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"style", -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+
+                    /* Write the scalar style. */
+
+                    if (!yaml_scalar_event_initialize(&output_event,
+                                NULL, (yaml_char_t *)"tag:yaml.org,2002:str",
+                                (yaml_char_t *)(style == YAML_BLOCK_MAPPING_STYLE ? "block" :
+                                 style == YAML_FLOW_MAPPING_STYLE ? "flow" :
+                                 "unknown"), -1,
+                                1, 1, YAML_PLAIN_SCALAR_STYLE))
+                        goto event_error;
+                    if (!yaml_emitter_emit(&emitter, &output_event))
+                        goto emitter_error;
+                }
+
+                break;
+
+            case YAML_MAPPING_END_EVENT:
+
+                /* Write 'type'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"type", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                /* Write 'MAPPING-END'. */
+
+                if (!yaml_scalar_event_initialize(&output_event,
+                            NULL, (yaml_char_t *)"tag:yaml.org,2002:str", (yaml_char_t *)"MAPPING-END", -1,
+                            1, 1, YAML_PLAIN_SCALAR_STYLE))
+                    goto event_error;
+                if (!yaml_emitter_emit(&emitter, &output_event))
+                    goto emitter_error;
+
+                break;
+
+            default:
+                /* It couldn't really happen. */
+                break;
+        }
+
+        /* Delete the event object. */
+
+        yaml_event_delete(&input_event);
+
+        /* Create and emit a MAPPING-END event. */
+
+        if (!yaml_mapping_end_event_initialize(&output_event))
+            goto event_error;
+        if (!yaml_emitter_emit(&emitter, &output_event))
+            goto emitter_error;
+    }
+
+    /* Create and emit the SEQUENCE-END event. */
+
+    if (!yaml_sequence_end_event_initialize(&output_event))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    /* Create and emit the DOCUMENT-END event. */
+
+    if (!yaml_document_end_event_initialize(&output_event, 0))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    /* Create and emit the STREAM-END event. */
+
+    if (!yaml_stream_end_event_initialize(&output_event))
+        goto event_error;
+    if (!yaml_emitter_emit(&emitter, &output_event))
+        goto emitter_error;
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 0;
+
+parser_error:
+
+    /* Display a parser error message. */
+
+    switch (parser.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
+            break;
+
+        case YAML_READER_ERROR:
+            if (parser.problem_value != -1) {
+                fprintf(stderr, "Reader error: %s: #%X at %zu\n", parser.problem,
+                        parser.problem_value, parser.problem_offset);
+            }
+            else {
+                fprintf(stderr, "Reader error: %s at %zu\n", parser.problem,
+                        parser.problem_offset);
+            }
+            break;
+
+        case YAML_SCANNER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        case YAML_PARSER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_event_delete(&input_event);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+emitter_error:
+
+    /* Display an emitter error message. */
+
+    switch (emitter.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+            break;
+
+        case YAML_WRITER_ERROR:
+            fprintf(stderr, "Writer error: %s\n", emitter.problem);
+            break;
+
+        case YAML_EMITTER_ERROR:
+            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_event_delete(&input_event);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+event_error:
+
+    fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
+
+    yaml_event_delete(&input_event);
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+}
+
diff --git a/libyaml/tests/example-reformatter-alt.c b/libyaml/tests/example-reformatter-alt.c
new file mode 100644
index 0000000..e7d006e
--- /dev/null
+++ b/libyaml/tests/example-reformatter-alt.c
@@ -0,0 +1,217 @@
+
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+    int help = 0;
+    int canonical = 0;
+    int unicode = 0;
+    int k;
+    int done = 0;
+
+    yaml_parser_t parser;
+    yaml_emitter_t emitter;
+    yaml_document_t document;
+
+    /* Clear the objects. */
+
+    memset(&parser, 0, sizeof(parser));
+    memset(&emitter, 0, sizeof(emitter));
+    memset(&document, 0, sizeof(document));
+
+    /* Analyze command line options. */
+
+    for (k = 1; k < argc; k ++)
+    {
+        if (strcmp(argv[k], "-h") == 0
+                || strcmp(argv[k], "--help") == 0) {
+            help = 1;
+        }
+
+        else if (strcmp(argv[k], "-c") == 0
+                || strcmp(argv[k], "--canonical") == 0) {
+            canonical = 1;
+        }
+
+        else if (strcmp(argv[k], "-u") == 0
+                || strcmp(argv[k], "--unicode") == 0) {
+            unicode = 1;
+        }
+
+        else {
+            fprintf(stderr, "Unrecognized option: %s\n"
+                    "Try `%s --help` for more information.\n",
+                    argv[k], argv[0]);
+            return 1;
+        }
+    }
+
+    /* Display the help string. */
+
+    if (help)
+    {
+        printf("%s [--canonical] [--unicode] <input >output\n"
+                "or\n%s -h | --help\nReformat a YAML stream\n\nOptions:\n"
+                "-h, --help\t\tdisplay this help and exit\n"
+                "-c, --canonical\t\toutput in the canonical YAML format\n"
+                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
+                argv[0], argv[0]);
+        return 0;
+    }
+
+    /* Initialize the parser and emitter objects. */
+
+    if (!yaml_parser_initialize(&parser))
+        goto parser_error;
+
+    if (!yaml_emitter_initialize(&emitter))
+        goto emitter_error;
+
+    /* Set the parser parameters. */
+
+    yaml_parser_set_input_file(&parser, stdin);
+
+    /* Set the emitter parameters. */
+
+    yaml_emitter_set_output_file(&emitter, stdout);
+
+    yaml_emitter_set_canonical(&emitter, canonical);
+    yaml_emitter_set_unicode(&emitter, unicode);
+
+    /* The main loop. */
+
+    while (!done)
+    {
+        /* Get the next event. */
+
+        if (!yaml_parser_load(&parser, &document))
+            goto parser_error;
+
+        /* Check if this is the stream end. */
+
+        if (!yaml_document_get_root_node(&document)) {
+            done = 1;
+        }
+
+        /* Emit the event. */
+
+        if (!yaml_emitter_dump(&emitter, &document))
+            goto emitter_error;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 0;
+
+parser_error:
+
+    /* Display a parser error message. */
+
+    switch (parser.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
+            break;
+
+        case YAML_READER_ERROR:
+            if (parser.problem_value != -1) {
+                fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem,
+                        parser.problem_value, parser.problem_offset);
+            }
+            else {
+                fprintf(stderr, "Reader error: %s at %lu\n", parser.problem,
+                        parser.problem_offset);
+            }
+            break;
+
+        case YAML_SCANNER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        case YAML_PARSER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        case YAML_COMPOSER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Composer error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Composer error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+emitter_error:
+
+    /* Display an emitter error message. */
+
+    switch (emitter.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+            break;
+
+        case YAML_WRITER_ERROR:
+            fprintf(stderr, "Writer error: %s\n", emitter.problem);
+            break;
+
+        case YAML_EMITTER_ERROR:
+            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+}
+
diff --git a/libyaml/tests/example-reformatter.c b/libyaml/tests/example-reformatter.c
new file mode 100644
index 0000000..306c742
--- /dev/null
+++ b/libyaml/tests/example-reformatter.c
@@ -0,0 +1,202 @@
+
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc, char *argv[])
+{
+    int help = 0;
+    int canonical = 0;
+    int unicode = 0;
+    int k;
+    int done = 0;
+
+    yaml_parser_t parser;
+    yaml_emitter_t emitter;
+    yaml_event_t event;
+
+    /* Clear the objects. */
+
+    memset(&parser, 0, sizeof(parser));
+    memset(&emitter, 0, sizeof(emitter));
+    memset(&event, 0, sizeof(event));
+
+    /* Analyze command line options. */
+
+    for (k = 1; k < argc; k ++)
+    {
+        if (strcmp(argv[k], "-h") == 0
+                || strcmp(argv[k], "--help") == 0) {
+            help = 1;
+        }
+
+        else if (strcmp(argv[k], "-c") == 0
+                || strcmp(argv[k], "--canonical") == 0) {
+            canonical = 1;
+        }
+
+        else if (strcmp(argv[k], "-u") == 0
+                || strcmp(argv[k], "--unicode") == 0) {
+            unicode = 1;
+        }
+
+        else {
+            fprintf(stderr, "Unrecognized option: %s\n"
+                    "Try `%s --help` for more information.\n",
+                    argv[k], argv[0]);
+            return 1;
+        }
+    }
+
+    /* Display the help string. */
+
+    if (help)
+    {
+        printf("%s [--canonical] [--unicode] <input >output\n"
+                "or\n%s -h | --help\nReformat a YAML stream\n\nOptions:\n"
+                "-h, --help\t\tdisplay this help and exit\n"
+                "-c, --canonical\t\toutput in the canonical YAML format\n"
+                "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
+                argv[0], argv[0]);
+        return 0;
+    }
+
+    /* Initialize the parser and emitter objects. */
+
+    if (!yaml_parser_initialize(&parser))
+        goto parser_error;
+
+    if (!yaml_emitter_initialize(&emitter))
+        goto emitter_error;
+
+    /* Set the parser parameters. */
+
+    yaml_parser_set_input_file(&parser, stdin);
+
+    /* Set the emitter parameters. */
+
+    yaml_emitter_set_output_file(&emitter, stdout);
+
+    yaml_emitter_set_canonical(&emitter, canonical);
+    yaml_emitter_set_unicode(&emitter, unicode);
+
+    /* The main loop. */
+
+    while (!done)
+    {
+        /* Get the next event. */
+
+        if (!yaml_parser_parse(&parser, &event))
+            goto parser_error;
+
+        /* Check if this is the stream end. */
+
+        if (event.type == YAML_STREAM_END_EVENT) {
+            done = 1;
+        }
+
+        /* Emit the event. */
+
+        if (!yaml_emitter_emit(&emitter, &event))
+            goto emitter_error;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 0;
+
+parser_error:
+
+    /* Display a parser error message. */
+
+    switch (parser.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for parsing\n");
+            break;
+
+        case YAML_READER_ERROR:
+            if (parser.problem_value != -1) {
+                fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem,
+                        parser.problem_value, parser.problem_offset);
+            }
+            else {
+                fprintf(stderr, "Reader error: %s at %zd\n", parser.problem,
+                        parser.problem_offset);
+            }
+            break;
+
+        case YAML_SCANNER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        case YAML_PARSER_ERROR:
+            if (parser.context) {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n"
+                        "%s at line %lu, column %lu\n", parser.context,
+                        parser.context_mark.line+1, parser.context_mark.column+1,
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            else {
+                fprintf(stderr, "Parser error: %s at line %lu, column %lu\n",
+                        parser.problem, parser.problem_mark.line+1,
+                        parser.problem_mark.column+1);
+            }
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+
+emitter_error:
+
+    /* Display an emitter error message. */
+
+    switch (emitter.error)
+    {
+        case YAML_MEMORY_ERROR:
+            fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+            break;
+
+        case YAML_WRITER_ERROR:
+            fprintf(stderr, "Writer error: %s\n", emitter.problem);
+            break;
+
+        case YAML_EMITTER_ERROR:
+            fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+            break;
+
+        default:
+            /* Couldn't happen. */
+            fprintf(stderr, "Internal error\n");
+            break;
+    }
+
+    yaml_parser_delete(&parser);
+    yaml_emitter_delete(&emitter);
+
+    return 1;
+}
+
diff --git a/libyaml/tests/run-dumper.c b/libyaml/tests/run-dumper.c
new file mode 100644
index 0000000..6004ad9
--- /dev/null
+++ b/libyaml/tests/run-dumper.c
@@ -0,0 +1,312 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+#define BUFFER_SIZE 65536
+#define MAX_DOCUMENTS  16
+
+int copy_document(yaml_document_t *document_to, yaml_document_t *document_from)
+{
+    yaml_node_t *node;
+    yaml_node_item_t *item;
+    yaml_node_pair_t *pair;
+
+    if (!yaml_document_initialize(document_to, document_from->version_directive,
+                document_from->tag_directives.start,
+                document_from->tag_directives.end,
+                document_from->start_implicit, document_from->end_implicit))
+        return 0;
+
+    for (node = document_from->nodes.start;
+            node < document_from->nodes.top; node ++) {
+        switch (node->type) {
+            case YAML_SCALAR_NODE:
+                if (!yaml_document_add_scalar(document_to, node->tag,
+                            node->data.scalar.value, node->data.scalar.length,
+                            node->data.scalar.style)) goto error;
+                break;
+            case YAML_SEQUENCE_NODE:
+                if (!yaml_document_add_sequence(document_to, node->tag,
+                            node->data.sequence.style)) goto error;
+                break;
+            case YAML_MAPPING_NODE:
+                if (!yaml_document_add_mapping(document_to, node->tag,
+                            node->data.mapping.style)) goto error;
+                break;
+            default:
+                assert(0);
+                break;
+        }
+    }
+
+    for (node = document_from->nodes.start;
+            node < document_from->nodes.top; node ++) {
+        switch (node->type) {
+            case YAML_SEQUENCE_NODE:
+                for (item = node->data.sequence.items.start;
+                        item < node->data.sequence.items.top; item ++) {
+                    if (!yaml_document_append_sequence_item(document_to,
+                                node - document_from->nodes.start + 1,
+                                *item)) goto error;
+                }
+                break;
+            case YAML_MAPPING_NODE:
+                for (pair = node->data.mapping.pairs.start;
+                        pair < node->data.mapping.pairs.top; pair ++) {
+                    if (!yaml_document_append_mapping_pair(document_to,
+                                node - document_from->nodes.start + 1,
+                                pair->key, pair->value)) goto error;
+                }
+                break;
+            default:
+                break;
+        }
+    }
+    return 1;
+
+error:
+    yaml_document_delete(document_to);
+    return 0;
+}
+
+int compare_nodes(yaml_document_t *document1, int index1,
+        yaml_document_t *document2, int index2, int level)
+{
+    if (level++ > 1000) return 0;
+    yaml_node_t *node1 = yaml_document_get_node(document1, index1);
+    yaml_node_t *node2 = yaml_document_get_node(document2, index2);
+    int k;
+
+    assert(node1);
+    assert(node2);
+
+    if (node1->type != node2->type)
+        return 0;
+
+    if (strcmp((char *)node1->tag, (char *)node2->tag) != 0) return 0;
+
+    switch (node1->type) {
+        case YAML_SCALAR_NODE:
+            if (node1->data.scalar.length != node2->data.scalar.length)
+                return 0;
+            if (strncmp((char *)node1->data.scalar.value, (char *)node2->data.scalar.value,
+                        node1->data.scalar.length) != 0) return 0;
+            break;
+        case YAML_SEQUENCE_NODE:
+            if ((node1->data.sequence.items.top - node1->data.sequence.items.start) !=
+                    (node2->data.sequence.items.top - node2->data.sequence.items.start))
+                return 0;
+            for (k = 0; k < (node1->data.sequence.items.top - node1->data.sequence.items.start); k ++) {
+                if (!compare_nodes(document1, node1->data.sequence.items.start[k],
+                            document2, node2->data.sequence.items.start[k], level)) return 0;
+            }
+            break;
+        case YAML_MAPPING_NODE:
+            if ((node1->data.mapping.pairs.top - node1->data.mapping.pairs.start) !=
+                    (node2->data.mapping.pairs.top - node2->data.mapping.pairs.start))
+                return 0;
+            for (k = 0; k < (node1->data.mapping.pairs.top - node1->data.mapping.pairs.start); k ++) {
+                if (!compare_nodes(document1, node1->data.mapping.pairs.start[k].key,
+                            document2, node2->data.mapping.pairs.start[k].key, level)) return 0;
+                if (!compare_nodes(document1, node1->data.mapping.pairs.start[k].value,
+                            document2, node2->data.mapping.pairs.start[k].value, level)) return 0;
+            }
+            break;
+        default:
+            assert(0);
+            break;
+    }
+    return 1;
+}
+
+int compare_documents(yaml_document_t *document1, yaml_document_t *document2)
+{
+    int k;
+
+    if ((document1->version_directive && !document2->version_directive)
+            || (!document1->version_directive && document2->version_directive)
+            || (document1->version_directive && document2->version_directive
+                && (document1->version_directive->major != document2->version_directive->major
+                    || document1->version_directive->minor != document2->version_directive->minor)))
+        return 0;
+
+    if ((document1->tag_directives.end - document1->tag_directives.start) !=
+            (document2->tag_directives.end - document2->tag_directives.start))
+        return 0;
+    for (k = 0; k < (document1->tag_directives.end - document1->tag_directives.start); k ++) {
+        if ((strcmp((char *)document1->tag_directives.start[k].handle,
+                        (char *)document2->tag_directives.start[k].handle) != 0)
+                || (strcmp((char *)document1->tag_directives.start[k].prefix,
+                    (char *)document2->tag_directives.start[k].prefix) != 0))
+            return 0;
+    }
+
+    if ((document1->nodes.top - document1->nodes.start) !=
+            (document2->nodes.top - document2->nodes.start))
+        return 0;
+
+    if (document1->nodes.top != document1->nodes.start) {
+        if (!compare_nodes(document1, 1, document2, 1, 0))
+            return 0;
+    }
+
+    return 1;
+}
+
+int print_output(char *name, unsigned char *buffer, size_t size, int count)
+{
+    FILE *file;
+    char data[BUFFER_SIZE];
+    size_t data_size = 1;
+    size_t total_size = 0;
+    if (count >= 0) {
+        printf("FAILED (at the document #%d)\nSOURCE:\n", count+1);
+    }
+    file = fopen(name, "rb");
+    assert(file);
+    while (data_size > 0) {
+        data_size = fread(data, 1, BUFFER_SIZE, file);
+        assert(!ferror(file));
+        if (!data_size) break;
+        assert(fwrite(data, 1, data_size, stdout) == data_size);
+        total_size += data_size;
+        if (feof(file)) break;
+    }
+    fclose(file);
+    printf("#### (length: %zd)\n", total_size);
+    printf("OUTPUT:\n%s#### (length: %zd)\n", buffer, size);
+    return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+    int number;
+    int canonical = 0;
+    int unicode = 0;
+
+    number = 1;
+    while (number < argc) {
+        if (strcmp(argv[number], "-c") == 0) {
+            canonical = 1;
+        }
+        else if (strcmp(argv[number], "-u") == 0) {
+            unicode = 1;
+        }
+        else if (argv[number][0] == '-') {
+            printf("Unknown option: '%s'\n", argv[number]);
+            return 0;
+        }
+        if (argv[number][0] == '-') {
+            if (number < argc-1) {
+                memmove(argv+number, argv+number+1, (argc-number-1)*sizeof(char *));
+            }
+            argc --;
+        }
+        else {
+            number ++;
+        }
+    }
+
+    if (argc < 2) {
+        printf("Usage: %s [-c] [-u] file1.yaml ...\n", argv[0]);
+        return 0;
+    }
+
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_emitter_t emitter;
+
+        yaml_document_t document;
+        unsigned char buffer[BUFFER_SIZE+1];
+        size_t written = 0;
+        yaml_document_t documents[MAX_DOCUMENTS];
+        size_t document_number = 0;
+        int done = 0;
+        int count = 0;
+        int error = 0;
+        int k;
+        memset(buffer, 0, BUFFER_SIZE+1);
+        memset(documents, 0, MAX_DOCUMENTS*sizeof(yaml_document_t));
+
+        printf("[%d] Loading, dumping, and loading again '%s': ", number, argv[number]);
+        fflush(stdout);
+
+        file = fopen(argv[number], "rb");
+        assert(file);
+
+        assert(yaml_parser_initialize(&parser));
+        yaml_parser_set_input_file(&parser, file);
+        assert(yaml_emitter_initialize(&emitter));
+        if (canonical) {
+            yaml_emitter_set_canonical(&emitter, 1);
+        }
+        if (unicode) {
+            yaml_emitter_set_unicode(&emitter, 1);
+        }
+        yaml_emitter_set_output_string(&emitter, buffer, BUFFER_SIZE, &written);
+        yaml_emitter_open(&emitter);
+
+        while (!done)
+        {
+            if (!yaml_parser_load(&parser, &document)) {
+                error = 1;
+                break;
+            }
+
+            done = (!yaml_document_get_root_node(&document));
+            if (!done) {
+                assert(document_number < MAX_DOCUMENTS);
+                assert(copy_document(&(documents[document_number++]), &document));
+                assert(yaml_emitter_dump(&emitter, &document) ||
+                        (yaml_emitter_flush(&emitter) && print_output(argv[number], buffer, written, count)));
+                count ++;
+            }
+            else {
+                yaml_document_delete(&document);
+            }
+        }
+
+        yaml_parser_delete(&parser);
+        assert(!fclose(file));
+        yaml_emitter_close(&emitter);
+        yaml_emitter_delete(&emitter);
+
+        if (!error)
+        {
+            count = done = 0;
+            assert(yaml_parser_initialize(&parser));
+            yaml_parser_set_input_string(&parser, buffer, written);
+
+            while (!done)
+            {
+                assert(yaml_parser_load(&parser, &document) || print_output(argv[number], buffer, written, count));
+                done = (!yaml_document_get_root_node(&document));
+                if (!done) {
+                    assert(compare_documents(documents+count, &document) || print_output(argv[number], buffer, written, count));
+                    count ++;
+                }
+                yaml_document_delete(&document);
+            }
+            yaml_parser_delete(&parser);
+        }
+
+        for (k = 0; k < document_number; k ++) {
+            yaml_document_delete(documents+k);
+        }
+
+        printf("PASSED (length: %zd)\n", written);
+        print_output(argv[number], buffer, written, -1);
+    }
+
+    return 0;
+}
diff --git a/libyaml/tests/run-emitter.c b/libyaml/tests/run-emitter.c
new file mode 100644
index 0000000..fee2922
--- /dev/null
+++ b/libyaml/tests/run-emitter.c
@@ -0,0 +1,327 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+#define BUFFER_SIZE 65536
+#define MAX_EVENTS  1024
+
+int copy_event(yaml_event_t *event_to, yaml_event_t *event_from)
+{
+    switch (event_from->type)
+    {
+        case YAML_STREAM_START_EVENT:
+            return yaml_stream_start_event_initialize(event_to,
+                    event_from->data.stream_start.encoding);
+
+        case YAML_STREAM_END_EVENT:
+            return yaml_stream_end_event_initialize(event_to);
+
+        case YAML_DOCUMENT_START_EVENT:
+            return yaml_document_start_event_initialize(event_to,
+                    event_from->data.document_start.version_directive,
+                    event_from->data.document_start.tag_directives.start,
+                    event_from->data.document_start.tag_directives.end,
+                    event_from->data.document_start.implicit);
+
+        case YAML_DOCUMENT_END_EVENT:
+            return yaml_document_end_event_initialize(event_to,
+                    event_from->data.document_end.implicit);
+
+        case YAML_ALIAS_EVENT:
+            return yaml_alias_event_initialize(event_to,
+                    event_from->data.alias.anchor);
+
+        case YAML_SCALAR_EVENT:
+            return yaml_scalar_event_initialize(event_to,
+                    event_from->data.scalar.anchor,
+                    event_from->data.scalar.tag,
+                    event_from->data.scalar.value,
+                    event_from->data.scalar.length,
+                    event_from->data.scalar.plain_implicit,
+                    event_from->data.scalar.quoted_implicit,
+                    event_from->data.scalar.style);
+
+        case YAML_SEQUENCE_START_EVENT:
+            return yaml_sequence_start_event_initialize(event_to,
+                    event_from->data.sequence_start.anchor,
+                    event_from->data.sequence_start.tag,
+                    event_from->data.sequence_start.implicit,
+                    event_from->data.sequence_start.style);
+
+        case YAML_SEQUENCE_END_EVENT:
+            return yaml_sequence_end_event_initialize(event_to);
+
+        case YAML_MAPPING_START_EVENT:
+            return yaml_mapping_start_event_initialize(event_to,
+                    event_from->data.mapping_start.anchor,
+                    event_from->data.mapping_start.tag,
+                    event_from->data.mapping_start.implicit,
+                    event_from->data.mapping_start.style);
+
+        case YAML_MAPPING_END_EVENT:
+            return yaml_mapping_end_event_initialize(event_to);
+
+        default:
+            assert(1);
+    }
+
+    return 0;
+}
+
+int compare_events(yaml_event_t *event1, yaml_event_t *event2)
+{
+    int k;
+
+    if (event1->type != event2->type)
+        return 0;
+
+    switch (event1->type)
+    {
+        case YAML_STREAM_START_EVENT:
+            return 1;
+            /* return (event1->data.stream_start.encoding ==
+                    event2->data.stream_start.encoding); */
+
+        case YAML_DOCUMENT_START_EVENT:
+            if ((event1->data.document_start.version_directive && !event2->data.document_start.version_directive)
+                    || (!event1->data.document_start.version_directive && event2->data.document_start.version_directive)
+                    || (event1->data.document_start.version_directive && event2->data.document_start.version_directive
+                        && (event1->data.document_start.version_directive->major != event2->data.document_start.version_directive->major
+                            || event1->data.document_start.version_directive->minor != event2->data.document_start.version_directive->minor)))
+                return 0;
+            if ((event1->data.document_start.tag_directives.end - event1->data.document_start.tag_directives.start) !=
+                    (event2->data.document_start.tag_directives.end - event2->data.document_start.tag_directives.start))
+                return 0;
+            for (k = 0; k < (event1->data.document_start.tag_directives.end - event1->data.document_start.tag_directives.start); k ++) {
+                if ((strcmp((char *)event1->data.document_start.tag_directives.start[k].handle,
+                                (char *)event2->data.document_start.tag_directives.start[k].handle) != 0)
+                        || (strcmp((char *)event1->data.document_start.tag_directives.start[k].prefix,
+                            (char *)event2->data.document_start.tag_directives.start[k].prefix) != 0))
+                    return 0;
+            }
+            /* if (event1->data.document_start.implicit != event2->data.document_start.implicit)
+                return 0; */
+            return 1;
+
+        case YAML_DOCUMENT_END_EVENT:
+            return 1;
+            /* return (event1->data.document_end.implicit ==
+                    event2->data.document_end.implicit); */
+
+        case YAML_ALIAS_EVENT:
+            return (strcmp((char *)event1->data.alias.anchor,
+                        (char *)event2->data.alias.anchor) == 0);
+
+        case YAML_SCALAR_EVENT:
+            if ((event1->data.scalar.anchor && !event2->data.scalar.anchor)
+                    || (!event1->data.scalar.anchor && event2->data.scalar.anchor)
+                    || (event1->data.scalar.anchor && event2->data.scalar.anchor
+                        && strcmp((char *)event1->data.scalar.anchor,
+                            (char *)event2->data.scalar.anchor) != 0))
+                return 0;
+            if ((event1->data.scalar.tag && !event2->data.scalar.tag
+                        && strcmp((char *)event1->data.scalar.tag, "!") != 0)
+                    || (!event1->data.scalar.tag && event2->data.scalar.tag
+                        && strcmp((char *)event2->data.scalar.tag, "!") != 0)
+                    || (event1->data.scalar.tag && event2->data.scalar.tag
+                        && strcmp((char *)event1->data.scalar.tag,
+                            (char *)event2->data.scalar.tag) != 0))
+                return 0;
+            if ((event1->data.scalar.length != event2->data.scalar.length)
+                    || memcmp(event1->data.scalar.value, event2->data.scalar.value,
+                        event1->data.scalar.length) != 0)
+                return 0;
+            if ((event1->data.scalar.plain_implicit != event2->data.scalar.plain_implicit)
+                    || (event2->data.scalar.quoted_implicit != event2->data.scalar.quoted_implicit)
+                    /* || (event2->data.scalar.style != event2->data.scalar.style) */)
+                return 0;
+            return 1;
+
+        case YAML_SEQUENCE_START_EVENT:
+            if ((event1->data.sequence_start.anchor && !event2->data.sequence_start.anchor)
+                    || (!event1->data.sequence_start.anchor && event2->data.sequence_start.anchor)
+                    || (event1->data.sequence_start.anchor && event2->data.sequence_start.anchor
+                        && strcmp((char *)event1->data.sequence_start.anchor,
+                            (char *)event2->data.sequence_start.anchor) != 0))
+                return 0;
+            if ((event1->data.sequence_start.tag && !event2->data.sequence_start.tag)
+                    || (!event1->data.sequence_start.tag && event2->data.sequence_start.tag)
+                    || (event1->data.sequence_start.tag && event2->data.sequence_start.tag
+                        && strcmp((char *)event1->data.sequence_start.tag,
+                            (char *)event2->data.sequence_start.tag) != 0))
+                return 0;
+            if ((event1->data.sequence_start.implicit != event2->data.sequence_start.implicit)
+                    /* || (event2->data.sequence_start.style != event2->data.sequence_start.style) */)
+                return 0;
+            return 1;
+
+        case YAML_MAPPING_START_EVENT:
+            if ((event1->data.mapping_start.anchor && !event2->data.mapping_start.anchor)
+                    || (!event1->data.mapping_start.anchor && event2->data.mapping_start.anchor)
+                    || (event1->data.mapping_start.anchor && event2->data.mapping_start.anchor
+                        && strcmp((char *)event1->data.mapping_start.anchor,
+                            (char *)event2->data.mapping_start.anchor) != 0))
+                return 0;
+            if ((event1->data.mapping_start.tag && !event2->data.mapping_start.tag)
+                    || (!event1->data.mapping_start.tag && event2->data.mapping_start.tag)
+                    || (event1->data.mapping_start.tag && event2->data.mapping_start.tag
+                        && strcmp((char *)event1->data.mapping_start.tag,
+                            (char *)event2->data.mapping_start.tag) != 0))
+                return 0;
+            if ((event1->data.mapping_start.implicit != event2->data.mapping_start.implicit)
+                    /* || (event2->data.mapping_start.style != event2->data.mapping_start.style) */)
+                return 0;
+            return 1;
+
+        default:
+            return 1;
+    }
+}
+
+int print_output(char *name, unsigned char *buffer, size_t size, int count)
+{
+    FILE *file;
+    char data[BUFFER_SIZE];
+    size_t data_size = 1;
+    size_t total_size = 0;
+    if (count >= 0) {
+        printf("FAILED (at the event #%d)\nSOURCE:\n", count+1);
+    }
+    file = fopen(name, "rb");
+    assert(file);
+    while (data_size > 0) {
+        data_size = fread(data, 1, BUFFER_SIZE, file);
+        assert(!ferror(file));
+        if (!data_size) break;
+        assert(fwrite(data, 1, data_size, stdout) == data_size);
+        total_size += data_size;
+        if (feof(file)) break;
+    }
+    fclose(file);
+    printf("#### (length: %zd)\n", total_size);
+    printf("OUTPUT:\n%s#### (length: %zd)\n", buffer, size);
+    return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+    int number;
+    int canonical = 0;
+    int unicode = 0;
+
+    number = 1;
+    while (number < argc) {
+        if (strcmp(argv[number], "-c") == 0) {
+            canonical = 1;
+        }
+        else if (strcmp(argv[number], "-u") == 0) {
+            unicode = 1;
+        }
+        else if (argv[number][0] == '-') {
+            printf("Unknown option: '%s'\n", argv[number]);
+            return 0;
+        }
+        if (argv[number][0] == '-') {
+            if (number < argc-1) {
+                memmove(argv+number, argv+number+1, (argc-number-1)*sizeof(char *));
+            }
+            argc --;
+        }
+        else {
+            number ++;
+        }
+    }
+
+    if (argc < 2) {
+        printf("Usage: %s [-c] [-u] file1.yaml ...\n", argv[0]);
+        return 0;
+    }
+
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_emitter_t emitter;
+        yaml_event_t event;
+        unsigned char buffer[BUFFER_SIZE+1];
+        size_t written = 0;
+        yaml_event_t events[MAX_EVENTS];
+        size_t event_number = 0;
+        int done = 0;
+        int count = 0;
+        int error = 0;
+        int k;
+        memset(buffer, 0, BUFFER_SIZE+1);
+        memset(events, 0, MAX_EVENTS*sizeof(yaml_event_t));
+
+        printf("[%d] Parsing, emitting, and parsing again '%s': ", number, argv[number]);
+        fflush(stdout);
+
+        file = fopen(argv[number], "rb");
+        assert(file);
+
+        assert(yaml_parser_initialize(&parser));
+        yaml_parser_set_input_file(&parser, file);
+        assert(yaml_emitter_initialize(&emitter));
+        if (canonical) {
+            yaml_emitter_set_canonical(&emitter, 1);
+        }
+        if (unicode) {
+            yaml_emitter_set_unicode(&emitter, 1);
+        }
+        yaml_emitter_set_output_string(&emitter, buffer, BUFFER_SIZE, &written);
+
+        while (!done)
+        {
+            if (!yaml_parser_parse(&parser, &event)) {
+                error = 1;
+                break;
+            }
+
+            done = (event.type == YAML_STREAM_END_EVENT);
+            assert(event_number < MAX_EVENTS);
+            assert(copy_event(&(events[event_number++]), &event));
+            assert(yaml_emitter_emit(&emitter, &event) || 
+                    print_output(argv[number], buffer, written, count));
+            count ++;
+        }
+
+        yaml_parser_delete(&parser);
+        assert(!fclose(file));
+        yaml_emitter_delete(&emitter);
+
+        if (!error)
+        {
+            count = done = 0;
+            assert(yaml_parser_initialize(&parser));
+            yaml_parser_set_input_string(&parser, buffer, written);
+
+            while (!done)
+            {
+                assert(yaml_parser_parse(&parser, &event) || print_output(argv[number], buffer, written, count));
+                done = (event.type == YAML_STREAM_END_EVENT);
+                assert(compare_events(events+count, &event) || print_output(argv[number], buffer, written, count));
+                yaml_event_delete(&event);
+                count ++;
+            }
+            yaml_parser_delete(&parser);
+        }
+
+        for (k = 0; k < event_number; k ++) {
+            yaml_event_delete(events+k);
+        }
+
+        printf("PASSED (length: %zd)\n", written);
+        print_output(argv[number], buffer, written, -1);
+    }
+
+    return 0;
+}
diff --git a/libyaml/tests/run-loader.c b/libyaml/tests/run-loader.c
new file mode 100644
index 0000000..8c36b66
--- /dev/null
+++ b/libyaml/tests/run-loader.c
@@ -0,0 +1,63 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+int
+main(int argc, char *argv[])
+{
+    int number;
+
+    if (argc < 2) {
+        printf("Usage: %s file1.yaml ...\n", argv[0]);
+        return 0;
+    }
+
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_document_t document;
+        int done = 0;
+        int count = 0;
+        int error = 0;
+
+        printf("[%d] Loading '%s': ", number, argv[number]);
+        fflush(stdout);
+
+        file = fopen(argv[number], "rb");
+        assert(file);
+
+        assert(yaml_parser_initialize(&parser));
+
+        yaml_parser_set_input_file(&parser, file);
+
+        while (!done)
+        {
+            if (!yaml_parser_load(&parser, &document)) {
+                error = 1;
+                break;
+            }
+
+            done = (!yaml_document_get_root_node(&document));
+
+            yaml_document_delete(&document);
+
+            if (!done) count ++;
+        }
+
+        yaml_parser_delete(&parser);
+
+        assert(!fclose(file));
+
+        printf("%s (%d documents)\n", (error ? "FAILURE" : "SUCCESS"), count);
+    }
+
+    return 0;
+}
+
diff --git a/libyaml/tests/run-parser.c b/libyaml/tests/run-parser.c
new file mode 100644
index 0000000..1303112
--- /dev/null
+++ b/libyaml/tests/run-parser.c
@@ -0,0 +1,63 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+int
+main(int argc, char *argv[])
+{
+    int number;
+
+    if (argc < 2) {
+        printf("Usage: %s file1.yaml ...\n", argv[0]);
+        return 0;
+    }
+
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_event_t event;
+        int done = 0;
+        int count = 0;
+        int error = 0;
+
+        printf("[%d] Parsing '%s': ", number, argv[number]);
+        fflush(stdout);
+
+        file = fopen(argv[number], "rb");
+        assert(file);
+
+        assert(yaml_parser_initialize(&parser));
+
+        yaml_parser_set_input_file(&parser, file);
+
+        while (!done)
+        {
+            if (!yaml_parser_parse(&parser, &event)) {
+                error = 1;
+                break;
+            }
+
+            done = (event.type == YAML_STREAM_END_EVENT);
+
+            yaml_event_delete(&event);
+
+            count ++;
+        }
+
+        yaml_parser_delete(&parser);
+
+        assert(!fclose(file));
+
+        printf("%s (%d events)\n", (error ? "FAILURE" : "SUCCESS"), count);
+    }
+
+    return 0;
+}
+
diff --git a/libyaml/tests/run-scanner.c b/libyaml/tests/run-scanner.c
new file mode 100644
index 0000000..2c79e7c
--- /dev/null
+++ b/libyaml/tests/run-scanner.c
@@ -0,0 +1,63 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+int
+main(int argc, char *argv[])
+{
+    int number;
+
+    if (argc < 2) {
+        printf("Usage: %s file1.yaml ...\n", argv[0]);
+        return 0;
+    }
+
+    for (number = 1; number < argc; number ++)
+    {
+        FILE *file;
+        yaml_parser_t parser;
+        yaml_token_t token;
+        int done = 0;
+        int count = 0;
+        int error = 0;
+
+        printf("[%d] Scanning '%s': ", number, argv[number]);
+        fflush(stdout);
+
+        file = fopen(argv[number], "rb");
+        assert(file);
+
+        assert(yaml_parser_initialize(&parser));
+
+        yaml_parser_set_input_file(&parser, file);
+
+        while (!done)
+        {
+            if (!yaml_parser_scan(&parser, &token)) {
+                error = 1;
+                break;
+            }
+
+            done = (token.type == YAML_STREAM_END_TOKEN);
+
+            yaml_token_delete(&token);
+
+            count ++;
+        }
+
+        yaml_parser_delete(&parser);
+
+        assert(!fclose(file));
+
+        printf("%s (%d tokens)\n", (error ? "FAILURE" : "SUCCESS"), count);
+    }
+
+    return 0;
+}
+
diff --git a/libyaml/tests/run-test-suite/Makefile b/libyaml/tests/run-test-suite/Makefile
new file mode 100644
index 0000000..3d39edc
--- /dev/null
+++ b/libyaml/tests/run-test-suite/Makefile
@@ -0,0 +1,30 @@
+.PHONY: test
+GITHUB_ORG_URI := https://github.com/yaml
+TEST_SUITE_URL := $(GITHUB_ORG_URI)/yaml-test-suite
+LIBYAML_DIR ?= $(PWD)/libyaml-parser-emitter/libyaml
+
+default: help
+
+help:
+	@echo 'test  - Run the tests'
+	@echo 'clean - Remove generated files'
+	@echo 'help  - Show help'
+
+# Depends on parser and emitter but, building parser will also build emitter.
+# Building twice makes things fail. Note: Some environments like on OS X, the
+# shell resets the {DY,}LD_LIBRARY_PATH vars, so we work around it like so:
+test: data src/libyaml-parser
+	(export MY_LD_LIBRARY_PATH=$(LIBYAML_DIR)/src/.libs; prove -lv test)
+
+clean:
+	rm -fr data
+
+data:
+	git clone $(TEST_SUITE_URL) $@ --branch=$@
+
+%/libyaml-parser %/libyaml-emitter: %
+	(cd $<; make clean build)
+	(cd $<; make clean build)
+
+libyaml-parser-emitter:
+	git clone $(GITHUB_ORG_URI)/$@ $@
diff --git a/libyaml/tests/run-test-suite/ReadMe.md b/libyaml/tests/run-test-suite/ReadMe.md
new file mode 100644
index 0000000..c1ef208
--- /dev/null
+++ b/libyaml/tests/run-test-suite/ReadMe.md
@@ -0,0 +1,17 @@
+LibYAML Test Runner
+===================
+
+Run libyaml-parser and libyaml-emitter against yaml-test-suite
+
+# Synopsis
+
+```
+make test
+```
+
+# Overview
+
+See:
+
+* https://github.com/yaml/libyaml
+* https://github.com/yaml/yaml-test-suite
diff --git a/libyaml/tests/run-test-suite/src/Makefile b/libyaml/tests/run-test-suite/src/Makefile
new file mode 100644
index 0000000..de0d49a
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/Makefile
@@ -0,0 +1,54 @@
+LIBYAML_DIR ?= libyaml
+LIBYAML_REPO ?= https://github.com/yaml/libyaml
+LIBYAML_BRANCH ?= master
+define HELP
+This Makefile supports the following targets:
+
+    build    - Build ./libyaml-parser and ./libyaml-emitter
+    test     - Run tests
+
+endef
+export HELP
+
+help:
+	@echo "$$HELP"
+
+build: touch libyaml-parser libyaml-emitter
+
+touch:
+ifneq ($(LIBYAML_DIR),libyaml)
+	touch *.c
+endif
+
+libyaml-%: $(LIBYAML_DIR)/tests/.libs/run-%
+	cp $< $@
+
+$(LIBYAML_DIR)/tests/.libs/%: $(LIBYAML_DIR)/tests/%.c $(LIBYAML_DIR)/Makefile
+	make -C $(LIBYAML_DIR)
+ifneq ($(LIBYAML_DIR),libyaml)
+	(cd $(LIBYAML_DIR) && git checkout tests/run-parser.c tests/run-emitter.c)
+endif
+
+$(LIBYAML_DIR)/tests/run-%: libyaml-% $(LIBYAML_DIR)
+	cp $< $@
+.SECONDARY: \
+	$(LIBYAML_DIR)/tests/run-parser.c \
+	$(LIBYAML_DIR)/tests/run-emitter.c \
+	$(LIBYAML_DIR)/tests/.libs/run-parser \
+	$(LIBYAML_DIR)/tests/.libs/run-emitter
+
+$(LIBYAML_DIR)/Makefile: $(LIBYAML_DIR)
+	( cd $< && ./bootstrap && ./configure )
+	touch $@
+
+$(LIBYAML_DIR):
+	git clone $(LIBYAML_REPO) $@
+	sleep 1
+	touch *.c
+
+.PHONY: test
+test: build
+	prove -lv test/
+
+clean:
+	rm -fr libyaml libyaml-parser libyaml-emitter
diff --git a/libyaml/tests/run-test-suite/src/ReadMe.md b/libyaml/tests/run-test-suite/src/ReadMe.md
new file mode 100644
index 0000000..ced29cb
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/ReadMe.md
@@ -0,0 +1,34 @@
+libyaml-parser-emitter
+======================
+
+Parser and Emitter CLI tools for libyaml
+
+# Synopsis
+
+```
+make build
+make test
+```
+
+# Usage
+
+Print parse events for a YAML file (or stdin):
+```
+./libyaml-parser file.yaml
+./libyaml-parser < file.yaml
+cat file.yaml | ./libyaml-parser
+```
+
+Print the YAML for a libyaml-parser events file (or stdin):
+```
+./libyaml-emitter file.events
+./libyaml-emitter < file.events
+cat file.events | ./libyaml-emitter
+```
+
+# Build
+
+```
+export LIBYAML_DIR=/path/to/libyaml   # Optional
+make build
+```
diff --git a/libyaml/tests/run-test-suite/src/libyaml-emitter.c b/libyaml/tests/run-test-suite/src/libyaml-emitter.c
new file mode 100644
index 0000000..6c599e8
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/libyaml-emitter.c
@@ -0,0 +1,232 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <assert.h>
+
+bool get_line(FILE * input, char *line);
+char *get_anchor(char sigil, char *line, char *anchor);
+char *get_tag(char *line, char *tag);
+void get_value(char *line, char *value, int *style);
+
+int main(int argc, char *argv[])
+{
+    FILE *input;
+    yaml_emitter_t emitter;
+    yaml_event_t event;
+
+    int canonical = 0;
+    int unicode = 0;
+    char line[1024];
+
+    if (argc == 1)
+        input = stdin;
+    else if (argc == 2)
+        input = fopen(argv[1], "rb");
+    else {
+        fprintf(stderr, "Usage: libyaml-emitter [<input-file>]\n");
+        return 1;
+    }
+    assert(input);
+
+    if (!yaml_emitter_initialize(&emitter)) {
+        fprintf(stderr, "Could not initalize the emitter object\n");
+        return 1;
+    }
+    yaml_emitter_set_output_file(&emitter, stdout);
+    yaml_emitter_set_canonical(&emitter, canonical);
+    yaml_emitter_set_unicode(&emitter, unicode);
+
+    while (get_line(input, line)) {
+        int ok;
+        char anchor[256];
+        char tag[256];
+        int implicit;
+
+        if (strncmp(line, "+STR", 4) == 0) {
+            ok = yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING);
+        }
+        else if (strncmp(line, "-STR", 4) == 0) {
+            ok = yaml_stream_end_event_initialize(&event);
+        }
+        else if (strncmp(line, "+DOC", 4) == 0) {
+            implicit = strncmp(line, "+DOC ---", 8) != 0;
+            ok = yaml_document_start_event_initialize(&event, NULL, NULL, NULL, implicit);
+        }
+        else if (strncmp(line, "-DOC", 4) == 0) {
+            implicit = strncmp(line, "-DOC ...", 8) != 0;
+            ok = yaml_document_end_event_initialize(&event, implicit);
+        }
+        else if (strncmp(line, "+MAP", 4) == 0) {
+            ok = yaml_mapping_start_event_initialize(&event, (yaml_char_t *)
+                                                     get_anchor('&', line, anchor), (yaml_char_t *)
+                                                     get_tag(line, tag), 0, YAML_BLOCK_MAPPING_STYLE);
+        }
+        else if (strncmp(line, "-MAP", 4) == 0) {
+            ok = yaml_mapping_end_event_initialize(&event);
+        }
+        else if (strncmp(line, "+SEQ", 4) == 0) {
+            ok = yaml_sequence_start_event_initialize(&event, (yaml_char_t *)
+                                                      get_anchor('&', line, anchor), (yaml_char_t *)
+                                                      get_tag(line, tag), 0, YAML_BLOCK_SEQUENCE_STYLE);
+        }
+        else if (strncmp(line, "-SEQ", 4) == 0) {
+            ok = yaml_sequence_end_event_initialize(&event);
+        }
+        else if (strncmp(line, "=VAL", 4) == 0) {
+            char value[1024];
+            int style;
+
+            get_value(line, value, &style);
+            implicit = (get_tag(line, tag) == NULL);
+
+            ok = yaml_scalar_event_initialize(&event, (yaml_char_t *)
+                                              get_anchor('&', line, anchor), (yaml_char_t *) get_tag(line, tag), (yaml_char_t *) value, -1, implicit, implicit, style);
+        }
+        else if (strncmp(line, "=ALI", 4) == 0) {
+            ok = yaml_alias_event_initialize(&event, (yaml_char_t *)
+                                             get_anchor('*', line, anchor)
+                );
+        }
+        else {
+            fprintf(stderr, "Unknown event: '%s'\n", line);
+            fflush(stdout);
+            return 1;
+        }
+
+        if (!ok)
+            goto event_error;
+        if (!yaml_emitter_emit(&emitter, &event))
+            goto emitter_error;
+    }
+
+    assert(!fclose(input));
+    yaml_emitter_delete(&emitter);
+    fflush(stdout);
+
+    return 0;
+
+  emitter_error:
+    switch (emitter.error) {
+    case YAML_MEMORY_ERROR:
+        fprintf(stderr, "Memory error: Not enough memory for emitting\n");
+        break;
+    case YAML_WRITER_ERROR:
+        fprintf(stderr, "Writer error: %s\n", emitter.problem);
+        break;
+    case YAML_EMITTER_ERROR:
+        fprintf(stderr, "Emitter error: %s\n", emitter.problem);
+        break;
+    default:
+        /*
+         * Couldn't happen. 
+         */
+        fprintf(stderr, "Internal error\n");
+        break;
+    }
+    yaml_emitter_delete(&emitter);
+    return 1;
+
+  event_error:
+    fprintf(stderr, "Memory error: Not enough memory for creating an event\n");
+    yaml_emitter_delete(&emitter);
+    return 1;
+}
+
+bool get_line(FILE * input, char *line)
+{
+    char *newline;
+
+    if (!fgets(line, 1024 - 1, input))
+        return false;
+
+    if ((newline = strchr(line, '\n')) == NULL) {
+        fprintf(stderr, "Line too long: '%s'", line);
+        abort();
+    }
+    *newline = '\0';
+
+    return true;
+}
+
+char *get_anchor(char sigil, char *line, char *anchor)
+{
+    char *start;
+    char *end;
+    if ((start = strchr(line, sigil)) == NULL)
+        return NULL;
+    start++;
+    if ((end = strchr(start, ' ')) == NULL)
+        end = line + strlen(line);
+    memcpy(anchor, start, end - start);
+    anchor[end - start] = '\0';
+    return anchor;
+}
+
+char *get_tag(char *line, char *tag)
+{
+    char *start;
+    char *end;
+    if ((start = strchr(line, '<')) == NULL)
+        return NULL;
+    if ((end = strchr(line, '>')) == NULL)
+        return NULL;
+    memcpy(tag, start + 1, end - start - 1);
+    tag[end - start - 1] = '\0';
+    return tag;
+}
+
+void get_value(char *line, char *value, int *style)
+{
+    int i = 0;
+    char *c;
+    char *start = NULL;
+    char *end = line + strlen(line);
+
+    for (c = line + 4; c < end; c++) {
+        if (*c == ' ') {
+            start = c + 1;
+            if (*start == ':')
+                *style = YAML_PLAIN_SCALAR_STYLE;
+            else if (*start == '\'')
+                *style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
+            else if (*start == '"')
+                *style = YAML_DOUBLE_QUOTED_SCALAR_STYLE;
+            else if (*start == '|')
+                *style = YAML_LITERAL_SCALAR_STYLE;
+            else if (*start == '>')
+                *style = YAML_FOLDED_SCALAR_STYLE;
+            else {
+                start = NULL;
+                continue;
+            }
+            start++;
+            break;
+        }
+    }
+    if (!start)
+        abort();
+
+    for (c = start; c < end; c++) {
+        if (*c == '\\') {
+            if (*++c == '\\')
+                value[i++] = '\\';
+            else if (*c == '0')
+                value[i++] = '\0';
+            else if (*c == 'b')
+                value[i++] = '\b';
+            else if (*c == 'n')
+                value[i++] = '\n';
+            else if (*c == 'r')
+                value[i++] = '\r';
+            else if (*c == 't')
+                value[i++] = '\t';
+            else
+                abort();
+        }
+        else
+            value[i++] = *c;
+    }
+    value[i] = '\0';
+}
diff --git a/libyaml/tests/run-test-suite/src/libyaml-parser.c b/libyaml/tests/run-test-suite/src/libyaml-parser.c
new file mode 100644
index 0000000..b2c7f84
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/libyaml-parser.c
@@ -0,0 +1,144 @@
+#include <yaml.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+void print_escaped(yaml_char_t * str, size_t length);
+
+int main(int argc, char *argv[])
+{
+    FILE *input;
+    yaml_parser_t parser;
+    yaml_event_t event;
+
+    if (argc == 1)
+        input = stdin;
+    else if (argc == 2)
+        input = fopen(argv[1], "rb");
+    else {
+        fprintf(stderr, "Usage: libyaml-parser [<input-file>]\n");
+        return 1;
+    }
+    assert(input);
+
+    if (!yaml_parser_initialize(&parser)) {
+        fprintf(stderr, "Could not initialize the parser object\n");
+        return 1;
+    }
+    yaml_parser_set_input_file(&parser, input);
+
+    while (1) {
+        yaml_event_type_t type;
+        if (!yaml_parser_parse(&parser, &event)) {
+            fprintf(stderr, "Parse error: %s\n", parser.problem);
+            return 1;
+        }
+        type = event.type;
+
+        if (type == YAML_NO_EVENT)
+            printf("???\n");
+        else if (type == YAML_STREAM_START_EVENT)
+            printf("+STR\n");
+        else if (type == YAML_STREAM_END_EVENT)
+            printf("-STR\n");
+        else if (type == YAML_DOCUMENT_START_EVENT) {
+            printf("+DOC");
+            if (!event.data.document_start.implicit)
+                printf(" ---");
+            printf("\n");
+        }
+        else if (type == YAML_DOCUMENT_END_EVENT) {
+            printf("-DOC");
+            if (!event.data.document_end.implicit)
+                printf(" ...");
+            printf("\n");
+        }
+        else if (type == YAML_MAPPING_START_EVENT) {
+            printf("+MAP");
+            if (event.data.mapping_start.anchor)
+                printf(" &%s", event.data.mapping_start.anchor);
+            if (event.data.mapping_start.tag)
+                printf(" <%s>", event.data.mapping_start.tag);
+            printf("\n");
+        }
+        else if (type == YAML_MAPPING_END_EVENT)
+            printf("-MAP\n");
+        else if (type == YAML_SEQUENCE_START_EVENT) {
+            printf("+SEQ");
+            if (event.data.sequence_start.anchor)
+                printf(" &%s", event.data.sequence_start.anchor);
+            if (event.data.sequence_start.tag)
+                printf(" <%s>", event.data.sequence_start.tag);
+            printf("\n");
+        }
+        else if (type == YAML_SEQUENCE_END_EVENT)
+            printf("-SEQ\n");
+        else if (type == YAML_SCALAR_EVENT) {
+            printf("=VAL");
+            if (event.data.scalar.anchor)
+                printf(" &%s", event.data.scalar.anchor);
+            if (event.data.scalar.tag)
+                printf(" <%s>", event.data.scalar.tag);
+            switch (event.data.scalar.style) {
+            case YAML_PLAIN_SCALAR_STYLE:
+                printf(" :");
+                break;
+            case YAML_SINGLE_QUOTED_SCALAR_STYLE:
+                printf(" '");
+                break;
+            case YAML_DOUBLE_QUOTED_SCALAR_STYLE:
+                printf(" \"");
+                break;
+            case YAML_LITERAL_SCALAR_STYLE:
+                printf(" |");
+                break;
+            case YAML_FOLDED_SCALAR_STYLE:
+                printf(" >");
+                break;
+            case YAML_ANY_SCALAR_STYLE:
+                abort();
+            }
+            print_escaped(event.data.scalar.value, event.data.scalar.length);
+            printf("\n");
+        }
+        else if (type == YAML_ALIAS_EVENT)
+            printf("=ALI *%s\n", event.data.alias.anchor);
+        else
+            abort();
+
+        yaml_event_delete(&event);
+
+        if (type == YAML_STREAM_END_EVENT)
+            break;
+    }
+
+    assert(!fclose(input));
+    yaml_parser_delete(&parser);
+    fflush(stdout);
+
+    return 0;
+}
+
+void print_escaped(yaml_char_t * str, size_t length)
+{
+    int i;
+    char c;
+
+    for (i = 0; i < length; i++) {
+        c = *(str + i);
+        if (c == '\\')
+            printf("\\\\");
+        else if (c == '\0')
+            printf("\\0");
+        else if (c == '\b')
+            printf("\\b");
+        else if (c == '\n')
+            printf("\\n");
+        else if (c == '\r')
+            printf("\\r");
+        else if (c == '\t')
+            printf("\\t");
+        else
+            printf("%c", c);
+    }
+}
diff --git a/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.events b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.events
new file mode 100644
index 0000000..fdd1b5f
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.events
@@ -0,0 +1,59 @@
++STR
++DOC ---
++MAP <tag:clarkevans.com,2002:invoice>
+=VAL :invoice
+=VAL :34843
+=VAL :date
+=VAL :2001-01-23
+=VAL :bill-to
++MAP &id001
+=VAL :given
+=VAL :Chris
+=VAL :family
+=VAL :Dumars
+=VAL :address
++MAP
+=VAL :lines
+=VAL |458 Walkman Dr.\nSuite #292\n
+=VAL :city
+=VAL :Royal Oak
+=VAL :state
+=VAL :MI
+=VAL :postal
+=VAL :48046
+-MAP
+-MAP
+=VAL :ship-to
+=ALI *id001
+=VAL :product
++SEQ
++MAP
+=VAL :sku
+=VAL :BL394D
+=VAL :quantity
+=VAL :4
+=VAL :description
+=VAL :Basketball
+=VAL :price
+=VAL :450.00
+-MAP
++MAP
+=VAL :sku
+=VAL :BL4438H
+=VAL :quantity
+=VAL :1
+=VAL :description
+=VAL :Super Hoop
+=VAL :price
+=VAL :2392.00
+-MAP
+-SEQ
+=VAL :tax
+=VAL :251.42
+=VAL :total
+=VAL :4443.52
+=VAL :comments
+=VAL :Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
+-MAP
+-DOC
+-STR
diff --git a/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.out b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.out
new file mode 100644
index 0000000..1a876c9
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.out
@@ -0,0 +1,26 @@
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date: 2001-01-23
+bill-to: &id001
+  given: Chris
+  family: Dumars
+  address:
+    lines: |
+      458 Walkman Dr.
+      Suite #292
+    city: Royal Oak
+    state: MI
+    postal: 48046
+ship-to: *id001
+product:
+- sku: BL394D
+  quantity: 4
+  description: Basketball
+  price: 450.00
+- sku: BL4438H
+  quantity: 1
+  description: Super Hoop
+  price: 2392.00
+tax: 251.42
+total: 4443.52
+comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
diff --git a/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.yaml b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.yaml
new file mode 100644
index 0000000..4625739
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/test/example-2.27-invoice.yaml
@@ -0,0 +1,29 @@
+--- !<tag:clarkevans.com,2002:invoice>
+invoice: 34843
+date   : 2001-01-23
+bill-to: &id001
+    given  : Chris
+    family : Dumars
+    address:
+        lines: |
+            458 Walkman Dr.
+            Suite #292
+        city    : Royal Oak
+        state   : MI
+        postal  : 48046
+ship-to: *id001
+product:
+    - sku         : BL394D
+      quantity    : 4
+      description : Basketball
+      price       : 450.00
+    - sku         : BL4438H
+      quantity    : 1
+      description : Super Hoop
+      price       : 2392.00
+tax  : 251.42
+total: 4443.52
+comments:
+    Late afternoon is best.
+    Backup contact is Nancy
+    Billsmer @ 338-4338.
diff --git a/libyaml/tests/run-test-suite/src/test/libyaml-emitter.t b/libyaml/tests/run-test-suite/src/test/libyaml-emitter.t
new file mode 100644
index 0000000..7afd5f0
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/test/libyaml-emitter.t
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+got=$(mktemp)
+
+count=0
+for test in test/*.events; do
+  want=${test//.events/.out}
+  label="Emitting '$test' equals '$want'"
+  rc=0
+  ./libyaml-emitter $test > $got || rc=$?
+  if [[ $rc -ne 0 ]]; then
+    echo "not ok $((++count)) - Error code $rc"
+    continue
+  fi
+  rc=0
+  diff=$(diff -u $want $got) || rc=$?
+  if [[ $rc -eq 0 ]]; then
+    echo "ok $((++count)) - $label"
+  else
+    echo "not ok $((++count)) - $label"
+    diff=${diff//$'\n'/$'\n'# }
+    echo "# $diff"
+  fi
+done
+
+echo "1..$count"
diff --git a/libyaml/tests/run-test-suite/src/test/libyaml-parser.t b/libyaml/tests/run-test-suite/src/test/libyaml-parser.t
new file mode 100644
index 0000000..40c56da
--- /dev/null
+++ b/libyaml/tests/run-test-suite/src/test/libyaml-parser.t
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+got=$(mktemp)
+
+count=0
+for test in test/*.yaml; do
+  want=${test//.yaml/.events}
+  label="Parsing '$test' equals '$want'"
+  rc=0
+  ./libyaml-parser $test > $got || rc=$?
+  if [[ $rc -ne 0 ]]; then
+    echo "not ok $((++count)) - Error code $rc"
+    continue
+  fi
+  rc=0
+  diff=$(diff -u $want $got) || rc=$?
+  if [[ $rc -eq 0 ]]; then
+    echo "ok $((++count)) - $label"
+  else
+    echo "not ok $((++count)) - $label"
+    diff=${diff//$'\n'/$'\n'# }
+    echo "# $diff"
+  fi
+done
+
+echo "1..$count"
diff --git a/libyaml/tests/run-test-suite/test/libyaml-emitter.list b/libyaml/tests/run-test-suite/test/libyaml-emitter.list
new file mode 100644
index 0000000..97e2804
--- /dev/null
+++ b/libyaml/tests/run-test-suite/test/libyaml-emitter.list
@@ -0,0 +1,127 @@
+229Q: Spec Example 2.4. Sequence of Mappings
+2AUY: Tags in Block Sequence
+3ALJ: Block Sequence in Block Sequence
+3GZX: Spec Example 7.1. Alias Nodes
+4CQQ: Spec Example 2.18. Multi-line Flow Scalars
+4GC6: Spec Example 7.7. Single Quoted Characters
+4UYU: Colon in Double Quoted String
+4ZYM: Spec Example 6.4. Line Prefixes
+54T7: Flow Mapping
+57H4: Spec Example 8.22. Block Collection Nodes
+5BVJ: Spec Example 5.7. Block Scalar Indicators
+5C5M: Spec Example 7.15. Flow Mappings
+5GBF: Spec Example 6.5. Empty Lines
+5KJE: Spec Example 7.13. Flow Sequence
+5NYZ: Spec Example 6.9. Separated Comment
+65WH: Single Entry Block Sequence
+6FWR: Block Scalar Keep
+6HB6: Spec Example 6.1. Indentation Spaces
+6JQW: Spec Example 2.13. In literals, newlines are preserved
+6JWB: Tags for Block Objects
+6VJK: Spec Example 2.15. Folded newlines are preserved for "more indented" and blank lines
+735Y: Spec Example 8.20. Block Node Types
+74H7: Tags in Implicit Mapping
+77H8: Spec Example 2.23. Various Explicit Tags
+7A4E: Spec Example 7.6. Double Quoted Lines
+7BUB: Spec Example 2.10. Node for “Sammy Sosa” appears twice in this document
+7FWL: Spec Example 6.24. Verbatim Tags
+7T8X: Spec Example 8.10. Folded Lines - 8.13. Final Empty Lines
+87E4: Spec Example 7.8. Single Quoted Implicit Keys
+8G76: Spec Example 6.10. Comment Lines
+8QBE: Block Sequence in Block Mapping
+8UDB: Spec Example 7.14. Flow Sequence Entries
+93JH: Block Mappings in Block Sequence
+96L6: Spec Example 2.14. In the folded scalars, newlines become spaces
+98YD: Spec Example 5.5. Comment Indicator
+9FMG: Multi-level Mapping Indent
+9J7A: Simple Mapping Indent
+9SHH: Spec Example 5.8. Quoted Scalar Indicators
+9U5K: Spec Example 2.12. Compact Nested Mapping
+9WXW: Spec Example 6.18. Primary Tag Handle
+9YRD: Multiline Scalar at Top Level
+A2M4: Spec Example 6.2. Indentation Indicators
+A6F9: Spec Example 8.4. Chomping Final Line Break
+A984: Multiline Scalar in Mapping
+AVM7: Empty Stream
+AZ63: Sequence With Same Indentation as Parent Mapping
+AZW3: Lookahead test cases
+BEC7: Spec Example 6.14. “YAML” directive
+C4HZ: Spec Example 2.24. Global Tags
+CC74: Spec Example 6.20. Tag Handles
+CT4Q: Spec Example 7.20. Single Pair Explicit Entry
+CUP7: Spec Example 5.6. Node Property Indicators
+D88J: Flow Sequence in Block Mapping
+D9TU: Single Pair Block Mapping
+DBG4: Spec Example 7.10. Plain Characters
+DHP8: Flow Sequence
+DWX9: Spec Example 8.8. Literal Content
+E76Z: Aliases in Implicit Block Mapping
+EHF6: Tags for Flow Objects
+F2C7: Anchors and Tags
+F8F9: Spec Example 8.5. Chomping Trailing Lines
+FQ7F: Spec Example 2.1. Sequence of Scalars
+FUP4: Flow Sequence in Flow Sequence
+G4RS: Spec Example 2.17. Quoted Scalars
+G992: Spec Example 8.9. Folded Scalar
+GH63: Mixed Block Mapping (explicit to implicit)
+H2RW: Blank lines
+HMK4: Spec Example 2.16. Indentation determines scope
+HMQ5: Spec Example 6.23. Node Properties
+HS5T: Spec Example 7.12. Plain Lines
+J3BT: Spec Example 5.12. Tabs and Spaces
+J5UC: Multiple Pair Block Mapping
+J7PZ: Spec Example 2.26. Ordered Mappings
+J7VC: Empty Lines Between Mapping Elements
+J9HZ: Spec Example 2.9. Single Document with Two Comments
+JHB9: Spec Example 2.7. Two Documents in a Stream
+JQ4R: Spec Example 8.14. Block Sequence
+JS2J: Spec Example 6.29. Node Anchors
+K4SU: Multiple Entry Block Sequence
+K527: Spec Example 6.6. Line Folding
+K858: Spec Example 8.6. Empty Scalar Chomping
+KMK3: Block Submapping
+L94M: Tags in Explicit Mapping
+L9U5: Spec Example 7.11. Plain Implicit Keys
+LP6E: Whitespace After Scalars in Flow
+LQZ7: Spec Example 7.4. Double Quoted Implicit Keys
+M29M: Literal Block Scalar
+M5C3: Spec Example 8.21. Block Scalar Nodes
+M5DY: Spec Example 2.11. Mapping between Sequences
+M9B4: Spec Example 8.7. Literal Scalar
+MJS9: Spec Example 6.7. Block Folding
+MXS3: Flow Mapping in Block Sequence
+MYW6: Block Scalar Strip
+MZX3: Non-Specific Tags on Scalars
+N782: Fake markers in flow style
+NP9H: Spec Example 7.5. Double Quoted Line Breaks
+P2AD: Spec Example 8.1. Block Scalar Header
+P76L: Spec Example 6.19. Secondary Tag Handle
+P94K: Spec Example 6.11. Multi-Line Comments
+PBJ2: Spec Example 2.3. Mapping Scalars to Sequences
+PRH3: Spec Example 7.9. Single Quoted Lines
+Q88A: Spec Example 7.23. Flow Content
+Q9WF: Spec Example 6.12. Separation Spaces
+QF4Y: Spec Example 7.19. Single Pair Flow Mappings
+R4YG: Spec Example 8.2. Block Indentation Indicator
+RLU9: Sequence Indent
+RR7F: Mixed Block Mapping (implicit to explicit)
+RTP8: Spec Example 9.2. Document Markers
+RZT7: Spec Example 2.28. Log File
+S4T7: Document with footer
+S9E8: Spec Example 5.3. Block Structure Indicators
+SBG9: Flow Sequence in Flow Mapping
+SYW4: Spec Example 2.2. Mapping Scalars to Scalars
+TE2A: Spec Example 8.16. Block Mappings
+TL85: Spec Example 6.8. Flow Folding
+TS54: Folded Block Scalar
+U3C3: Spec Example 6.16. “TAG” directive
+U9NS: Spec Example 2.8. Play by Play Feed from a Game
+UDR7: Spec Example 5.4. Flow Collection Indicators
+UGM3: Spec Example 2.27. Invoice
+V55R: Aliases in Block Sequence
+V9D5: Spec Example 8.19. Compact Block Mappings
+X38W: Aliases in Flow Objects
+YD5X: Spec Example 2.5. Sequence of Sequences
+Z9M4: Spec Example 6.22. Global Tag Prefix
+ZF4X: Spec Example 2.6. Mapping of Mappings
+ZH7C: Anchors in Mapping
diff --git a/libyaml/tests/run-test-suite/test/libyaml-emitter.t b/libyaml/tests/run-test-suite/test/libyaml-emitter.t
new file mode 100755
index 0000000..2b12b3a
--- /dev/null
+++ b/libyaml/tests/run-test-suite/test/libyaml-emitter.t
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ $# -gt 0 ]]; then
+  ids=("$@")
+else
+  ids=($(cut -d: -f1 < test/libyaml-emitter.list))
+fi
+
+# Some environments like on OS X, the shell resets the following vars, so we
+# work around it like so:
+export LD_LIBRARY_PATH="${MY_LD_LIBRARY_PATH:?}"
+export DYLD_LIBRARY_PATH="${MY_LD_LIBRARY_PATH:?}"
+
+count=0
+for id in "${ids[@]}"; do
+  dir="data/$id"
+  label="$id: $(< $dir/===)"
+  [[ -e "$dir/in.yaml" ]] || continue
+  want="$dir/out.yaml"
+  [[ -e $want ]] || want="$dir/in.yaml"
+  ./src/libyaml-emitter "$dir/test.event" > /tmp/test.out || {
+    (
+      cat "$dir/test.event"
+      cat "$want"
+    ) | sed 's/^/# /'
+  }
+  ok=true
+  output="$(${DIFF:-diff} -u $want /tmp/test.out)" || ok=false
+  if $ok; then
+    echo "ok $((++count)) $label"
+  else
+    echo "not ok $((++count)) $label"
+    echo "$output" | sed 's/^/# /'
+  fi
+done
+
+echo "1..$count"
diff --git a/libyaml/tests/run-test-suite/test/libyaml-parser.list b/libyaml/tests/run-test-suite/test/libyaml-parser.list
new file mode 100644
index 0000000..202cce4
--- /dev/null
+++ b/libyaml/tests/run-test-suite/test/libyaml-parser.list
@@ -0,0 +1,137 @@
+229Q: Spec Example 2.4. Sequence of Mappings
+2AUY: Tags in Block Sequence
+2XXW: Spec Example 2.25. Unordered Sets
+35KP: Tags for Root Objects
+3ALJ: Block Sequence in Block Sequence
+3GZX: Spec Example 7.1. Alias Nodes
+4CQQ: Spec Example 2.18. Multi-line Flow Scalars
+4GC6: Spec Example 7.7. Single Quoted Characters
+4UYU: Colon in Double Quoted String
+4ZYM: Spec Example 6.4. Line Prefixes
+54T7: Flow Mapping
+565N: Construct Binary
+57H4: Spec Example 8.22. Block Collection Nodes
+5BVJ: Spec Example 5.7. Block Scalar Indicators
+5C5M: Spec Example 7.15. Flow Mappings
+5GBF: Spec Example 6.5. Empty Lines
+5KJE: Spec Example 7.13. Flow Sequence
+5NYZ: Spec Example 6.9. Separated Comment
+5TYM: Spec Example 6.21. Local Tag Prefix
+5WE3: Spec Example 8.17. Explicit Block Mapping Entries
+65WH: Single Entry Block Sequence
+6CK3: Spec Example 6.26. Tag Shorthands
+6FWR: Block Scalar Keep
+6HB6: Spec Example 6.1. Indentation Spaces
+6JQW: Spec Example 2.13. In literals, newlines are preserved
+6JWB: Tags for Block Objects
+6VJK: Spec Example 2.15. Folded newlines are preserved for "more indented" and blank lines
+735Y: Spec Example 8.20. Block Node Types
+74H7: Tags in Implicit Mapping
+77H8: Spec Example 2.23. Various Explicit Tags
+7A4E: Spec Example 7.6. Double Quoted Lines
+7BUB: Spec Example 2.10. Node for “Sammy Sosa” appears twice in this document
+7FWL: Spec Example 6.24. Verbatim Tags
+7T8X: Spec Example 8.10. Folded Lines - 8.13. Final Empty Lines
+7W2P: Block Mapping with Missing Values
+87E4: Spec Example 7.8. Single Quoted Implicit Keys
+8G76: Spec Example 6.10. Comment Lines
+8MK2: Explicit Non-Specific Tag
+8QBE: Block Sequence in Block Mapping
+8UDB: Spec Example 7.14. Flow Sequence Entries
+93JH: Block Mappings in Block Sequence
+96L6: Spec Example 2.14. In the folded scalars, newlines become spaces
+98YD: Spec Example 5.5. Comment Indicator
+9FMG: Multi-level Mapping Indent
+9J7A: Simple Mapping Indent
+9SHH: Spec Example 5.8. Quoted Scalar Indicators
+9U5K: Spec Example 2.12. Compact Nested Mapping
+9WXW: Spec Example 6.18. Primary Tag Handle
+9YRD: Multiline Scalar at Top Level
+A6F9: Spec Example 8.4. Chomping Final Line Break
+A984: Multiline Scalar in Mapping
+AVM7: Empty Stream
+AZ63: Sequence With Same Indentation as Parent Mapping
+AZW3: Lookahead test cases
+C2DT: Spec Example 7.18. Flow Mapping Adjacent Values
+C4HZ: Spec Example 2.24. Global Tags
+CC74: Spec Example 6.20. Tag Handles
+CT4Q: Spec Example 7.20. Single Pair Explicit Entry
+CUP7: Spec Example 5.6. Node Property Indicators
+D88J: Flow Sequence in Block Mapping
+D9TU: Single Pair Block Mapping
+DFF7: Spec Example 7.16. Flow Mapping Entries
+DHP8: Flow Sequence
+DWX9: Spec Example 8.8. Literal Content
+E76Z: Aliases in Implicit Block Mapping
+EHF6: Tags for Flow Objects
+F2C7: Anchors and Tags
+F8F9: Spec Example 8.5. Chomping Trailing Lines
+FH7J: Tags on Empty Scalars
+FQ7F: Spec Example 2.1. Sequence of Scalars
+FUP4: Flow Sequence in Flow Sequence
+G4RS: Spec Example 2.17. Quoted Scalars
+G992: Spec Example 8.9. Folded Scalar
+GH63: Mixed Block Mapping (explicit to implicit)
+H2RW: Blank lines
+HMK4: Spec Example 2.16. Indentation determines scope
+HMQ5: Spec Example 6.23. Node Properties
+HS5T: Spec Example 7.12. Plain Lines
+J3BT: Spec Example 5.12. Tabs and Spaces
+J5UC: Multiple Pair Block Mapping
+J7PZ: Spec Example 2.26. Ordered Mappings
+J7VC: Empty Lines Between Mapping Elements
+J9HZ: Spec Example 2.9. Single Document with Two Comments
+JHB9: Spec Example 2.7. Two Documents in a Stream
+JQ4R: Spec Example 8.14. Block Sequence
+JS2J: Spec Example 6.29. Node Anchors
+JTV5: Block Mapping with Multiline Scalars
+K4SU: Multiple Entry Block Sequence
+K527: Spec Example 6.6. Line Folding
+K858: Spec Example 8.6. Empty Scalar Chomping
+KMK3: Block Submapping
+L94M: Tags in Explicit Mapping
+L9U5: Spec Example 7.11. Plain Implicit Keys
+LE5A: Spec Example 7.24. Flow Nodes
+LP6E: Whitespace After Scalars in Flow
+LQZ7: Spec Example 7.4. Double Quoted Implicit Keys
+M29M: Literal Block Scalar
+M5C3: Spec Example 8.21. Block Scalar Nodes
+M5DY: Spec Example 2.11. Mapping between Sequences
+M9B4: Spec Example 8.7. Literal Scalar
+MJS9: Spec Example 6.7. Block Folding
+MXS3: Flow Mapping in Block Sequence
+MYW6: Block Scalar Strip
+MZX3: Non-Specific Tags on Scalars
+NP9H: Spec Example 7.5. Double Quoted Line Breaks
+P2AD: Spec Example 8.1. Block Scalar Header
+P76L: Spec Example 6.19. Secondary Tag Handle
+P94K: Spec Example 6.11. Multi-Line Comments
+PBJ2: Spec Example 2.3. Mapping Scalars to Sequences
+PRH3: Spec Example 7.9. Single Quoted Lines
+PW8X: Anchors on Empty Scalars
+Q88A: Spec Example 7.23. Flow Content
+Q9WF: Spec Example 6.12. Separation Spaces
+QF4Y: Spec Example 7.19. Single Pair Flow Mappings
+RLU9: Sequence Indent
+RR7F: Mixed Block Mapping (implicit to explicit)
+RZT7: Spec Example 2.28. Log File
+S4JQ: Spec Example 6.28. Non-Specific Tags
+S4T7: Document with footer
+S9E8: Spec Example 5.3. Block Structure Indicators
+SBG9: Flow Sequence in Flow Mapping
+SYW4: Spec Example 2.2. Mapping Scalars to Scalars
+TE2A: Spec Example 8.16. Block Mappings
+TL85: Spec Example 6.8. Flow Folding
+TS54: Folded Block Scalar
+U3C3: Spec Example 6.16. “TAG” directive
+U9NS: Spec Example 2.8. Play by Play Feed from a Game
+UDR7: Spec Example 5.4. Flow Collection Indicators
+UGM3: Spec Example 2.27. Invoice
+V55R: Aliases in Block Sequence
+V9D5: Spec Example 8.19. Compact Block Mappings
+W42U: Spec Example 8.15. Block Sequence Entry Types
+X38W: Aliases in Flow Objects
+YD5X: Spec Example 2.5. Sequence of Sequences
+Z9M4: Spec Example 6.22. Global Tag Prefix
+ZF4X: Spec Example 2.6. Mapping of Mappings
+ZH7C: Anchors in Mapping
diff --git a/libyaml/tests/run-test-suite/test/libyaml-parser.t b/libyaml/tests/run-test-suite/test/libyaml-parser.t
new file mode 100755
index 0000000..1c3d0c4
--- /dev/null
+++ b/libyaml/tests/run-test-suite/test/libyaml-parser.t
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ $# -gt 0 ]]; then
+  ids=("$@")
+else
+  ids=($(cut -d: -f1 < test/libyaml-parser.list))
+fi
+
+count=0
+for id in "${ids[@]}"; do
+  dir="data/$id"
+  label="$id: $(< $dir/===)"
+  [[ -e "$dir/in.yaml" ]] || continue
+  ./src/libyaml-parser "$dir/in.yaml" > /tmp/test.out || {
+    (
+      cat "$dir/in.yaml"
+      cat "$dir/test.event"
+    ) | sed 's/^/# /'
+  }
+  ok=true
+  output="$(${DIFF:-diff} -u $dir/test.event /tmp/test.out)" || ok=false
+  if $ok; then
+    echo "ok $((++count)) $label"
+  else
+    echo "not ok $((++count)) $label"
+    echo "$output" | sed 's/^/# /'
+  fi
+done
+
+echo "1..$count"
diff --git a/libyaml/tests/run-tests.sh b/libyaml/tests/run-tests.sh
new file mode 100755
index 0000000..3336900
--- /dev/null
+++ b/libyaml/tests/run-tests.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+set -e
+
+main() {
+  clean
+
+  ./bootstrap
+  ./configure
+  make test-all
+
+  clean
+
+  cmake .
+  make
+  make test
+
+  clean
+}
+
+clean() {
+  git clean -d -x -f
+  rm -fr tests/run-test-suite/data
+}
+
+main "$@"
diff --git a/libyaml/tests/test-reader.c b/libyaml/tests/test-reader.c
new file mode 100644
index 0000000..eeff485
--- /dev/null
+++ b/libyaml/tests/test-reader.c
@@ -0,0 +1,354 @@
+#include <yaml.h>
+
+YAML_DECLARE(int)
+yaml_parser_update_buffer(yaml_parser_t *parser, size_t length);
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+/*
+ * Test cases are stolen from
+ * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+ */
+
+typedef struct {
+    char *title;
+    char *test;
+    int result;
+} test_case;
+
+test_case utf8_sequences[] = {
+    /* {"title", "test 1|test 2|...|test N!", (0 or 1)}, */
+
+    {"a simple test", "'test' is '\xd0\xbf\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb5\xd1\x80\xd0\xba\xd0\xb0' in Russian!", 1},
+    {"an empty line", "!", 1},
+
+    {"u-0 is a control character", "\x00!", 0},
+    {"u-80 is a control character", "\xc2\x80!", 0},
+    {"u-800 is valid", "\xe0\xa0\x80!", 1},
+    {"u-10000 is valid", "\xf0\x90\x80\x80!", 1},
+    {"5 bytes sequences are not allowed", "\xf8\x88\x80\x80\x80!", 0},
+    {"6 bytes sequences are not allowed", "\xfc\x84\x80\x80\x80\x80!", 0},
+
+    {"u-7f is a control character", "\x7f!", 0},
+    {"u-7FF is valid", "\xdf\xbf!", 1},
+    {"u-FFFF is a control character", "\xef\xbf\xbf!", 0},
+    {"u-1FFFFF is too large", "\xf7\xbf\xbf\xbf!", 0},
+    {"u-3FFFFFF is 5 bytes", "\xfb\xbf\xbf\xbf\xbf!", 0},
+    {"u-7FFFFFFF is 6 bytes", "\xfd\xbf\xbf\xbf\xbf\xbf!", 0},
+
+    {"u-D7FF", "\xed\x9f\xbf!", 1},
+    {"u-E000", "\xee\x80\x80!", 1},
+    {"u-FFFD", "\xef\xbf\xbd!", 1},
+    {"u-10FFFF", "\xf4\x8f\xbf\xbf!", 1},
+    {"u-110000", "\xf4\x90\x80\x80!", 0},
+
+    {"first continuation byte", "\x80!", 0},
+    {"last continuation byte", "\xbf!", 0},
+
+    {"2 continuation bytes", "\x80\xbf!", 0},
+    {"3 continuation bytes", "\x80\xbf\x80!", 0},
+    {"4 continuation bytes", "\x80\xbf\x80\xbf!", 0},
+    {"5 continuation bytes", "\x80\xbf\x80\xbf\x80!", 0},
+    {"6 continuation bytes", "\x80\xbf\x80\xbf\x80\xbf!", 0},
+    {"7 continuation bytes", "\x80\xbf\x80\xbf\x80\xbf\x80!", 0},
+
+    {"sequence of all 64 possible continuation bytes",
+     "\x80|\x81|\x82|\x83|\x84|\x85|\x86|\x87|\x88|\x89|\x8a|\x8b|\x8c|\x8d|\x8e|\x8f|"
+     "\x90|\x91|\x92|\x93|\x94|\x95|\x96|\x97|\x98|\x99|\x9a|\x9b|\x9c|\x9d|\x9e|\x9f|"
+     "\xa0|\xa1|\xa2|\xa3|\xa4|\xa5|\xa6|\xa7|\xa8|\xa9|\xaa|\xab|\xac|\xad|\xae|\xaf|"
+     "\xb0|\xb1|\xb2|\xb3|\xb4|\xb5|\xb6|\xb7|\xb8|\xb9|\xba|\xbb|\xbc|\xbd|\xbe|\xbf!", 0},
+    {"32 first bytes of 2-byte sequences {0xc0-0xdf}",
+     "\xc0 |\xc1 |\xc2 |\xc3 |\xc4 |\xc5 |\xc6 |\xc7 |\xc8 |\xc9 |\xca |\xcb |\xcc |\xcd |\xce |\xcf |"
+     "\xd0 |\xd1 |\xd2 |\xd3 |\xd4 |\xd5 |\xd6 |\xd7 |\xd8 |\xd9 |\xda |\xdb |\xdc |\xdd |\xde |\xdf !", 0},
+    {"16 first bytes of 3-byte sequences {0xe0-0xef}",
+     "\xe0 |\xe1 |\xe2 |\xe3 |\xe4 |\xe5 |\xe6 |\xe7 |\xe8 |\xe9 |\xea |\xeb |\xec |\xed |\xee |\xef !", 0},
+    {"8 first bytes of 4-byte sequences {0xf0-0xf7}", "\xf0 |\xf1 |\xf2 |\xf3 |\xf4 |\xf5 |\xf6 |\xf7 !", 0},
+    {"4 first bytes of 5-byte sequences {0xf8-0xfb}", "\xf8 |\xf9 |\xfa |\xfb !", 0},
+    {"2 first bytes of 6-byte sequences {0xfc-0xfd}", "\xfc |\xfd !", 0},
+
+    {"sequences with last byte missing {u-0}",
+     "\xc0|\xe0\x80|\xf0\x80\x80|\xf8\x80\x80\x80|\xfc\x80\x80\x80\x80!", 0},
+    {"sequences with last byte missing {u-...FF}",
+     "\xdf|\xef\xbf|\xf7\xbf\xbf|\xfb\xbf\xbf\xbf|\xfd\xbf\xbf\xbf\xbf!", 0},
+
+    {"impossible bytes", "\xfe|\xff|\xfe\xfe\xff\xff!", 0},
+
+    {"overlong sequences {u-2f}",
+     "\xc0\xaf|\xe0\x80\xaf|\xf0\x80\x80\xaf|\xf8\x80\x80\x80\xaf|\xfc\x80\x80\x80\x80\xaf!", 0},
+
+    {"maximum overlong sequences",
+     "\xc1\xbf|\xe0\x9f\xbf|\xf0\x8f\xbf\xbf|\xf8\x87\xbf\xbf\xbf|\xfc\x83\xbf\xbf\xbf\xbf!", 0},
+
+    {"overlong representation of the NUL character",
+     "\xc0\x80|\xe0\x80\x80|\xf0\x80\x80\x80|\xf8\x80\x80\x80\x80|\xfc\x80\x80\x80\x80\x80!", 0},
+
+    {"single UTF-16 surrogates",
+     "\xed\xa0\x80|\xed\xad\xbf|\xed\xae\x80|\xed\xaf\xbf|\xed\xb0\x80|\xed\xbe\x80|\xed\xbf\xbf!", 0},
+
+    {"paired UTF-16 surrogates",
+     "\xed\xa0\x80\xed\xb0\x80|\xed\xa0\x80\xed\xbf\xbf|\xed\xad\xbf\xed\xb0\x80|"
+     "\xed\xad\xbf\xed\xbf\xbf|\xed\xae\x80\xed\xb0\x80|\xed\xae\x80\xed\xbf\xbf|"
+     "\xed\xaf\xbf\xed\xb0\x80|\xed\xaf\xbf\xed\xbf\xbf!", 0},
+
+    {"other illegal code positions", "\xef\xbf\xbe|\xef\xbf\xbf!", 0},
+
+    {NULL, NULL, 0}
+};
+
+test_case boms[] = {
+
+    /* {"title", "test!", lenth}, */
+
+    {"no bom (utf-8)", "Hi is \xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!", 13},
+    {"bom (utf-8)", "\xef\xbb\xbfHi is \xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!", 13},
+    {"bom (utf-16-le)", "\xff\xfeH\x00i\x00 \x00i\x00s\x00 \x00\x1f\x04@\x04""8\x04""2\x04""5\x04""B\x04!", 13},
+    {"bom (utf-16-be)", "\xfe\xff\x00H\x00i\x00 \x00i\x00s\x00 \x04\x1f\x04@\x04""8\x04""2\x04""5\x04""B!", 13},
+    {NULL, NULL, 0}
+};
+
+char *bom_original = "Hi is \xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82";
+
+int check_utf8_sequences(void)
+{
+    yaml_parser_t parser;
+    int failed = 0;
+    int k;
+    printf("checking utf-8 sequences...\n");
+    for (k = 0; utf8_sequences[k].test; k++) {
+        char *title = utf8_sequences[k].title;
+        int check = utf8_sequences[k].result;
+        int result;
+        char *start = utf8_sequences[k].test;
+        char *end = start;
+        printf("\t%s:\n", title);
+        while(1) {
+            while (*end != '|' && *end != '!') end++;
+            yaml_parser_initialize(&parser);
+            yaml_parser_set_input_string(&parser, (unsigned char *)start, end-start);
+            result = yaml_parser_update_buffer(&parser, end-start);
+            if (result != check) {
+                printf("\t\t- ");
+                failed ++;
+            }
+            else {
+                printf("\t\t+ ");
+            }
+            if (!parser.error) {
+                printf("(no error)\n");
+            }
+            else if (parser.error == YAML_READER_ERROR) {
+                if (parser.problem_value != -1) {
+                    printf("(reader error: %s: #%X at %zu)\n",
+                            parser.problem, parser.problem_value, parser.problem_offset);
+                }
+                else {
+                    printf("(reader error: %s at %zu)\n",
+                            parser.problem, parser.problem_offset);
+                }
+            }
+            if (*end == '!') break;
+            start = ++end;
+            yaml_parser_delete(&parser);
+        };
+        printf("\n");
+    }
+    printf("checking utf-8 sequences: %d fail(s)\n", failed);
+    return failed;
+}
+
+int check_boms(void)
+{
+    yaml_parser_t parser;
+    int failed = 0;
+    int k;
+    printf("checking boms...\n");
+    for (k = 0; boms[k].test; k++) {
+        char *title = boms[k].title;
+        int check = boms[k].result;
+        int result;
+        char *start = boms[k].test;
+        char *end = start;
+        while (*end != '!') end++;
+        printf("\t%s: ", title);
+        yaml_parser_initialize(&parser);
+        yaml_parser_set_input_string(&parser, (unsigned char *)start, end-start);
+        result = yaml_parser_update_buffer(&parser, end-start);
+        if (!result) {
+            printf("- (reader error: %s at %zu)\n", parser.problem, parser.problem_offset);
+            failed++;
+        }
+        else {
+            if (parser.unread != check) {
+                printf("- (length=%zu while expected length=%d)\n", parser.unread, check);
+                failed++;
+            }
+            else if (memcmp(parser.buffer.start, bom_original, check) != 0) {
+                printf("- (value '%s' does not equal to the original value '%s')\n", parser.buffer.start, bom_original);
+                failed++;
+            }
+            else {
+                printf("+\n");
+            }
+        }
+        yaml_parser_delete(&parser);
+    }
+    printf("checking boms: %d fail(s)\n", failed);
+    return failed;
+}
+
+#define LONG    100000
+
+int check_long_utf8(void)
+{
+    yaml_parser_t parser;
+    int k = 0;
+    int j;
+    int failed = 0;
+    unsigned char ch0, ch1;
+    unsigned char *buffer = malloc(3+LONG*2);
+    assert(buffer);
+    printf("checking a long utf8 sequence...\n");
+    buffer[k++] = '\xef';
+    buffer[k++] = '\xbb';
+    buffer[k++] = '\xbf';
+    for (j = 0; j < LONG; j ++) {
+        if (j % 2) {
+            buffer[k++] = '\xd0';
+            buffer[k++] = '\x90';
+        }
+        else {
+            buffer[k++] = '\xd0';
+            buffer[k++] = '\xaf';
+        }
+    }
+    yaml_parser_initialize(&parser);
+    yaml_parser_set_input_string(&parser, buffer, 3+LONG*2);
+    for (k = 0; k < LONG; k++) {
+        if (!parser.unread) {
+            if (!yaml_parser_update_buffer(&parser, 1)) {
+                printf("\treader error: %s at %zu\n", parser.problem, parser.problem_offset);
+                failed = 1;
+                break;
+            }
+        }
+        if (!parser.unread) {
+            printf("\tnot enough characters at %d\n", k);
+            failed = 1;
+            break;
+        }
+        if (k % 2) {
+            ch0 = '\xd0';
+            ch1 = '\x90';
+        }
+        else {
+            ch0 = '\xd0';
+            ch1 = '\xaf';
+        }
+        if (parser.buffer.pointer[0] != ch0 || parser.buffer.pointer[1] != ch1) {
+            printf("\tincorrect UTF-8 sequence: %X %X instead of %X %X\n",
+                    (int)parser.buffer.pointer[0], (int)parser.buffer.pointer[1],
+                    (int)ch0, (int)ch1);
+            failed = 1;
+            break;
+        }
+        parser.buffer.pointer += 2;
+        parser.unread -= 1;
+    }
+    if (!failed) {
+        if (!yaml_parser_update_buffer(&parser, 1)) {
+            printf("\treader error: %s at %zu\n", parser.problem, parser.problem_offset);
+            failed = 1;
+        }
+        else if (parser.buffer.pointer[0] != '\0') {
+            printf("\texpected NUL, found %X (eof=%d, unread=%zu)\n", (int)parser.buffer.pointer[0], parser.eof, parser.unread);
+            failed = 1;
+        }
+    }
+    yaml_parser_delete(&parser);
+    free(buffer);
+    printf("checking a long utf8 sequence: %d fail(s)\n", failed);
+    return failed;
+}
+
+int check_long_utf16(void)
+{
+    yaml_parser_t parser;
+    int k = 0;
+    int j;
+    int failed = 0;
+    unsigned char ch0, ch1;
+    unsigned char *buffer = malloc(2+LONG*2);
+    assert(buffer);
+    printf("checking a long utf16 sequence...\n");
+    buffer[k++] = '\xff';
+    buffer[k++] = '\xfe';
+    for (j = 0; j < LONG; j ++) {
+        if (j % 2) {
+            buffer[k++] = '\x10';
+            buffer[k++] = '\x04';
+        }
+        else {
+            buffer[k++] = '/';
+            buffer[k++] = '\x04';
+        }
+    }
+    yaml_parser_initialize(&parser);
+    yaml_parser_set_input_string(&parser, buffer, 2+LONG*2);
+    for (k = 0; k < LONG; k++) {
+        if (!parser.unread) {
+            if (!yaml_parser_update_buffer(&parser, 1)) {
+                printf("\treader error: %s at %zu\n", parser.problem, parser.problem_offset);
+                failed = 1;
+                break;
+            }
+        }
+        if (!parser.unread) {
+            printf("\tnot enough characters at %d\n", k);
+            failed = 1;
+            break;
+        }
+        if (k % 2) {
+            ch0 = '\xd0';
+            ch1 = '\x90';
+        }
+        else {
+            ch0 = '\xd0';
+            ch1 = '\xaf';
+        }
+        if (parser.buffer.pointer[0] != ch0 || parser.buffer.pointer[1] != ch1) {
+            printf("\tincorrect UTF-8 sequence: %X %X instead of %X %X\n",
+                    (int)parser.buffer.pointer[0], (int)parser.buffer.pointer[1],
+                    (int)ch0, (int)ch1);
+            failed = 1;
+            break;
+        }
+        parser.buffer.pointer += 2;
+        parser.unread -= 1;
+    }
+    if (!failed) {
+        if (!yaml_parser_update_buffer(&parser, 1)) {
+            printf("\treader error: %s at %zu\n", parser.problem, parser.problem_offset);
+            failed = 1;
+        }
+        else if (parser.buffer.pointer[0] != '\0') {
+            printf("\texpected NUL, found %X (eof=%d, unread=%zu)\n", (int)parser.buffer.pointer[0], parser.eof, parser.unread);
+            failed = 1;
+        }
+    }
+    yaml_parser_delete(&parser);
+    free(buffer);
+    printf("checking a long utf16 sequence: %d fail(s)\n", failed);
+    return failed;
+}
+
+int
+main(void)
+{
+    return check_utf8_sequences() + check_boms() + check_long_utf8() + check_long_utf16();
+}
diff --git a/libyaml/tests/test-version.c b/libyaml/tests/test-version.c
new file mode 100644
index 0000000..69ae5bb
--- /dev/null
+++ b/libyaml/tests/test-version.c
@@ -0,0 +1,29 @@
+#include <yaml.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef NDEBUG
+#undef NDEBUG
+#endif
+#include <assert.h>
+
+int
+main(void)
+{
+    int major = -1;
+    int minor = -1;
+    int patch = -1;
+    char buf[64];
+
+    yaml_get_version(&major, &minor, &patch);
+    sprintf(buf, "%d.%d.%d", major, minor, patch);
+    assert(strcmp(buf, yaml_get_version_string()) == 0);
+
+    /* Print structure sizes. */
+    printf("sizeof(token) = %lu\n", sizeof(yaml_token_t));
+    printf("sizeof(event) = %lu\n", sizeof(yaml_event_t));
+    printf("sizeof(parser) = %lu\n", sizeof(yaml_parser_t));
+
+    return 0;
+}
diff --git a/libyaml/win32/Makefile.am b/libyaml/win32/Makefile.am
new file mode 100644
index 0000000..00cfe3b
--- /dev/null
+++ b/libyaml/win32/Makefile.am
@@ -0,0 +1,3 @@
+
+EXTRA_DIST = config.h
+
diff --git a/libyaml/win32/config.h b/libyaml/win32/config.h
new file mode 100644
index 0000000..9ca2669
--- /dev/null
+++ b/libyaml/win32/config.h
@@ -0,0 +1,4 @@
+#define YAML_VERSION_MAJOR 0
+#define YAML_VERSION_MINOR 1
+#define YAML_VERSION_PATCH 7
+#define YAML_VERSION_STRING "0.1.7"
diff --git a/libyaml/yaml-0.1.pc.in b/libyaml/yaml-0.1.pc.in
new file mode 100644
index 0000000..70c8008
--- /dev/null
+++ b/libyaml/yaml-0.1.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+libdir=@libdir@
+
+Name: LibYAML
+Description: Library to parse and emit YAML
+Version: @PACKAGE_VERSION@
+Cflags: -I${includedir}
+Libs: -L${libdir} -lyaml
diff --git a/main.c b/main.c
index 458f1a9..403363c 100644
--- a/main.c
+++ b/main.c
@@ -40,27 +40,32 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <yaml.h>
 
 #include "benchmark_aux.h"
+#include "common.h"
 
-#define STAT_AMOUNT 5
-#define TSFILE_NAME_SUFFIX			".ts"
-
-#define RING_SUCCESS	0
-#define RING_BADPARM	-1
-#define RING_NODATA		-2
+#define MAX_SCALAR	20
+static struct tee_ts_global *bench_ts_global;
 
 static const TEEC_UUID pta_benchmark_uuid = PTA_BENCHMARK_UUID;
-struct tee_ts_global *bench_ts_global;
-static bool is_running;
-
 static TEEC_SharedMemory ts_buf_shm = {
 		.flags = TEEC_MEM_INPUT | TEEC_MEM_OUTPUT
 };
-
 static TEEC_Context ctx;
 static TEEC_Session sess;
 
+static volatile sig_atomic_t is_running;
+static yaml_emitter_t emitter;
+
+
+void sigint_handler(int data)
+{
+	(void)data;
+
+	is_running = 0;
+}
+
 static void open_bench_pta(void)
 {
 	TEEC_Result res;
@@ -165,6 +170,155 @@
 	return 0;
 }
 
+static bool init_emitter(FILE *ts_file)
+{
+	yaml_event_t event;
+
+	if (!yaml_emitter_initialize(&emitter))
+		ERROR_RETURN_FALSE("Can't initialize YAML emitter");
+
+	yaml_emitter_set_canonical(&emitter, 0);
+	yaml_emitter_set_unicode(&emitter, 1);
+	yaml_emitter_set_output_file(&emitter, ts_file);
+
+	/* Stream start */
+	if (!yaml_stream_start_event_initialize(&event, YAML_UTF8_ENCODING))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML stream start event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML stream start event");
+
+	/* Document start */
+	if (!yaml_document_start_event_initialize(&event,
+							NULL, NULL, NULL, YAML_IMPLICIT))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML document start event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML doc start event");
+
+	/* Mapping start */
+	if (!yaml_mapping_start_event_initialize(&event,
+				NULL, NULL , YAML_IMPLICIT,
+				YAML_ANY_SEQUENCE_STYLE))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML mapping start event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete,
+				"Failed to emit YAML sequence mapping event");
+	/* Key timestamps */
+	yaml_scalar_event_initialize(&event, NULL, NULL,
+		(yaml_char_t *)"timestamps", -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_RETURN_FALSE("Failed to emit YAML scalar");
+
+	/* Sequence start */
+	if (!yaml_sequence_start_event_initialize(&event,
+				NULL, NULL , YAML_IMPLICIT,
+				YAML_ANY_SEQUENCE_STYLE))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML sequence start event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML sequence start event");
+
+	return true;
+emitter_delete:
+	yaml_emitter_delete(&emitter);
+	return false;
+}
+
+static void deinit_emitter()
+{
+	yaml_event_t event;
+
+	/* Sequence cmd */
+	if (!yaml_sequence_end_event_initialize(&event))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML sequence end event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML sequence end event");
+
+	/* Mapping end */
+	if (!yaml_mapping_end_event_initialize(&event))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML mapping end event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete,
+				"Failed to emit YAML mapping end event");
+
+	/* Document end */
+	if (!yaml_document_end_event_initialize(&event, 0))
+		ERROR_GOTO(emitter_delete,
+				"Failed to initialize YAML document end event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML doc end event");
+
+	/* Stream end */
+	if (!yaml_stream_end_event_initialize(&event))
+		ERROR_GOTO(emitter_delete,
+				"Error occured while initialising YAML stream end event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_GOTO(emitter_delete, "Failed to emit YAML stream end event");
+
+emitter_delete:
+	yaml_emitter_delete(&emitter);
+}
+
+static bool fill_map(char *var, char *value)
+{
+	yaml_event_t event;
+
+	yaml_scalar_event_initialize(&event, NULL, NULL,
+		(yaml_char_t *)var, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_RETURN_FALSE("Failed to emit YAML scalar");
+
+	yaml_scalar_event_initialize(&event, NULL, NULL,
+		(yaml_char_t *)value, -1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_RETURN_FALSE("Failed to emit YAML scalar");
+
+	return true;
+}
+
+static bool fill_timestamp(uint32_t core, uint64_t count, uint64_t addr,
+							const char *subsystem)
+{
+	yaml_event_t event;
+	char data[MAX_SCALAR];
+
+	/* Mapping start */
+	if (!yaml_mapping_start_event_initialize(&event,
+				NULL, NULL , YAML_IMPLICIT,
+				YAML_ANY_SEQUENCE_STYLE))
+		ERROR_RETURN_FALSE("Failed to initialize YAML mapping start event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_RETURN_FALSE("Failed to emit YAML mapping start event");
+
+	snprintf(data, MAX_SCALAR, "%" PRIu32, core);
+	fill_map("core", data);
+
+	snprintf(data, MAX_SCALAR, "%" PRIu64, count);
+	fill_map("counter", data);
+
+	snprintf(data, MAX_SCALAR, "0x%" PRIx64, addr);
+	fill_map("address", data);
+
+	snprintf(data, MAX_SCALAR, "%s", subsystem);
+	fill_map("component", data);
+
+	/* Mapping end */
+	if (!yaml_mapping_end_event_initialize(&event))
+		ERROR_RETURN_FALSE("Failed to initialize YAML mapping end event");
+	if (!yaml_emitter_emit(&emitter, &event))
+		ERROR_RETURN_FALSE("Failed to emit YAML mapping end event");
+
+	return true;
+}
+
+/*
+ * Consume all timestamps from per-cpu ringbuffers and put everything into
+ * the yaml file.
+ */
 static void *ts_consumer(void *arg)
 {
 	unsigned int i;
@@ -173,19 +327,21 @@
 	uint32_t cores;
 	struct tee_time_st ts_data;
 	FILE *ts_file;
-	char *tsfile_path;
+	char *tsfile_path = arg;
 
-	tsfile_path = arg;
 	if (!tsfile_path)
-		goto exit;
+		ERROR_GOTO(exit, "Wrong timestamp file path");
 
 	cores = get_cores();
 	if (!cores)
-		goto exit;
+		ERROR_GOTO(exit, "Can't receive amount of avalable cores");
 
 	ts_file = fopen(tsfile_path, "w");
 	if (!ts_file)
-		goto exit;
+		ERROR_GOTO(exit, "Can't open timestamp file");
+
+	if (!init_emitter(ts_file))
+		ERROR_GOTO(file_close, "Error occured in emitter initialization");
 
 	while (is_running) {
 		ts_received = false;
@@ -194,21 +350,30 @@
 						&ts_data);
 			if (!ret) {
 				ts_received = true;
-				fprintf(ts_file, "%u\t%lld\t0x%"
-						PRIx64 "\t%s\n",
+				DBG("Timestamp: core = %u; tick = %lld; pc = 0x%"
+						PRIx64 ";system = %s",
 						i, ts_data.cnt, ts_data.addr,
 						bench_str_src(ts_data.src));
+				if (!fill_timestamp(i, ts_data.cnt,
+						ts_data.addr, bench_str_src(ts_data.src)))
+					ERROR_GOTO(deinit_yaml, "Adding timestamp failed");
+
 			}
 		}
 
 		if (!ts_received) {
-			if (is_running)
+			if (is_running) {
+				DBG("yielding...");
 				sched_yield();
-			else
-				goto file_close;
+			} else {
+				ERROR_GOTO(deinit_yaml,
+					"No new data in the per-cpu ringbuffers, closing ts file");
+			}
 		}
 	}
 
+deinit_yaml:
+	deinit_emitter();
 file_close:
 	fclose(ts_file);
 exit:
@@ -240,15 +405,16 @@
 		}
 	}
 
-	printf("1. Opening Benchmark Static TA...\n");
+	signal(SIGINT, sigint_handler);
+
+	INFO("1. Opening Benchmark Static TA...");
 	open_bench_pta();
 
 	cores = get_cores();
 	if (!cores)
-		tee_errx("Receiving amount of active cores failed",
-					EXIT_FAILURE);
+		ERROR_EXIT("Receiving amount of active cores failed");
 
-	printf("2. Allocating per-core buffers, cores detected = %d\n",
+	INFO("2. Allocating per-core buffers, cores detected = %d",
 					cores);
 	register_bench_buf(cores);
 
@@ -258,32 +424,33 @@
 
 	alloc_argv(argc, argv, &testapp_argv);
 
-	printf("3. Starting origin host app %s ...\n", testapp_path);
+	INFO("3. Starting origin host app %s ...", testapp_path);
 
 	/* fork/exec here */
 	pid = fork();
 
 	if (pid == -1) {
-		tee_errx("fork() failed", EXIT_FAILURE);
+		DBG("fork() failed");
+		ERROR_EXIT("Starting origin host application failed.");
 	} else if (pid > 0) {
 		is_running = 1;
 
 		tsfile_path = malloc(strlen(testapp_path) +
 					strlen(TSFILE_NAME_SUFFIX) + 1);
 		if (!tsfile_path)
-			return 1;
+			ERROR_EXIT("Memory allocation failed for timestamp file path.");
 
 		tsfile_path[0] = '\0';
 		strcat(tsfile_path, testapp_path);
 		strcat(tsfile_path, TSFILE_NAME_SUFFIX);
 
-		printf("Dumping timestamps to %s ...\n", tsfile_path);
+		INFO("Dumping timestamps to %s ...", tsfile_path);
 		print_line();
 
 		if (pthread_create(&consumer_thread, NULL,
 				ts_consumer, tsfile_path)) {
-			fprintf(stderr, "Error creating ts consumer thread\n");
-			return 1;
+			DBG( "Error creating ts consumer thread");
+			ERROR_EXIT("Can't start process of reading timestamps");
 		}
 		/* wait for child app exits */
 		waitpid(pid, &status, 0);
@@ -291,16 +458,17 @@
 
 		/* wait for our consumer thread terminate */
 		if (pthread_join(consumer_thread, NULL)) {
-			fprintf(stderr, "Error joining thread\n");
-			return 2;
+			DBG("Error joining thread");
+			ERROR_EXIT("Something went wrong while consuming timestamps");
 		}
 	}
 	else {
 		execvp(testapp_path, testapp_argv);
-		tee_errx("execve() failed", EXIT_FAILURE);
+		DBG("execve() failed");
+		ERROR_EXIT("Starting origin host application failed");
 	}
 
-	printf("4. Done benchmark\n");
+	INFO("4. Done benchmark");
 
 	dealloc_argv(argc-1, testapp_argv);
 	unregister_bench();
