Add notice file saying the branch was renamed
diff --git a/.appveyor.yml b/.appveyor.yml
deleted file mode 100644
index eb70441..0000000
--- a/.appveyor.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-version: 0.5.4-build-{build}
-pull_requests:
-  do_not_increment_build_number: true
-image:
-- Visual Studio 2015
-- Visual Studio 2017
-- Visual Studio 2019
-install:
-- cmd: >-
-    set tests=1
-
-    if /i "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" (call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86) & (set QTDIR=C:\Qt\5.9\msvc2015)
-
-    if /i "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" (call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64) & (set QTDIR=C:\Qt\5.12\msvc2017_64)
-
-    if /i "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2019" (call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64) & (set QTDIR=C:\Qt\5.15\msvc2019_64) & set CFLAGS=/arch:AVX2
-
-    set path=%PATH%;%QTDIR%\bin
-build_script:
-- cmd: >-
-    nmake -f Makefile.nmake -nologo CFLAGS="%CFLAGS% -W3 -Os -MDd"
-
-    cd tests
-
-    if /i "%tests%"=="1" qmake CONFIG-=release CONFIG+=debug
-
-    if /i "%tests%"=="1" nmake -nologo -s
-test_script:
-- cmd: >-
-    if /i "%tests%"=="1" nmake -s -nologo TESTARGS=-silent check
-
-    if /i "%tests%"=="0" echo Tests skipped.
-artifacts:
-- path: lib\tinycbor.lib
-deploy: off
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 76ed256..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1,4 +0,0 @@
-.tag                    export-subst
-.gitignore              export-ignore
-.gitattributes          export-ignore
-.appveyor.yml           text
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 3272de3..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,81 +0,0 @@
-# Frequent generated files
-callgrind.out.*
-pcviewer.cfg
-*~
-*.a
-*.la
-*.core
-*.d
-*.dylib
-*.moc
-*.o
-*.obj
-*.orig
-*.swp
-*.rej
-*.so
-*.so.*
-*.pbxuser
-*.mode1
-*.mode1v3
-*_pch.h.cpp
-*_resource.rc
-.#*
-*.*#
-core
-.qmake.cache
-.qmake.stash
-.qmake.vars
-.device.vars
-tags
-.DS_Store
-*.debug
-Makefile*
-*.prl
-*.app
-*.pro.user*
-*.qmlproject.user*
-*.gcov
-*.gcda
-*.gcno
-*.flc
-.*.swp
-tinycbor.pc
-
-# Visual Studio generated files
-*.ib_pdb_index
-*.idb
-*.ilk
-*.pdb
-*.sln
-*.suo
-*.vcproj
-*vcproj.*.*.user
-*.ncb
-*.vcxproj
-*.vcxproj.filters
-*.vcxproj.user
-*.exe.embed.manifest
-*.exe_manifest.rc
-*.exe_manifest.res
-
-# MinGW generated files
-*.Debug
-*.Release
-
-# INTEGRITY generated files
-*.gpj
-*.int
-*.ael
-*.dla
-*.dnm
-*.dep
-*.map
-
-bin
-doc
-lib
-src/cjson
-src/doxygen.log
-!/Makefile
-.config
diff --git a/.tag b/.tag
deleted file mode 100644
index 6828f88..0000000
--- a/.tag
+++ /dev/null
@@ -1 +0,0 @@
-$Format:%H$
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a935ac9..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,92 +0,0 @@
-env:
-  - BUILD_DOCS=false
-jobs:
-  include:
-    - # only build docs on master
-      if: branch = master
-      env: BUILD_DOCS=true
-
-language: cpp
-matrix:
-  include:
-    - os: linux
-      dist: xenial
-      addons:
-        apt:
-          sources:
-            - sourceline: 'ppa:beineri/opt-qt-5.12.1-xenial'
-          packages:
-            - qt512base valgrind
-            - doxygen
-      env:
-        - QMAKESPEC=linux-g++
-        - EVAL="CC=gcc && CXX=g++"
-        - CFLAGS="-Os"
-        - LDFLAGS="-Wl,--no-undefined -lm"
-        - QMAKEFLAGS="-config release"
-        - QT_NO_CPU_FEATURE=rdrnd
-    - os: linux
-      dist: xenial
-      addons:
-        apt:
-          sources:
-            - sourceline: 'ppa:beineri/opt-qt-5.12.1-xenial'
-          packages:
-            - qt512base
-      env:
-        - QMAKESPEC=linux-clang
-        - EVAL="CC=clang && CXX=clang++"
-        - CFLAGS="-Oz"
-        - LDFLAGS="-Wl,--no-undefined -lm"
-        - QMAKEFLAGS="-config release"
-        - MAKEFLAGS=-s
-        - TESTARGS=-silent
-    - os: linux
-      dist: xenial
-      env:
-        - QMAKESPEC=linux-gcc-freestanding
-        - EVAL="CXX=false"
-        - CFLAGS="-ffreestanding -Os"
-        - LDFLAGS="-Wl,--no-undefined -lm"
-    - os: linux
-      dist: xenial
-      env:
-        - QMAKESPEC=linux-gcc-no-math
-        - EVAL="CXX=false && touch src/math.h src/float.h"
-        - CFLAGS="-ffreestanding -DCBOR_NO_FLOATING_POINT -Os"
-        - LDFLAGS="-Wl,--no-undefined"
-        - LDLIBS=""
-    - os: osx
-      env:
-        - QMAKESPEC=macx-clang
-        - CFLAGS="-Oz"
-        - QMAKEFLAGS="-config debug"
-        - MAKEFLAGS=-s
-        - TESTARGS=-silent
-        - PATH=/usr/local/opt/qt5/bin:$PATH
-install:
-  - if [ "${TRAVIS_OS_NAME}" != "linux" ]; then
-        brew update;
-        brew install qt5;
-    fi
-script:
-  - PATH=`echo /opt/qt*/bin`:$PATH
-  - eval "$EVAL"
-  - make -s -f Makefile.configure configure | tee .config
-  - make -k
-        CFLAGS="$CFLAGS -march=native -g1 -Wall -Wextra -Werror"
-        CPPFLAGS="-DNDEBUG"
-        lib/libtinycbor.a
-  - size lib/libtinycbor.a | tee sizes
-  - make -s clean
-  - make -k
-        CFLAGS="$CFLAGS -O0 -g"
-        LDFLAGS="$LDFLAGS" ${LDLIBS+LDLIBS="$LDLIBS"}
-  - grep -q freestanding-pass .config || make
-        QMAKEFLAGS="$QMAKEFLAGS QMAKE_CXX=$CXX"
-        tests/Makefile
-  - grep -q freestanding-pass .config ||
-        (cd tests && make TESTARGS=-silent check -k
-        TESTRUNNER=`which valgrind 2>/dev/null`)
-  - make -s clean
-  - ! [ $BUILD_DOCS ] || ./scripts/update-docs.sh
diff --git a/Doxyfile b/Doxyfile
deleted file mode 100644
index a7263c2..0000000
--- a/Doxyfile
+++ /dev/null
@@ -1,49 +0,0 @@
-PROJECT_NAME           = "TinyCBOR $(VERSION) API"
-OUTPUT_DIRECTORY       = ../doc
-ABBREVIATE_BRIEF       =
-SHORT_NAMES            = YES
-JAVADOC_AUTOBRIEF      = YES
-QT_AUTOBRIEF           = YES
-TAB_SIZE               = 8
-ALIASES                = "value=\arg \c"
-OPTIMIZE_OUTPUT_FOR_C  = YES
-EXTRACT_STATIC         = YES
-EXTRACT_LOCAL_CLASSES  = NO
-HIDE_UNDOC_MEMBERS     = YES
-HIDE_UNDOC_CLASSES     = YES
-GENERATE_TODOLIST      = NO
-GENERATE_TESTLIST      = NO
-GENERATE_BUGLIST       = NO
-GENERATE_DEPRECATEDLIST= NO
-SHOW_USED_FILES        = NO
-WARN_IF_UNDOCUMENTED   = NO
-WARN_LOGFILE           = doxygen.log
-INPUT                  = .
-FILE_PATTERNS          = *.h \
-                         *.c \
-                         *.dox
-EXCLUDE_PATTERNS       = *_p.h
-STRIP_CODE_COMMENTS    = NO
-REFERENCED_BY_RELATION = YES
-IGNORE_PREFIX          = cbor_ \
-                         Cbor
-HTML_TIMESTAMP         = NO
-GENERATE_HTMLHELP      = YES
-GENERATE_CHI           = YES
-BINARY_TOC             = YES
-TOC_EXPAND             = YES
-MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
-SEARCHENGINE           = NO
-GENERATE_LATEX         = NO
-COMPACT_LATEX          = YES
-MACRO_EXPANSION        = YES
-PREDEFINED             = DOXYGEN \
-                         CBOR_INLINE_API=
-CLASS_DIAGRAMS         = NO
-CLASS_GRAPH            = NO
-COLLABORATION_GRAPH    = NO
-GROUP_GRAPHS           = NO
-INCLUDE_GRAPH          = NO
-INCLUDED_BY_GRAPH      = NO
-GRAPHICAL_HIERARCHY    = NO
-DIRECTORY_GRAPH        = NO
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 4aad977..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 Intel Corporation
-
-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/Makefile b/Makefile
deleted file mode 100644
index f3ff00b..0000000
--- a/Makefile
+++ /dev/null
@@ -1,245 +0,0 @@
-# Variables:
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-libdir = $(exec_prefix)/lib
-includedir = $(prefix)/include
-pkgconfigdir = $(libdir)/pkgconfig
-
-CFLAGS = -Wall -Wextra
-LDFLAGS_GCSECTIONS = -Wl,--gc-sections
-LDFLAGS += $(if $(gc_sections-pass),$(LDFLAGS_GCSECTIONS))
-LDLIBS = -lm
-
-GIT_ARCHIVE = git archive --prefix="$(PACKAGE)/" -9
-INSTALL = install
-INSTALL_DATA = $(INSTALL) -m 644
-INSTALL_PROGRAM = $(INSTALL) -m 755
-QMAKE = qmake
-MKDIR = mkdir -p
-RMDIR = rmdir
-SED = sed
-
-# Our sources
-TINYCBOR_HEADERS = src/cbor.h src/cborjson.h src/tinycbor-version.h
-TINYCBOR_FREESTANDING_SOURCES = \
-	src/cborerrorstrings.c \
-	src/cborencoder.c \
-	src/cborencoder_close_container_checked.c \
-	src/cborparser.c \
-	src/cborpretty.c \
-#
-CBORDUMP_SOURCES = tools/cbordump/cbordump.c
-
-BUILD_SHARED = $(shell file -L /bin/sh 2>/dev/null | grep -q ELF && echo 1)
-BUILD_STATIC = 1
-
-ifneq ($(BUILD_STATIC),1)
-ifneq ($(BUILD_SHARED),1)
-  $(error error: BUILD_STATIC and BUILD_SHARED can not be both disabled)
-endif
-endif
-
-INSTALL_TARGETS += $(bindir)/cbordump
-ifeq ($(BUILD_SHARED),1)
-BINLIBRARY=lib/libtinycbor.so
-INSTALL_TARGETS += $(libdir)/libtinycbor.so.$(VERSION)
-endif
-ifeq ($(BUILD_STATIC),1)
-BINLIBRARY=lib/libtinycbor.a
-INSTALL_TARGETS += $(libdir)/libtinycbor.a
-endif
-INSTALL_TARGETS += $(pkgconfigdir)/tinycbor.pc
-INSTALL_TARGETS += $(TINYCBOR_HEADERS:src/%=$(includedir)/tinycbor/%)
-
-# setup VPATH
-MAKEFILE := $(lastword $(MAKEFILE_LIST))
-SRCDIR := $(dir $(MAKEFILE))
-VPATH = $(SRCDIR):$(SRCDIR)/src
-
-# Our version
-GIT_DIR := $(strip $(shell git -C $(SRCDIR). rev-parse --git-dir 2> /dev/null))
-VERSION = $(shell cat $(SRCDIR)VERSION)
-SOVERSION = $(shell cut -f1-2 -d. $(SRCDIR)VERSION)
-PACKAGE = tinycbor-$(VERSION)
-
-# Check that QMAKE is Qt 5
-ifeq ($(origin QMAKE),file)
-  check_qmake = $(strip $(shell $(1) -query QT_VERSION 2>/dev/null | cut -b1))
-  ifneq ($(call check_qmake,$(QMAKE)),5)
-    QMAKE := qmake -qt5
-    ifneq ($(call check_qmake,$(QMAKE)),5)
-      QMAKE := qmake-qt5
-      ifneq ($(call check_qmake,$(QMAKE)),5)
-        QMAKE := @echo >&2 $(MAKEFILE): Cannot find a Qt 5 qmake; false
-      endif
-    endif
-  endif
-endif
-
--include .config
-
-ifeq ($(wildcard .config),)
-    $(info .config file not yet created)
-endif
-
-ifeq ($(freestanding-pass),1)
-TINYCBOR_SOURCES = $(TINYCBOR_FREESTANDING_SOURCES)
-else
-TINYCBOR_SOURCES = \
-	$(TINYCBOR_FREESTANDING_SOURCES) \
-	src/cborparser_dup_string.c \
-	src/cborpretty_stdio.c \
-	src/cbortojson.c \
-	src/cborvalidation.c \
-#
-# if open_memstream is unavailable on the system, try to implement our own
-# version using funopen or fopencookie
-ifeq ($(open_memstream-pass),)
-  ifeq ($(funopen-pass)$(fopencookie-pass),)
-    CFLAGS += -DWITHOUT_OPEN_MEMSTREAM
-    ifeq ($(wildcard .config),.config)
-        $(warning warning: funopen and fopencookie unavailable, open_memstream can not be implemented and conversion to JSON will not work properly!)
-    endif
-  else
-    TINYCBOR_SOURCES += src/open_memstream.c
-  endif
-endif
-endif
-
-# json2cbor depends on an external library (cjson)
-ifneq ($(cjson-pass)$(system-cjson-pass),)
-  JSON2CBOR_SOURCES = tools/json2cbor/json2cbor.c
-  INSTALL_TARGETS += $(bindir)/json2cbor
-  ifeq ($(system-cjson-pass),1)
-    LDFLAGS_CJSON = -lcjson
-  else
-    JSON2CBOR_SOURCES += src/cjson/cJSON.c
-    json2cbor_CCFLAGS = -I$(SRCDIR)src/cjson
-  endif
-endif
-
-# Rules
-all: .config \
-	$(if $(subst 0,,$(BUILD_STATIC)),lib/libtinycbor.a) \
-	$(if $(subst 0,,$(BUILD_SHARED)),lib/libtinycbor.so) \
-	$(if $(freestanding-pass),,bin/cbordump) \
-	tinycbor.pc
-all: $(if $(JSON2CBOR_SOURCES),bin/json2cbor)
-check: tests/Makefile | $(BINLIBRARY)
-	$(MAKE) -C tests check
-silentcheck: | $(BINLIBRARY)
-	TESTARGS=-silent $(MAKE) -f $(MAKEFILE) -s check
-configure: .config
-.config: Makefile.configure
-	$(MAKE) -f $(SRCDIR)Makefile.configure OUT='>&9' configure 9> $@
-
-lib/libtinycbor-freestanding.a: $(TINYCBOR_FREESTANDING_SOURCES:.c=.o)
-	@$(MKDIR) -p lib
-	$(AR) cqs $@ $^
-
-lib/libtinycbor.a: $(TINYCBOR_SOURCES:.c=.o)
-	@$(MKDIR) -p lib
-	$(AR) cqs $@ $^
-
-lib/libtinycbor.so: $(TINYCBOR_SOURCES:.c=.pic.o)
-	@$(MKDIR) -p lib
-	$(CC) -shared -Wl,-soname,libtinycbor.so.$(SOVERSION) -o lib/libtinycbor.so.$(VERSION) $(LDFLAGS) $^ $(LDLIBS)
-	cd lib ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so ; ln -sf libtinycbor.so.$(VERSION) libtinycbor.so.$(SOVERSION)
-
-bin/cbordump: $(CBORDUMP_SOURCES:.c=.o) $(BINLIBRARY)
-	@$(MKDIR) -p bin
-	$(CC) -o $@ $(LDFLAGS) $^ $(LDLIBS)
-
-bin/json2cbor: $(JSON2CBOR_SOURCES:.c=.o) $(BINLIBRARY)
-	@$(MKDIR) -p bin
-	$(CC) -o $@ $(LDFLAGS) $^ $(LDFLAGS_CJSON) $(LDLIBS)
-
-tinycbor.pc: tinycbor.pc.in
-	$(SED) > $@ < $< \
-		-e 's,@prefix@,$(prefix),' \
-		-e 's,@exec_prefix@,$(exec_prefix),' \
-		-e 's,@libdir@,$(libdir),' \
-		-e 's,@includedir@,$(includedir),' \
-		-e 's,@version@,$(VERSION),'
-
-tests/Makefile: tests/tests.pro
-	$(QMAKE) $(QMAKEFLAGS) -o $@ $<
-
-$(PACKAGE).tar.gz: | .git
-	GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=tar.gz -o "$(PACKAGE).tar.gz" HEAD
-$(PACKAGE).zip: | .git
-	GIT_DIR=$(SRCDIR).git $(GIT_ARCHIVE) --format=zip -o "$(PACKAGE).zip" HEAD
-
-$(DESTDIR)$(libdir)/%: lib/%
-	$(INSTALL) -d $(@D)
-	$(INSTALL_DATA) $< $@
-$(DESTDIR)$(bindir)/%: bin/%
-	$(INSTALL) -d $(@D)
-	$(INSTALL_PROGRAM) $< $@
-$(DESTDIR)$(pkgconfigdir)/%: %
-	$(INSTALL) -d $(@D)
-	$(INSTALL_DATA) $< $@
-$(DESTDIR)$(includedir)/tinycbor/%: src/%
-	$(INSTALL) -d $(@D)
-	$(INSTALL_DATA) $< $@
-
-install-strip:
-	$(MAKE) -f $(MAKEFILE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
-
-install: $(INSTALL_TARGETS:%=$(DESTDIR)%)
-ifeq ($(BUILD_SHARED),1)
-	ln -sf libtinycbor.so.$(VERSION) $(DESTDIR)$(libdir)/libtinycbor.so
-	ln -sf libtinycbor.so.$(VERSION) $(DESTDIR)$(libdir)/libtinycbor.so.$(SOVERSION)
-endif
-
-uninstall:
-	$(RM) $(INSTALL_TARGETS:%=$(DESTDIR)%)
-	$(RM) $(DESTDIR)$(libdir)/libtinycbor.so
-	$(RM) $(DESTDIR)$(libdir)/libtinycbor.so.$(SOVERSION)
-
-mostlyclean:
-	$(RM) $(TINYCBOR_SOURCES:.c=.o)
-	$(RM) $(TINYCBOR_SOURCES:.c=.pic.o)
-	$(RM) $(CBORDUMP_SOURCES:.c=.o)
-
-clean: mostlyclean
-	$(RM) bin/cbordump
-	$(RM) bin/json2cbor
-	$(RM) lib/libtinycbor.a
-	$(RM) lib/libtinycbor-freestanding.a
-	$(RM) tinycbor.pc
-	$(RM) lib/libtinycbor.so*
-	test -e tests/Makefile && $(MAKE) -C tests clean || :
-
-distclean: clean
-	test -e tests/Makefile && $(MAKE) -C tests distclean || :
-
-docs:
-	cd $(SRCDIR)src && VERSION=$(VERSION) doxygen $(SRCDIR)/../Doxyfile
-
-dist: $(PACKAGE).tar.gz $(PACKAGE).zip
-distcheck: .git
-	-$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
-	GIT_DIR=$(SRCDIR).git git archive --prefix=tinycbor-distcheck/ --format=tar HEAD | tar -xf - -C $${TMPDIR-/tmp}
-	cd $${TMPDIR-/tmp}/tinycbor-distcheck && $(MAKE) silentcheck
-	$(RM) -r $${TMPDIR-/tmp}/tinycbor-distcheck
-
-tag: distcheck
-	@cd $(SRCDIR). && perl scripts/maketag.pl
-
-.PHONY: all check silentcheck configure install uninstall
-.PHONY: mostlyclean clean distclean
-.PHONY: docs dist distcheck release
-.SECONDARY:
-
-cflags := $(CPPFLAGS) -I$(SRCDIR)src
-cflags += -std=gnu99 $(CFLAGS)
-%.o: %.c
-	@test -d $(@D) || $(MKDIR) $(@D)
-	$(CC) $(cflags) $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
-%.pic.o: %.c
-	@test -d $(@D) || $(MKDIR) $(@D)
-	$(CC) $(cflags) -fPIC $($(basename $(notdir $@))_CCFLAGS) -c -o $@ $<
-
--include src/*.d
diff --git a/Makefile.configure b/Makefile.configure
deleted file mode 100644
index c2f51ee..0000000
--- a/Makefile.configure
+++ /dev/null
@@ -1,35 +0,0 @@
-ALLTESTS = open_memstream funopen fopencookie gc_sections \
-	   system-cjson cjson freestanding
-MAKEFILE := $(lastword $(MAKEFILE_LIST))
-OUT :=
-
-PROGRAM-open_memstream = extern int open_memstream(); int main() { return open_memstream(); }
-PROGRAM-funopen = extern int funopen(); int main() { return funopen(); }
-PROGRAM-fopencookie = extern int fopencookie(); int main() { return fopencookie(); }
-PROGRAM-gc_sections = int main() {}
-CCFLAGS-gc_sections = -Wl,--gc-sections
-PROGRAM-freestanding  = \#if !defined(__STDC_HOSTED__) || __STDC_HOSTED__-0 == 1\n
-PROGRAM-freestanding += \#error Hosted implementation\n
-PROGRAM-freestanding += \#endif\n
-PROGRAM-freestanding += int main() {}
-CCFLAGS-freestanding = $(CFLAGS)
-
-PROGRAM-cjson  = \#include <stdlib.h>\n
-PROGRAM-cjson += \#include <cjson/cJSON.h>\n
-PROGRAM-cjson += int main() { return cJSON_False; }
-CCFLAGS-cjson = -I$(dir $(MAKEFILE))src
-PROGRAM-system-cjson = $(PROGRAM-cjson)
-CCFLAGS-system-cjson = -lcjson
-
-sink:
-	@echo >&2 Please run from the top-level Makefile.
-
-configure: $(foreach it,$(ALLTESTS),check-$(it))
-
-check-%:
-	@echo $(subst check-,,$@)-tested := 1 $(OUT)
-	$(if $(V),,@)if printf "$($(subst check-,PROGRAM-,$@))" | \
-	    $(CC) -xc $($(subst check-,CCFLAGS-,$@)) -o /dev/null - $(if $(V),,>/dev/null 2>&1); \
-	then \
-	    echo $(subst check-,,$@)-pass := 1 $(OUT); \
-	fi
diff --git a/Makefile.nmake b/Makefile.nmake
deleted file mode 100644
index 04b58ab..0000000
--- a/Makefile.nmake
+++ /dev/null
@@ -1,47 +0,0 @@
-CFLAGS = -W3
-
-TINYCBOR_HEADERS = src\cbor.h src\cborjson.h
-TINYCBOR_SOURCES = \
-	src\cborerrorstrings.c \
-	src\cborencoder.c \
-	src\cborencoder_close_container_checked.c \
-	src\cborparser.c \
-	src\cborparser_dup_string.c \
-	src\cborpretty.c \
-	src\cborpretty_stdio.c \
-	src\cborvalidation.c
-TINYCBOR_OBJS = \
-	src\cborerrorstrings.obj \
-	src\cborencoder.obj \
-	src\cborencoder_close_container_checked.obj \
-	src\cborparser.obj \
-	src\cborparser_dup_string.obj \
-	src\cborpretty.obj \
-	src\cborpretty_stdio.obj \
-	src\cborvalidation.obj
-
-all: lib\tinycbor.lib
-check: tests\Makefile lib\tinycbor.lib
-	cd tests & $(MAKE) check
-silentcheck:
-	cd tests & set TESTARGS=-silent & $(MAKE) -s check
-tests\Makefile: tests\tests.pro
-	qmake -o $@ $**
-
-lib\tinycbor.lib: $(TINYCBOR_OBJS)
-	-if not exist lib\NUL md lib
-	lib -nologo /out:$@ $**
-
-mostlyclean:
-	-del $(TINYCBOR_OBJS)
-clean: mostlyclean
-	-del lib\tinycbor.lib
-	if exist tests\Makefile (cd tests & $(MAKE) clean)
-distclean: clean
-	if exist tests\Makefile (cd tests & $(MAKE) distclean)
-tag:
-	@perl maketag.pl
-
-{src\}.c{src\}.obj:
-	$(CC) -nologo $(CFLAGS) -Isrc -c -Fo$@ $<
-
diff --git a/README b/README
deleted file mode 100644
index 167efa0..0000000
--- a/README
+++ /dev/null
@@ -1,13 +0,0 @@
-Concise Binary Object Representation (CBOR) Library
----------------------------------------------------
-
-To build TinyCBOR:
-
-  make
-
-If you want to change the compiler or pass extra compiler flags:
-
-  make CC=clang CFLAGS="-m32 -Oz" LDFLAGS="-m32"
-
-Documentation: https://intel.github.io/tinycbor/current/
-
diff --git a/TODO b/TODO
deleted file mode 100644
index e9103ee..0000000
--- a/TODO
+++ /dev/null
@@ -1,25 +0,0 @@
-==== To Do list for libcbor ====
-=== General ===
-* API review
-* Benchmark
-* Write examples
-** Simple decoder
-** Decoder to JSON
-** Windowed encoding/decoding (limited memory)
-
-=== Encoder ===
-* Write API docs
-* Add API for creating indeterminate-length arrays and maps
-* Add API for creating indeterminate-length strings
-* Add API for relaxing doubles to floats and to integers
-* Add length-checking of the sub-containers (#ifndef CBOR_ENCODER_NO_USER_CHECK)
-* Decide how to indicate number of bytes needed
-** Suggestion: return negative number from the functions
-
-=== Decoder ===
-* Write functions not yet implemented
-* Add API for stream-decoding strings
-* Add API for checking known tags and simple types
-* (unlikely) Add API for checking the pairing of a tag and the tagged type
-* Write tests for error conditions
-* Fuzzy-test the decoder
diff --git a/VERSION b/VERSION
deleted file mode 100644
index 7d85683..0000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-0.5.4
diff --git a/examples/examples.pro b/examples/examples.pro
deleted file mode 100644
index 22071ac..0000000
--- a/examples/examples.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = simplereader.pro
diff --git a/examples/simplereader.c b/examples/simplereader.c
deleted file mode 100644
index 0612ba4..0000000
--- a/examples/simplereader.c
+++ /dev/null
@@ -1,185 +0,0 @@
-#include "../src/cbor.h"
-
-#include <sys/stat.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static uint8_t *readfile(const char *fname, size_t *size)
-{
-    struct stat st;
-    FILE *f = fopen(fname, "rb");
-    if (!f)
-        return NULL;
-    if (fstat(fileno(f), &st) == -1)
-        return NULL;
-    uint8_t *buf = malloc(st.st_size);
-    if (buf == NULL)
-        return NULL;
-    *size = fread(buf, st.st_size, 1, f) == 1 ? st.st_size : 0;
-    fclose(f);
-    return buf;
-}
-
-static void indent(int nestingLevel)
-{
-    while (nestingLevel--)
-        printf("  ");
-}
-
-static void dumpbytes(const uint8_t *buf, size_t len)
-{
-    printf("\"");
-    while (len--)
-        printf("\\x%02X", *buf++);
-    printf("\"");
-}
-
-static CborError dumprecursive(CborValue *it, int nestingLevel)
-{
-    while (!cbor_value_at_end(it)) {
-        CborError err;
-        CborType type = cbor_value_get_type(it);
-
-        indent(nestingLevel);
-        switch (type) {
-        case CborArrayType:
-        case CborMapType: {
-            // recursive type
-            CborValue recursed;
-            assert(cbor_value_is_container(it));
-            puts(type == CborArrayType ? "Array[" : "Map[");
-            err = cbor_value_enter_container(it, &recursed);
-            if (err)
-                return err;       // parse error
-            err = dumprecursive(&recursed, nestingLevel + 1);
-            if (err)
-                return err;       // parse error
-            err = cbor_value_leave_container(it, &recursed);
-            if (err)
-                return err;       // parse error
-            indent(nestingLevel);
-            puts("]");
-            continue;
-        }
-
-        case CborIntegerType: {
-            int64_t val;
-            cbor_value_get_int64(it, &val);     // can't fail
-            printf("%lld\n", (long long)val);
-            break;
-        }
-
-        case CborByteStringType: {
-            uint8_t *buf;
-            size_t n;
-            err = cbor_value_dup_byte_string(it, &buf, &n, it);
-            if (err)
-                return err;     // parse error
-            dumpbytes(buf, n);
-            puts("");
-            free(buf);
-            continue;
-        }
-
-        case CborTextStringType: {
-            char *buf;
-            size_t n;
-            err = cbor_value_dup_text_string(it, &buf, &n, it);
-            if (err)
-                return err;     // parse error
-            printf("\"%s\"\n", buf);
-            free(buf);
-            continue;
-        }
-
-        case CborTagType: {
-            CborTag tag;
-            cbor_value_get_tag(it, &tag);       // can't fail
-            printf("Tag(%lld)\n", (long long)tag);
-            break;
-        }
-
-        case CborSimpleType: {
-            uint8_t type;
-            cbor_value_get_simple_type(it, &type);  // can't fail
-            printf("simple(%u)\n", type);
-            break;
-        }
-
-        case CborNullType:
-            puts("null");
-            break;
-
-        case CborUndefinedType:
-            puts("undefined");
-            break;
-
-        case CborBooleanType: {
-            bool val;
-            cbor_value_get_boolean(it, &val);       // can't fail
-            puts(val ? "true" : "false");
-            break;
-        }
-
-        case CborDoubleType: {
-            double val;
-            if (false) {
-                float f;
-        case CborFloatType:
-                cbor_value_get_float(it, &f);
-                val = f;
-            } else {
-                cbor_value_get_double(it, &val);
-            }
-            printf("%g\n", val);
-            break;
-        }
-        case CborHalfFloatType: {
-            uint16_t val;
-            cbor_value_get_half_float(it, &val);
-            printf("__f16(%04x)\n", val);
-            break;
-        }
-
-        case CborInvalidType:
-            assert(false);      // can't happen
-            break;
-        }
-
-        err = cbor_value_advance_fixed(it);
-        if (err)
-            return err;
-    }
-    return CborNoError;
-}
-
-int main(int argc, char **argv)
-{
-    if (argc != 2) {
-        puts("simplereader <filename>");
-        return 1;
-    }
-
-    size_t length;
-    uint8_t *buf = readfile(argv[1], &length);
-    if (!buf) {
-        perror("readfile");
-        return 1;
-    }
-
-    CborParser parser;
-    CborValue it;
-    CborError err = cbor_parser_init(buf, length, 0, &parser, &it);
-    if (!err)
-        err = dumprecursive(&it, 0);
-    free(buf);
-
-    if (err) {
-        fprintf(stderr, "CBOR parsing failure at offset %ld: %s\n",
-                it.ptr - buf, cbor_error_string(err));
-        return 1;
-    }
-    return 0;
-}
diff --git a/examples/simplereader.pro b/examples/simplereader.pro
deleted file mode 100644
index 07fdc6a..0000000
--- a/examples/simplereader.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-CONFIG -= qt
-SOURCES = simplereader.c
-include(../src/src.pri)
diff --git a/master-branch-renamed-to-main b/master-branch-renamed-to-main
new file mode 100644
index 0000000..42bb5f1
--- /dev/null
+++ b/master-branch-renamed-to-main
@@ -0,0 +1,3 @@
+The branch named 'master' is renamed to 'main'.
+
+  git checkout main
diff --git a/scripts/maketag.pl b/scripts/maketag.pl
deleted file mode 100644
index 5b1a8b7..0000000
--- a/scripts/maketag.pl
+++ /dev/null
@@ -1,91 +0,0 @@
-#!perl
-use strict;
-sub run(@) {
-    open PROC, "-|", @_ or die("Cannot run $_[0]: $!");
-    my @out;
-    while (<PROC>) {
-        chomp;
-        push @out, $_;
-    }
-    close PROC;
-    return @out;
-}
-
-my @tags = run("git", "tag");
-my @v = run("git", "show", "HEAD:VERSION");
-my $v = $v[0];
-
-my $tagfile = ".git/TAG_EDITMSG";
-open TAGFILE, ">", $tagfile
-    or die("Cannot create file for editing tag message: $!");
-select TAGFILE;
-print "TinyCBOR release $v\n";
-print "\n";
-print "# Write something nice about this release here\n";
-
-# Do we have a commit template?
-my @result = run("git", "config", "--get", "commit.template");
-if (scalar @result) {
-    open TEMPLATE, "<", $result[0];
-    map { print $_; } <TEMPLATE>;
-    close TEMPLATE;
-}
-
-print "\n";
-print "# Commit log\n";
-open LOG, "-|", "git", "shortlog", "-e", "--no-merges", "--not", @tags;
-map { print "#  $_"; } <LOG>;
-close LOG;
-
-print "# Header diff:\n";
-open DIFF, "-|", "git", "diff", "HEAD", "--not", @tags, "--", 'src/*.h', ':!*_p.h';
-map { print "# $_"; } <DIFF>;
-close DIFF;
-
-select STDOUT;
-close TAGFILE;
-
-# Run the editor.
-# We use system so that stdin, stdout and stderr are forwarded.
-@result = run("git", "var", "GIT_EDITOR");
-@result = ($result[0], $tagfile);
-system @result;
-exit ($? >> 8) if $?;
-
-# Create the tag
-# Also using system so that hte user can see the output.
-system("git", "tag", "-a", "-F", $tagfile, split(' ', $ENV{GITTAGFLAGS}), "v$v");
-exit ($? >> 8) if $?;
-
-# Update the version files for the next patch release
-@v = split(/\./, $v);
-if (scalar @v < 3) {
-    push @v, '1';
-} else {
-    ++$v[-1];
-}
-$v = join('.', @v);
-open VERSION, ">", "VERSION" or die("Cannot open VERSION file: $!");
-print VERSION "$v\n";
-close VERSION;
-
-open VERSION, ">", "src/tinycbor-version.h" or die("Cannot open src/tinycbor-version.h: $!");
-print VERSION "#define TINYCBOR_VERSION_MAJOR      ", $v[0], "\n";
-print VERSION "#define TINYCBOR_VERSION_MINOR      ", $v[1], "\n";
-print VERSION "#define TINYCBOR_VERSION_PATCH      ", $v[2], "\n";
-close VERSION;
-
-if (open APPVEYORYML, "<", ".appveyor.yml") {
-    my @contents = map {
-        s/^version:.*/version: $v[0].$v[1].$v[2]-build-{build}/;
-        $_;
-    } <APPVEYORYML>;
-    close APPVEYORYML;
-    open APPVEYORYML, ">", ".appveyor.yml";
-    print APPVEYORYML join('', @contents);
-    close APPVEYORYML;
-}
-
-# Print summary
-print "Tag created and next versions updated.\n";
-print "Don't forget to create the docs.\n" if $v[2] == 1;
diff --git a/scripts/update-docs.sh b/scripts/update-docs.sh
deleted file mode 100755
index dc5f1a2..0000000
--- a/scripts/update-docs.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh -ex
-tuple="$TRAVIS_BRANCH${TRAVIS_TAG:+tag:$TRAVIS_TAG},$TRAVIS_PULL_REQUEST"
-case "$tuple" in
-    dev,false|master,false|tag:*)
-        ;;
-    *)
-        exit 0
-        ;;
-esac
-V=`cut -f1-2 -d. <VERSION`
-git fetch origin gh-pages
-
-# Fail if the library sizes file isn't present
-test -r sizes
-
-# Run doxygen (maybe)
-if [ -n "${TRAVIS_TAG-$FORCE_DOCS}" ] && make -s docs 2>/dev/null; then
-    git checkout -b gh-pages FETCH_HEAD
-    if [ -d "$V" ]; then
-        mv "$V" "old-$V"
-    fi
-    mv doc/html "$V"
-    git add -A "$V"
-else
-    git checkout -b gh-pages FETCH_HEAD
-    mkdir -p "$V"
-fi
-
-# Update the symlink for the branch name
-rm -f "./$TRAVIS_BRANCH"
-ln -s "$V" "$TRAVIS_BRANCH"
-git add "./$TRAVIS_BRANCH"
-
-# Update the library sizes file
-# (will fail if the release build failed)
-mkdir -p "library_sizes/$TRAVIS_BRANCH"
-mv sizes "library_sizes/$TRAVIS_BRANCH/$QMAKESPEC"
-(cd "library_sizes/$TRAVIS_BRANCH/";
- for f in *; do echo "$f:"; cat  "$f" ; done) > "$V/library_sizes.txt"
-git add "library_sizes/$TRAVIS_BRANCH" "$V/library_sizes.txt"
-git diff --cached -U0 "$V/library_sizes.txt"
-
-# Commit everything
-if git commit -m "Update docs for $V (Travis build $TRAVIS_BUILD_NUMBER)
-
-Matching commit $TRAVIS_COMMIT:
-$TRAVIS_COMMIT_MESSAGE"; then
-    # We've made a commit, push it
-    set +x
-    url=`git config --get remote.origin.url | sed -e s,://github,://$GITHUB_AUTH@github,`
-    git push "$url" @:gh-pages
-fi
diff --git a/src/cbor.dox b/src/cbor.dox
deleted file mode 100644
index 0bf5c54..0000000
--- a/src/cbor.dox
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-/**
- * \mainpage
- * The TinyCBOR $(VERSION) library is a small CBOR encoder and decoder library,
- * optimized for very fast operation with very small footprint. The main encoder
- * and decoder functions do not allocate memory.
- *
- * TinyCBOR is divided into the following groups of functions and structures:
- *  - \ref CborGlobals
- *  - \ref CborEncoding
- *  - \ref CborParsing
- *  - \ref CborPretty
- *  - \ref CborToJson
- */
-
-/**
- * \file <cbor.h>
- * The <cbor.h> is the main header in TinyCBOR and defines the constants used by most functions
- * as well as the structures for encoding (CborEncoder) and decoding (CborValue).
- *
- * \sa <cborjson.h>
- */
-
-/**
- * \file <cborjson.h>
- * The <cborjson.h> file contains the routines that are used to convert a CBOR
- * data stream into JSON.
- *
- * \sa <cbor.h>
- */
-
-/**
- * \defgroup CborGlobals Global constants
- * \brief Constants used by all TinyCBOR function groups.
- */
-
-/**
- * \addtogroup CborGlobals
- * @{
- */
-
-/**
- * \var size_t CborIndefiniteLength
- *
- * This variable is a constant used to indicate that the length of the map or
- * array is not yet determined. It is used in functions
- * cbor_encoder_create_map() and cbor_encoder_create_array()
- */
-
-/**
- * \enum CborType
- * The CborType enum contains the types known to TinyCBOR.
- *
- * \value CborIntegerType           Type is an integer value, positive, negative or zero
- * \value CborByteStringType        Type is a string of arbitrary raw bytes
- * \value CborTextStringType        Type is a text string encoded in UTF-8
- * \value CborArrayType             Type is a CBOR array
- * \value CborMapType               Type is a CBOR map (an associative container with key and value pairs)
- * \value CborTagType               Type is a CBOR tag (a 64-bit integer describing the item that follows, see CborKnownTags)
- * \value CborSimpleType            Type is one of the CBOR Simple Types
- * \value CborBooleanType           Type is a boolean (true or false)
- * \value CborNullType              Type encodes a null
- * \value CborUndefinedType         Type encodes an undefined value
- * \value CborHalfFloatType         Type is an IEEE 754 half precision (16-bit) floating point type
- * \value CborFloatType             Type is an IEEE 754 single precision (32-bit) floating point type
- * \value CborDoubleType            Type is an IEEE 754 double precision (64-bit) floating point type
- * \value CborInvalidType           Type is not valid (this value is used to indicate error conditions)
- */
-
-/**
- * \enum CborKnownTags
- * The CborKnownTags enum contains known tags specified in RFC 7049, for use by the application.
- * TinyCBOR does not usually interpret the meaning of these tags and does not add them to the
- * output stream, unless specifically instructed to do so in functions for that effect.
- *
- * \value CborDateTimeStringTag     Text string contains a date-time encoded in RFC 3339 format, "YYYY-MM-DD hh:mm:ss+zzzz"
- * \value CborUnixTime_tTag         Number is a Unix time_t quantity, the number of seconds since 1970-01-01 midnight UTC
- * \value CborPositiveBignumTag     Item is a CBOR byte string encoding a positive integer of arbitrary precision
- * \value CborNegativeBignumTag     Item is a CBOR byte string encoding a negative integer of arbitrary precision
- * \value CborDecimalTag            Item is a CBOR array of two integers encoding a fixed-point decimal
- * \value CborBigfloatTag           Item is a bigfloat
- * \value CborExpectedBase64urlTag  Item is a CBOR byte string that is expected to be encoded as Base64Url
- * \value CborExpectedBase64Tag     Item is a CBOR byte string that is expected to be encoded as Base64
- * \value CborExpectedBase16Tag     Item is a CBOR byte string that is expected to be encoded as Base16 (also known as "hexdump")
- * \value CborUriTag                Item is a CBOR text string containing a URI (RFC 3986) or IRI (RFC 3987)
- * \value CborBase64urlTag          Item is a CBOR text string that was encoded as Base64Url
- * \value CborBase64Tag             Item is a CBOR text string that was encoded as Base64
- * \value CborRegularExpressionTag  Item is a CBOR text string containing a regular expression
- * \value CborMimeMessageTag        Item is a CBOR text string containing a MIME message (RFC 2045, 2046, 2047, 2822)
- * \value CborSignatureTag          Item contains CBOR-encoded data.
- *                                  This tag is also used as "file magic," marking a file as containing CBOR
- */
-
-/**
- * \typedef CborTag
- * This typedef is an unsigned 64-bit integer. Known CBOR tags can be used from the CborKnownTags enum
- * but the user application may use other tag values than the ones specified in RFC 7049.
- */
-
-/** @} */
diff --git a/src/cbor.h b/src/cbor.h
deleted file mode 100644
index 313d683..0000000
--- a/src/cbor.h
+++ /dev/null
@@ -1,607 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef CBOR_H
-#define CBOR_H
-
-#ifndef assert
-#include <assert.h>
-#endif
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "tinycbor-version.h"
-
-#define TINYCBOR_VERSION            ((TINYCBOR_VERSION_MAJOR << 16) | (TINYCBOR_VERSION_MINOR << 8) | TINYCBOR_VERSION_PATCH)
-
-#ifdef __cplusplus
-extern "C" {
-#else
-#include <stdbool.h>
-#endif
-
-#ifndef SIZE_MAX
-/* Some systems fail to define SIZE_MAX in <stdint.h>, even though C99 requires it...
- * Conversion from signed to unsigned is defined in 6.3.1.3 (Signed and unsigned integers) p2,
- * which says: "the value is converted by repeatedly adding or subtracting one more than the
- * maximum value that can be represented in the new type until the value is in the range of the
- * new type."
- * So -1 gets converted to size_t by adding SIZE_MAX + 1, which results in SIZE_MAX.
- */
-#  define SIZE_MAX ((size_t)-1)
-#endif
-
-#ifndef CBOR_API
-#  define CBOR_API
-#endif
-#ifndef CBOR_PRIVATE_API
-#  define CBOR_PRIVATE_API
-#endif
-#ifndef CBOR_INLINE_API
-#  if defined(__cplusplus)
-#    define CBOR_INLINE inline
-#    define CBOR_INLINE_API inline
-#  else
-#    define CBOR_INLINE_API static CBOR_INLINE
-#    if defined(_MSC_VER)
-#      define CBOR_INLINE __inline
-#    elif defined(__GNUC__)
-#      define CBOR_INLINE __inline__
-#    elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#      define CBOR_INLINE inline
-#    else
-#      define CBOR_INLINE
-#    endif
-#  endif
-#endif
-
-typedef enum CborType {
-    CborIntegerType     = 0x00,
-    CborByteStringType  = 0x40,
-    CborTextStringType  = 0x60,
-    CborArrayType       = 0x80,
-    CborMapType         = 0xa0,
-    CborTagType         = 0xc0,
-    CborSimpleType      = 0xe0,
-    CborBooleanType     = 0xf5,
-    CborNullType        = 0xf6,
-    CborUndefinedType   = 0xf7,
-    CborHalfFloatType   = 0xf9,
-    CborFloatType       = 0xfa,
-    CborDoubleType      = 0xfb,
-
-    CborInvalidType     = 0xff              /* equivalent to the break byte, so it will never be used */
-} CborType;
-
-typedef uint64_t CborTag;
-typedef enum CborKnownTags {
-    CborDateTimeStringTag          = 0,
-    CborUnixTime_tTag              = 1,
-    CborPositiveBignumTag          = 2,
-    CborNegativeBignumTag          = 3,
-    CborDecimalTag                 = 4,
-    CborBigfloatTag                = 5,
-    CborCOSE_Encrypt0Tag           = 16,
-    CborCOSE_Mac0Tag               = 17,
-    CborCOSE_Sign1Tag              = 18,
-    CborExpectedBase64urlTag       = 21,
-    CborExpectedBase64Tag          = 22,
-    CborExpectedBase16Tag          = 23,
-    CborEncodedCborTag             = 24,
-    CborUrlTag                     = 32,
-    CborBase64urlTag               = 33,
-    CborBase64Tag                  = 34,
-    CborRegularExpressionTag       = 35,
-    CborMimeMessageTag             = 36,
-    CborCOSE_EncryptTag            = 96,
-    CborCOSE_MacTag                = 97,
-    CborCOSE_SignTag               = 98,
-    CborSignatureTag               = 55799
-} CborKnownTags;
-
-/* #define the constants so we can check with #ifdef */
-#define CborDateTimeStringTag CborDateTimeStringTag
-#define CborUnixTime_tTag CborUnixTime_tTag
-#define CborPositiveBignumTag CborPositiveBignumTag
-#define CborNegativeBignumTag CborNegativeBignumTag
-#define CborDecimalTag CborDecimalTag
-#define CborBigfloatTag CborBigfloatTag
-#define CborCOSE_Encrypt0Tag CborCOSE_Encrypt0Tag
-#define CborCOSE_Mac0Tag CborCOSE_Mac0Tag
-#define CborCOSE_Sign1Tag CborCOSE_Sign1Tag
-#define CborExpectedBase64urlTag CborExpectedBase64urlTag
-#define CborExpectedBase64Tag CborExpectedBase64Tag
-#define CborExpectedBase16Tag CborExpectedBase16Tag
-#define CborEncodedCborTag CborEncodedCborTag
-#define CborUrlTag CborUrlTag
-#define CborBase64urlTag CborBase64urlTag
-#define CborBase64Tag CborBase64Tag
-#define CborRegularExpressionTag CborRegularExpressionTag
-#define CborMimeMessageTag CborMimeMessageTag
-#define CborCOSE_EncryptTag CborCOSE_EncryptTag
-#define CborCOSE_MacTag CborCOSE_MacTag
-#define CborCOSE_SignTag CborCOSE_SignTag
-#define CborSignatureTag CborSignatureTag
-
-/* Error API */
-
-typedef enum CborError {
-    CborNoError = 0,
-
-    /* errors in all modes */
-    CborUnknownError,
-    CborErrorUnknownLength,         /* request for length in array, map, or string with indeterminate length */
-    CborErrorAdvancePastEOF,
-    CborErrorIO,
-
-    /* parser errors streaming errors */
-    CborErrorGarbageAtEnd = 256,
-    CborErrorUnexpectedEOF,
-    CborErrorUnexpectedBreak,
-    CborErrorUnknownType,           /* can only happen in major type 7 */
-    CborErrorIllegalType,           /* type not allowed here */
-    CborErrorIllegalNumber,
-    CborErrorIllegalSimpleType,     /* types of value less than 32 encoded in two bytes */
-
-    /* parser errors in strict mode parsing only */
-    CborErrorUnknownSimpleType = 512,
-    CborErrorUnknownTag,
-    CborErrorInappropriateTagForType,
-    CborErrorDuplicateObjectKeys,
-    CborErrorInvalidUtf8TextString,
-    CborErrorExcludedType,
-    CborErrorExcludedValue,
-    CborErrorImproperValue,
-    CborErrorOverlongEncoding,
-    CborErrorMapKeyNotString,
-    CborErrorMapNotSorted,
-    CborErrorMapKeysNotUnique,
-
-    /* encoder errors */
-    CborErrorTooManyItems = 768,
-    CborErrorTooFewItems,
-
-    /* internal implementation errors */
-    CborErrorDataTooLarge = 1024,
-    CborErrorNestingTooDeep,
-    CborErrorUnsupportedType,
-
-    /* errors in converting to JSON */
-    CborErrorJsonObjectKeyIsAggregate = 1280,
-    CborErrorJsonObjectKeyNotString,
-    CborErrorJsonNotImplemented,
-
-    CborErrorOutOfMemory = (int) (~0U / 2 + 1),
-    CborErrorInternalError = (int) (~0U / 2)    /* INT_MAX on two's complement machines */
-} CborError;
-
-CBOR_API const char *cbor_error_string(CborError error);
-
-/* Encoder API */
-struct CborEncoder
-{
-    union {
-        uint8_t *ptr;
-        ptrdiff_t bytes_needed;
-    } data;
-    const uint8_t *end;
-    size_t remaining;
-    int flags;
-};
-typedef struct CborEncoder CborEncoder;
-
-static const size_t CborIndefiniteLength = SIZE_MAX;
-
-CBOR_API void cbor_encoder_init(CborEncoder *encoder, uint8_t *buffer, size_t size, int flags);
-CBOR_API CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value);
-CBOR_API CborError cbor_encode_int(CborEncoder *encoder, int64_t value);
-CBOR_API CborError cbor_encode_negative_int(CborEncoder *encoder, uint64_t absolute_value);
-CBOR_API CborError cbor_encode_simple_value(CborEncoder *encoder, uint8_t value);
-CBOR_API CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag);
-CBOR_API CborError cbor_encode_text_string(CborEncoder *encoder, const char *string, size_t length);
-CBOR_INLINE_API CborError cbor_encode_text_stringz(CborEncoder *encoder, const char *string)
-{ return cbor_encode_text_string(encoder, string, strlen(string)); }
-CBOR_API CborError cbor_encode_byte_string(CborEncoder *encoder, const uint8_t *string, size_t length);
-CBOR_API CborError cbor_encode_floating_point(CborEncoder *encoder, CborType fpType, const void *value);
-
-CBOR_INLINE_API CborError cbor_encode_boolean(CborEncoder *encoder, bool value)
-{ return cbor_encode_simple_value(encoder, (int)value - 1 + (CborBooleanType & 0x1f)); }
-CBOR_INLINE_API CborError cbor_encode_null(CborEncoder *encoder)
-{ return cbor_encode_simple_value(encoder, CborNullType & 0x1f); }
-CBOR_INLINE_API CborError cbor_encode_undefined(CborEncoder *encoder)
-{ return cbor_encode_simple_value(encoder, CborUndefinedType & 0x1f); }
-
-CBOR_INLINE_API CborError cbor_encode_half_float(CborEncoder *encoder, const void *value)
-{ return cbor_encode_floating_point(encoder, CborHalfFloatType, value); }
-CBOR_INLINE_API CborError cbor_encode_float(CborEncoder *encoder, float value)
-{ return cbor_encode_floating_point(encoder, CborFloatType, &value); }
-CBOR_INLINE_API CborError cbor_encode_double(CborEncoder *encoder, double value)
-{ return cbor_encode_floating_point(encoder, CborDoubleType, &value); }
-
-CBOR_API CborError cbor_encoder_create_array(CborEncoder *parentEncoder, CborEncoder *arrayEncoder, size_t length);
-CBOR_API CborError cbor_encoder_create_map(CborEncoder *parentEncoder, CborEncoder *mapEncoder, size_t length);
-CBOR_API CborError cbor_encoder_close_container(CborEncoder *parentEncoder, const CborEncoder *containerEncoder);
-CBOR_API CborError cbor_encoder_close_container_checked(CborEncoder *parentEncoder, const CborEncoder *containerEncoder);
-
-CBOR_INLINE_API uint8_t *_cbor_encoder_get_buffer_pointer(const CborEncoder *encoder)
-{
-    return encoder->data.ptr;
-}
-
-CBOR_INLINE_API size_t cbor_encoder_get_buffer_size(const CborEncoder *encoder, const uint8_t *buffer)
-{
-    return (size_t)(encoder->data.ptr - buffer);
-}
-
-CBOR_INLINE_API size_t cbor_encoder_get_extra_bytes_needed(const CborEncoder *encoder)
-{
-    return encoder->end ? 0 : (size_t)encoder->data.bytes_needed;
-}
-
-/* Parser API */
-
-enum CborParserIteratorFlags
-{
-    CborIteratorFlag_IntegerValueTooLarge   = 0x01,
-    CborIteratorFlag_NegativeInteger        = 0x02,
-    CborIteratorFlag_IteratingStringChunks  = 0x02,
-    CborIteratorFlag_UnknownLength          = 0x04,
-    CborIteratorFlag_ContainerIsMap         = 0x20,
-    CborIteratorFlag_NextIsMapKey           = 0x40
-};
-
-struct CborParser
-{
-    const uint8_t *end;
-    uint32_t flags;
-};
-typedef struct CborParser CborParser;
-
-struct CborValue
-{
-    const CborParser *parser;
-    const uint8_t *ptr;
-    uint32_t remaining;
-    uint16_t extra;
-    uint8_t type;
-    uint8_t flags;
-};
-typedef struct CborValue CborValue;
-
-CBOR_API CborError cbor_parser_init(const uint8_t *buffer, size_t size, uint32_t flags, CborParser *parser, CborValue *it);
-
-CBOR_API CborError cbor_value_validate_basic(const CborValue *it);
-
-CBOR_INLINE_API bool cbor_value_at_end(const CborValue *it)
-{ return it->remaining == 0; }
-CBOR_INLINE_API const uint8_t *cbor_value_get_next_byte(const CborValue *it)
-{ return it->ptr; }
-CBOR_API CborError cbor_value_advance_fixed(CborValue *it);
-CBOR_API CborError cbor_value_advance(CborValue *it);
-CBOR_INLINE_API bool cbor_value_is_container(const CborValue *it)
-{ return it->type == CborArrayType || it->type == CborMapType; }
-CBOR_API CborError cbor_value_enter_container(const CborValue *it, CborValue *recursed);
-CBOR_API CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed);
-
-CBOR_PRIVATE_API uint64_t _cbor_value_decode_int64_internal(const CborValue *value);
-CBOR_INLINE_API uint64_t _cbor_value_extract_int64_helper(const CborValue *value)
-{
-    return value->flags & CborIteratorFlag_IntegerValueTooLarge ?
-                _cbor_value_decode_int64_internal(value) : value->extra;
-}
-
-CBOR_INLINE_API bool cbor_value_is_valid(const CborValue *value)
-{ return value && value->type != CborInvalidType; }
-CBOR_INLINE_API CborType cbor_value_get_type(const CborValue *value)
-{ return (CborType)value->type; }
-
-/* Null & undefined type */
-CBOR_INLINE_API bool cbor_value_is_null(const CborValue *value)
-{ return value->type == CborNullType; }
-CBOR_INLINE_API bool cbor_value_is_undefined(const CborValue *value)
-{ return value->type == CborUndefinedType; }
-
-/* Booleans */
-CBOR_INLINE_API bool cbor_value_is_boolean(const CborValue *value)
-{ return value->type == CborBooleanType; }
-CBOR_INLINE_API CborError cbor_value_get_boolean(const CborValue *value, bool *result)
-{
-    assert(cbor_value_is_boolean(value));
-    *result = !!value->extra;
-    return CborNoError;
-}
-
-/* Simple types */
-CBOR_INLINE_API bool cbor_value_is_simple_type(const CborValue *value)
-{ return value->type == CborSimpleType; }
-CBOR_INLINE_API CborError cbor_value_get_simple_type(const CborValue *value, uint8_t *result)
-{
-    assert(cbor_value_is_simple_type(value));
-    *result = (uint8_t)value->extra;
-    return CborNoError;
-}
-
-/* Integers */
-CBOR_INLINE_API bool cbor_value_is_integer(const CborValue *value)
-{ return value->type == CborIntegerType; }
-CBOR_INLINE_API bool cbor_value_is_unsigned_integer(const CborValue *value)
-{ return cbor_value_is_integer(value) && (value->flags & CborIteratorFlag_NegativeInteger) == 0; }
-CBOR_INLINE_API bool cbor_value_is_negative_integer(const CborValue *value)
-{ return cbor_value_is_integer(value) && (value->flags & CborIteratorFlag_NegativeInteger); }
-
-CBOR_INLINE_API CborError cbor_value_get_raw_integer(const CborValue *value, uint64_t *result)
-{
-    assert(cbor_value_is_integer(value));
-    *result = _cbor_value_extract_int64_helper(value);
-    return CborNoError;
-}
-
-CBOR_INLINE_API CborError cbor_value_get_uint64(const CborValue *value, uint64_t *result)
-{
-    assert(cbor_value_is_unsigned_integer(value));
-    *result = _cbor_value_extract_int64_helper(value);
-    return CborNoError;
-}
-
-CBOR_INLINE_API CborError cbor_value_get_int64(const CborValue *value, int64_t *result)
-{
-    assert(cbor_value_is_integer(value));
-    *result = (int64_t) _cbor_value_extract_int64_helper(value);
-    if (value->flags & CborIteratorFlag_NegativeInteger)
-        *result = -*result - 1;
-    return CborNoError;
-}
-
-CBOR_INLINE_API CborError cbor_value_get_int(const CborValue *value, int *result)
-{
-    assert(cbor_value_is_integer(value));
-    *result = (int) _cbor_value_extract_int64_helper(value);
-    if (value->flags & CborIteratorFlag_NegativeInteger)
-        *result = -*result - 1;
-    return CborNoError;
-}
-
-CBOR_API CborError cbor_value_get_int64_checked(const CborValue *value, int64_t *result);
-CBOR_API CborError cbor_value_get_int_checked(const CborValue *value, int *result);
-
-CBOR_INLINE_API bool cbor_value_is_length_known(const CborValue *value)
-{ return (value->flags & CborIteratorFlag_UnknownLength) == 0; }
-
-/* Tags */
-CBOR_INLINE_API bool cbor_value_is_tag(const CborValue *value)
-{ return value->type == CborTagType; }
-CBOR_INLINE_API CborError cbor_value_get_tag(const CborValue *value, CborTag *result)
-{
-    assert(cbor_value_is_tag(value));
-    *result = _cbor_value_extract_int64_helper(value);
-    return CborNoError;
-}
-CBOR_API CborError cbor_value_skip_tag(CborValue *it);
-
-/* Strings */
-CBOR_INLINE_API bool cbor_value_is_byte_string(const CborValue *value)
-{ return value->type == CborByteStringType; }
-CBOR_INLINE_API bool cbor_value_is_text_string(const CborValue *value)
-{ return value->type == CborTextStringType; }
-
-CBOR_INLINE_API CborError cbor_value_get_string_length(const CborValue *value, size_t *length)
-{
-    uint64_t v;
-    assert(cbor_value_is_byte_string(value) || cbor_value_is_text_string(value));
-    if (!cbor_value_is_length_known(value))
-        return CborErrorUnknownLength;
-    v = _cbor_value_extract_int64_helper(value);
-    *length = (size_t)v;
-    if (*length != v)
-        return CborErrorDataTooLarge;
-    return CborNoError;
-}
-
-CBOR_PRIVATE_API CborError _cbor_value_copy_string(const CborValue *value, void *buffer,
-                                                   size_t *buflen, CborValue *next);
-CBOR_PRIVATE_API CborError _cbor_value_dup_string(const CborValue *value, void **buffer,
-                                                  size_t *buflen, CborValue *next);
-
-CBOR_API CborError cbor_value_calculate_string_length(const CborValue *value, size_t *length);
-
-CBOR_INLINE_API CborError cbor_value_copy_text_string(const CborValue *value, char *buffer,
-                                                      size_t *buflen, CborValue *next)
-{
-    assert(cbor_value_is_text_string(value));
-    return _cbor_value_copy_string(value, buffer, buflen, next);
-}
-CBOR_INLINE_API CborError cbor_value_copy_byte_string(const CborValue *value, uint8_t *buffer,
-                                                      size_t *buflen, CborValue *next)
-{
-    assert(cbor_value_is_byte_string(value));
-    return _cbor_value_copy_string(value, buffer, buflen, next);
-}
-
-CBOR_INLINE_API CborError cbor_value_dup_text_string(const CborValue *value, char **buffer,
-                                                     size_t *buflen, CborValue *next)
-{
-    assert(cbor_value_is_text_string(value));
-    return _cbor_value_dup_string(value, (void **)buffer, buflen, next);
-}
-CBOR_INLINE_API CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer,
-                                                     size_t *buflen, CborValue *next)
-{
-    assert(cbor_value_is_byte_string(value));
-    return _cbor_value_dup_string(value, (void **)buffer, buflen, next);
-}
-
-CBOR_API CborError cbor_value_text_string_equals(const CborValue *value, const char *string, bool *result);
-
-/* Maps and arrays */
-CBOR_INLINE_API bool cbor_value_is_array(const CborValue *value)
-{ return value->type == CborArrayType; }
-CBOR_INLINE_API bool cbor_value_is_map(const CborValue *value)
-{ return value->type == CborMapType; }
-
-CBOR_INLINE_API CborError cbor_value_get_array_length(const CborValue *value, size_t *length)
-{
-    uint64_t v;
-    assert(cbor_value_is_array(value));
-    if (!cbor_value_is_length_known(value))
-        return CborErrorUnknownLength;
-    v = _cbor_value_extract_int64_helper(value);
-    *length = (size_t)v;
-    if (*length != v)
-        return CborErrorDataTooLarge;
-    return CborNoError;
-}
-
-CBOR_INLINE_API CborError cbor_value_get_map_length(const CborValue *value, size_t *length)
-{
-    uint64_t v;
-    assert(cbor_value_is_map(value));
-    if (!cbor_value_is_length_known(value))
-        return CborErrorUnknownLength;
-    v = _cbor_value_extract_int64_helper(value);
-    *length = (size_t)v;
-    if (*length != v)
-        return CborErrorDataTooLarge;
-    return CborNoError;
-}
-
-CBOR_API CborError cbor_value_map_find_value(const CborValue *map, const char *string, CborValue *element);
-
-/* Floating point */
-CBOR_INLINE_API bool cbor_value_is_half_float(const CborValue *value)
-{ return value->type == CborHalfFloatType; }
-CBOR_API CborError cbor_value_get_half_float(const CborValue *value, void *result);
-
-CBOR_INLINE_API bool cbor_value_is_float(const CborValue *value)
-{ return value->type == CborFloatType; }
-CBOR_INLINE_API CborError cbor_value_get_float(const CborValue *value, float *result)
-{
-    uint32_t data;
-    assert(cbor_value_is_float(value));
-    assert(value->flags & CborIteratorFlag_IntegerValueTooLarge);
-    data = (uint32_t)_cbor_value_decode_int64_internal(value);
-    memcpy(result, &data, sizeof(*result));
-    return CborNoError;
-}
-
-CBOR_INLINE_API bool cbor_value_is_double(const CborValue *value)
-{ return value->type == CborDoubleType; }
-CBOR_INLINE_API CborError cbor_value_get_double(const CborValue *value, double *result)
-{
-    uint64_t data;
-    assert(cbor_value_is_double(value));
-    assert(value->flags & CborIteratorFlag_IntegerValueTooLarge);
-    data = _cbor_value_decode_int64_internal(value);
-    memcpy(result, &data, sizeof(*result));
-    return CborNoError;
-}
-
-/* Validation API */
-
-enum CborValidationFlags {
-    /* Bit mapping:
-     *  bits 0-7 (8 bits):      canonical format
-     *  bits 8-11 (4 bits):     canonical format & strict mode
-     *  bits 12-20 (8 bits):    strict mode
-     *  bits 21-31 (10 bits):   other
-     */
-
-    CborValidateShortestIntegrals           = 0x0001,
-    CborValidateShortestFloatingPoint       = 0x0002,
-    CborValidateShortestNumbers             = CborValidateShortestIntegrals | CborValidateShortestFloatingPoint,
-    CborValidateNoIndeterminateLength       = 0x0100,
-    CborValidateMapIsSorted                 = 0x0200 | CborValidateNoIndeterminateLength,
-
-    CborValidateCanonicalFormat             = 0x0fff,
-
-    CborValidateMapKeysAreUnique            = 0x1000 | CborValidateMapIsSorted,
-    CborValidateTagUse                      = 0x2000,
-    CborValidateUtf8                        = 0x4000,
-
-    CborValidateStrictMode                  = 0xfff00,
-
-    CborValidateMapKeysAreString            = 0x100000,
-    CborValidateNoUndefined                 = 0x200000,
-    CborValidateNoTags                      = 0x400000,
-    CborValidateFiniteFloatingPoint         = 0x800000,
-    /* unused                               = 0x1000000, */
-    /* unused                               = 0x2000000, */
-
-    CborValidateNoUnknownSimpleTypesSA      = 0x4000000,
-    CborValidateNoUnknownSimpleTypes        = 0x8000000 | CborValidateNoUnknownSimpleTypesSA,
-    CborValidateNoUnknownTagsSA             = 0x10000000,
-    CborValidateNoUnknownTagsSR             = 0x20000000 | CborValidateNoUnknownTagsSA,
-    CborValidateNoUnknownTags               = 0x40000000 | CborValidateNoUnknownTagsSR,
-
-    CborValidateCompleteData                = (int)0x80000000,
-
-    CborValidateStrictest                   = (int)~0U,
-    CborValidateBasic                       = 0
-};
-
-CBOR_API CborError cbor_value_validate(const CborValue *it, uint32_t flags);
-
-/* Human-readable (dump) API */
-
-enum CborPrettyFlags {
-    CborPrettyNumericEncodingIndicators     = 0x01,
-    CborPrettyTextualEncodingIndicators     = 0,
-
-    CborPrettyIndicateIndeterminateLength   = 0x02,
-    CborPrettyIndicateIndetermineLength     = CborPrettyIndicateIndeterminateLength, /* deprecated */
-    CborPrettyIndicateOverlongNumbers       = 0x04,
-
-    CborPrettyShowStringFragments           = 0x100,
-    CborPrettyMergeStringFragments          = 0,
-
-    CborPrettyDefaultFlags          = CborPrettyIndicateIndeterminateLength
-};
-
-typedef CborError (*CborStreamFunction)(void *token, const char *fmt, ...)
-#ifdef __GNUC__
-    __attribute__((__format__(printf, 2, 3)))
-#endif
-;
-
-CBOR_API CborError cbor_value_to_pretty_stream(CborStreamFunction streamFunction, void *token, CborValue *value, int flags);
-
-/* The following API requires a hosted C implementation (uses FILE*) */
-#if !defined(__STDC_HOSTED__) || __STDC_HOSTED__-0 == 1
-CBOR_API CborError cbor_value_to_pretty_advance_flags(FILE *out, CborValue *value, int flags);
-CBOR_API CborError cbor_value_to_pretty_advance(FILE *out, CborValue *value);
-CBOR_INLINE_API CborError cbor_value_to_pretty(FILE *out, const CborValue *value)
-{
-    CborValue copy = *value;
-    return cbor_value_to_pretty_advance_flags(out, &copy, CborPrettyDefaultFlags);
-}
-#endif /* __STDC_HOSTED__ check */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* CBOR_H */
-
diff --git a/src/cborencoder.c b/src/cborencoder.c
deleted file mode 100644
index 692ff62..0000000
--- a/src/cborencoder.c
+++ /dev/null
@@ -1,645 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE 1
-#endif
-#ifndef _DEFAULT_SOURCE
-#define _DEFAULT_SOURCE 1
-#endif
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-/**
- * \defgroup CborEncoding Encoding to CBOR
- * \brief Group of functions used to encode data to CBOR.
- *
- * CborEncoder is used to encode data into a CBOR stream. The outermost
- * CborEncoder is initialized by calling cbor_encoder_init(), with the buffer
- * where the CBOR stream will be stored. The outermost CborEncoder is usually
- * used to encode exactly one item, most often an array or map. It is possible
- * to encode more than one item, but care must then be taken on the decoder
- * side to ensure the state is reset after each item was decoded.
- *
- * Nested CborEncoder objects are created using cbor_encoder_create_array() and
- * cbor_encoder_create_map(), later closed with cbor_encoder_close_container()
- * or cbor_encoder_close_container_checked(). The pairs of creation and closing
- * must be exactly matched and their parameters are always the same.
- *
- * CborEncoder writes directly to the user-supplied buffer, without extra
- * buffering. CborEncoder does not allocate memory and CborEncoder objects are
- * usually created on the stack of the encoding functions.
- *
- * The example below initializes a CborEncoder object with a buffer and encodes
- * a single integer.
- *
- * \code
- *      uint8_t buf[16];
- *      CborEncoder encoder;
- *      cbor_encoder_init(&encoder, buf, sizeof(buf), 0);
- *      cbor_encode_int(&encoder, some_value);
- * \endcode
- *
- * As explained before, usually the outermost CborEncoder object is used to add
- * one array or map, which in turn contains multiple elements. The example
- * below creates a CBOR map with one element: a key "foo" and a boolean value.
- *
- * \code
- *      uint8_t buf[16];
- *      CborEncoder encoder, mapEncoder;
- *      cbor_encoder_init(&encoder, buf, sizeof(buf), 0);
- *      cbor_encoder_create_map(&encoder, &mapEncoder, 1);
- *      cbor_encode_text_stringz(&mapEncoder, "foo");
- *      cbor_encode_boolean(&mapEncoder, some_value);
- *      cbor_encoder_close_container(&encoder, &mapEncoder);
- * \endcode
- *
- * <h3 class="groupheader">Error checking and buffer size</h3>
- *
- * All functions operating on CborEncoder return a condition of type CborError.
- * If the encoding was successful, they return CborNoError. Some functions do
- * extra checking on the input provided and may return some other error
- * conditions (for example, cbor_encode_simple_value() checks that the type is
- * of the correct type).
- *
- * In addition, all functions check whether the buffer has enough bytes to
- * encode the item being appended. If that is not possible, they return
- * CborErrorOutOfMemory.
- *
- * It is possible to continue with the encoding of data past the first function
- * that returns CborErrorOutOfMemory. CborEncoder functions will not overrun
- * the buffer, but will instead count how many more bytes are needed to
- * complete the encoding. At the end, you can obtain that count by calling
- * cbor_encoder_get_extra_bytes_needed().
- *
- * \section1 Finalizing the encoding
- *
- * Once all items have been appended and the containers have all been properly
- * closed, the user-supplied buffer will contain the CBOR stream and may be
- * immediately used. To obtain the size of the buffer, call
- * cbor_encoder_get_buffer_size() with the original buffer pointer.
- *
- * The example below illustrates how one can encode an item with error checking
- * and then pass on the buffer for network sending.
- *
- * \code
- *      uint8_t buf[16];
- *      CborError err;
- *      CborEncoder encoder, mapEncoder;
- *      cbor_encoder_init(&encoder, buf, sizeof(buf), 0);
- *      err = cbor_encoder_create_map(&encoder, &mapEncoder, 1);
- *      if (err)
- *          return err;
- *      err = cbor_encode_text_stringz(&mapEncoder, "foo");
- *      if (err)
- *          return err;
- *      err = cbor_encode_boolean(&mapEncoder, some_value);
- *      if (err)
- *          return err;
- *      err = cbor_encoder_close_container_checked(&encoder, &mapEncoder);
- *      if (err)
- *          return err;
- *
- *      size_t len = cbor_encoder_get_buffer_size(&encoder, buf);
- *      send_payload(buf, len);
- *      return CborNoError;
- * \endcode
- *
- * Finally, the example below expands on the one above and also
- * deals with dynamically growing the buffer if the initial allocation wasn't
- * big enough. Note the two places where the error checking was replaced with
- * an cbor_assertion, showing where the author assumes no error can occur.
- *
- * \code
- * uint8_t *encode_string_array(const char **strings, int n, size_t *bufsize)
- * {
- *     CborError err;
- *     CborEncoder encoder, arrayEncoder;
- *     size_t size = 256;
- *     uint8_t *buf = NULL;
- *
- *     while (1) {
- *         int i;
- *         size_t more_bytes;
- *         uint8_t *nbuf = realloc(buf, size);
- *         if (nbuf == NULL)
- *             goto error;
- *         buf = nbuf;
- *
- *         cbor_encoder_init(&encoder, buf, size, 0);
- *         err = cbor_encoder_create_array(&encoder, &arrayEncoder, n);
- *         cbor_assert(!err);         // can't fail, the buffer is always big enough
- *
- *         for (i = 0; i < n; ++i) {
- *             err = cbor_encode_text_stringz(&arrayEncoder, strings[i]);
- *             if (err && err != CborErrorOutOfMemory)
- *                 goto error;
- *         }
- *
- *         err = cbor_encoder_close_container_checked(&encoder, &arrayEncoder);
- *         cbor_assert(!err);         // shouldn't fail!
- *
- *         more_bytes = cbor_encoder_get_extra_bytes_needed(encoder);
- *         if (more_size) {
- *             // buffer wasn't big enough, try again
- *             size += more_bytes;
- *             continue;
- *         }
- *
- *         *bufsize = cbor_encoder_get_buffer_size(encoder, buf);
- *         return buf;
- *     }
- *  error:
- *     free(buf);
- *     return NULL;
- *  }
- * \endcode
- */
-
-/**
- * \addtogroup CborEncoding
- * @{
- */
-
-/**
- * \struct CborEncoder
- * Structure used to encode to CBOR.
- */
-
-/**
- * Initializes a CborEncoder structure \a encoder by pointing it to buffer \a
- * buffer of size \a size. The \a flags field is currently unused and must be
- * zero.
- */
-void cbor_encoder_init(CborEncoder *encoder, uint8_t *buffer, size_t size, int flags)
-{
-    encoder->data.ptr = buffer;
-    encoder->end = buffer + size;
-    encoder->remaining = 2;
-    encoder->flags = flags;
-}
-
-static inline void put16(void *where, uint16_t v)
-{
-    uint16_t v_be = cbor_htons(v);
-    memcpy(where, &v_be, sizeof(v_be));
-}
-
-/* Note: Since this is currently only used in situations where OOM is the only
- * valid error, we KNOW this to be true.  Thus, this function now returns just 'true',
- * but if in the future, any function starts returning a non-OOM error, this will need
- * to be changed to the test.  At the moment, this is done to prevent more branches
- * being created in the tinycbor output */
-static inline bool isOomError(CborError err)
-{
-    (void) err;
-    return true;
-}
-
-static inline void put32(void *where, uint32_t v)
-{
-    uint32_t v_be = cbor_htonl(v);
-    memcpy(where, &v_be, sizeof(v_be));
-}
-
-static inline void put64(void *where, uint64_t v)
-{
-    uint64_t v_be = cbor_htonll(v);
-    memcpy(where, &v_be, sizeof(v_be));
-}
-
-static inline bool would_overflow(CborEncoder *encoder, size_t len)
-{
-    ptrdiff_t remaining = (ptrdiff_t)encoder->end;
-    remaining -= remaining ? (ptrdiff_t)encoder->data.ptr : encoder->data.bytes_needed;
-    remaining -= (ptrdiff_t)len;
-    return unlikely(remaining < 0);
-}
-
-static inline void advance_ptr(CborEncoder *encoder, size_t n)
-{
-    if (encoder->end)
-        encoder->data.ptr += n;
-    else
-        encoder->data.bytes_needed += n;
-}
-
-static inline CborError append_to_buffer(CborEncoder *encoder, const void *data, size_t len)
-{
-    if (would_overflow(encoder, len)) {
-        if (encoder->end != NULL) {
-            len -= encoder->end - encoder->data.ptr;
-            encoder->end = NULL;
-            encoder->data.bytes_needed = 0;
-        }
-
-        advance_ptr(encoder, len);
-        return CborErrorOutOfMemory;
-    }
-
-    memcpy(encoder->data.ptr, data, len);
-    encoder->data.ptr += len;
-    return CborNoError;
-}
-
-static inline CborError append_byte_to_buffer(CborEncoder *encoder, uint8_t byte)
-{
-    return append_to_buffer(encoder, &byte, 1);
-}
-
-static inline CborError encode_number_no_update(CborEncoder *encoder, uint64_t ui, uint8_t shiftedMajorType)
-{
-    /* Little-endian would have been so much more convenient here:
-     * We could just write at the beginning of buf but append_to_buffer
-     * only the necessary bytes.
-     * Since it has to be big endian, do it the other way around:
-     * write from the end. */
-    uint64_t buf[2];
-    uint8_t *const bufend = (uint8_t *)buf + sizeof(buf);
-    uint8_t *bufstart = bufend - 1;
-    put64(buf + 1, ui);     /* we probably have a bunch of zeros in the beginning */
-
-    if (ui < Value8Bit) {
-        *bufstart += shiftedMajorType;
-    } else {
-        uint8_t more = 0;
-        if (ui > 0xffU)
-            ++more;
-        if (ui > 0xffffU)
-            ++more;
-        if (ui > 0xffffffffU)
-            ++more;
-        bufstart -= (size_t)1 << more;
-        *bufstart = shiftedMajorType + Value8Bit + more;
-    }
-
-    return append_to_buffer(encoder, bufstart, bufend - bufstart);
-}
-
-static inline void saturated_decrement(CborEncoder *encoder)
-{
-    if (encoder->remaining)
-        --encoder->remaining;
-}
-
-static inline CborError encode_number(CborEncoder *encoder, uint64_t ui, uint8_t shiftedMajorType)
-{
-    saturated_decrement(encoder);
-    return encode_number_no_update(encoder, ui, shiftedMajorType);
-}
-
-/**
- * Appends the unsigned 64-bit integer \a value to the CBOR stream provided by
- * \a encoder.
- *
- * \sa cbor_encode_negative_int, cbor_encode_int
- */
-CborError cbor_encode_uint(CborEncoder *encoder, uint64_t value)
-{
-    return encode_number(encoder, value, UnsignedIntegerType << MajorTypeShift);
-}
-
-/**
- * Appends the negative 64-bit integer whose absolute value is \a
- * absolute_value to the CBOR stream provided by \a encoder.
- *
- * If the value \a absolute_value is zero, this function encodes -2^64.
- *
- * \sa cbor_encode_uint, cbor_encode_int
- */
-CborError cbor_encode_negative_int(CborEncoder *encoder, uint64_t absolute_value)
-{
-    return encode_number(encoder, absolute_value - 1, NegativeIntegerType << MajorTypeShift);
-}
-
-/**
- * Appends the signed 64-bit integer \a value to the CBOR stream provided by
- * \a encoder.
- *
- * \sa cbor_encode_negative_int, cbor_encode_uint
- */
-CborError cbor_encode_int(CborEncoder *encoder, int64_t value)
-{
-    /* adapted from code in RFC 7049 appendix C (pseudocode) */
-    uint64_t ui = value >> 63;              /* extend sign to whole length */
-    uint8_t majorType = ui & 0x20;          /* extract major type */
-    ui ^= value;                            /* complement negatives */
-    return encode_number(encoder, ui, majorType);
-}
-
-/**
- * Appends the CBOR Simple Type of value \a value to the CBOR stream provided by
- * \a encoder.
- *
- * This function may return error CborErrorIllegalSimpleType if the \a value
- * variable contains a number that is not a valid simple type.
- */
-CborError cbor_encode_simple_value(CborEncoder *encoder, uint8_t value)
-{
-#ifndef CBOR_ENCODER_NO_CHECK_USER
-    /* check if this is a valid simple type */
-    if (value >= HalfPrecisionFloat && value <= Break)
-        return CborErrorIllegalSimpleType;
-#endif
-    return encode_number(encoder, value, SimpleTypesType << MajorTypeShift);
-}
-
-/**
- * Appends the floating-point value of type \a fpType and pointed to by \a
- * value to the CBOR stream provided by \a encoder. The value of \a fpType must
- * be one of CborHalfFloatType, CborFloatType or CborDoubleType, otherwise the
- * behavior of this function is undefined.
- *
- * This function is useful for code that needs to pass through floating point
- * values but does not wish to have the actual floating-point code.
- *
- * \sa cbor_encode_half_float, cbor_encode_float, cbor_encode_double
- */
-CborError cbor_encode_floating_point(CborEncoder *encoder, CborType fpType, const void *value)
-{
-    unsigned size;
-    uint8_t buf[1 + sizeof(uint64_t)];
-    cbor_assert(fpType == CborHalfFloatType || fpType == CborFloatType || fpType == CborDoubleType);
-    buf[0] = fpType;
-
-    size = 2U << (fpType - CborHalfFloatType);
-    if (size == 8)
-        put64(buf + 1, *(const uint64_t*)value);
-    else if (size == 4)
-        put32(buf + 1, *(const uint32_t*)value);
-    else
-        put16(buf + 1, *(const uint16_t*)value);
-    saturated_decrement(encoder);
-    return append_to_buffer(encoder, buf, size + 1);
-}
-
-/**
- * Appends the CBOR tag \a tag to the CBOR stream provided by \a encoder.
- *
- * \sa CborTag
- */
-CborError cbor_encode_tag(CborEncoder *encoder, CborTag tag)
-{
-    /* tags don't count towards the number of elements in an array or map */
-    return encode_number_no_update(encoder, tag, TagType << MajorTypeShift);
-}
-
-static CborError encode_string(CborEncoder *encoder, size_t length, uint8_t shiftedMajorType, const void *string)
-{
-    CborError err = encode_number(encoder, length, shiftedMajorType);
-    if (err && !isOomError(err))
-        return err;
-    return append_to_buffer(encoder, string, length);
-}
-
-/**
- * \fn CborError cbor_encode_text_stringz(CborEncoder *encoder, const char *string)
- *
- * Appends the null-terminated text string \a string to the CBOR stream
- * provided by \a encoder. CBOR requires that \a string be valid UTF-8, but
- * TinyCBOR makes no verification of correctness. The terminating null is not
- * included in the stream.
- *
- * \sa cbor_encode_text_string, cbor_encode_byte_string
- */
-
-/**
- * Appends the byte string \a string of length \a length to the CBOR stream
- * provided by \a encoder. CBOR byte strings are arbitrary raw data.
- *
- * \sa cbor_encode_text_stringz, cbor_encode_text_string
- */
-CborError cbor_encode_byte_string(CborEncoder *encoder, const uint8_t *string, size_t length)
-{
-    return encode_string(encoder, length, ByteStringType << MajorTypeShift, string);
-}
-
-/**
- * Appends the text string \a string of length \a length to the CBOR stream
- * provided by \a encoder. CBOR requires that \a string be valid UTF-8, but
- * TinyCBOR makes no verification of correctness.
- *
- * \sa CborError cbor_encode_text_stringz, cbor_encode_byte_string
- */
-CborError cbor_encode_text_string(CborEncoder *encoder, const char *string, size_t length)
-{
-    return encode_string(encoder, length, TextStringType << MajorTypeShift, string);
-}
-
-#ifdef __GNUC__
-__attribute__((noinline))
-#endif
-static CborError create_container(CborEncoder *encoder, CborEncoder *container, size_t length, uint8_t shiftedMajorType)
-{
-    CborError err;
-    container->data.ptr = encoder->data.ptr;
-    container->end = encoder->end;
-    saturated_decrement(encoder);
-    container->remaining = length + 1;      /* overflow ok on CborIndefiniteLength */
-
-    cbor_static_assert(((MapType << MajorTypeShift) & CborIteratorFlag_ContainerIsMap) == CborIteratorFlag_ContainerIsMap);
-    cbor_static_assert(((ArrayType << MajorTypeShift) & CborIteratorFlag_ContainerIsMap) == 0);
-    container->flags = shiftedMajorType & CborIteratorFlag_ContainerIsMap;
-
-    if (length == CborIndefiniteLength) {
-        container->flags |= CborIteratorFlag_UnknownLength;
-        err = append_byte_to_buffer(container, shiftedMajorType + IndefiniteLength);
-    } else {
-        if (shiftedMajorType & CborIteratorFlag_ContainerIsMap)
-            container->remaining += length;
-        err = encode_number_no_update(container, length, shiftedMajorType);
-    }
-    return err;
-}
-
-/**
- * Creates a CBOR array in the CBOR stream provided by \a parentEncoder and
- * initializes \a arrayEncoder so that items can be added to the array using
- * the CborEncoder functions. The array must be terminated by calling either
- * cbor_encoder_close_container() or cbor_encoder_close_container_checked()
- * with the same \a encoder and \a arrayEncoder parameters.
- *
- * The number of items inserted into the array must be exactly \a length items,
- * otherwise the stream is invalid. If the number of items is not known when
- * creating the array, the constant \ref CborIndefiniteLength may be passed as
- * length instead, and an indefinite length array is created.
- *
- * \sa cbor_encoder_create_map
- */
-CborError cbor_encoder_create_array(CborEncoder *parentEncoder, CborEncoder *arrayEncoder, size_t length)
-{
-    return create_container(parentEncoder, arrayEncoder, length, ArrayType << MajorTypeShift);
-}
-
-/**
- * Creates a CBOR map in the CBOR stream provided by \a parentEncoder and
- * initializes \a mapEncoder so that items can be added to the map using
- * the CborEncoder functions. The map must be terminated by calling either
- * cbor_encoder_close_container() or cbor_encoder_close_container_checked()
- * with the same \a encoder and \a mapEncoder parameters.
- *
- * The number of pair of items inserted into the map must be exactly \a length
- * items, otherwise the stream is invalid. If the number is not known
- * when creating the map, the constant \ref CborIndefiniteLength may be passed as
- * length instead, and an indefinite length map is created.
- *
- * \b{Implementation limitation:} TinyCBOR cannot encode more than SIZE_MAX/2
- * key-value pairs in the stream. If the length \a length is larger than this
- * value (and is not \ref CborIndefiniteLength), this function returns error
- * CborErrorDataTooLarge.
- *
- * \sa cbor_encoder_create_array
- */
-CborError cbor_encoder_create_map(CborEncoder *parentEncoder, CborEncoder *mapEncoder, size_t length)
-{
-    if (length != CborIndefiniteLength && length > SIZE_MAX / 2)
-        return CborErrorDataTooLarge;
-    return create_container(parentEncoder, mapEncoder, length, MapType << MajorTypeShift);
-}
-
-/**
- * Closes the CBOR container (array or map) provided by \a containerEncoder and
- * updates the CBOR stream provided by \a encoder. Both parameters must be the
- * same as were passed to cbor_encoder_create_array() or
- * cbor_encoder_create_map().
- *
- * Since version 0.5, this function verifies that the number of items (or pairs
- * of items, in the case of a map) was correct. It is no longer necessary to call
- * cbor_encoder_close_container_checked() instead.
- *
- * \sa cbor_encoder_create_array(), cbor_encoder_create_map()
- */
-CborError cbor_encoder_close_container(CborEncoder *parentEncoder, const CborEncoder *containerEncoder)
-{
-    // synchronise buffer state with that of the container
-    parentEncoder->end = containerEncoder->end;
-    parentEncoder->data = containerEncoder->data;
-
-    if (containerEncoder->flags & CborIteratorFlag_UnknownLength)
-        return append_byte_to_buffer(parentEncoder, BreakByte);
-
-    if (containerEncoder->remaining != 1)
-        return containerEncoder->remaining == 0 ? CborErrorTooManyItems : CborErrorTooFewItems;
-
-    if (!parentEncoder->end)
-        return CborErrorOutOfMemory;    /* keep the state */
-
-    return CborNoError;
-}
-
-/**
- * \fn CborError cbor_encode_boolean(CborEncoder *encoder, bool value)
- *
- * Appends the boolean value \a value to the CBOR stream provided by \a encoder.
- */
-
-/**
- * \fn CborError cbor_encode_null(CborEncoder *encoder)
- *
- * Appends the CBOR type representing a null value to the CBOR stream provided
- * by \a encoder.
- *
- * \sa cbor_encode_undefined()
- */
-
-/**
- * \fn CborError cbor_encode_undefined(CborEncoder *encoder)
- *
- * Appends the CBOR type representing an undefined value to the CBOR stream
- * provided by \a encoder.
- *
- * \sa cbor_encode_null()
- */
-
-/**
- * \fn CborError cbor_encode_half_float(CborEncoder *encoder, const void *value)
- *
- * Appends the IEEE 754 half-precision (16-bit) floating point value pointed to
- * by \a value to the CBOR stream provided by \a encoder.
- *
- * \sa cbor_encode_floating_point(), cbor_encode_float(), cbor_encode_double()
- */
-
-/**
- * \fn CborError cbor_encode_float(CborEncoder *encoder, float value)
- *
- * Appends the IEEE 754 single-precision (32-bit) floating point value \a value
- * to the CBOR stream provided by \a encoder.
- *
- * \sa cbor_encode_floating_point(), cbor_encode_half_float(), cbor_encode_double()
- */
-
-/**
- * \fn CborError cbor_encode_double(CborEncoder *encoder, double value)
- *
- * Appends the IEEE 754 double-precision (64-bit) floating point value \a value
- * to the CBOR stream provided by \a encoder.
- *
- * \sa cbor_encode_floating_point(), cbor_encode_half_float(), cbor_encode_float()
- */
-
-/**
- * \fn size_t cbor_encoder_get_buffer_size(const CborEncoder *encoder, const uint8_t *buffer)
- *
- * Returns the total size of the buffer starting at \a buffer after the
- * encoding finished without errors. The \a encoder and \a buffer arguments
- * must be the same as supplied to cbor_encoder_init().
- *
- * If the encoding process had errors, the return value of this function is
- * meaningless. If the only errors were CborErrorOutOfMemory, instead use
- * cbor_encoder_get_extra_bytes_needed() to find out by how much to grow the
- * buffer before encoding again.
- *
- * See \ref CborEncoding for an example of using this function.
- *
- * \sa cbor_encoder_init(), cbor_encoder_get_extra_bytes_needed(), CborEncoding
- */
-
-/**
- * \fn size_t cbor_encoder_get_extra_bytes_needed(const CborEncoder *encoder)
- *
- * Returns how many more bytes the original buffer supplied to
- * cbor_encoder_init() needs to be extended by so that no CborErrorOutOfMemory
- * condition will happen for the encoding. If the buffer was big enough, this
- * function returns 0. The \a encoder must be the original argument as passed
- * to cbor_encoder_init().
- *
- * This function is usually called after an encoding sequence ended with one or
- * more CborErrorOutOfMemory errors, but no other error. If any other error
- * happened, the return value of this function is meaningless.
- *
- * See \ref CborEncoding for an example of using this function.
- *
- * \sa cbor_encoder_init(), cbor_encoder_get_buffer_size(), CborEncoding
- */
-
-/** @} */
diff --git a/src/cborencoder_close_container_checked.c b/src/cborencoder_close_container_checked.c
deleted file mode 100644
index 5661e4d..0000000
--- a/src/cborencoder_close_container_checked.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _BSD_SOURCE 1
-#define _DEFAULT_SOURCE 1
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-
-/**
- * \addtogroup CborEncoding
- * @{
- */
-
-/**
- * @deprecated
- *
- * Closes the CBOR container (array or map) provided by \a containerEncoder and
- * updates the CBOR stream provided by \a encoder. Both parameters must be the
- * same as were passed to cbor_encoder_create_array() or
- * cbor_encoder_create_map().
- *
- * Prior to version 0.5, cbor_encoder_close_container() did not check the
- * number of items added. Since that version, it does and now
- * cbor_encoder_close_container_checked() is no longer needed.
- *
- * \sa cbor_encoder_create_array(), cbor_encoder_create_map()
- */
-CborError cbor_encoder_close_container_checked(CborEncoder *encoder, const CborEncoder *containerEncoder)
-{
-    return cbor_encoder_close_container(encoder, containerEncoder);
-}
-
-/** @} */
diff --git a/src/cborerrorstrings.c b/src/cborerrorstrings.c
deleted file mode 100644
index 3fe3a98..0000000
--- a/src/cborerrorstrings.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include "cbor.h"
-
-#ifndef _
-#  define _(msg)    msg
-#endif
-
-/**
- * \enum CborError
- * \ingroup CborGlobals
- * The CborError enum contains the possible error values used by the CBOR encoder and decoder.
- *
- * TinyCBOR functions report success by returning CborNoError, or one error
- * condition by returning one of the values below. One exception is the
- * out-of-memory condition (CborErrorOutOfMemory), which the functions for \ref
- * CborEncoding may report in bit-wise OR with other conditions.
- *
- * This technique allows code to determine whether the only error condition was
- * a lack of buffer space, which may not be a fatal condition if the buffer can
- * be resized. Additionally, the functions for \ref CborEncoding may continue
- * to be used even after CborErrorOutOfMemory is returned, and instead they
- * will simply calculate the extra space needed.
- *
- * \value CborNoError                   No error occurred
- * \omitvalue CborUnknownError
- * \value CborErrorUnknownLength        Request for the length of an array, map or string whose length is not provided in the CBOR stream
- * \value CborErrorAdvancePastEOF       Not enough data in the stream to decode item (decoding would advance past end of stream)
- * \value CborErrorIO                   An I/O error occurred, probably due to an out-of-memory situation
- * \value CborErrorGarbageAtEnd         Bytes exist past the end of the CBOR stream
- * \value CborErrorUnexpectedEOF        End of stream reached unexpectedly
- * \value CborErrorUnexpectedBreak      A CBOR break byte was found where not expected
- * \value CborErrorUnknownType          An unknown type (future extension to CBOR) was found in the stream
- * \value CborErrorIllegalType          An invalid type was found while parsing a chunked CBOR string
- * \value CborErrorIllegalNumber        An illegal initial byte (encoding unspecified additional information) was found
- * \value CborErrorIllegalSimpleType    An illegal encoding of a CBOR Simple Type of value less than 32 was found
- * \omitvalue CborErrorUnknownSimpleType
- * \omitvalue CborErrorUnknownTag
- * \omitvalue CborErrorInappropriateTagForType
- * \omitvalue CborErrorDuplicateObjectKeys
- * \value CborErrorInvalidUtf8TextString Illegal UTF-8 encoding found while parsing CBOR Text String
- * \value CborErrorTooManyItems         Too many items were added to CBOR map or array of pre-determined length
- * \value CborErrorTooFewItems          Too few items were added to CBOR map or array of pre-determined length
- * \value CborErrorDataTooLarge         Data item size exceeds TinyCBOR's implementation limits
- * \value CborErrorNestingTooDeep       Data item nesting exceeds TinyCBOR's implementation limits
- * \omitvalue CborErrorUnsupportedType
- * \value CborErrorJsonObjectKeyIsAggregate Conversion to JSON failed because the key in a map is a CBOR map or array
- * \value CborErrorJsonObjectKeyNotString Conversion to JSON failed because the key in a map is not a text string
- * \value CborErrorOutOfMemory          During CBOR encoding, the buffer provided is insufficient for encoding the data item;
- *                                      in other situations, TinyCBOR failed to allocate memory
- * \value CborErrorInternalError        An internal error occurred in TinyCBOR
- */
-
-/**
- * \ingroup CborGlobals
- * Returns the error string corresponding to the CBOR error condition \a error.
- */
-const char *cbor_error_string(CborError error)
-{
-    switch (error) {
-    case CborNoError:
-        return "";
-
-    case CborUnknownError:
-        return _("unknown error");
-
-    case CborErrorOutOfMemory:
-        return _("out of memory/need more memory");
-
-    case CborErrorUnknownLength:
-        return _("unknown length (attempted to get the length of a map/array/string of indeterminate length");
-
-    case CborErrorAdvancePastEOF:
-        return _("attempted to advance past EOF");
-
-    case CborErrorIO:
-        return _("I/O error");
-
-    case CborErrorGarbageAtEnd:
-        return _("garbage after the end of the content");
-
-    case CborErrorUnexpectedEOF:
-        return _("unexpected end of data");
-
-    case CborErrorUnexpectedBreak:
-        return _("unexpected 'break' byte");
-
-    case CborErrorUnknownType:
-        return _("illegal byte (encodes future extension type)");
-
-    case CborErrorIllegalType:
-        return _("mismatched string type in chunked string");
-
-    case CborErrorIllegalNumber:
-        return _("illegal initial byte (encodes unspecified additional information)");
-
-    case CborErrorIllegalSimpleType:
-        return _("illegal encoding of simple type smaller than 32");
-
-    case CborErrorUnknownSimpleType:
-        return _("unknown simple type");
-
-    case CborErrorUnknownTag:
-        return _("unknown tag");
-
-    case CborErrorInappropriateTagForType:
-        return _("inappropriate tag for type");
-
-    case CborErrorDuplicateObjectKeys:
-        return _("duplicate keys in object");
-
-    case CborErrorInvalidUtf8TextString:
-        return _("invalid UTF-8 content in string");
-
-    case CborErrorExcludedType:
-        return _("excluded type found");
-
-    case CborErrorExcludedValue:
-        return _("excluded value found");
-
-    case CborErrorImproperValue:
-    case CborErrorOverlongEncoding:
-        return _("value encoded in non-canonical form");
-
-    case CborErrorMapKeyNotString:
-    case CborErrorJsonObjectKeyNotString:
-        return _("key in map is not a string");
-
-    case CborErrorMapNotSorted:
-        return _("map is not sorted");
-
-    case CborErrorMapKeysNotUnique:
-        return _("map keys are not unique");
-
-    case CborErrorTooManyItems:
-        return _("too many items added to encoder");
-
-    case CborErrorTooFewItems:
-        return _("too few items added to encoder");
-
-    case CborErrorDataTooLarge:
-        return _("internal error: data too large");
-
-    case CborErrorNestingTooDeep:
-        return _("internal error: too many nested containers found in recursive function");
-
-    case CborErrorUnsupportedType:
-        return _("unsupported type");
-
-    case CborErrorJsonObjectKeyIsAggregate:
-        return _("conversion to JSON failed: key in object is an array or map");
-
-    case CborErrorJsonNotImplemented:
-        return _("conversion to JSON failed: open_memstream unavailable");
-
-    case CborErrorInternalError:
-        return _("internal error");
-    }
-    return cbor_error_string(CborUnknownError);
-}
diff --git a/src/cborinternal_p.h b/src/cborinternal_p.h
deleted file mode 100644
index 35b7a79..0000000
--- a/src/cborinternal_p.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef CBORINTERNAL_P_H
-#define CBORINTERNAL_P_H
-
-#include "compilersupport_p.h"
-
-#ifndef CBOR_NO_FLOATING_POINT
-#  include <float.h>
-#  include <math.h>
-#else
-#  ifndef CBOR_NO_HALF_FLOAT_TYPE
-#    define CBOR_NO_HALF_FLOAT_TYPE     1
-#  endif
-#endif
-
-#ifndef CBOR_NO_HALF_FLOAT_TYPE
-#  if defined(__F16C__) || defined(__AVX2__)
-#    include <immintrin.h>
-static inline unsigned short encode_half(float val)
-{
-    __m128i m = _mm_cvtps_ph(_mm_set_ss(val), _MM_FROUND_CUR_DIRECTION);
-    return _mm_extract_epi16(m, 0);
-}
-static inline float decode_half(unsigned short half)
-{
-    __m128i m = _mm_cvtsi32_si128(half);
-    return _mm_cvtss_f32(_mm_cvtph_ps(m));
-}
-#  else
-/* software implementation of float-to-fp16 conversions */
-static inline unsigned short encode_half(double val)
-{
-    uint64_t v;
-    int sign, exp, mant;
-    memcpy(&v, &val, sizeof(v));
-    sign = v >> 63 << 15;
-    exp = (v >> 52) & 0x7ff;
-    mant = v << 12 >> 12 >> (53-11);    /* keep only the 11 most significant bits of the mantissa */
-    exp -= 1023;
-    if (exp == 1024) {
-        /* infinity or NaN */
-        exp = 16;
-        mant >>= 1;
-    } else if (exp >= 16) {
-        /* overflow, as largest number */
-        exp = 15;
-        mant = 1023;
-    } else if (exp >= -14) {
-        /* regular normal */
-    } else if (exp >= -24) {
-        /* subnormal */
-        mant |= 1024;
-        mant >>= -(exp + 14);
-        exp = -15;
-    } else {
-        /* underflow, make zero */
-        return 0;
-    }
-
-    /* safe cast here as bit operations above guarantee not to overflow */
-    return (unsigned short)(sign | ((exp + 15) << 10) | mant);
-}
-
-/* this function was copied & adapted from RFC 7049 Appendix D */
-static inline double decode_half(unsigned short half)
-{
-    int exp = (half >> 10) & 0x1f;
-    int mant = half & 0x3ff;
-    double val;
-    if (exp == 0) val = ldexp(mant, -24);
-    else if (exp != 31) val = ldexp(mant + 1024, exp - 25);
-    else val = mant == 0 ? INFINITY : NAN;
-    return half & 0x8000 ? -val : val;
-}
-#  endif
-#endif /* CBOR_NO_HALF_FLOAT_TYPE */
-
-#ifndef CBOR_INTERNAL_API
-#  define CBOR_INTERNAL_API
-#endif
-
-#ifndef CBOR_PARSER_MAX_RECURSIONS
-#  define CBOR_PARSER_MAX_RECURSIONS 1024
-#endif
-
-/*
- * CBOR Major types
- * Encoded in the high 3 bits of the descriptor byte
- * See http://tools.ietf.org/html/rfc7049#section-2.1
- */
-typedef enum CborMajorTypes {
-    UnsignedIntegerType = 0U,
-    NegativeIntegerType = 1U,
-    ByteStringType = 2U,
-    TextStringType = 3U,
-    ArrayType = 4U,
-    MapType = 5U,           /* a.k.a. object */
-    TagType = 6U,
-    SimpleTypesType = 7U
-} CborMajorTypes;
-
-/*
- * CBOR simple and floating point types
- * Encoded in the low 8 bits of the descriptor byte when the
- * Major Type is 7.
- */
-typedef enum CborSimpleTypes {
-    FalseValue              = 20,
-    TrueValue               = 21,
-    NullValue               = 22,
-    UndefinedValue          = 23,
-    SimpleTypeInNextByte    = 24,   /* not really a simple type */
-    HalfPrecisionFloat      = 25,   /* ditto */
-    SinglePrecisionFloat    = 26,   /* ditto */
-    DoublePrecisionFloat    = 27,   /* ditto */
-    Break                   = 31
-} CborSimpleTypes;
-
-enum {
-    SmallValueBitLength     = 5U,
-    SmallValueMask          = (1U << SmallValueBitLength) - 1,      /* 31 */
-    Value8Bit               = 24U,
-    Value16Bit              = 25U,
-    Value32Bit              = 26U,
-    Value64Bit              = 27U,
-    IndefiniteLength        = 31U,
-
-    MajorTypeShift          = SmallValueBitLength,
-    MajorTypeMask           = (int) (~0U << MajorTypeShift),
-
-    BreakByte               = (unsigned)Break | (SimpleTypesType << MajorTypeShift)
-};
-
-CBOR_INTERNAL_API CborError CBOR_INTERNAL_API_CC _cbor_value_extract_number(const uint8_t **ptr, const uint8_t *end, uint64_t *len);
-CBOR_INTERNAL_API CborError CBOR_INTERNAL_API_CC _cbor_value_prepare_string_iteration(CborValue *it);
-CBOR_INTERNAL_API CborError CBOR_INTERNAL_API_CC _cbor_value_get_string_chunk(const CborValue *value, const void **bufferptr,
-                                                                              size_t *len, CborValue *next);
-
-
-#endif /* CBORINTERNAL_P_H */
diff --git a/src/cborjson.h b/src/cborjson.h
deleted file mode 100644
index 8ff27b9..0000000
--- a/src/cborjson.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef CBORJSON_H
-#define CBORJSON_H
-
-#include "cbor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Conversion to JSON */
-enum CborToJsonFlags
-{
-    CborConvertAddMetadata = 1,
-    CborConvertTagsToObjects = 2,
-    CborConvertIgnoreTags = 0,
-
-    CborConvertObeyByteStringTags = 0,
-    CborConvertByteStringsToBase64Url = 4,
-
-    CborConvertRequireMapStringKeys = 0,
-    CborConvertStringifyMapKeys = 8,
-
-    CborConvertDefaultFlags = 0
-};
-
-CBOR_API CborError cbor_value_to_json_advance(FILE *out, CborValue *value, int flags);
-CBOR_INLINE_API CborError cbor_value_to_json(FILE *out, const CborValue *value, int flags)
-{
-    CborValue copy = *value;
-    return cbor_value_to_json_advance(out, &copy, flags);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* CBORJSON_H */
-
diff --git a/src/cborparser.c b/src/cborparser.c
deleted file mode 100644
index 60ce574..0000000
--- a/src/cborparser.c
+++ /dev/null
@@ -1,1449 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE 1
-#endif
-#ifndef _DEFAULT_SOURCE
-#define _DEFAULT_SOURCE 1
-#endif
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-
-#include <string.h>
-
-/**
- * \defgroup CborParsing Parsing CBOR streams
- * \brief Group of functions used to parse CBOR streams.
- *
- * TinyCBOR provides functions for pull-based stream parsing of a CBOR-encoded
- * payload. The main data type for the parsing is a CborValue, which behaves
- * like an iterator and can be used to extract the encoded data. It is first
- * initialized with a call to cbor_parser_init() and is usually used to extract
- * exactly one item, most often an array or map.
- *
- * Nested CborValue objects can be parsed using cbor_value_enter_container().
- * Each call to cbor_value_enter_container() must be matched by a call to
- * cbor_value_leave_container(), with the exact same parameters.
- *
- * The example below initializes a CborParser object, begins the parsing with a
- * CborValue and decodes a single integer:
- *
- * \code
- * int extract_int(const uint8_t *buffer, size_t len)
- * {
- *     CborParser parser;
- *     CborValue value;
- *     int result;
- *     cbor_parser_init(buffer, len, 0, &parser, &value);
- *     cbor_value_get_int(&value, &result);
- *     return result;
- * }
- * \endcode
- *
- * The code above does no error checking, which means it assumes the data comes
- * from a source trusted to send one properly-encoded integer. The following
- * example does the exact same operation, but includes error checking and
- * returns 0 on parsing failure:
- *
- * \code
- * int extract_int(const uint8_t *buffer, size_t len)
- * {
- *     CborParser parser;
- *     CborValue value;
- *     int result;
- *     if (cbor_parser_init(buffer, len, 0, &parser, &value) != CborNoError)
- *         return 0;
- *     if (!cbor_value_is_integer(&value) ||
- *             cbor_value_get_int(&value, &result) != CborNoError)
- *         return 0;
- *     return result;
- * }
- * \endcode
- *
- * Note, in the example above, that one can't distinguish a parsing failure
- * from an encoded value of zero. Reporting a parsing error is left as an
- * exercise to the reader.
- *
- * The code above does not execute a range-check either: it is possible that
- * the value decoded from the CBOR stream encodes a number larger than what can
- * be represented in a variable of type \c{int}. If detecting that case is
- * important, the code should call cbor_value_get_int_checked() instead.
- *
- * <h3 class="groupheader">Memory and parsing constraints</h3>
- *
- * TinyCBOR is designed to run with little memory and with minimal overhead.
- * Except where otherwise noted, the parser functions always run on constant
- * time (O(1)), do not recurse and never allocate memory (thus, stack usage is
- * bounded and is O(1)).
- *
- * <h3 class="groupheader">Error handling and preconditions</h3>
- *
- * All functions operating on a CborValue return a CborError condition, with
- * CborNoError standing for the normal situation in which no parsing error
- * occurred. All functions may return parsing errors in case the stream cannot
- * be decoded properly, be it due to corrupted data or due to reaching the end
- * of the input buffer.
- *
- * Error conditions must not be ignored. All decoder functions have undefined
- * behavior if called after an error has been reported, and may crash.
- *
- * Some functions are also documented to have preconditions, like
- * cbor_value_get_int() requiring that the input be an integral value.
- * Violation of preconditions also results in undefined behavior and the
- * program may crash.
- */
-
-/**
- * \addtogroup CborParsing
- * @{
- */
-
-/**
- * \struct CborValue
- *
- * This type contains one value parsed from the CBOR stream. Each CborValue
- * behaves as an iterator in a StAX-style parser.
- *
- * \if privatedocs
- * Implementation details: the CborValue contains these fields:
- * \list
- *   \li ptr: pointer to the actual data
- *   \li flags: flags from the decoder
- *   \li extra: partially decoded integer value (0, 1 or 2 bytes)
- *   \li remaining: remaining items in this collection after this item or UINT32_MAX if length is unknown
- * \endlist
- * \endif
- */
-
-static inline uint16_t get16(const uint8_t *ptr)
-{
-    uint16_t result;
-    memcpy(&result, ptr, sizeof(result));
-    return cbor_ntohs(result);
-}
-
-static inline uint32_t get32(const uint8_t *ptr)
-{
-    uint32_t result;
-    memcpy(&result, ptr, sizeof(result));
-    return cbor_ntohl(result);
-}
-
-static inline uint64_t get64(const uint8_t *ptr)
-{
-    uint64_t result;
-    memcpy(&result, ptr, sizeof(result));
-    return cbor_ntohll(result);
-}
-
-CborError CBOR_INTERNAL_API_CC _cbor_value_extract_number(const uint8_t **ptr, const uint8_t *end, uint64_t *len)
-{
-    size_t bytesNeeded;
-    uint8_t additional_information = **ptr & SmallValueMask;
-    ++*ptr;
-    if (additional_information < Value8Bit) {
-        *len = additional_information;
-        return CborNoError;
-    }
-    if (unlikely(additional_information > Value64Bit))
-        return CborErrorIllegalNumber;
-
-    bytesNeeded = (size_t)(1 << (additional_information - Value8Bit));
-    if (unlikely(bytesNeeded > (size_t)(end - *ptr))) {
-        return CborErrorUnexpectedEOF;
-    } else if (bytesNeeded == 1) {
-        *len = (uint8_t)(*ptr)[0];
-    } else if (bytesNeeded == 2) {
-        *len = get16(*ptr);
-    } else if (bytesNeeded == 4) {
-        *len = get32(*ptr);
-    } else {
-        *len = get64(*ptr);
-    }
-    *ptr += bytesNeeded;
-    return CborNoError;
-}
-
-static CborError extract_length(const CborParser *parser, const uint8_t **ptr, size_t *len)
-{
-    uint64_t v;
-    CborError err = _cbor_value_extract_number(ptr, parser->end, &v);
-    if (err) {
-        *len = 0;
-        return err;
-    }
-
-    *len = (size_t)v;
-    if (v != *len)
-        return CborErrorDataTooLarge;
-    return CborNoError;
-}
-
-static bool is_fixed_type(uint8_t type)
-{
-    return type != CborTextStringType && type != CborByteStringType && type != CborArrayType &&
-           type != CborMapType;
-}
-
-static CborError preparse_value(CborValue *it)
-{
-    enum {
-        /* flags to keep */
-        FlagsToKeep = CborIteratorFlag_ContainerIsMap | CborIteratorFlag_NextIsMapKey
-    };
-    const CborParser *parser = it->parser;
-    it->type = CborInvalidType;
-
-    /* are we at the end? */
-    if (it->ptr == parser->end)
-        return CborErrorUnexpectedEOF;
-
-    uint8_t descriptor = *it->ptr;
-    uint8_t type = descriptor & MajorTypeMask;
-    it->type = type;
-    it->flags &= FlagsToKeep;
-    it->extra = (descriptor &= SmallValueMask);
-
-    if (descriptor > Value64Bit) {
-        if (unlikely(descriptor != IndefiniteLength))
-            return type == CborSimpleType ? CborErrorUnknownType : CborErrorIllegalNumber;
-        if (likely(!is_fixed_type(type))) {
-            /* special case */
-            it->flags |= CborIteratorFlag_UnknownLength;
-            it->type = type;
-            return CborNoError;
-        }
-        return type == CborSimpleType ? CborErrorUnexpectedBreak : CborErrorIllegalNumber;
-    }
-
-    size_t bytesNeeded = descriptor < Value8Bit ? 0 : (1 << (descriptor - Value8Bit));
-    if (bytesNeeded + 1 > (size_t)(parser->end - it->ptr))
-        return CborErrorUnexpectedEOF;
-
-    uint8_t majortype = type >> MajorTypeShift;
-    if (majortype == NegativeIntegerType) {
-        it->flags |= CborIteratorFlag_NegativeInteger;
-        it->type = CborIntegerType;
-    } else if (majortype == SimpleTypesType) {
-        switch (descriptor) {
-        case FalseValue:
-            it->extra = false;
-            it->type = CborBooleanType;
-            break;
-
-        case SinglePrecisionFloat:
-        case DoublePrecisionFloat:
-            it->flags |= CborIteratorFlag_IntegerValueTooLarge;
-            /* fall through */
-        case TrueValue:
-        case NullValue:
-        case UndefinedValue:
-        case HalfPrecisionFloat:
-            it->type = *it->ptr;
-            break;
-
-        case SimpleTypeInNextByte:
-            it->extra = (uint8_t)it->ptr[1];
-#ifndef CBOR_PARSER_NO_STRICT_CHECKS
-            if (unlikely(it->extra < 32)) {
-                it->type = CborInvalidType;
-                return CborErrorIllegalSimpleType;
-            }
-#endif
-            break;
-
-        case 28:
-        case 29:
-        case 30:
-        case Break:
-            cbor_assert(false);  /* these conditions can't be reached */
-            return CborErrorUnexpectedBreak;
-        }
-        return CborNoError;
-    }
-
-    /* try to decode up to 16 bits */
-    if (descriptor < Value8Bit)
-        return CborNoError;
-
-    if (descriptor == Value8Bit)
-        it->extra = (uint8_t)it->ptr[1];
-    else if (descriptor == Value16Bit)
-        it->extra = get16(it->ptr + 1);
-    else
-        it->flags |= CborIteratorFlag_IntegerValueTooLarge;     /* Value32Bit or Value64Bit */
-    return CborNoError;
-}
-
-static CborError preparse_next_value_nodecrement(CborValue *it)
-{
-    if (it->remaining == UINT32_MAX && it->ptr != it->parser->end && *it->ptr == (uint8_t)BreakByte) {
-        /* end of map or array */
-        if ((it->flags & CborIteratorFlag_ContainerIsMap && it->flags & CborIteratorFlag_NextIsMapKey)
-                || it->type == CborTagType) {
-            /* but we weren't expecting it! */
-            return CborErrorUnexpectedBreak;
-        }
-        ++it->ptr;
-        it->type = CborInvalidType;
-        it->remaining = 0;
-        return CborNoError;
-    }
-
-    return preparse_value(it);
-}
-
-static CborError preparse_next_value(CborValue *it)
-{
-    /* tags don't count towards item totals or whether we've successfully
-     * read a map's key or value */
-    bool itemCounts = it->type != CborTagType;
-
-    if (it->remaining != UINT32_MAX) {
-        if (itemCounts && --it->remaining == 0) {
-            it->type = CborInvalidType;
-            return CborNoError;
-        }
-    }
-    if (itemCounts) {
-        /* toggle the flag indicating whether this was a map key */
-        it->flags ^= CborIteratorFlag_NextIsMapKey;
-    }
-    return preparse_next_value_nodecrement(it);
-}
-
-static CborError advance_internal(CborValue *it)
-{
-    uint64_t length;
-    CborError err = _cbor_value_extract_number(&it->ptr, it->parser->end, &length);
-    cbor_assert(err == CborNoError);
-
-    if (it->type == CborByteStringType || it->type == CborTextStringType) {
-        cbor_assert(length == (size_t)length);
-        cbor_assert((it->flags & CborIteratorFlag_UnknownLength) == 0);
-        it->ptr += length;
-    }
-
-    return preparse_next_value(it);
-}
-
-/** \internal
- *
- * Decodes the CBOR integer value when it is larger than the 16 bits available
- * in value->extra. This function requires that value->flags have the
- * CborIteratorFlag_IntegerValueTooLarge flag set.
- *
- * This function is also used to extract single- and double-precision floating
- * point values (SinglePrecisionFloat == Value32Bit and DoublePrecisionFloat ==
- * Value64Bit).
- */
-uint64_t _cbor_value_decode_int64_internal(const CborValue *value)
-{
-    cbor_assert(value->flags & CborIteratorFlag_IntegerValueTooLarge ||
-                value->type == CborFloatType || value->type == CborDoubleType);
-
-    /* since the additional information can only be Value32Bit or Value64Bit,
-     * we just need to test for the one bit those two options differ */
-    cbor_assert((*value->ptr & SmallValueMask) == Value32Bit || (*value->ptr & SmallValueMask) == Value64Bit);
-    if ((*value->ptr & 1) == (Value32Bit & 1))
-        return get32(value->ptr + 1);
-
-    cbor_assert((*value->ptr & SmallValueMask) == Value64Bit);
-    return get64(value->ptr + 1);
-}
-
-/**
- * Initializes the CBOR parser for parsing \a size bytes beginning at \a
- * buffer. Parsing will use flags set in \a flags. The iterator to the first
- * element is returned in \a it.
- *
- * The \a parser structure needs to remain valid throughout the decoding
- * process. It is not thread-safe to share one CborParser among multiple
- * threads iterating at the same time, but the object can be copied so multiple
- * threads can iterate.
- */
-CborError cbor_parser_init(const uint8_t *buffer, size_t size, uint32_t flags, CborParser *parser, CborValue *it)
-{
-    memset(parser, 0, sizeof(*parser));
-    parser->end = buffer + size;
-    parser->flags = flags;
-    it->parser = parser;
-    it->ptr = buffer;
-    it->remaining = 1;      /* there's one type altogether, usually an array or map */
-    it->flags = 0;
-    return preparse_value(it);
-}
-
-/**
- * \fn bool cbor_value_at_end(const CborValue *it)
- *
- * Returns true if \a it has reached the end of the iteration, usually when
- * advancing after the last item in an array or map.
- *
- * In the case of the outermost CborValue object, this function returns true
- * after decoding a single element. A pointer to the first byte of the
- * remaining data (if any) can be obtained with cbor_value_get_next_byte().
- *
- * \sa cbor_value_advance(), cbor_value_is_valid(), cbor_value_get_next_byte()
- */
-
-/**
- * \fn const uint8_t *cbor_value_get_next_byte(const CborValue *it)
- *
- * Returns a pointer to the next byte that would be decoded if this CborValue
- * object were advanced.
- *
- * This function is useful if cbor_value_at_end() returns true for the
- * outermost CborValue: the pointer returned is the first byte of the data
- * remaining in the buffer, if any. Code can decide whether to begin decoding a
- * new CBOR data stream from this point, or parse some other data appended to
- * the same buffer.
- *
- * This function may be used even after a parsing error. If that occurred,
- * then this function returns a pointer to where the parsing error occurred.
- * Note that the error recovery is not precise and the pointer may not indicate
- * the exact byte containing bad data.
- *
- * \sa cbor_value_at_end()
- */
-
-/**
- * \fn bool cbor_value_is_valid(const CborValue *it)
- *
- * Returns true if the iterator \a it contains a valid value. Invalid iterators
- * happen when iteration reaches the end of a container (see \ref
- * cbor_value_at_end()) or when a search function resulted in no matches.
- *
- * \sa cbor_value_advance(), cbor_value_at_end(), cbor_value_get_type()
- */
-
-/**
- * Performs a basic validation of the CBOR stream pointed by \a it and returns
- * the error it found. If no error was found, it returns CborNoError and the
- * application can iterate over the items with certainty that no other errors
- * will appear during parsing.
- *
- * A basic validation checks for:
- * \list
- *   \li absence of undefined additional information bytes;
- *   \li well-formedness of all numbers, lengths, and simple values;
- *   \li string contents match reported sizes;
- *   \li arrays and maps contain the number of elements they are reported to have;
- * \endlist
- *
- * For further checks, see cbor_value_validate().
- *
- * This function has the same timing and memory requirements as
- * cbor_value_advance().
- *
- * \sa cbor_value_validate(), cbor_value_advance()
- */
-CborError cbor_value_validate_basic(const CborValue *it)
-{
-    CborValue value = *it;
-    return cbor_value_advance(&value);
-}
-
-/**
- * Advances the CBOR value \a it by one fixed-size position. Fixed-size types
- * are: integers, tags, simple types (including boolean, null and undefined
- * values) and floating point types.
- *
- * If the type is not of fixed size, this function has undefined behavior. Code
- * must be sure that the current type is one of the fixed-size types before
- * calling this function. This function is provided because it can guarantee
- * that it runs in constant time (O(1)).
- *
- * If the caller is not able to determine whether the type is fixed or not, code
- * can use the cbor_value_advance() function instead.
- *
- * \sa cbor_value_at_end(), cbor_value_advance(), cbor_value_enter_container(), cbor_value_leave_container()
- */
-CborError cbor_value_advance_fixed(CborValue *it)
-{
-    cbor_assert(it->type != CborInvalidType);
-    cbor_assert(is_fixed_type(it->type));
-    if (!it->remaining)
-        return CborErrorAdvancePastEOF;
-    return advance_internal(it);
-}
-
-static CborError advance_recursive(CborValue *it, int nestingLevel)
-{
-    CborError err;
-    CborValue recursed;
-
-    if (is_fixed_type(it->type))
-        return advance_internal(it);
-
-    if (!cbor_value_is_container(it)) {
-        size_t len = SIZE_MAX;
-        return _cbor_value_copy_string(it, NULL, &len, it);
-    }
-
-    /* map or array */
-    if (nestingLevel == 0)
-        return CborErrorNestingTooDeep;
-
-    err = cbor_value_enter_container(it, &recursed);
-    if (err)
-        return err;
-    while (!cbor_value_at_end(&recursed)) {
-        err = advance_recursive(&recursed, nestingLevel - 1);
-        if (err)
-            return err;
-    }
-    return cbor_value_leave_container(it, &recursed);
-}
-
-
-/**
- * Advances the CBOR value \a it by one element, skipping over containers.
- * Unlike cbor_value_advance_fixed(), this function can be called on a CBOR
- * value of any type. However, if the type is a container (map or array) or a
- * string with a chunked payload, this function will not run in constant time
- * and will recurse into itself (it will run on O(n) time for the number of
- * elements or chunks and will use O(n) memory for the number of nested
- * containers).
- *
- * The number of recursions can be limited at compile time to avoid stack
- * exhaustion in constrained systems.
- *
- * \sa cbor_value_at_end(), cbor_value_advance_fixed(), cbor_value_enter_container(), cbor_value_leave_container()
- */
-CborError cbor_value_advance(CborValue *it)
-{
-    cbor_assert(it->type != CborInvalidType);
-    if (!it->remaining)
-        return CborErrorAdvancePastEOF;
-    return advance_recursive(it, CBOR_PARSER_MAX_RECURSIONS);
-}
-
-/**
- * \fn bool cbor_value_is_tag(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR tag.
- *
- * \sa cbor_value_get_tag(), cbor_value_skip_tag()
- */
-
-/**
- * \fn CborError cbor_value_get_tag(const CborValue *value, CborTag *result)
- *
- * Retrieves the CBOR tag value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to a CBOR tag value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_tag is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_tag()
- */
-
-/**
- * Advances the CBOR value \a it until it no longer points to a tag. If \a it is
- * already not pointing to a tag, then this function returns it unchanged.
- *
- * This function does not run in constant time: it will run on O(n) for n being
- * the number of tags. It does use constant memory (O(1) memory requirements).
- *
- * \sa cbor_value_advance_fixed(), cbor_value_advance()
- */
-CborError cbor_value_skip_tag(CborValue *it)
-{
-    while (cbor_value_is_tag(it)) {
-        CborError err = cbor_value_advance_fixed(it);
-        if (err)
-            return err;
-    }
-    return CborNoError;
-}
-
-/**
- * \fn bool cbor_value_is_container(const CborValue *it)
- *
- * Returns true if the \a it value is a container and requires recursion in
- * order to decode (maps and arrays), false otherwise.
- */
-
-/**
- * Creates a CborValue iterator pointing to the first element of the container
- * represented by \a it and saves it in \a recursed. The \a it container object
- * needs to be kept and passed again to cbor_value_leave_container() in order
- * to continue iterating past this container.
- *
- * The \a it CborValue iterator must point to a container.
- *
- * \sa cbor_value_is_container(), cbor_value_leave_container(), cbor_value_advance()
- */
-CborError cbor_value_enter_container(const CborValue *it, CborValue *recursed)
-{
-    cbor_static_assert(CborIteratorFlag_ContainerIsMap == (CborMapType & ~CborArrayType));
-    cbor_assert(cbor_value_is_container(it));
-    *recursed = *it;
-
-    if (it->flags & CborIteratorFlag_UnknownLength) {
-        recursed->remaining = UINT32_MAX;
-        ++recursed->ptr;
-    } else {
-        uint64_t len;
-        CborError err = _cbor_value_extract_number(&recursed->ptr, recursed->parser->end, &len);
-        cbor_assert(err == CborNoError);
-
-        recursed->remaining = (uint32_t)len;
-        if (recursed->remaining != len || len == UINT32_MAX) {
-            /* back track the pointer to indicate where the error occurred */
-            recursed->ptr = it->ptr;
-            return CborErrorDataTooLarge;
-        }
-        if (recursed->type == CborMapType) {
-            /* maps have keys and values, so we need to multiply by 2 */
-            if (recursed->remaining > UINT32_MAX / 2) {
-                /* back track the pointer to indicate where the error occurred */
-                recursed->ptr = it->ptr;
-                return CborErrorDataTooLarge;
-            }
-            recursed->remaining *= 2;
-        }
-        if (len == 0) {
-            /* the case of the empty container */
-            recursed->type = CborInvalidType;
-            return CborNoError;
-        }
-    }
-    recursed->flags = (recursed->type & CborIteratorFlag_ContainerIsMap);
-    return preparse_next_value_nodecrement(recursed);
-}
-
-/**
- * Updates \a it to point to the next element after the container. The \a
- * recursed object needs to point to the element obtained either by advancing
- * the last element of the container (via cbor_value_advance(),
- * cbor_value_advance_fixed(), a nested cbor_value_leave_container(), or the \c
- * next pointer from cbor_value_copy_string() or cbor_value_dup_string()).
- *
- * The \a it and \a recursed parameters must be the exact same as passed to
- * cbor_value_enter_container().
- *
- * \sa cbor_value_enter_container(), cbor_value_at_end()
- */
-CborError cbor_value_leave_container(CborValue *it, const CborValue *recursed)
-{
-    cbor_assert(cbor_value_is_container(it));
-    cbor_assert(recursed->type == CborInvalidType);
-    it->ptr = recursed->ptr;
-    return preparse_next_value(it);
-}
-
-
-/**
- * \fn CborType cbor_value_get_type(const CborValue *value)
- *
- * Returns the type of the CBOR value that the iterator \a value points to. If
- * \a value does not point to a valid value, this function returns \ref
- * CborInvalidType.
- *
- * TinyCBOR also provides functions to test directly if a given CborValue object
- * is of a given type, like cbor_value_is_text_string() and cbor_value_is_null().
- *
- * \sa cbor_value_is_valid()
- */
-
-/**
- * \fn bool cbor_value_is_null(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR null type.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_undefined()
- */
-
-/**
- * \fn bool cbor_value_is_undefined(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR undefined type.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_null()
- */
-
-/**
- * \fn bool cbor_value_is_boolean(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR boolean
- * type (true or false).
- *
- * \sa cbor_value_is_valid(), cbor_value_get_boolean()
- */
-
-/**
- * \fn CborError cbor_value_get_boolean(const CborValue *value, bool *result)
- *
- * Retrieves the boolean value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to a boolean value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_boolean is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_boolean()
- */
-
-/**
- * \fn bool cbor_value_is_simple_type(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR Simple Type
- * type (other than true, false, null and undefined).
- *
- * \sa cbor_value_is_valid(), cbor_value_get_simple_type()
- */
-
-/**
- * \fn CborError cbor_value_get_simple_type(const CborValue *value, uint8_t *result)
- *
- * Retrieves the CBOR Simple Type value that \a value points to and stores it
- * in \a result. If the iterator \a value does not point to a simple_type
- * value, the behavior is undefined, so checking with \ref cbor_value_get_type
- * or with \ref cbor_value_is_simple_type is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_simple_type()
- */
-
-/**
- * \fn bool cbor_value_is_integer(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR integer
- * type.
- *
- * \sa cbor_value_is_valid(), cbor_value_get_int, cbor_value_get_int64, cbor_value_get_uint64, cbor_value_get_raw_integer
- */
-
-/**
- * \fn bool cbor_value_is_unsigned_integer(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR unsigned
- * integer type (positive values or zero).
- *
- * \sa cbor_value_is_valid(), cbor_value_get_uint64()
- */
-
-/**
- * \fn bool cbor_value_is_negative_integer(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR negative
- * integer type.
- *
- * \sa cbor_value_is_valid(), cbor_value_get_int, cbor_value_get_int64, cbor_value_get_raw_integer
- */
-
-/**
- * \fn CborError cbor_value_get_int(const CborValue *value, int *result)
- *
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an integer value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_integer is recommended.
- *
- * Note that this function does not do range-checking: integral values that do
- * not fit in a variable of type \c{int} are silently truncated to fit. Use
- * cbor_value_get_int_checked() if that is not acceptable.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer()
- */
-
-/**
- * \fn CborError cbor_value_get_int64(const CborValue *value, int64_t *result)
- *
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an integer value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_integer is recommended.
- *
- * Note that this function does not do range-checking: integral values that do
- * not fit in a variable of type \c{int64_t} are silently truncated to fit. Use
- * cbor_value_get_int64_checked() that is not acceptable.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer()
- */
-
-/**
- * \fn CborError cbor_value_get_uint64(const CborValue *value, uint64_t *result)
- *
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an unsigned integer
- * value, the behavior is undefined, so checking with \ref cbor_value_get_type
- * or with \ref cbor_value_is_unsigned_integer is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_unsigned_integer()
- */
-
-/**
- * \fn CborError cbor_value_get_raw_integer(const CborValue *value, uint64_t *result)
- *
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an integer value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_integer is recommended.
- *
- * This function is provided because CBOR negative integers can assume values
- * that cannot be represented with normal 64-bit integer variables.
- *
- * If the integer is unsigned (that is, if cbor_value_is_unsigned_integer()
- * returns true), then \a result will contain the actual value. If the integer
- * is negative, then \a result will contain the absolute value of that integer,
- * minus one. That is, \c {actual = -result - 1}. On architectures using two's
- * complement for representation of negative integers, it is equivalent to say
- * that \a result will contain the bitwise negation of the actual value.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer()
- */
-
-/**
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an integer value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_integer is recommended.
- *
- * Unlike \ref cbor_value_get_int64(), this function performs a check to see if the
- * stored integer fits in \a result without data loss. If the number is outside
- * the valid range for the data type, this function returns the recoverable
- * error CborErrorDataTooLarge. In that case, use either
- * cbor_value_get_uint64() (if the number is positive) or
- * cbor_value_get_raw_integer().
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer(), cbor_value_get_int64()
- */
-CborError cbor_value_get_int64_checked(const CborValue *value, int64_t *result)
-{
-    uint64_t v;
-    cbor_assert(cbor_value_is_integer(value));
-    v = _cbor_value_extract_int64_helper(value);
-
-    /* Check before converting, as the standard says (C11 6.3.1.3 paragraph 3):
-     * "[if] the new type is signed and the value cannot be represented in it; either the
-     *  result is implementation-defined or an implementation-defined signal is raised."
-     *
-     * The range for int64_t is -2^63 to 2^63-1 (int64_t is required to be
-     * two's complement, C11 7.20.1.1 paragraph 3), which in CBOR is
-     * represented the same way, differing only on the "sign bit" (the major
-     * type).
-     */
-
-    if (unlikely(v > (uint64_t)INT64_MAX))
-        return CborErrorDataTooLarge;
-
-    *result = v;
-    if (value->flags & CborIteratorFlag_NegativeInteger)
-        *result = -*result - 1;
-    return CborNoError;
-}
-
-/**
- * Retrieves the CBOR integer value that \a value points to and stores it in \a
- * result. If the iterator \a value does not point to an integer value, the
- * behavior is undefined, so checking with \ref cbor_value_get_type or with
- * \ref cbor_value_is_integer is recommended.
- *
- * Unlike \ref cbor_value_get_int(), this function performs a check to see if the
- * stored integer fits in \a result without data loss. If the number is outside
- * the valid range for the data type, this function returns the recoverable
- * error CborErrorDataTooLarge. In that case, use one of the other integer
- * functions to obtain the value.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_integer(), cbor_value_get_int64(),
- *     cbor_value_get_uint64(), cbor_value_get_int64_checked(), cbor_value_get_raw_integer()
- */
-CborError cbor_value_get_int_checked(const CborValue *value, int *result)
-{
-    uint64_t v;
-    cbor_assert(cbor_value_is_integer(value));
-    v = _cbor_value_extract_int64_helper(value);
-
-    /* Check before converting, as the standard says (C11 6.3.1.3 paragraph 3):
-     * "[if] the new type is signed and the value cannot be represented in it; either the
-     *  result is implementation-defined or an implementation-defined signal is raised."
-     *
-     * But we can convert from signed to unsigned without fault (paragraph 2).
-     *
-     * The range for int is implementation-defined and int is not guaranteed to use
-     * two's complement representation (although int32_t is).
-     */
-
-    if (value->flags & CborIteratorFlag_NegativeInteger) {
-        if (unlikely(v > (unsigned) -(INT_MIN + 1)))
-            return CborErrorDataTooLarge;
-
-        *result = (int)v;
-        *result = -*result - 1;
-    } else {
-        if (unlikely(v > (uint64_t)INT_MAX))
-            return CborErrorDataTooLarge;
-
-        *result = (int)v;
-    }
-    return CborNoError;
-
-}
-
-/**
- * \fn bool cbor_value_is_length_known(const CborValue *value)
- *
- * Returns true if the length of this type is known without calculation. That
- * is, if the length of this CBOR string, map or array is encoded in the data
- * stream, this function returns true. If the length is not encoded, it returns
- * false.
- *
- * If the length is known, code can call cbor_value_get_string_length(),
- * cbor_value_get_array_length() or cbor_value_get_map_length() to obtain the
- * length. If the length is not known but is necessary, code can use the
- * cbor_value_calculate_string_length() function (no equivalent function is
- * provided for maps and arrays).
- */
-
-/**
- * \fn bool cbor_value_is_text_string(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR text
- * string. CBOR text strings are UTF-8 encoded and usually contain
- * human-readable text.
- *
- * \sa cbor_value_is_valid(), cbor_value_get_string_length(), cbor_value_calculate_string_length(),
- *     cbor_value_copy_text_string(), cbor_value_dup_text_string()
- */
-
-/**
- * \fn bool cbor_value_is_byte_string(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR byte
- * string. CBOR byte strings are binary data with no specified encoding or
- * format.
- *
- * \sa cbor_value_is_valid(), cbor_value_get_string_length(), cbor_value_calculate_string_length(),
- *     cbor_value_copy_byte_string(), cbor_value_dup_byte_string()
- */
-
-/**
- * \fn CborError cbor_value_get_string_length(const CborValue *value, size_t *length)
- *
- * Extracts the length of the byte or text string that \a value points to and
- * stores it in \a result. If the iterator \a value does not point to a text
- * string or a byte string, the behaviour is undefined, so checking with \ref
- * cbor_value_get_type, with \ref cbor_value_is_text_string or \ref
- * cbor_value_is_byte_string is recommended.
- *
- * If the length of this string is not encoded in the CBOR data stream, this
- * function will return the recoverable error CborErrorUnknownLength. You may
- * also check whether that is the case by using cbor_value_is_length_known().
- *
- * If the length of the string is required but the length was not encoded, use
- * cbor_value_calculate_string_length(), but note that that function does not
- * run in constant time.
- *
- * \note On 32-bit platforms, this function will return error condition of \ref
- * CborErrorDataTooLarge if the stream indicates a length that is too big to
- * fit in 32-bit.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_length_known(), cbor_value_calculate_string_length()
- */
-
-/**
- * Calculates the length of the byte or text string that \a value points to and
- * stores it in \a len. If the iterator \a value does not point to a text
- * string or a byte string, the behaviour is undefined, so checking with \ref
- * cbor_value_get_type, with \ref cbor_value_is_text_string or \ref
- * cbor_value_is_byte_string is recommended.
- *
- * This function is different from cbor_value_get_string_length() in that it
- * calculates the length even for strings sent in chunks. For that reason, this
- * function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It does use constant memory (O(1)).
- *
- * \note On 32-bit platforms, this function will return error condition of \ref
- * CborErrorDataTooLarge if the stream indicates a length that is too big to
- * fit in 32-bit.
- *
- * \sa cbor_value_get_string_length(), cbor_value_copy_text_string(), cbor_value_copy_byte_string(), cbor_value_is_length_known()
- */
-CborError cbor_value_calculate_string_length(const CborValue *value, size_t *len)
-{
-    *len = SIZE_MAX;
-    return _cbor_value_copy_string(value, NULL, len, NULL);
-}
-
-static inline void prepare_string_iteration(CborValue *it)
-{
-    if (!cbor_value_is_length_known(it)) {
-        /* chunked string: we're before the first chunk;
-         * advance to the first chunk */
-        ++it->ptr;
-        it->flags |= CborIteratorFlag_IteratingStringChunks;
-    }
-}
-
-CborError CBOR_INTERNAL_API_CC _cbor_value_prepare_string_iteration(CborValue *it)
-{
-    cbor_assert((it->flags & CborIteratorFlag_IteratingStringChunks) == 0);
-    prepare_string_iteration(it);
-
-    /* are we at the end? */
-    if (it->ptr == it->parser->end)
-        return CborErrorUnexpectedEOF;
-    return CborNoError;
-}
-
-static CborError get_string_chunk(CborValue *it, const void **bufferptr, size_t *len)
-{
-    CborError err;
-
-    /* Possible states:
-     * length known | iterating | meaning
-     *     no       |    no     | before the first chunk of a chunked string
-     *     yes      |    no     | at a non-chunked string
-     *     no       |    yes    | second or later chunk
-     *     yes      |    yes    | after a non-chunked string
-     */
-    if (it->flags & CborIteratorFlag_IteratingStringChunks) {
-        /* already iterating */
-        if (cbor_value_is_length_known(it)) {
-            /* if the length was known, it wasn't chunked, so finish iteration */
-            goto last_chunk;
-        }
-    } else {
-        prepare_string_iteration(it);
-    }
-
-    /* are we at the end? */
-    if (it->ptr == it->parser->end)
-        return CborErrorUnexpectedEOF;
-
-    if (*it->ptr == BreakByte) {
-        /* last chunk */
-        ++it->ptr;
-last_chunk:
-        *bufferptr = NULL;
-        *len = 0;
-        return preparse_next_value(it);
-    } else if ((uint8_t)(*it->ptr & MajorTypeMask) == it->type) {
-        err = extract_length(it->parser, &it->ptr, len);
-        if (err)
-            return err;
-        if (*len > (size_t)(it->parser->end - it->ptr))
-            return CborErrorUnexpectedEOF;
-
-        *bufferptr = it->ptr;
-        it->ptr += *len;
-    } else {
-        return CborErrorIllegalType;
-    }
-
-    it->flags |= CborIteratorFlag_IteratingStringChunks;
-    return CborNoError;
-}
-
-CborError CBOR_INTERNAL_API_CC
-_cbor_value_get_string_chunk(const CborValue *value, const void **bufferptr,
-                             size_t *len, CborValue *next)
-{
-    CborValue tmp;
-    if (!next)
-        next = &tmp;
-    *next = *value;
-    return get_string_chunk(next, bufferptr, len);
-}
-
-/* We return uintptr_t so that we can pass memcpy directly as the iteration
- * function. The choice is to optimize for memcpy, which is used in the base
- * parser API (cbor_value_copy_string), while memcmp is used in convenience API
- * only. */
-typedef uintptr_t (*IterateFunction)(char *, const uint8_t *, size_t);
-
-static uintptr_t iterate_noop(char *dest, const uint8_t *src, size_t len)
-{
-    (void)dest;
-    (void)src;
-    (void)len;
-    return true;
-}
-
-static uintptr_t iterate_memcmp(char *s1, const uint8_t *s2, size_t len)
-{
-    return memcmp(s1, (const char *)s2, len) == 0;
-}
-
-static uintptr_t iterate_memcpy(char *dest, const uint8_t *src, size_t len)
-{
-    return (uintptr_t)memcpy(dest, src, len);
-}
-
-static CborError iterate_string_chunks(const CborValue *value, char *buffer, size_t *buflen,
-                                       bool *result, CborValue *next, IterateFunction func)
-{
-    CborError err;
-    CborValue tmp;
-    size_t total = 0;
-    const void *ptr;
-
-    cbor_assert(cbor_value_is_byte_string(value) || cbor_value_is_text_string(value));
-    if (!next)
-        next = &tmp;
-    *next = *value;
-    *result = true;
-
-    while (1) {
-        size_t newTotal;
-        size_t chunkLen;
-        err = get_string_chunk(next, &ptr, &chunkLen);
-        if (err)
-            return err;
-        if (!ptr)
-            break;
-
-        if (unlikely(add_check_overflow(total, chunkLen, &newTotal)))
-            return CborErrorDataTooLarge;
-
-        if (*result && *buflen >= newTotal)
-            *result = !!func(buffer + total, (const uint8_t *)ptr, chunkLen);
-        else
-            *result = false;
-
-        total = newTotal;
-    }
-
-    /* is there enough room for the ending NUL byte? */
-    if (*result && *buflen > total) {
-        uint8_t nul[] = { 0 };
-        *result = !!func(buffer + total, nul, 1);
-    }
-    *buflen = total;
-    return CborNoError;
-}
-
-/**
- * \fn CborError cbor_value_copy_text_string(const CborValue *value, char *buffer, size_t *buflen, CborValue *next)
- *
- * Copies the string pointed to by \a value into the buffer provided at \a buffer
- * of \a buflen bytes. If \a buffer is a NULL pointer, this function will not
- * copy anything and will only update the \a next value.
- *
- * If the iterator \a value does not point to a text string, the behaviour is
- * undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_text_string is recommended.
- *
- * If the provided buffer length was too small, this function returns an error
- * condition of \ref CborErrorOutOfMemory. If you need to calculate the length
- * of the string in order to preallocate a buffer, use
- * cbor_value_calculate_string_length().
- *
- * On success, this function sets the number of bytes copied to \c{*buflen}. If
- * the buffer is large enough, this function will insert a null byte after the
- * last copied byte, to facilitate manipulation of text strings. That byte is
- * not included in the returned value of \c{*buflen}. If there was no space for
- * the terminating null, no error is returned, so callers must check the value
- * of *buflen after the call, before relying on the '\0'; if it has not been
- * changed by the call, there is no '\0'-termination on the buffer's contents.
- *
- * The \a next pointer, if not null, will be updated to point to the next item
- * after this string. If \a value points to the last item, then \a next will be
- * invalid.
- *
- * This function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It requires constant memory (O(1)).
- *
- * \note This function does not perform UTF-8 validation on the incoming text
- * string.
- *
- * \sa cbor_value_get_text_string_chunk() cbor_value_dup_text_string(), cbor_value_copy_byte_string(), cbor_value_get_string_length(), cbor_value_calculate_string_length()
- */
-
-/**
- * \fn CborError cbor_value_copy_byte_string(const CborValue *value, uint8_t *buffer, size_t *buflen, CborValue *next)
- *
- * Copies the string pointed by \a value into the buffer provided at \a buffer
- * of \a buflen bytes. If \a buffer is a NULL pointer, this function will not
- * copy anything and will only update the \a next value.
- *
- * If the iterator \a value does not point to a byte string, the behaviour is
- * undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_byte_string is recommended.
- *
- * If the provided buffer length was too small, this function returns an error
- * condition of \ref CborErrorOutOfMemory. If you need to calculate the length
- * of the string in order to preallocate a buffer, use
- * cbor_value_calculate_string_length().
- *
- * On success, this function sets the number of bytes copied to \c{*buflen}. If
- * the buffer is large enough, this function will insert a null byte after the
- * last copied byte, to facilitate manipulation of null-terminated strings.
- * That byte is not included in the returned value of \c{*buflen}.
- *
- * The \a next pointer, if not null, will be updated to point to the next item
- * after this string. If \a value points to the last item, then \a next will be
- * invalid.
- *
- * This function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It requires constant memory (O(1)).
- *
- * \sa cbor_value_get_byte_string_chunk(), cbor_value_dup_text_string(), cbor_value_copy_text_string(), cbor_value_get_string_length(), cbor_value_calculate_string_length()
- */
-
-CborError _cbor_value_copy_string(const CborValue *value, void *buffer,
-                                 size_t *buflen, CborValue *next)
-{
-    bool copied_all;
-    CborError err = iterate_string_chunks(value, (char*)buffer, buflen, &copied_all, next,
-                                          buffer ? iterate_memcpy : iterate_noop);
-    return err ? err :
-                 copied_all ? CborNoError : CborErrorOutOfMemory;
-}
-
-/**
- * Compares the entry \a value with the string \a string and stores the result
- * in \a result. If the value is different from \a string \a result will
- * contain \c false.
- *
- * The entry at \a value may be a tagged string. If \a value is not a string or
- * a tagged string, the comparison result will be false.
- *
- * CBOR requires text strings to be encoded in UTF-8, but this function does
- * not validate either the strings in the stream or the string \a string to be
- * matched. Moreover, comparison is done on strict codepoint comparison,
- * without any Unicode normalization.
- *
- * This function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It requires constant memory (O(1)).
- *
- * \sa cbor_value_skip_tag(), cbor_value_copy_text_string()
- */
-CborError cbor_value_text_string_equals(const CborValue *value, const char *string, bool *result)
-{
-    size_t len;
-    CborValue copy = *value;
-    CborError err = cbor_value_skip_tag(&copy);
-    if (err)
-        return err;
-    if (!cbor_value_is_text_string(&copy)) {
-        *result = false;
-        return CborNoError;
-    }
-
-    len = strlen(string);
-    return iterate_string_chunks(&copy, CONST_CAST(char *, string), &len, result, NULL, iterate_memcmp);
-}
-
-/**
- * \fn bool cbor_value_is_array(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR array.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_map()
- */
-
-/**
- * \fn CborError cbor_value_get_array_length(const CborValue *value, size_t *length)
- *
- * Extracts the length of the CBOR array that \a value points to and stores it
- * in \a result. If the iterator \a value does not point to a CBOR array, the
- * behaviour is undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_array is recommended.
- *
- * If the length of this array is not encoded in the CBOR data stream, this
- * function will return the recoverable error CborErrorUnknownLength. You may
- * also check whether that is the case by using cbor_value_is_length_known().
- *
- * \note On 32-bit platforms, this function will return error condition of \ref
- * CborErrorDataTooLarge if the stream indicates a length that is too big to
- * fit in 32-bit.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_length_known()
- */
-
-/**
- * \fn bool cbor_value_is_map(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR map.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_array()
- */
-
-/**
- * \fn CborError cbor_value_get_map_length(const CborValue *value, size_t *length)
- *
- * Extracts the length of the CBOR map that \a value points to and stores it in
- * \a result. If the iterator \a value does not point to a CBOR map, the
- * behaviour is undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_map is recommended.
- *
- * If the length of this map is not encoded in the CBOR data stream, this
- * function will return the recoverable error CborErrorUnknownLength. You may
- * also check whether that is the case by using cbor_value_is_length_known().
- *
- * \note On 32-bit platforms, this function will return error condition of \ref
- * CborErrorDataTooLarge if the stream indicates a length that is too big to
- * fit in 32-bit.
- *
- * \sa cbor_value_is_valid(), cbor_value_is_length_known()
- */
-
-/**
- * Attempts to find the value in map \a map that corresponds to the text string
- * entry \a string. If the iterator \a value does not point to a CBOR map, the
- * behaviour is undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_map is recommended.
- *
- * If the item is found, it is stored in \a result. If no item is found
- * matching the key, then \a result will contain an element of type \ref
- * CborInvalidType. Matching is performed using
- * cbor_value_text_string_equals(), so tagged strings will also match.
- *
- * This function has a time complexity of O(n) where n is the number of
- * elements in the map to be searched. In addition, this function is has O(n)
- * memory requirement based on the number of nested containers (maps or arrays)
- * found as elements of this map.
- *
- * \sa cbor_value_is_valid(), cbor_value_text_string_equals(), cbor_value_advance()
- */
-CborError cbor_value_map_find_value(const CborValue *map, const char *string, CborValue *element)
-{
-    CborError err;
-    size_t len = strlen(string);
-    cbor_assert(cbor_value_is_map(map));
-    err = cbor_value_enter_container(map, element);
-    if (err)
-        goto error;
-
-    while (!cbor_value_at_end(element)) {
-        /* find the non-tag so we can compare */
-        err = cbor_value_skip_tag(element);
-        if (err)
-            goto error;
-        if (cbor_value_is_text_string(element)) {
-            bool equals;
-            size_t dummyLen = len;
-            err = iterate_string_chunks(element, CONST_CAST(char *, string), &dummyLen,
-                                        &equals, element, iterate_memcmp);
-            if (err)
-                goto error;
-            if (equals)
-                return preparse_value(element);
-        } else {
-            /* skip this key */
-            err = cbor_value_advance(element);
-            if (err)
-                goto error;
-        }
-
-        /* skip this value */
-        err = cbor_value_skip_tag(element);
-        if (err)
-            goto error;
-        err = cbor_value_advance(element);
-        if (err)
-            goto error;
-    }
-
-    /* not found */
-    element->type = CborInvalidType;
-    return CborNoError;
-
-error:
-    element->type = CborInvalidType;
-    return err;
-}
-
-/**
- * \fn bool cbor_value_is_float(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR
- * single-precision floating point (32-bit).
- *
- * \sa cbor_value_is_valid(), cbor_value_is_double(), cbor_value_is_half_float()
- */
-
-/**
- * \fn CborError cbor_value_get_float(const CborValue *value, float *result)
- *
- * Retrieves the CBOR single-precision floating point (32-bit) value that \a
- * value points to and stores it in \a result. If the iterator \a value does
- * not point to a single-precision floating point value, the behavior is
- * undefined, so checking with \ref cbor_value_get_type or with \ref
- * cbor_value_is_float is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_float(), cbor_value_get_double()
- */
-
-/**
- * \fn bool cbor_value_is_double(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR
- * double-precision floating point (64-bit).
- *
- * \sa cbor_value_is_valid(), cbor_value_is_float(), cbor_value_is_half_float()
- */
-
-/**
- * \fn CborError cbor_value_get_double(const CborValue *value, float *result)
- *
- * Retrieves the CBOR double-precision floating point (64-bit) value that \a
- * value points to and stores it in \a result. If the iterator \a value does
- * not point to a double-precision floating point value, the behavior is
- * undefined, so checking with \ref cbor_value_get_type or with \ref
- * cbor_value_is_double is recommended.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_double(), cbor_value_get_float()
- */
-
-/**
- * \fn bool cbor_value_is_half_float(const CborValue *value)
- *
- * Returns true if the iterator \a value is valid and points to a CBOR
- * single-precision floating point (16-bit).
- *
- * \sa cbor_value_is_valid(), cbor_value_is_double(), cbor_value_is_float()
- */
-
-/**
- * Retrieves the CBOR half-precision floating point (16-bit) value that \a
- * value points to and stores it in \a result. If the iterator \a value does
- * not point to a half-precision floating point value, the behavior is
- * undefined, so checking with \ref cbor_value_get_type or with \ref
- * cbor_value_is_half_float is recommended.
- *
- * Note: since the C language does not have a standard type for half-precision
- * floating point, this function takes a \c{void *} as a parameter for the
- * storage area, which must be at least 16 bits wide.
- *
- * \sa cbor_value_get_type(), cbor_value_is_valid(), cbor_value_is_half_float(), cbor_value_get_float()
- */
-CborError cbor_value_get_half_float(const CborValue *value, void *result)
-{
-    uint16_t v;
-    cbor_assert(cbor_value_is_half_float(value));
-
-    /* size has been computed already */
-    v = get16(value->ptr + 1);
-    memcpy(result, &v, sizeof(v));
-    return CborNoError;
-}
-
-/** @} */
diff --git a/src/cborparser_dup_string.c b/src/cborparser_dup_string.c
deleted file mode 100644
index 061c5ac..0000000
--- a/src/cborparser_dup_string.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef _BSD_SOURCE
-#define _BSD_SOURCE 1
-#endif
-#ifndef _DEFAULT_SOURCE
-#define _DEFAULT_SOURCE 1
-#endif
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "compilersupport_p.h"
-#include <stdlib.h>
-
-/**
- * \fn CborError cbor_value_dup_text_string(const CborValue *value, char **buffer, size_t *buflen, CborValue *next)
- *
- * Allocates memory for the string pointed by \a value and copies it into this
- * buffer. The pointer to the buffer is stored in \a buffer and the number of
- * bytes copied is stored in \a buflen (those variables must not be NULL).
- *
- * If the iterator \a value does not point to a text string, the behaviour is
- * undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_text_string is recommended.
- *
- * If \c malloc returns a NULL pointer, this function will return error
- * condition \ref CborErrorOutOfMemory.
- *
- * On success, \c{*buffer} will contain a valid pointer that must be freed by
- * calling \c{free()}. This is the case even for zero-length strings.
- *
- * The \a next pointer, if not null, will be updated to point to the next item
- * after this string. If \a value points to the last item, then \a next will be
- * invalid.
- *
- * This function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It requires constant memory (O(1)) in addition to the
- * malloc'ed block.
- *
- * \note This function does not perform UTF-8 validation on the incoming text
- * string.
- *
- * \sa cbor_value_get_text_string_chunk(), cbor_value_copy_text_string(), cbor_value_dup_byte_string()
- */
-
-/**
- * \fn CborError cbor_value_dup_byte_string(const CborValue *value, uint8_t **buffer, size_t *buflen, CborValue *next)
- *
- * Allocates memory for the string pointed by \a value and copies it into this
- * buffer. The pointer to the buffer is stored in \a buffer and the number of
- * bytes copied is stored in \a buflen (those variables must not be NULL).
- *
- * If the iterator \a value does not point to a byte string, the behaviour is
- * undefined, so checking with \ref cbor_value_get_type or \ref
- * cbor_value_is_byte_string is recommended.
- *
- * If \c malloc returns a NULL pointer, this function will return error
- * condition \ref CborErrorOutOfMemory.
- *
- * On success, \c{*buffer} will contain a valid pointer that must be freed by
- * calling \c{free()}. This is the case even for zero-length strings.
- *
- * The \a next pointer, if not null, will be updated to point to the next item
- * after this string. If \a value points to the last item, then \a next will be
- * invalid.
- *
- * This function may not run in constant time (it will run in O(n) time on the
- * number of chunks). It requires constant memory (O(1)) in addition to the
- * malloc'ed block.
- *
- * \sa cbor_value_get_text_string_chunk(), cbor_value_copy_byte_string(), cbor_value_dup_text_string()
- */
-CborError _cbor_value_dup_string(const CborValue *value, void **buffer, size_t *buflen, CborValue *next)
-{
-    CborError err;
-    cbor_assert(buffer);
-    cbor_assert(buflen);
-    *buflen = SIZE_MAX;
-    err = _cbor_value_copy_string(value, NULL, buflen, NULL);
-    if (err)
-        return err;
-
-    ++*buflen;
-    *buffer = malloc(*buflen);
-    if (!*buffer) {
-        /* out of memory */
-        return CborErrorOutOfMemory;
-    }
-    err = _cbor_value_copy_string(value, *buffer, buflen, next);
-    if (err) {
-        free(*buffer);
-        return err;
-    }
-    return CborNoError;
-}
diff --git a/src/cborpretty.c b/src/cborpretty.c
deleted file mode 100644
index b0a3db8..0000000
--- a/src/cborpretty.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _BSD_SOURCE 1
-#define _DEFAULT_SOURCE 1
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-#include "utf8_p.h"
-
-#include <inttypes.h>
-#include <string.h>
-
-/**
- * \defgroup CborPretty Converting CBOR to text
- * \brief Group of functions used to convert CBOR to text form.
- *
- * This group contains two functions that can be used to convert a \ref
- * CborValue object to a text representation. This module attempts to follow
- * the recommendations from RFC 7049 section 6 "Diagnostic Notation", though it
- * has a few differences. They are noted below.
- *
- * TinyCBOR does not provide a way to convert from the text representation back
- * to encoded form. To produce a text form meant to be parsed, CborToJson is
- * recommended instead.
- *
- * Either of the functions in this section will attempt to convert exactly one
- * CborValue object to text. Those functions may return any error documented
- * for the functions for CborParsing. In addition, if the C standard library
- * stream functions return with error, the text conversion will return with
- * error CborErrorIO.
- *
- * These functions also perform UTF-8 validation in CBOR text strings. If they
- * encounter a sequence of bytes that is not permitted in UTF-8, they will return
- * CborErrorInvalidUtf8TextString. That includes encoding of surrogate points
- * in UTF-8.
- *
- * \warning The output type produced by these functions is not guaranteed to
- * remain stable. A future update of TinyCBOR may produce different output for
- * the same input and parsers may be unable to handle it.
- *
- * \sa CborParsing, CborToJson, cbor_parser_init()
- */
-
-/**
- * \addtogroup CborPretty
- * @{
- * <h2 class="groupheader">Text format</h2>
- *
- * As described in RFC 7049 section 6 "Diagnostic Notation", the format is
- * largely borrowed from JSON, but modified to suit CBOR's different data
- * types. TinyCBOR makes further modifications to distinguish different, but
- * similar values.
- *
- * CBOR values are currently encoded as follows:
- * \par Integrals (unsigned and negative)
- *      Base-10 (decimal) text representation of the value
- * \par Byte strings:
- *      <tt>"h'"</tt> followed by the Base16 (hex) representation of the binary data, followed by an ending quote (')
- * \par Text strings:
- *      C-style escaped string in quotes, with C11/C++11 escaping of Unicode codepoints above U+007F.
- * \par Tags:
- *      Tag value, with the tagged value in parentheses. No special encoding of the tagged value is performed.
- * \par Simple types:
- *      <tt>"simple(nn)"</tt> where \c nn is the simple value
- * \par Null:
- *      \c null
- * \par Undefined:
- *      \c undefined
- * \par Booleans:
- *      \c true or \c false
- * \par Floating point:
- *      If NaN or infinite, the actual words \c NaN or \c infinite.
- *      Otherwise, the decimal representation with as many digits as necessary to ensure no loss of information.
- *      By default, float values are suffixed by "f" and half-float values suffixed by "f16" (doubles have no suffix).
- *      If the CborPrettyNumericEncodingIndicators flag is active, the values instead are encoded following the
- *      Section 6 recommended encoding indicators: float values are suffixed with "_2" and half-float with "_1".
- *      A decimal point is always present.
- * \par Arrays:
- *      Comma-separated list of elements, enclosed in square brackets ("[" and "]").
- * \par Maps:
- *      Comma-separated list of key-value pairs, with the key and value separated
- *      by a colon (":"), enclosed in curly braces ("{" and "}").
- *
- * The CborPrettyFlags enumerator contains flags to control some aspects of the
- * encoding:
- * \par String fragmentation
- *      When the CborPrettyShowStringFragments option is active, text and byte
- *      strings that are transmitted in fragments are shown instead inside
- *      parentheses ("(" and ")") with no preceding number and each fragment is
- *      displayed individually. If a tag precedes the string, then the output
- *      will contain a double set of parentheses. If the option is not active,
- *      the fragments are merged together and the display will not show any
- *      difference from a string transmitted with determinate length.
- * \par Encoding indicators
- *      Numbers and lengths in CBOR can be encoded in multiple representations.
- *      If the CborPrettyIndicateOverlongNumbers option is active, numbers
- *      and lengths that are transmitted in a longer encoding than necessary
- *      will be indicated, by appending an underscore ("_") to either the
- *      number or the opening bracket or brace, followed by a number
- *      indicating the CBOR additional information: 0 for 1 byte, 1 for 2
- *      bytes, 2 for 4 bytes and 3 for 8 bytes.
- *      If the CborPrettyIndicateIndeterminateLength option is active, maps,
- *      arrays and strings encoded with indeterminate length will be marked by
- *      an underscore after the opening bracket or brace or the string (if not
- *      showing fragments), without a number after it.
- */
-
-/**
- * \enum CborPrettyFlags
- * The CborPrettyFlags enum contains flags that control the conversion of CBOR to text format.
- *
- * \value CborPrettyNumericEncodingIndicators   Use numeric encoding indicators instead of textual for float and half-float.
- * \value CborPrettyTextualEncodingIndicators   Use textual encoding indicators for float ("f") and half-float ("f16").
- * \value CborPrettyIndicateIndeterminateLength (default) Indicate when a map or array has indeterminate length.
- * \value CborPrettyIndicateOverlongNumbers     Indicate when a number or length was encoded with more bytes than needed.
- * \value CborPrettyShowStringFragments         If the byte or text string is transmitted in chunks, show each individually.
- * \value CborPrettyMergeStringFragment         Merge all chunked byte or text strings and display them in a single entry.
- * \value CborPrettyDefaultFlags                Default conversion flags.
- */
-
-#ifndef CBOR_NO_FLOATING_POINT
-static inline bool convertToUint64(double v, uint64_t *absolute)
-{
-    double supremum;
-    v = fabs(v);
-
-    /* C11 standard section 6.3.1.4 "Real floating and integer" says:
-     *
-     *  1 When a finite value of real floating type is converted to an integer
-     *    type other than _Bool, the fractional part is discarded (i.e., the
-     *    value is truncated toward zero). If the value of the integral part
-     *    cannot be represented by the integer type, the behavior is undefined.
-     *
-     * So we must perform a range check that v <= UINT64_MAX, but we can't use
-     * UINT64_MAX + 1.0 because the standard continues:
-     *
-     *  2 When a value of integer type is converted to a real floating type, if
-     *    the value being converted can be represented exactly in the new type,
-     *    it is unchanged. If the value being converted is in the range of
-     *    values that can be represented but cannot be represented exactly, the
-     *    result is either the nearest higher or nearest lower representable
-     *    value, chosen in an implementation-defined manner.
-     */
-    supremum = -2.0 * INT64_MIN;     /* -2 * (- 2^63) == 2^64 */
-    if (v >= supremum)
-        return false;
-
-    /* Now we can convert, these two conversions cannot be UB */
-    *absolute = v;
-    return *absolute == v;
-}
-#endif
-
-static void printRecursionLimit(CborStreamFunction stream, void *out)
-{
-    stream(out, "<nesting too deep, recursion stopped>");
-}
-
-static CborError hexDump(CborStreamFunction stream, void *out, const void *ptr, size_t n)
-{
-    const uint8_t *buffer = (const uint8_t *)ptr;
-    CborError err = CborNoError;
-    while (n-- && !err)
-        err = stream(out, "%02" PRIx8, *buffer++);
-
-    return err;
-}
-
-/* This function decodes buffer as UTF-8 and prints as escaped UTF-16.
- * On UTF-8 decoding error, it returns CborErrorInvalidUtf8TextString */
-static CborError utf8EscapedDump(CborStreamFunction stream, void *out, const void *ptr, size_t n)
-{
-    const uint8_t *buffer = (const uint8_t *)ptr;
-    const uint8_t * const end = buffer + n;
-    CborError err = CborNoError;
-
-    while (buffer < end && !err) {
-        uint32_t uc = get_utf8(&buffer, end);
-        if (uc == ~0U)
-            return CborErrorInvalidUtf8TextString;
-
-        if (uc < 0x80) {
-            /* single-byte UTF-8 */
-            unsigned char escaped = (unsigned char)uc;
-            if (uc < 0x7f && uc >= 0x20 && uc != '\\' && uc != '"') {
-                err = stream(out, "%c", (char)uc);
-                continue;
-            }
-
-            /* print as an escape sequence */
-            switch (uc) {
-            case '"':
-            case '\\':
-                break;
-            case '\b':
-                escaped = 'b';
-                break;
-            case '\f':
-                escaped = 'f';
-                break;
-            case '\n':
-                escaped = 'n';
-                break;
-            case '\r':
-                escaped = 'r';
-                break;
-            case '\t':
-                escaped = 't';
-                break;
-            default:
-                goto print_utf16;
-            }
-            err = stream(out, "\\%c", escaped);
-            continue;
-        }
-
-        /* now print the sequence */
-        if (uc > 0xffffU) {
-            /* needs surrogate pairs */
-            err = stream(out, "\\u%04" PRIX32 "\\u%04" PRIX32,
-                         (uc >> 10) + 0xd7c0,    /* high surrogate */
-                         (uc % 0x0400) + 0xdc00);
-        } else {
-print_utf16:
-            /* no surrogate pair needed */
-            err = stream(out, "\\u%04" PRIX32, uc);
-        }
-    }
-    return err;
-}
-
-static const char *resolve_indicator(const uint8_t *ptr, const uint8_t *end, int flags)
-{
-    static const char indicators[8][3] = {
-        "_0", "_1", "_2", "_3",
-        "", "", "",             /* these are not possible */
-        "_"
-    };
-    const char *no_indicator = indicators[5];   /* empty string */
-    uint8_t additional_information;
-    uint8_t expected_information;
-    uint64_t value;
-    CborError err;
-
-    if (ptr == end)
-        return NULL;    /* CborErrorUnexpectedEOF */
-
-    additional_information = (*ptr & SmallValueMask);
-    if (additional_information < Value8Bit)
-        return no_indicator;
-
-    /* determine whether to show anything */
-    if ((flags & CborPrettyIndicateIndeterminateLength) &&
-            additional_information == IndefiniteLength)
-        return indicators[IndefiniteLength - Value8Bit];
-    if ((flags & CborPrettyIndicateOverlongNumbers) == 0)
-        return no_indicator;
-
-    err = _cbor_value_extract_number(&ptr, end, &value);
-    if (err)
-        return NULL;    /* CborErrorUnexpectedEOF */
-
-    expected_information = Value8Bit - 1;
-    if (value >= Value8Bit)
-        ++expected_information;
-    if (value > 0xffU)
-        ++expected_information;
-    if (value > 0xffffU)
-        ++expected_information;
-    if (value > 0xffffffffU)
-        ++expected_information;
-    return expected_information == additional_information ?
-                no_indicator :
-                indicators[additional_information - Value8Bit];
-}
-
-static const char *get_indicator(const CborValue *it, int flags)
-{
-    return resolve_indicator(it->ptr, it->parser->end, flags);
-}
-
-static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue *it, int flags, int recursionsLeft);
-static CborError container_to_pretty(CborStreamFunction stream, void *out, CborValue *it, CborType containerType,
-                                     int flags, int recursionsLeft)
-{
-    const char *comma = "";
-    CborError err = CborNoError;
-
-    if (!recursionsLeft) {
-        printRecursionLimit(stream, out);
-        return err;     /* do allow the dumping to continue */
-    }
-
-    while (!cbor_value_at_end(it) && !err) {
-        err = stream(out, "%s", comma);
-        comma = ", ";
-
-        if (!err)
-            err = value_to_pretty(stream, out, it, flags, recursionsLeft);
-
-        if (containerType == CborArrayType)
-            continue;
-
-        /* map: that was the key, so get the value */
-        if (!err)
-            err = stream(out, ": ");
-        if (!err)
-            err = value_to_pretty(stream, out, it, flags, recursionsLeft);
-    }
-    return err;
-}
-
-static CborError value_to_pretty(CborStreamFunction stream, void *out, CborValue *it, int flags, int recursionsLeft)
-{
-    CborError err = CborNoError;
-    CborType type = cbor_value_get_type(it);
-    switch (type) {
-    case CborArrayType:
-    case CborMapType: {
-        /* recursive type */
-        CborValue recursed;
-        const char *indicator = get_indicator(it, flags);
-        const char *space = *indicator ? " " : indicator;
-
-        err = stream(out, "%c%s%s", type == CborArrayType ? '[' : '{', indicator, space);
-        if (err)
-            return err;
-
-        err = cbor_value_enter_container(it, &recursed);
-        if (err) {
-            it->ptr = recursed.ptr;
-            return err;       /* parse error */
-        }
-        err = container_to_pretty(stream, out, &recursed, type, flags, recursionsLeft - 1);
-        if (err) {
-            it->ptr = recursed.ptr;
-            return err;       /* parse error */
-        }
-        err = cbor_value_leave_container(it, &recursed);
-        if (err)
-            return err;       /* parse error */
-
-        return stream(out, type == CborArrayType ? "]" : "}");
-    }
-
-    case CborIntegerType: {
-        uint64_t val;
-        cbor_value_get_raw_integer(it, &val);    /* can't fail */
-
-        if (cbor_value_is_unsigned_integer(it)) {
-            err = stream(out, "%" PRIu64, val);
-        } else {
-            /* CBOR stores the negative number X as -1 - X
-             * (that is, -1 is stored as 0, -2 as 1 and so forth) */
-            if (++val) {                /* unsigned overflow may happen */
-                err = stream(out, "-%" PRIu64, val);
-            } else {
-                /* overflown
-                 *   0xffff`ffff`ffff`ffff + 1 =
-                 * 0x1`0000`0000`0000`0000 = 18446744073709551616 (2^64) */
-                err = stream(out, "-18446744073709551616");
-            }
-        }
-        if (!err)
-            err = stream(out, "%s", get_indicator(it, flags));
-        break;
-    }
-
-    case CborByteStringType:
-    case CborTextStringType: {
-        size_t n = 0;
-        const void *ptr;
-        bool showingFragments = (flags & CborPrettyShowStringFragments) && !cbor_value_is_length_known(it);
-        const char *separator = "";
-        char close = '\'';
-        char open[3] = "h'";
-        const char *indicator = NULL;
-
-        if (type == CborTextStringType) {
-            close = open[0] = '"';
-            open[1] = '\0';
-        }
-
-        if (showingFragments) {
-            err = stream(out, "(_ ");
-            if (!err)
-                err = _cbor_value_prepare_string_iteration(it);
-        } else {
-            err = stream(out, "%s", open);
-        }
-
-        while (!err) {
-            if (showingFragments || indicator == NULL) {
-                /* any iteration, except the second for a non-chunked string */
-                indicator = resolve_indicator(it->ptr, it->parser->end, flags);
-            }
-
-            err = _cbor_value_get_string_chunk(it, &ptr, &n, it);
-            if (err)
-                return err;
-            if (!ptr)
-                break;
-
-            if (!err && showingFragments)
-                err = stream(out, "%s%s", separator, open);
-            if (!err)
-                err = (type == CborByteStringType ?
-                           hexDump(stream, out, ptr, n) :
-                           utf8EscapedDump(stream, out, ptr, n));
-            if (!err && showingFragments) {
-                err = stream(out, "%c%s", close, indicator);
-                separator = ", ";
-            }
-        }
-
-        if (!err) {
-            if (showingFragments)
-                err = stream(out, ")");
-            else
-                err = stream(out, "%c%s", close, indicator);
-        }
-        return err;
-    }
-
-    case CborTagType: {
-        CborTag tag;
-        cbor_value_get_tag(it, &tag);       /* can't fail */
-        err = stream(out, "%" PRIu64 "%s(", tag, get_indicator(it, flags));
-        if (!err)
-            err = cbor_value_advance_fixed(it);
-        if (!err && recursionsLeft)
-            err = value_to_pretty(stream, out, it, flags, recursionsLeft - 1);
-        else if (!err)
-            printRecursionLimit(stream, out);
-        if (!err)
-            err = stream(out, ")");
-        return err;
-    }
-
-    case CborSimpleType: {
-        /* simple types can't fail and can't have overlong encoding */
-        uint8_t simple_type;
-        cbor_value_get_simple_type(it, &simple_type);
-        err = stream(out, "simple(%" PRIu8 ")", simple_type);
-        break;
-    }
-
-    case CborNullType:
-        err = stream(out, "null");
-        break;
-
-    case CborUndefinedType:
-        err = stream(out, "undefined");
-        break;
-
-    case CborBooleanType: {
-        bool val;
-        cbor_value_get_boolean(it, &val);       /* can't fail */
-        err = stream(out, val ? "true" : "false");
-        break;
-    }
-
-#ifndef CBOR_NO_FLOATING_POINT
-    case CborDoubleType: {
-        const char *suffix;
-        double val;
-        int r;
-        uint64_t ival;
-
-        if (false) {
-            float f;
-    case CborFloatType:
-            cbor_value_get_float(it, &f);
-            val = f;
-            suffix = flags & CborPrettyNumericEncodingIndicators ? "_2" : "f";
-        } else if (false) {
-            uint16_t f16;
-    case CborHalfFloatType:
-#ifndef CBOR_NO_HALF_FLOAT_TYPE
-            cbor_value_get_half_float(it, &f16);
-            val = decode_half(f16);
-            suffix = flags & CborPrettyNumericEncodingIndicators ? "_1" : "f16";
-#else
-            (void)f16;
-            err = CborErrorUnsupportedType;
-            break;
-#endif
-        } else {
-            cbor_value_get_double(it, &val);
-            suffix = "";
-        }
-
-        if ((flags & CborPrettyNumericEncodingIndicators) == 0) {
-            r = fpclassify(val);
-            if (r == FP_NAN || r == FP_INFINITE)
-                suffix = "";
-        }
-
-        if (convertToUint64(val, &ival)) {
-            /* this double value fits in a 64-bit integer, so show it as such
-             * (followed by a floating point suffix, to disambiguate) */
-            err = stream(out, "%s%" PRIu64 ".%s", val < 0 ? "-" : "", ival, suffix);
-        } else {
-            /* this number is definitely not a 64-bit integer */
-            err = stream(out, "%." DBL_DECIMAL_DIG_STR "g%s", val, suffix);
-        }
-        break;
-    }
-#else
-    case CborDoubleType:
-    case CborFloatType:
-    case CborHalfFloatType:
-        err = CborErrorUnsupportedType;
-        break;
-#endif /* !CBOR_NO_FLOATING_POINT */
-
-    case CborInvalidType:
-        err = stream(out, "invalid");
-        if (err)
-            return err;
-        return CborErrorUnknownType;
-    }
-
-    if (!err)
-        err = cbor_value_advance_fixed(it);
-    return err;
-}
-
-/**
- * Converts the current CBOR type pointed by \a value to its textual
- * representation and writes it to the stream by calling the \a streamFunction.
- * If an error occurs, this function returns an error code similar to
- * \ref CborParsing.
- *
- * The textual representation can be controlled by the \a flags parameter (see
- * \ref CborPrettyFlags for more information).
- *
- * If no error ocurred, this function advances \a value to the next element.
- * Often, concatenating the text representation of multiple elements can be
- * done by appending a comma to the output stream in between calls to this
- * function.
- *
- * The \a streamFunction function will be called with the \a token value as the
- * first parameter and a printf-style format string as the second, with a variable
- * number of further parameters.
- *
- * \sa cbor_value_to_pretty(), cbor_value_to_json_advance()
- */
-CborError cbor_value_to_pretty_stream(CborStreamFunction streamFunction, void *token, CborValue *value, int flags)
-{
-    return value_to_pretty(streamFunction, token, value, flags, CBOR_PARSER_MAX_RECURSIONS);
-}
-
-/** @} */
diff --git a/src/cborpretty_stdio.c b/src/cborpretty_stdio.c
deleted file mode 100644
index 2013185..0000000
--- a/src/cborpretty_stdio.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include "cbor.h"
-#include <stdarg.h>
-#include <stdio.h>
-
-static CborError cbor_fprintf(void *out, const char *fmt, ...)
-{
-    int n;
-
-    va_list list;
-    va_start(list, fmt);
-    n = vfprintf((FILE *)out, fmt, list);
-    va_end(list);
-
-    return n < 0 ? CborErrorIO : CborNoError;
-}
-
-/**
- * \fn CborError cbor_value_to_pretty(FILE *out, const CborValue *value)
- *
- * Converts the current CBOR type pointed to by \a value to its textual
- * representation and writes it to the \a out stream. If an error occurs, this
- * function returns an error code similar to CborParsing.
- *
- * \sa cbor_value_to_pretty_advance(), cbor_value_to_json_advance()
- */
-
-/**
- * Converts the current CBOR type pointed to by \a value to its textual
- * representation and writes it to the \a out stream. If an error occurs, this
- * function returns an error code similar to CborParsing.
- *
- * If no error ocurred, this function advances \a value to the next element.
- * Often, concatenating the text representation of multiple elements can be
- * done by appending a comma to the output stream in between calls to this
- * function.
- *
- * \sa cbor_value_to_pretty(), cbor_value_to_pretty_stream(), cbor_value_to_json_advance()
- */
-CborError cbor_value_to_pretty_advance(FILE *out, CborValue *value)
-{
-    return cbor_value_to_pretty_stream(cbor_fprintf, out, value, CborPrettyDefaultFlags);
-}
-
-/**
- * Converts the current CBOR type pointed to by \a value to its textual
- * representation and writes it to the \a out stream. If an error occurs, this
- * function returns an error code similar to CborParsing.
- *
- * The textual representation can be controlled by the \a flags parameter (see
- * CborPrettyFlags for more information).
- *
- * If no error ocurred, this function advances \a value to the next element.
- * Often, concatenating the text representation of multiple elements can be
- * done by appending a comma to the output stream in between calls to this
- * function.
- *
- * \sa cbor_value_to_pretty_stream(), cbor_value_to_pretty(), cbor_value_to_json_advance()
- */
-CborError cbor_value_to_pretty_advance_flags(FILE *out, CborValue *value, int flags)
-{
-    return cbor_value_to_pretty_stream(cbor_fprintf, out, value, flags);
-}
-
diff --git a/src/cbortojson.c b/src/cbortojson.c
deleted file mode 100644
index 4b11d31..0000000
--- a/src/cbortojson.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _BSD_SOURCE 1
-#define _DEFAULT_SOURCE 1
-#define _GNU_SOURCE 1
-#define _POSIX_C_SOURCE 200809L
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "cborjson.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/**
- * \defgroup CborToJson Converting CBOR to JSON
- * \brief Group of functions used to convert CBOR to JSON.
- *
- * This group contains two functions that can be used to convert a \ref
- * CborValue object to an equivalent JSON representation. This module attempts
- * to follow the recommendations from RFC 7049 section 4.1 "Converting from
- * CBOR to JSON", though it has a few differences. They are noted below.
- *
- * These functions produce a "minified" JSON output, with no spacing,
- * indentation or line breaks. If those are necessary, they need to be applied
- * in a post-processing phase.
- *
- * Note that JSON cannot support all CBOR types with fidelity, so the
- * conversion is usually lossy. For that reason, TinyCBOR supports adding a set
- * of metadata JSON values that can be used by a JSON-to-CBOR converter to
- * restore the original data types.
- *
- * The TinyCBOR library does not provide a way to convert from JSON
- * representation back to encoded form. However, it provides a tool called
- * \c json2cbor which can be used for that purpose. That tool supports the
- * metadata format that these functions may produce.
- *
- * Either of the functions in this section will attempt to convert exactly one
- * CborValue object to JSON. Those functions may return any error documented
- * for the functions for CborParsing. In addition, if the C standard library
- * stream functions return with error, the text conversion will return with
- * error CborErrorIO.
- *
- * These functions also perform UTF-8 validation in CBOR text strings. If they
- * encounter a sequence of bytes that is not permitted in UTF-8, they will return
- * CborErrorInvalidUtf8TextString. That includes encoding of surrogate points
- * in UTF-8.
- *
- * \warning The metadata produced by these functions is not guaranteed to
- * remain stable. A future update of TinyCBOR may produce different output for
- * the same input and parsers may be unable to handle it.
- *
- * \sa CborParsing, CborPretty, cbor_parser_init()
- */
-
-/**
- * \addtogroup CborToJson
- * @{
- * <h2 class="groupheader">Conversion limitations</h2>
- *
- * When converting from CBOR to JSON, there may be information loss. This
- * section lists the possible scenarios.
- *
- * \par Number precision:
- * ALL JSON numbers, due to its JavaScript heritage, are IEEE 754
- * double-precision floating point. This means JSON is not capable of
- * representing all integers numbers outside the range [-(2<sup>53</sup>)+1,
- * 2<sup>53</sup>-1] and is not capable of representing NaN or infinite. If the
- * CBOR data contains a number outside the valid range, the conversion will
- * lose precision. If the input was NaN or infinite, the result of the
- * conversion will be the JSON null value. In addition, the distinction between
- * half-, single- and double-precision is lost.
- *
- * \par
- * If enabled, the original value and original type are stored in the metadata.
- *
- * \par Non-native types:
- * CBOR's type system is richer than JSON's, which means some data values
- * cannot be represented when converted to JSON. The conversion silently turns
- * them into strings: CBOR simple types become "simple(nn)" where \c nn is the
- * simple type's value, with the exception of CBOR undefined, which becomes
- * "undefined", while CBOR byte strings are converted to an Base16, Base64, or
- * Base64url encoding
- *
- * \par
- * If enabled, the original type is stored in the metadata.
- *
- * \par Presence of tags:
- * JSON has no support for tagged values, so by default tags are dropped when
- * converting to JSON. However, if the CborConvertObeyByteStringTags option is
- * active (default), then certain known tags are honored and are used to format
- * the conversion of the tagged byte string to JSON.
- *
- * \par
- * If the CborConvertTagsToObjects option is active, then the tag and the
- * tagged value are converted to a JSON object. Otherwise, if enabled, the
- * last (innermost) tag is stored in the metadata.
- *
- * \par Non-string keys in maps:
- * JSON requires all Object keys to be strings, while CBOR does not. By
- * default, if a non-string key is found, the conversion fails with error
- * CborErrorJsonObjectKeyNotString. If the CborConvertStringifyMapKeys option
- * is active, then the conversion attempts to create a string representation
- * using CborPretty. Note that the \c json2cbor tool is not able to parse this
- * back to the original form.
- *
- * \par Duplicate keys in maps:
- * Neither JSON nor CBOR allow duplicated keys, but current TinyCBOR does not
- * validate that this is the case. If there are duplicated keys in the input,
- * they will be repeated in the output, which many JSON tools may flag as
- * invalid. In addition to that, if the CborConvertStringifyMapKeys option is
- * active, it is possible that a non-string key in a CBOR map will be converted
- * to a string form that is identical to another key.
- *
- * \par
- * When metadata support is active, the conversion will add extra key-value
- * pairs to the JSON output so it can store the metadata. It is possible that
- * the keys for the metadata clash with existing keys in the JSON map.
- */
-
-extern FILE *open_memstream(char **bufptr, size_t *sizeptr);
-
-enum ConversionStatusFlags {
-    TypeWasNotNative            = 0x100,    /* anything but strings, boolean, null, arrays and maps */
-    TypeWasTagged               = 0x200,
-    NumberPrecisionWasLost      = 0x400,
-    NumberWasNaN                = 0x800,
-    NumberWasInfinite           = 0x1000,
-    NumberWasNegative           = 0x2000,   /* only used with NumberWasInifite or NumberWasTooBig */
-
-    FinalTypeMask               = 0xff
-};
-
-typedef struct ConversionStatus {
-    CborTag lastTag;
-    uint64_t originalNumber;
-    int flags;
-} ConversionStatus;
-
-static CborError value_to_json(FILE *out, CborValue *it, int flags, CborType type, ConversionStatus *status);
-
-static CborError dump_bytestring_base16(char **result, CborValue *it)
-{
-    static const char characters[] = "0123456789abcdef";
-    size_t i;
-    size_t n = 0;
-    uint8_t *buffer;
-    CborError err = cbor_value_calculate_string_length(it, &n);
-    if (err)
-        return err;
-
-    /* a Base16 (hex) output is twice as big as our buffer */
-    buffer = (uint8_t *)malloc(n * 2 + 1);
-    if (buffer == NULL)
-        /* out of memory */
-        return CborErrorOutOfMemory;
-
-    *result = (char *)buffer;
-
-    /* let cbor_value_copy_byte_string know we have an extra byte for the terminating NUL */
-    ++n;
-    err = cbor_value_copy_byte_string(it, buffer + n - 1, &n, it);
-    cbor_assert(err == CborNoError);
-
-    for (i = 0; i < n; ++i) {
-        uint8_t byte = buffer[n + i];
-        buffer[2*i]     = characters[byte >> 4];
-        buffer[2*i + 1] = characters[byte & 0xf];
-    }
-    return CborNoError;
-}
-
-static CborError generic_dump_base64(char **result, CborValue *it, const char alphabet[65])
-{
-    size_t n = 0, i;
-    uint8_t *buffer, *out, *in;
-    CborError err = cbor_value_calculate_string_length(it, &n);
-    if (err)
-        return err;
-
-    /* a Base64 output (untruncated) has 4 bytes for every 3 in the input */
-    size_t len = (n + 5) / 3 * 4;
-    buffer = (uint8_t *)malloc(len + 1);
-    if (buffer == NULL)
-        /* out of memory */
-        return CborErrorOutOfMemory;
-
-    out = buffer;
-    *result = (char *)buffer;
-
-    /* we read our byte string at the tail end of the buffer
-     * so we can do an in-place conversion while iterating forwards */
-    in = buffer + len - n;
-
-    /* let cbor_value_copy_byte_string know we have an extra byte for the terminating NUL */
-    ++n;
-    err = cbor_value_copy_byte_string(it, in, &n, it);
-    cbor_assert(err == CborNoError);
-
-    uint_least32_t val = 0;
-    for (i = 0; n - i >= 3; i += 3) {
-        /* read 3 bytes x 8 bits = 24 bits */
-        if (false) {
-#ifdef __GNUC__
-        } else if (i) {
-            __builtin_memcpy(&val, in + i - 1, sizeof(val));
-            val = cbor_ntohl(val);
-#endif
-        } else {
-            val = (in[i] << 16) | (in[i + 1] << 8) | in[i + 2];
-        }
-
-        /* write 4 chars x 6 bits = 24 bits */
-        *out++ = alphabet[(val >> 18) & 0x3f];
-        *out++ = alphabet[(val >> 12) & 0x3f];
-        *out++ = alphabet[(val >> 6) & 0x3f];
-        *out++ = alphabet[val & 0x3f];
-    }
-
-    /* maybe 1 or 2 bytes left */
-    if (n - i) {
-        /* we can read in[i + 1] even if it's past the end of the string because
-         * we know (by construction) that it's a NUL byte */
-#ifdef __GNUC__
-        uint16_t val16;
-        __builtin_memcpy(&val16, in + i, sizeof(val16));
-        val = cbor_ntohs(val16);
-#else
-        val = (in[i] << 8) | in[i + 1];
-#endif
-        val <<= 8;
-
-        /* the 65th character in the alphabet is our filler: either '=' or '\0' */
-        out[4] = '\0';
-        out[3] = alphabet[64];
-        if (n - i == 2) {
-            /* write the third char in 3 chars x 6 bits = 18 bits */
-            out[2] = alphabet[(val >> 6) & 0x3f];
-        } else {
-            out[2] = alphabet[64];  /* filler */
-        }
-        out[1] = alphabet[(val >> 12) & 0x3f];
-        out[0] = alphabet[(val >> 18) & 0x3f];
-    } else {
-        out[0] = '\0';
-    }
-
-    return CborNoError;
-}
-
-static CborError dump_bytestring_base64(char **result, CborValue *it)
-{
-    static const char alphabet[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
-                                   "ghijklmn" "opqrstuv" "wxyz0123" "456789+/" "=";
-    return generic_dump_base64(result, it, alphabet);
-}
-
-static CborError dump_bytestring_base64url(char **result, CborValue *it)
-{
-    static const char alphabet[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
-                                   "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
-    return generic_dump_base64(result, it, alphabet);
-}
-
-static CborError add_value_metadata(FILE *out, CborType type, const ConversionStatus *status)
-{
-    int flags = status->flags;
-    if (flags & TypeWasTagged) {
-        /* extract the tagged type, which may be JSON native */
-        type = flags & FinalTypeMask;
-        flags &= ~(FinalTypeMask | TypeWasTagged);
-
-        if (fprintf(out, "\"tag\":\"%" PRIu64 "\"%s", status->lastTag,
-                    flags & ~TypeWasTagged ? "," : "") < 0)
-            return CborErrorIO;
-    }
-
-    if (!flags)
-        return CborNoError;
-
-    /* print at least the type */
-    if (fprintf(out, "\"t\":%d", type) < 0)
-        return CborErrorIO;
-
-    if (flags & NumberWasNaN)
-        if (fprintf(out, ",\"v\":\"nan\"") < 0)
-            return CborErrorIO;
-    if (flags & NumberWasInfinite)
-        if (fprintf(out, ",\"v\":\"%sinf\"", flags & NumberWasNegative ? "-" : "") < 0)
-            return CborErrorIO;
-    if (flags & NumberPrecisionWasLost)
-        if (fprintf(out, ",\"v\":\"%c%" PRIx64 "\"", flags & NumberWasNegative ? '-' : '+',
-                    status->originalNumber) < 0)
-            return CborErrorIO;
-    if (type == CborSimpleType)
-        if (fprintf(out, ",\"v\":%d", (int)status->originalNumber) < 0)
-            return CborErrorIO;
-    return CborNoError;
-}
-
-static CborError find_tagged_type(CborValue *it, CborTag *tag, CborType *type)
-{
-    CborError err = CborNoError;
-    *type = cbor_value_get_type(it);
-    while (*type == CborTagType) {
-        cbor_value_get_tag(it, tag);    /* can't fail */
-        err = cbor_value_advance_fixed(it);
-        if (err)
-            return err;
-
-        *type = cbor_value_get_type(it);
-    }
-    return err;
-}
-
-static CborError tagged_value_to_json(FILE *out, CborValue *it, int flags, ConversionStatus *status)
-{
-    CborTag tag;
-    CborError err;
-
-    if (flags & CborConvertTagsToObjects) {
-        cbor_value_get_tag(it, &tag);       /* can't fail */
-        err = cbor_value_advance_fixed(it);
-        if (err)
-            return err;
-
-        if (fprintf(out, "{\"tag%" PRIu64 "\":", tag) < 0)
-            return CborErrorIO;
-
-        CborType type = cbor_value_get_type(it);
-        err = value_to_json(out, it, flags, type, status);
-        if (err)
-            return err;
-        if (flags & CborConvertAddMetadata && status->flags) {
-            if (fprintf(out, ",\"tag%" PRIu64 "$cbor\":{", tag) < 0 ||
-                    add_value_metadata(out, type, status) != CborNoError ||
-                    fputc('}', out) < 0)
-                return CborErrorIO;
-        }
-        if (fputc('}', out) < 0)
-            return CborErrorIO;
-        status->flags = TypeWasNotNative | CborTagType;
-        return CborNoError;
-    }
-
-    CborType type;
-    err = find_tagged_type(it, &status->lastTag, &type);
-    if (err)
-        return err;
-    tag = status->lastTag;
-
-    /* special handling of byte strings? */
-    if (type == CborByteStringType && (flags & CborConvertByteStringsToBase64Url) == 0 &&
-            (tag == CborNegativeBignumTag || tag == CborExpectedBase16Tag || tag == CborExpectedBase64Tag)) {
-        char *str;
-        const char *pre = "";
-
-        if (tag == CborNegativeBignumTag) {
-            pre = "~";
-            err = dump_bytestring_base64url(&str, it);
-        } else if (tag == CborExpectedBase64Tag) {
-            err = dump_bytestring_base64(&str, it);
-        } else { /* tag == CborExpectedBase16Tag */
-            err = dump_bytestring_base16(&str, it);
-        }
-        if (err)
-            return err;
-        err = fprintf(out, "\"%s%s\"", pre, str) < 0 ? CborErrorIO : CborNoError;
-        free(str);
-        status->flags = TypeWasNotNative | TypeWasTagged | CborByteStringType;
-        return err;
-    }
-
-    /* no special handling */
-    err = value_to_json(out, it, flags, type, status);
-    status->flags |= TypeWasTagged | type;
-    return err;
-}
-
-static CborError stringify_map_key(char **key, CborValue *it, int flags, CborType type)
-{
-    (void)flags;    /* unused */
-    (void)type;     /* unused */
-#ifdef WITHOUT_OPEN_MEMSTREAM
-    (void)key;      /* unused */
-    (void)it;       /* unused */
-    return CborErrorJsonNotImplemented;
-#else
-    size_t size;
-
-    FILE *memstream = open_memstream(key, &size);
-    if (memstream == NULL)
-        return CborErrorOutOfMemory;        /* could also be EMFILE, but it's unlikely */
-    CborError err = cbor_value_to_pretty_advance(memstream, it);
-
-    if (unlikely(fclose(memstream) < 0 || *key == NULL))
-        return CborErrorInternalError;
-    return err;
-#endif
-}
-
-static CborError array_to_json(FILE *out, CborValue *it, int flags, ConversionStatus *status)
-{
-    const char *comma = "";
-    while (!cbor_value_at_end(it)) {
-        if (fprintf(out, "%s", comma) < 0)
-            return CborErrorIO;
-        comma = ",";
-
-        CborError err = value_to_json(out, it, flags, cbor_value_get_type(it), status);
-        if (err)
-            return err;
-    }
-    return CborNoError;
-}
-
-static CborError map_to_json(FILE *out, CborValue *it, int flags, ConversionStatus *status)
-{
-    const char *comma = "";
-    CborError err;
-    while (!cbor_value_at_end(it)) {
-        char *key;
-        if (fprintf(out, "%s", comma) < 0)
-            return CborErrorIO;
-        comma = ",";
-
-        CborType keyType = cbor_value_get_type(it);
-        if (likely(keyType == CborTextStringType)) {
-            size_t n = 0;
-            err = cbor_value_dup_text_string(it, &key, &n, it);
-        } else if (flags & CborConvertStringifyMapKeys) {
-            err = stringify_map_key(&key, it, flags, keyType);
-        } else {
-            return CborErrorJsonObjectKeyNotString;
-        }
-        if (err)
-            return err;
-
-        /* first, print the key */
-        if (fprintf(out, "\"%s\":", key) < 0) {
-            free(key);
-            return CborErrorIO;
-        }
-
-        /* then, print the value */
-        CborType valueType = cbor_value_get_type(it);
-        err = value_to_json(out, it, flags, valueType, status);
-
-        /* finally, print any metadata we may have */
-        if (flags & CborConvertAddMetadata) {
-            if (!err && keyType != CborTextStringType) {
-                if (fprintf(out, ",\"%s$keycbordump\":true", key) < 0)
-                    err = CborErrorIO;
-            }
-            if (!err && status->flags) {
-                if (fprintf(out, ",\"%s$cbor\":{", key) < 0 ||
-                        add_value_metadata(out, valueType, status) != CborNoError ||
-                        fputc('}', out) < 0)
-                    err = CborErrorIO;
-            }
-        }
-
-        free(key);
-        if (err)
-            return err;
-    }
-    return CborNoError;
-}
-
-static CborError value_to_json(FILE *out, CborValue *it, int flags, CborType type, ConversionStatus *status)
-{
-    CborError err;
-    status->flags = 0;
-
-    switch (type) {
-    case CborArrayType:
-    case CborMapType: {
-        /* recursive type */
-        CborValue recursed;
-        err = cbor_value_enter_container(it, &recursed);
-        if (err) {
-            it->ptr = recursed.ptr;
-            return err;       /* parse error */
-        }
-        if (fputc(type == CborArrayType ? '[' : '{', out) < 0)
-            return CborErrorIO;
-
-        err = (type == CborArrayType) ?
-                  array_to_json(out, &recursed, flags, status) :
-                  map_to_json(out, &recursed, flags, status);
-        if (err) {
-            it->ptr = recursed.ptr;
-            return err;       /* parse error */
-        }
-
-        if (fputc(type == CborArrayType ? ']' : '}', out) < 0)
-            return CborErrorIO;
-        err = cbor_value_leave_container(it, &recursed);
-        if (err)
-            return err;       /* parse error */
-
-        status->flags = 0;    /* reset, there are never conversion errors for us */
-        return CborNoError;
-    }
-
-    case CborIntegerType: {
-        double num;     /* JS numbers are IEEE double precision */
-        uint64_t val;
-        cbor_value_get_raw_integer(it, &val);    /* can't fail */
-        num = (double)val;
-
-        if (cbor_value_is_negative_integer(it)) {
-            num = -num - 1;                     /* convert to negative */
-            if ((uint64_t)(-num - 1) != val) {
-                status->flags = NumberPrecisionWasLost | NumberWasNegative;
-                status->originalNumber = val;
-            }
-        } else {
-            if ((uint64_t)num != val) {
-                status->flags = NumberPrecisionWasLost;
-                status->originalNumber = val;
-            }
-        }
-        if (fprintf(out, "%.0f", num) < 0)  /* this number has no fraction, so no decimal points please */
-            return CborErrorIO;
-        break;
-    }
-
-    case CborByteStringType:
-    case CborTextStringType: {
-        char *str;
-        if (type == CborByteStringType) {
-            err = dump_bytestring_base64url(&str, it);
-            status->flags = TypeWasNotNative;
-        } else {
-            size_t n = 0;
-            err = cbor_value_dup_text_string(it, &str, &n, it);
-        }
-        if (err)
-            return err;
-        err = (fprintf(out, "\"%s\"", str) < 0) ? CborErrorIO : CborNoError;
-        free(str);
-        return err;
-    }
-
-    case CborTagType:
-        return tagged_value_to_json(out, it, flags, status);
-
-    case CborSimpleType: {
-        uint8_t simple_type;
-        cbor_value_get_simple_type(it, &simple_type);  /* can't fail */
-        status->flags = TypeWasNotNative;
-        status->originalNumber = simple_type;
-        if (fprintf(out, "\"simple(%" PRIu8 ")\"", simple_type) < 0)
-            return CborErrorIO;
-        break;
-    }
-
-    case CborNullType:
-        if (fprintf(out, "null") < 0)
-            return CborErrorIO;
-        break;
-
-    case CborUndefinedType:
-        status->flags = TypeWasNotNative;
-        if (fprintf(out, "\"undefined\"") < 0)
-            return CborErrorIO;
-        break;
-
-    case CborBooleanType: {
-        bool val;
-        cbor_value_get_boolean(it, &val);       /* can't fail */
-        if (fprintf(out, val ? "true" : "false") < 0)
-            return CborErrorIO;
-        break;
-    }
-
-#ifndef CBOR_NO_FLOATING_POINT
-    case CborDoubleType: {
-        double val;
-        if (false) {
-            float f;
-    case CborFloatType:
-            status->flags = TypeWasNotNative;
-            cbor_value_get_float(it, &f);
-            val = f;
-        } else if (false) {
-            uint16_t f16;
-    case CborHalfFloatType:
-#  ifndef CBOR_NO_HALF_FLOAT_TYPE
-            status->flags = TypeWasNotNative;
-            cbor_value_get_half_float(it, &f16);
-            val = decode_half(f16);
-#  else
-            (void)f16;
-            err = CborErrorUnsupportedType;
-            break;
-#  endif
-        } else {
-            cbor_value_get_double(it, &val);
-        }
-
-        int r = fpclassify(val);
-        if (r == FP_NAN || r == FP_INFINITE) {
-            if (fprintf(out, "null") < 0)
-                return CborErrorIO;
-            status->flags |= r == FP_NAN ? NumberWasNaN :
-                                           NumberWasInfinite | (val < 0 ? NumberWasNegative : 0);
-        } else {
-            uint64_t ival = (uint64_t)fabs(val);
-            if ((double)ival == fabs(val)) {
-                /* print as integer so we get the full precision */
-                r = fprintf(out, "%s%" PRIu64, val < 0 ? "-" : "", ival);
-                status->flags |= TypeWasNotNative;   /* mark this integer number as a double */
-            } else {
-                /* this number is definitely not a 64-bit integer */
-                r = fprintf(out, "%." DBL_DECIMAL_DIG_STR "g", val);
-            }
-            if (r < 0)
-                return CborErrorIO;
-        }
-        break;
-    }
-#else
-    case CborDoubleType:
-    case CborFloatType:
-    case CborHalfFloatType:
-        err = CborErrorUnsupportedType;
-        break;
-#endif /* !CBOR_NO_FLOATING_POINT */
-
-    case CborInvalidType:
-        return CborErrorUnknownType;
-    }
-
-    return cbor_value_advance_fixed(it);
-}
-
-/**
- * \enum CborToJsonFlags
- * The CborToJsonFlags enum contains flags that control the conversion of CBOR to JSON.
- *
- * \value CborConvertAddMetadata        Adds metadata to facilitate restoration of the original CBOR data.
- * \value CborConvertTagsToObjects      Converts CBOR tags to JSON objects
- * \value CborConvertIgnoreTags         (default) Ignore CBOR tags, except for byte strings
- * \value CborConvertObeyByteStringTags (default) Honor formatting of CBOR byte strings if so tagged
- * \value CborConvertByteStringsToBase64Url Force the conversion of all CBOR byte strings to Base64url encoding, despite any tags
- * \value CborConvertRequireMapStringKeys (default) Require CBOR map keys to be strings, failing the conversion if they are not
- * \value CborConvertStringifyMapKeys   Convert non-string keys in CBOR maps to a string form
- * \value CborConvertDefaultFlags       Default conversion flags.
- */
-
-/**
- * \fn CborError cbor_value_to_json(FILE *out, const CborValue *value, int flags)
- *
- * Converts the current CBOR type pointed to by \a value to JSON and writes that
- * to the \a out stream. If an error occurs, this function returns an error
- * code similar to CborParsing. The \a flags parameter indicates one or more of
- * the flags from CborToJsonFlags that control the conversion.
- *
- * \sa cbor_value_to_json_advance(), cbor_value_to_pretty()
- */
-
-/**
- * Converts the current CBOR type pointed to by \a value to JSON and writes that
- * to the \a out stream. If an error occurs, this function returns an error
- * code similar to CborParsing. The \a flags parameter indicates one or more of
- * the flags from CborToJsonFlags that control the conversion.
- *
- * If no error ocurred, this function advances \a value to the next element.
- *
- * \sa cbor_value_to_json(), cbor_value_to_pretty_advance()
- */
-CborError cbor_value_to_json_advance(FILE *out, CborValue *value, int flags)
-{
-    ConversionStatus status;
-    return value_to_json(out, value, flags, cbor_value_get_type(value), &status);
-}
-
-/** @} */
diff --git a/src/cborvalidation.c b/src/cborvalidation.c
deleted file mode 100644
index 6c9d383..0000000
--- a/src/cborvalidation.c
+++ /dev/null
@@ -1,670 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _BSD_SOURCE 1
-#define _DEFAULT_SOURCE 1
-#ifndef __STDC_LIMIT_MACROS
-#  define __STDC_LIMIT_MACROS 1
-#endif
-
-#include "cbor.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-#include "utf8_p.h"
-
-#include <string.h>
-
-#ifndef CBOR_NO_FLOATING_POINT
-#  include <float.h>
-#  include <math.h>
-#endif
-
-
-#ifndef CBOR_PARSER_MAX_RECURSIONS
-#  define CBOR_PARSER_MAX_RECURSIONS 1024
-#endif
-
-/**
- * \addtogroup CborParsing
- * @{
- */
-
-/**
- * \enum CborValidationFlags
- * The CborValidationFlags enum contains flags that control the validation of a
- * CBOR stream.
- *
- * \value CborValidateBasic         Validates only the syntactic correctedness of the stream.
- * \value CborValidateCanonical     Validates that the stream is in canonical format, according to
- *                                  RFC 7049 section 3.9.
- * \value CborValidateStrictMode    Performs strict validation, according to RFC 7049 section 3.10.
- * \value CborValidateStrictest     Attempt to perform the strictest validation we know of.
- *
- * \value CborValidateShortestIntegrals     (Canonical) Validate that integral numbers and lengths are
- *                                          enconded in their shortest form possible.
- * \value CborValidateShortestFloatingPoint (Canonical) Validate that floating-point numbers are encoded
- *                                          in their shortest form possible.
- * \value CborValidateShortestNumbers       (Canonical) Validate both integral and floating-point numbers
- *                                          are in their shortest form possible.
- * \value CborValidateNoIndeterminateLength (Canonical) Validate that no string, array or map uses
- *                                          indeterminate length encoding.
- * \value CborValidateMapIsSorted           (Canonical & Strict mode) Validate that map keys appear in
- *                                          sorted order.
- * \value CborValidateMapKeysAreUnique      (Strict mode) Validate that map keys are unique.
- * \value CborValidateTagUse                (Strict mode) Validate that known tags are used with the
- *                                          correct types. This does not validate that the content of
- *                                          those types is syntactically correct. For example, this
- *                                          option validates that tag 1 (DateTimeString) is used with
- *                                          a Text String, but it does not validate that the string is
- *                                          a valid date/time representation.
- * \value CborValidateUtf8                  (Strict mode) Validate that text strings are appropriately
- *                                          encoded in UTF-8.
- * \value CborValidateMapKeysAreString      Validate that all map keys are text strings.
- * \value CborValidateNoUndefined           Validate that no elements of type "undefined" are present.
- * \value CborValidateNoTags                Validate that no tags are used.
- * \value CborValidateFiniteFloatingPoint   Validate that all floating point numbers are finite (no NaN or
- *                                          infinities are allowed).
- * \value CborValidateCompleteData          Validate that the stream is complete and there is no more data
- *                                          in the buffer.
- * \value CborValidateNoUnknownSimpleTypesSA Validate that all Standards Action simple types are registered
- *                                          with IANA.
- * \value CborValidateNoUnknownSimpleTypes  Validate that all simple types used are registered with IANA.
- * \value CborValidateNoUnknownTagsSA       Validate that all Standard Actions tags are registered with IANA.
- * \value CborValidateNoUnknownTagsSR       Validate that all Standard Actions and Specification Required tags
- *                                          are registered with IANA (see below for limitations).
- * \value CborValidateNoUnkonwnTags         Validate that all tags are registered with IANA
- *                                          (see below for limitations).
- *
- * \par Simple type registry
- * The CBOR specification requires that registration for use of the first 19
- * simple types must be done by way of Standards Action. The rest of the simple
- * types only require a specification. The official list can be obtained from
- *  https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xhtml.
- *
- * \par
- * There are no registered simple types recognized by this release of TinyCBOR
- * (beyond those defined by RFC 7049).
- *
- * \par Tag registry
- * The CBOR specification requires that registration for use of the first 23
- * tags must be done by way of Standards Action. The next up to tag 255 only
- * require a specification. Finally, all other tags can be registered on a
- * first-come-first-serve basis. The official list can be ontained from
- *  https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml.
- *
- * \par
- * Given the variability of this list, TinyCBOR cannot recognize all tags
- * registered with IANA. Instead, the implementation only recognizes tags
- * that are backed by an RFC.
- *
- * \par
- * These are the tags known to the current TinyCBOR release:
-<table>
-  <tr>
-    <th>Tag</th>
-    <th>Data Item</th>
-    <th>Semantics</th>
-  </tr>
-  <tr>
-    <td>0</td>
-    <td>UTF-8 text string</td>
-    <td>Standard date/time string</td>
-  </tr>
-  <tr>
-    <td>1</td>
-    <td>integer</td>
-    <td>Epoch-based date/time</td>
-  </tr>
-  <tr>
-    <td>2</td>
-    <td>byte string</td>
-    <td>Positive bignum</td>
-  </tr>
-  <tr>
-    <td>3</td>
-    <td>byte string</td>
-    <td>Negative bignum</td>
-  </tr>
-  <tr>
-    <td>4</td>
-    <td>array</td>
-    <td>Decimal fraction</td>
-  </tr>
-  <tr>
-    <td>5</td>
-    <td>array</td>
-    <td>Bigfloat</td>
-  </tr>
-  <tr>
-    <td>16</td>
-    <td>array</td>
-    <td>COSE Single Recipient Encrypted Data Object (RFC 8152)</td>
-  </tr>
-  <tr>
-    <td>17</td>
-    <td>array</td>
-    <td>COSE Mac w/o Recipients Object (RFC 8152)</td>
-  </tr>
-  <tr>
-    <td>18</td>
-    <td>array</td>
-    <td>COSE Single Signer Data Object (RFC 8162)</td>
-  </tr>
-  <tr>
-    <td>21</td>
-    <td>byte string, array, map</td>
-    <td>Expected conversion to base64url encoding</td>
-  </tr>
-  <tr>
-    <td>22</td>
-    <td>byte string, array, map</td>
-    <td>Expected conversion to base64 encoding</td>
-  </tr>
-  <tr>
-    <td>23</td>
-    <td>byte string, array, map</td>
-    <td>Expected conversion to base16 encoding</td>
-  </tr>
-  <tr>
-    <td>24</td>
-    <td>byte string</td>
-    <td>Encoded CBOR data item</td>
-  </tr>
-  <tr>
-    <td>32</td>
-    <td>UTF-8 text string</td>
-    <td>URI</td>
-  </tr>
-  <tr>
-    <td>33</td>
-    <td>UTF-8 text string</td>
-    <td>base64url</td>
-  </tr>
-  <tr>
-    <td>34</td>
-    <td>UTF-8 text string</td>
-    <td>base64</td>
-  </tr>
-  <tr>
-    <td>35</td>
-    <td>UTF-8 text string</td>
-    <td>Regular expression</td>
-  </tr>
-  <tr>
-    <td>36</td>
-    <td>UTF-8 text string</td>
-    <td>MIME message</td>
-  </tr>
-  <tr>
-    <td>96</td>
-    <td>array</td>
-    <td>COSE Encrypted Data Object (RFC 8152)</td>
-  </tr>
-  <tr>
-    <td>97</td>
-    <td>array</td>
-    <td>COSE MACed Data Object (RFC 8152)</td>
-  </tr>
-  <tr>
-    <td>98</td>
-    <td>array</td>
-    <td>COSE Signed Data Object (RFC 8152)</td>
-  </tr>
-  <tr>
-    <td>55799</td>
-    <td>any</td>
-    <td>Self-describe CBOR</td>
-  </tr>
-</table>
- */
-
-struct KnownTagData { uint32_t tag; uint32_t types; };
-static const struct KnownTagData knownTagData[] = {
-    { 0, (uint32_t)CborTextStringType },
-    { 1, (uint32_t)(CborIntegerType+1) },
-    { 2, (uint32_t)CborByteStringType },
-    { 3, (uint32_t)CborByteStringType },
-    { 4, (uint32_t)CborArrayType },
-    { 5, (uint32_t)CborArrayType },
-    { 16, (uint32_t)CborArrayType },
-    { 17, (uint32_t)CborArrayType },
-    { 18, (uint32_t)CborArrayType },
-    { 21, (uint32_t)CborByteStringType | ((uint32_t)CborArrayType << 8) | ((uint32_t)CborMapType << 16) },
-    { 22, (uint32_t)CborByteStringType | ((uint32_t)CborArrayType << 8) | ((uint32_t)CborMapType << 16) },
-    { 23, (uint32_t)CborByteStringType | ((uint32_t)CborArrayType << 8) | ((uint32_t)CborMapType << 16) },
-    { 24, (uint32_t)CborByteStringType },
-    { 32, (uint32_t)CborTextStringType },
-    { 33, (uint32_t)CborTextStringType },
-    { 34, (uint32_t)CborTextStringType },
-    { 35, (uint32_t)CborTextStringType },
-    { 36, (uint32_t)CborTextStringType },
-    { 96, (uint32_t)CborArrayType },
-    { 97, (uint32_t)CborArrayType },
-    { 98, (uint32_t)CborArrayType },
-    { 55799, 0U }
-};
-
-static CborError validate_value(CborValue *it, uint32_t flags, int recursionLeft);
-
-static inline CborError validate_utf8_string(const void *ptr, size_t n)
-{
-    const uint8_t *buffer = (const uint8_t *)ptr;
-    const uint8_t * const end = buffer + n;
-    while (buffer < end) {
-        uint32_t uc = get_utf8(&buffer, end);
-        if (uc == ~0U)
-            return CborErrorInvalidUtf8TextString;
-    }
-    return CborNoError;
-}
-
-static inline CborError validate_simple_type(uint8_t simple_type, uint32_t flags)
-{
-    /* At current time, all known simple types are those from RFC 7049,
-     * which are parsed by the parser into different CBOR types.
-     * That means that if we've got here, the type is unknown */
-    if (simple_type < 32)
-        return (flags & CborValidateNoUnknownSimpleTypesSA) ? CborErrorUnknownSimpleType : CborNoError;
-    return (flags & CborValidateNoUnknownSimpleTypes) == CborValidateNoUnknownSimpleTypes ?
-                CborErrorUnknownSimpleType : CborNoError;
-}
-
-static inline CborError validate_number(const CborValue *it, CborType type, uint32_t flags)
-{
-    CborError err = CborNoError;
-    const uint8_t *ptr = it->ptr;
-    size_t bytesUsed, bytesNeeded;
-    uint64_t value;
-
-    if ((flags & CborValidateShortestIntegrals) == 0)
-        return err;
-    if (type >= CborHalfFloatType && type <= CborDoubleType)
-        return err;     /* checked elsewhere */
-
-    err = _cbor_value_extract_number(&ptr, it->parser->end, &value);
-    if (err)
-        return err;
-
-    bytesUsed = (size_t)(ptr - it->ptr - 1);
-    bytesNeeded = 0;
-    if (value >= Value8Bit)
-        ++bytesNeeded;
-    if (value > 0xffU)
-        ++bytesNeeded;
-    if (value > 0xffffU)
-        bytesNeeded += 2;
-    if (value > 0xffffffffU)
-        bytesNeeded += 4;
-    if (bytesNeeded < bytesUsed)
-        return CborErrorOverlongEncoding;
-    return CborNoError;
-}
-
-static inline CborError validate_tag(CborValue *it, CborTag tag, uint32_t flags, int recursionLeft)
-{
-    CborType type = cbor_value_get_type(it);
-    const size_t knownTagCount = sizeof(knownTagData) / sizeof(knownTagData[0]);
-    const struct KnownTagData *tagData = knownTagData;
-    const struct KnownTagData * const knownTagDataEnd = knownTagData + knownTagCount;
-
-    if (!recursionLeft)
-        return CborErrorNestingTooDeep;
-    if (flags & CborValidateNoTags)
-        return CborErrorExcludedType;
-
-    /* find the tag data, if any */
-    for ( ; tagData != knownTagDataEnd; ++tagData) {
-        if (tagData->tag < tag)
-            continue;
-        if (tagData->tag > tag)
-            tagData = NULL;
-        break;
-    }
-    if (tagData == knownTagDataEnd)
-        tagData = NULL;
-
-    if (flags & CborValidateNoUnknownTags && !tagData) {
-        /* tag not found */
-        if (flags & CborValidateNoUnknownTagsSA && tag < 24)
-            return CborErrorUnknownTag;
-        if ((flags & CborValidateNoUnknownTagsSR) == CborValidateNoUnknownTagsSR && tag < 256)
-            return CborErrorUnknownTag;
-        if ((flags & CborValidateNoUnknownTags) == CborValidateNoUnknownTags)
-            return CborErrorUnknownTag;
-    }
-
-    if (flags & CborValidateTagUse && tagData && tagData->types) {
-        uint32_t allowedTypes = tagData->types;
-
-        /* correct Integer so it's not zero */
-        if (type == CborIntegerType)
-            type = (CborType)(type + 1);
-
-        while (allowedTypes) {
-            if ((uint8_t)(allowedTypes & 0xff) == type)
-                break;
-            allowedTypes >>= 8;
-        }
-        if (!allowedTypes)
-            return CborErrorInappropriateTagForType;
-    }
-
-    return validate_value(it, flags, recursionLeft);
-}
-
-#ifndef CBOR_NO_FLOATING_POINT
-static inline CborError validate_floating_point(CborValue *it, CborType type, uint32_t flags)
-{
-    CborError err;
-    int r;
-    double val;
-    float valf;
-    uint16_t valf16;
-
-    if (type != CborDoubleType) {
-        if (type == CborFloatType) {
-            err = cbor_value_get_float(it, &valf);
-            val = valf;
-        } else {
-#  ifdef CBOR_NO_HALF_FLOAT_TYPE
-            (void)valf16;
-            return CborErrorUnsupportedType;
-#  else
-            err = cbor_value_get_half_float(it, &valf16);
-            val = decode_half(valf16);
-#  endif
-        }
-    } else {
-        err = cbor_value_get_double(it, &val);
-    }
-    cbor_assert(err == CborNoError);     /* can't fail */
-
-    r = fpclassify(val);
-    if (r == FP_NAN || r == FP_INFINITE) {
-        if (flags & CborValidateFiniteFloatingPoint)
-            return CborErrorExcludedValue;
-        if (flags & CborValidateShortestFloatingPoint) {
-            if (type == CborDoubleType)
-                return CborErrorOverlongEncoding;
-#  ifndef CBOR_NO_HALF_FLOAT_TYPE
-            if (type == CborFloatType)
-                return CborErrorOverlongEncoding;
-            if (r == FP_NAN && valf16 != 0x7e00)
-                return CborErrorImproperValue;
-            if (r == FP_INFINITE && valf16 != 0x7c00 && valf16 != 0xfc00)
-                return CborErrorImproperValue;
-#  endif
-        }
-    }
-
-    if (flags & CborValidateShortestFloatingPoint && type > CborHalfFloatType) {
-        if (type == CborDoubleType) {
-            valf = (float)val;
-            if ((double)valf == val)
-                return CborErrorOverlongEncoding;
-        }
-#  ifndef CBOR_NO_HALF_FLOAT_TYPE
-        if (type == CborFloatType) {
-            valf16 = encode_half(valf);
-            if (valf == decode_half(valf16))
-                return CborErrorOverlongEncoding;
-        }
-#  endif
-    }
-
-    return CborNoError;
-}
-#endif
-
-static CborError validate_container(CborValue *it, int containerType, uint32_t flags, int recursionLeft)
-{
-    CborError err;
-    const uint8_t *previous = NULL;
-    const uint8_t *previous_end = NULL;
-
-    if (!recursionLeft)
-        return CborErrorNestingTooDeep;
-
-    while (!cbor_value_at_end(it)) {
-        const uint8_t *current = cbor_value_get_next_byte(it);
-
-        if (containerType == CborMapType) {
-            if (flags & CborValidateMapKeysAreString) {
-                CborType type = cbor_value_get_type(it);
-                if (type == CborTagType) {
-                    /* skip the tags */
-                    CborValue copy = *it;
-                    err = cbor_value_skip_tag(&copy);
-                    if (err)
-                        return err;
-                    type = cbor_value_get_type(&copy);
-                }
-                if (type != CborTextStringType)
-                    return CborErrorMapKeyNotString;
-            }
-        }
-
-        err = validate_value(it, flags, recursionLeft);
-        if (err)
-            return err;
-
-        if (containerType != CborMapType)
-            continue;
-
-        if (flags & CborValidateMapIsSorted) {
-            if (previous) {
-                uint64_t len1, len2;
-                const uint8_t *ptr;
-
-                /* extract the two lengths */
-                ptr = previous;
-                _cbor_value_extract_number(&ptr, it->parser->end, &len1);
-                ptr = current;
-                _cbor_value_extract_number(&ptr, it->parser->end, &len2);
-
-                if (len1 > len2)
-                    return CborErrorMapNotSorted;
-                if (len1 == len2) {
-                    size_t bytelen1 = (size_t)(previous_end - previous);
-                    size_t bytelen2 = (size_t)(it->ptr - current);
-                    int r = memcmp(previous, current, bytelen1 <= bytelen2 ? bytelen1 : bytelen2);
-
-                    if (r == 0 && bytelen1 != bytelen2)
-                        r = bytelen1 < bytelen2 ? -1 : +1;
-                    if (r > 0)
-                        return CborErrorMapNotSorted;
-                    if (r == 0 && (flags & CborValidateMapKeysAreUnique) == CborValidateMapKeysAreUnique)
-                        return CborErrorMapKeysNotUnique;
-                }
-            }
-
-            previous = current;
-            previous_end = it->ptr;
-        }
-
-        /* map: that was the key, so get the value */
-        err = validate_value(it, flags, recursionLeft);
-        if (err)
-            return err;
-    }
-    return CborNoError;
-}
-
-static CborError validate_value(CborValue *it, uint32_t flags, int recursionLeft)
-{
-    CborError err;
-    CborType type = cbor_value_get_type(it);
-
-    if (cbor_value_is_length_known(it)) {
-        err = validate_number(it, type, flags);
-        if (err)
-            return err;
-    } else {
-        if (flags & CborValidateNoIndeterminateLength)
-            return CborErrorUnknownLength;
-    }
-
-    switch (type) {
-    case CborArrayType:
-    case CborMapType: {
-        /* recursive type */
-        CborValue recursed;
-        err = cbor_value_enter_container(it, &recursed);
-        if (!err)
-            err = validate_container(&recursed, type, flags, recursionLeft - 1);
-        if (err) {
-            it->ptr = recursed.ptr;
-            return err;
-        }
-        err = cbor_value_leave_container(it, &recursed);
-        if (err)
-            return err;
-        return CborNoError;
-    }
-
-    case CborIntegerType: {
-        uint64_t val;
-        err = cbor_value_get_raw_integer(it, &val);
-        cbor_assert(err == CborNoError);         /* can't fail */
-
-        break;
-    }
-
-    case CborByteStringType:
-    case CborTextStringType: {
-        size_t n = 0;
-        const void *ptr;
-
-        err = _cbor_value_prepare_string_iteration(it);
-        if (err)
-            return err;
-
-        while (1) {
-            CborValue next;
-            err = _cbor_value_get_string_chunk(it, &ptr, &n, &next);
-            if (err)
-                return err;
-            if (ptr) {
-                err = validate_number(it, type, flags);
-                if (err)
-                    return err;
-            }
-
-            *it = next;
-            if (!ptr)
-                break;
-
-            if (type == CborTextStringType && flags & CborValidateUtf8) {
-                err = validate_utf8_string(ptr, n);
-                if (err)
-                    return err;
-            }
-        }
-
-        return CborNoError;
-    }
-
-    case CborTagType: {
-        CborTag tag;
-        err = cbor_value_get_tag(it, &tag);
-        cbor_assert(err == CborNoError);     /* can't fail */
-
-        err = cbor_value_advance_fixed(it);
-        if (err)
-            return err;
-        err = validate_tag(it, tag, flags, recursionLeft - 1);
-        if (err)
-            return err;
-
-        return CborNoError;
-    }
-
-    case CborSimpleType: {
-        uint8_t simple_type;
-        err = cbor_value_get_simple_type(it, &simple_type);
-        cbor_assert(err == CborNoError);     /* can't fail */
-        err = validate_simple_type(simple_type, flags);
-        if (err)
-            return err;
-        break;
-    }
-
-    case CborNullType:
-    case CborBooleanType:
-        break;
-
-    case CborUndefinedType:
-        if (flags & CborValidateNoUndefined)
-            return CborErrorExcludedType;
-        break;
-
-    case CborHalfFloatType:
-    case CborFloatType:
-    case CborDoubleType: {
-#ifdef CBOR_NO_FLOATING_POINT
-        return CborErrorUnsupportedType;
-#else
-        err = validate_floating_point(it, type, flags);
-        if (err)
-            return err;
-        break;
-#endif /* !CBOR_NO_FLOATING_POINT */
-    }
-
-    case CborInvalidType:
-        return CborErrorUnknownType;
-    }
-
-    err = cbor_value_advance_fixed(it);
-    return err;
-}
-
-/**
- * Performs a full validation, controlled by the \a flags options, of the CBOR
- * stream pointed by \a it and returns the error it found. If no error was
- * found, it returns CborNoError and the application can iterate over the items
- * with certainty that no errors will appear during parsing.
- *
- * If \a flags is CborValidateBasic, the result should be the same as
- * cbor_value_validate_basic().
- *
- * This function has the same timing and memory requirements as
- * cbor_value_advance() and cbor_value_validate_basic().
- *
- * \sa CborValidationFlags, cbor_value_validate_basic(), cbor_value_advance()
- */
-CborError cbor_value_validate(const CborValue *it, uint32_t flags)
-{
-    CborValue value = *it;
-    CborError err = validate_value(&value, flags, CBOR_PARSER_MAX_RECURSIONS);
-    if (err)
-        return err;
-    if (flags & CborValidateCompleteData && it->ptr != it->parser->end)
-        return CborErrorGarbageAtEnd;
-    return CborNoError;
-}
-
-/**
- * @}
- */
diff --git a/src/compilersupport_p.h b/src/compilersupport_p.h
deleted file mode 100644
index 0879801..0000000
--- a/src/compilersupport_p.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef COMPILERSUPPORT_H
-#define COMPILERSUPPORT_H
-
-#include "cbor.h"
-
-#ifndef _BSD_SOURCE
-#  define _BSD_SOURCE
-#endif
-#ifndef _DEFAULT_SOURCE
-#  define _DEFAULT_SOURCE
-#endif
-#ifndef assert
-#  include <assert.h>
-#endif
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#ifndef __cplusplus
-#  include <stdbool.h>
-#endif
-
-#if __STDC_VERSION__ >= 201112L || (defined(__cplusplus) && __cplusplus >= 201103L) || (defined(__cpp_static_assert) && __cpp_static_assert >= 200410)
-#  define cbor_static_assert(x)         static_assert(x, #x)
-#elif !defined(__cplusplus) && defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) && (__STDC_VERSION__ > 199901L)
-#  define cbor_static_assert(x)         _Static_assert(x, #x)
-#else
-#  define cbor_static_assert(x)         ((void)sizeof(char[2*!!(x) - 1]))
-#endif
-#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
-/* inline is a keyword */
-#else
-/* use the definition from cbor.h */
-#  define inline    CBOR_INLINE
-#endif
-
-#ifdef NDEBUG
-#  define cbor_assert(cond)     do { if (!(cond)) unreachable(); } while (0)
-#else
-#  define cbor_assert(cond)     assert(cond)
-#endif
-
-#ifndef STRINGIFY
-#define STRINGIFY(x)            STRINGIFY2(x)
-#endif
-#define STRINGIFY2(x)           #x
-
-#if !defined(UINT32_MAX) || !defined(INT64_MAX)
-/* C89? We can define UINT32_MAX portably, but not INT64_MAX */
-#  error "Your system has stdint.h but that doesn't define UINT32_MAX or INT64_MAX"
-#endif
-
-#ifndef DBL_DECIMAL_DIG
-/* DBL_DECIMAL_DIG is C11 */
-#  define DBL_DECIMAL_DIG       17
-#endif
-#define DBL_DECIMAL_DIG_STR     STRINGIFY(DBL_DECIMAL_DIG)
-
-#if defined(__GNUC__) && defined(__i386__) && !defined(__iamcu__)
-#  define CBOR_INTERNAL_API_CC          __attribute__((regparm(3)))
-#elif defined(_MSC_VER) && defined(_M_IX86)
-#  define CBOR_INTERNAL_API_CC          __fastcall
-#else
-#  define CBOR_INTERNAL_API_CC
-#endif
-
-#ifndef __has_builtin
-#  define __has_builtin(x)  0
-#endif
-
-#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) || \
-    (__has_builtin(__builtin_bswap64) && __has_builtin(__builtin_bswap32))
-#  if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-#    define cbor_ntohll     __builtin_bswap64
-#    define cbor_htonll     __builtin_bswap64
-#    define cbor_ntohl      __builtin_bswap32
-#    define cbor_htonl      __builtin_bswap32
-#    ifdef __INTEL_COMPILER
-#      define cbor_ntohs    _bswap16
-#      define cbor_htons    _bswap16
-#    elif (__GNUC__ * 100 + __GNUC_MINOR__ >= 608) || __has_builtin(__builtin_bswap16)
-#      define cbor_ntohs    __builtin_bswap16
-#      define cbor_htons    __builtin_bswap16
-#    else
-#      define cbor_ntohs(x) (((uint16_t)(x) >> 8) | ((uint16_t)(x) << 8))
-#      define cbor_htons    cbor_ntohs
-#    endif
-#  else
-#    define cbor_ntohll
-#    define cbor_htonll
-#    define cbor_ntohl
-#    define cbor_htonl
-#    define cbor_ntohs
-#    define cbor_htons
-#  endif
-#elif defined(__sun)
-#  include <sys/byteorder.h>
-#elif defined(_MSC_VER)
-/* MSVC, which implies Windows, which implies little-endian and sizeof(long) == 4 */
-#  include <stdlib.h>
-#  define cbor_ntohll       _byteswap_uint64
-#  define cbor_htonll       _byteswap_uint64
-#  define cbor_ntohl        _byteswap_ulong
-#  define cbor_htonl        _byteswap_ulong
-#  define cbor_ntohs        _byteswap_ushort
-#  define cbor_htons        _byteswap_ushort
-#endif
-#ifndef cbor_ntohs
-#  include <arpa/inet.h>
-#  define cbor_ntohs        ntohs
-#  define cbor_htons        htons
-#endif
-#ifndef cbor_ntohl
-#  include <arpa/inet.h>
-#  define cbor_ntohl        ntohl
-#  define cbor_htonl        htonl
-#endif
-#ifndef cbor_ntohll
-#  define cbor_ntohll       ntohll
-#  define cbor_htonll       htonll
-/* ntohll isn't usually defined */
-#  ifndef ntohll
-#    if (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \
-    (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN) || \
-    (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN) || \
-    (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) || \
-    defined(__ARMEB__) || defined(__MIPSEB__) || defined(__s390__) || defined(__sparc__)
-#      define ntohll
-#      define htonll
-#    elif (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \
-    (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN) || \
-    (defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && BYTE_ORDER == LITTLE_ENDIAN) || \
-    defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__MIPSEL__) || \
-    defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__) || defined(__amd64)
-#      define ntohll(x)       ((ntohl((uint32_t)(x)) * UINT64_C(0x100000000)) + (ntohl((x) >> 32)))
-#      define htonll          ntohll
-#    else
-#      error "Unable to determine byte order!"
-#    endif
-#  endif
-#endif
-
-
-#ifdef __cplusplus
-#  define CONST_CAST(t, v)  const_cast<t>(v)
-#else
-/* C-style const_cast without triggering a warning with -Wcast-qual */
-#  define CONST_CAST(t, v)  (t)(uintptr_t)(v)
-#endif
-
-#ifdef __GNUC__
-#ifndef likely
-#  define likely(x)     __builtin_expect(!!(x), 1)
-#endif
-#ifndef unlikely
-#  define unlikely(x)   __builtin_expect(!!(x), 0)
-#endif
-#  define unreachable() __builtin_unreachable()
-#elif defined(_MSC_VER)
-#  define likely(x)     (x)
-#  define unlikely(x)   (x)
-#  define unreachable() __assume(0)
-#else
-#  define likely(x)     (x)
-#  define unlikely(x)   (x)
-#  define unreachable() do {} while (0)
-#endif
-
-static inline bool add_check_overflow(size_t v1, size_t v2, size_t *r)
-{
-#if ((defined(__GNUC__) && (__GNUC__ >= 5)) && !defined(__INTEL_COMPILER)) || __has_builtin(__builtin_add_overflow)
-    return __builtin_add_overflow(v1, v2, r);
-#else
-    /* unsigned additions are well-defined */
-    *r = v1 + v2;
-    return v1 > v1 + v2;
-#endif
-}
-
-#endif /* COMPILERSUPPORT_H */
-
diff --git a/src/open_memstream.c b/src/open_memstream.c
deleted file mode 100644
index 3365378..0000000
--- a/src/open_memstream.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _BSD_SOURCE 1
-#define _DEFAULT_SOURCE 1
-#define _GNU_SOURCE 1
-
-#include <sys/types.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if defined(__unix__) || defined(__APPLE__)
-#  include <unistd.h>
-#endif
-#ifdef __APPLE__
-typedef int RetType;
-typedef int LenType;
-#elif __linux__
-typedef ssize_t RetType;
-typedef size_t LenType;
-#else
-#  error "Cannot implement open_memstream!"
-#endif
-
-#include "compilersupport_p.h"
-
-struct Buffer
-{
-    char **ptr;
-    size_t *len;
-    size_t alloc;
-};
-
-static RetType write_to_buffer(void *cookie, const char *data, LenType len)
-{
-    struct Buffer *b = (struct Buffer *)cookie;
-    char *ptr = *b->ptr;
-    size_t newsize;
-
-    errno = EFBIG;
-    if (unlikely(add_check_overflow(*b->len, len, &newsize)))
-        return -1;
-
-    if (newsize >= b->alloc) { // NB! one extra byte is needed to avoid buffer overflow at close_buffer
-        // make room
-        size_t newalloc = newsize + newsize / 2 + 1;    // give 50% more room
-        ptr = realloc(ptr, newalloc);
-        if (ptr == NULL)
-            return -1;
-        b->alloc = newalloc;
-        *b->ptr = ptr;
-    }
-
-    memcpy(ptr + *b->len, data, len);
-    *b->len = newsize;
-    return len;
-}
-
-static int close_buffer(void *cookie)
-{
-    struct Buffer *b = (struct Buffer *)cookie;
-    if (*b->ptr)
-        (*b->ptr)[*b->len] = '\0';
-    free(b);
-    return 0;
-}
-
-FILE *open_memstream(char **bufptr, size_t *lenptr)
-{
-    struct Buffer *b = (struct Buffer *)malloc(sizeof(struct Buffer));
-    if (b == NULL)
-        return NULL;
-    b->alloc = 0;
-    b->len = lenptr;
-    b->ptr = bufptr;
-    *bufptr = NULL;
-    *lenptr = 0;
-
-#ifdef __APPLE__
-    return funopen(b, NULL, write_to_buffer, NULL, close_buffer);
-#elif __linux__
-    static const cookie_io_functions_t vtable = {
-        NULL,
-        write_to_buffer,
-        NULL,
-        close_buffer
-    };
-    return fopencookie(b, "w", vtable);
-#endif
-}
-
diff --git a/src/parsetags.pl b/src/parsetags.pl
deleted file mode 100755
index fbb1829..0000000
--- a/src/parsetags.pl
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/usr/bin/perl -l
-## Copyright (C) 2017 Intel Corporation
-##
-## 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.
-##
-use strict;
-my $fname = shift @ARGV
-    or die("Usage: parsetags.pl tags.txt");
-open TAGS, "<", $fname
-    or die("Cannot open $fname: $!");
-
-my %typedescriptions = (
-    "Integer" => "integer",
-    "ByteString" => "byte string",
-    "TextString" => "UTF-8 text string",
-    "Array" => "array",
-    "Map" => "map",
-    "Tag" => "tag",     # shouldn't happen
-    "Simple" => "any simple type",
-    "Boolean" => "boolean",
-    "Null" => "null",
-    "Undefined" => "undefined",
-    "HalfFloat" => "IEEE 754 half-precision floating point",
-    "Float" => "IEEE 754 single-precision floating point",
-    "Double" => "IEEE 754 double-precision floating point"
-);
-
-my %tags;
-while (<TAGS>) {
-    s/\s*#.*$//;
-    next if /^$/;
-    chomp;
-
-    die("Could not parse line \"$_\"")
-        unless /^(\d+);(\w+);([\w,]*);(.*)$/;
-    $tags{$1}{id} = $2;
-    $tags{$1}{semantic} = $4;
-    my @types = split(',', $3);
-    $tags{$1}{types} = \@types;
-}
-close TAGS or die;
-
-my @tagnumbers = sort { $a <=> $b } keys %tags;
-
-print "==== HTML listing ====";
-print "<table>\n  <tr>\n    <th>Tag</th>\n    <th>Data Item</th>\n    <th>Semantics</th>\n  </tr>";
-for my $n (@tagnumbers) {
-    print "  <tr>";
-    print "    <td>$n</td>";
-
-    my @types = @{$tags{$n}{types}};
-    @types = map { $typedescriptions{$_}; } @types;
-    unshift @types, "any"
-        if (scalar @types == 0);
-    printf "    <td>%s</td>\n", join(', ', @types);
-    printf "    <td>%s</td>\n", $tags{$n}{semantic};
-    print "  </td>";
-}
-print "</table>";
-
-print "\n==== enum listing for cbor.h ====\n";
-printf "typedef enum CborKnownTags {";
-my $comma = "";
-for my $n (@tagnumbers) {
-    printf "%s\n    Cbor%sTag%s = %d", $comma,
-        $tags{$n}{id},
-        ' ' x (23 - length($tags{$n}{id})),
-        $n;
-    $comma = ",";
-}
-print "\n} CborKnownTags;";
-print "\n/* #define the constants so we can check with #ifdef */";
-for my $n (@tagnumbers) {
-    printf "#define Cbor%sTag Cbor%sTag\n", $tags{$n}{id}, $tags{$n}{id};
-}
-
-print "\n==== search table ====\n";
-print "struct KnownTagData { uint32_t tag; uint32_t types; };";
-printf "static const struct KnownTagData knownTagData[] = {";
-$comma = "";
-for my $n (@tagnumbers) {
-    my @types = @{$tags{$n}{types}};
-
-    my $typemask;
-    my $shift = 0;
-    for my $type (@types) {
-        die("Too many match types for tag $n") if $shift == 32;
-        my $actualtype = "Cbor${type}Type";
-        $actualtype = "($actualtype+1)" if $type eq "Integer";
-        $typemask .= " | " if $typemask ne "";
-        $typemask .= "((uint32_t)$actualtype << $shift)" if $shift;
-        $typemask .= "(uint32_t)$actualtype" unless $shift;
-        $shift += 8;
-    }
-    $typemask = "0U" if $typemask eq "";
-
-    printf "%s\n    { %d, %s }", $comma, $n, $typemask;
-    $comma = ",";
-}
-print "\n};";
diff --git a/src/src.pri b/src/src.pri
deleted file mode 100644
index 01887aa..0000000
--- a/src/src.pri
+++ /dev/null
@@ -1,16 +0,0 @@
-SOURCES += \
-    $$PWD/cborencoder.c \
-    $$PWD/cborencoder_close_container_checked.c \
-    $$PWD/cborerrorstrings.c \
-    $$PWD/cborparser.c \
-    $$PWD/cborparser_dup_string.c \
-    $$PWD/cborpretty.c \
-    $$PWD/cbortojson.c \
-    $$PWD/cborvalidation.c \
-
-HEADERS += $$PWD/cbor.h $$PWD/tinycbor-version.h
-
-QMAKE_CFLAGS *= $$QMAKE_CFLAGS_SPLIT_SECTIONS
-QMAKE_LFLAGS *= $$QMAKE_LFLAGS_GCSECTIONS
-INCLUDEPATH += $$PWD
-CONFIG(release, debug|release): DEFINES += NDEBUG
diff --git a/src/tags.txt b/src/tags.txt
deleted file mode 100644
index ef78cfb..0000000
--- a/src/tags.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-# Tag number; Tag ID; Applicable types (comma-separated); Semantics
-0;DateTimeString;TextString;Standard date/time string
-1;UnixTime_t;Integer;Epoch-based date/time
-2;PositiveBignum;ByteString;Positive bignum
-3;NegativeBignum;ByteString;Negative bignum
-4;Decimal;Array;Decimal fraction
-5;Bigfloat;Array;Bigfloat
-16;COSE_Encrypt0;Array;COSE Single Recipient Encrypted Data Object (RFC 8152)
-17;COSE_Mac0;Array;COSE Mac w/o Recipients Object (RFC 8152)
-18;COSE_Sign1;Array;COSE Single Signer Data Object (RFC 8162)
-21;ExpectedBase64url;ByteString,Array,Map;Expected conversion to base64url encoding
-22;ExpectedBase64;ByteString,Array,Map;Expected conversion to base64 encoding
-23;ExpectedBase16;ByteString,Array,Map;Expected conversion to base16 encoding
-24;EncodedCbor;ByteString;Encoded CBOR data item
-32;Url;TextString;URI
-33;Base64url;TextString;base64url
-34;Base64;TextString;base64
-35;RegularExpression;TextString;Regular expression
-36;MimeMessage;TextString;MIME message
-96;COSE_Encrypt;Array;COSE Encrypted Data Object (RFC 8152)
-97;COSE_Mac;Array;COSE MACed Data Object (RFC 8152)
-98;COSE_Sign;Array;COSE Signed Data Object (RFC 8152)
-55799;Signature;;Self-describe CBOR
diff --git a/src/tinycbor-version.h b/src/tinycbor-version.h
deleted file mode 100644
index 270c915..0000000
--- a/src/tinycbor-version.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#define TINYCBOR_VERSION_MAJOR      0
-#define TINYCBOR_VERSION_MINOR      5
-#define TINYCBOR_VERSION_PATCH      4
diff --git a/src/tinycbor.pro b/src/tinycbor.pro
deleted file mode 100644
index 980dfd1..0000000
--- a/src/tinycbor.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-TEMPLATE = lib
-CONFIG += static
-CONFIG -= qt
-DESTDIR = ../lib
-
-include(src.pri)
diff --git a/src/utf8_p.h b/src/utf8_p.h
deleted file mode 100644
index ca43835..0000000
--- a/src/utf8_p.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#ifndef CBOR_UTF8_H
-#define CBOR_UTF8_H
-
-#include "compilersupport_p.h"
-
-#include <stdint.h>
-
-static inline uint32_t get_utf8(const uint8_t **buffer, const uint8_t *end)
-{
-    int charsNeeded;
-    uint32_t uc, min_uc;
-    uint8_t b;
-    ptrdiff_t n = end - *buffer;
-    if (n == 0)
-        return ~0U;
-
-    uc = *(*buffer)++;
-    if (uc < 0x80) {
-        /* single-byte UTF-8 */
-        return uc;
-    }
-
-    /* multi-byte UTF-8, decode it */
-    if (unlikely(uc <= 0xC1))
-        return ~0U;
-    if (uc < 0xE0) {
-        /* two-byte UTF-8 */
-        charsNeeded = 2;
-        min_uc = 0x80;
-        uc &= 0x1f;
-    } else if (uc < 0xF0) {
-        /* three-byte UTF-8 */
-        charsNeeded = 3;
-        min_uc = 0x800;
-        uc &= 0x0f;
-    } else if (uc < 0xF5) {
-        /* four-byte UTF-8 */
-        charsNeeded = 4;
-        min_uc = 0x10000;
-        uc &= 0x07;
-    } else {
-        return ~0U;
-    }
-
-    if (n < charsNeeded)
-        return ~0U;
-
-    /* first continuation character */
-    b = *(*buffer)++;
-    if ((b & 0xc0) != 0x80)
-        return ~0U;
-    uc <<= 6;
-    uc |= b & 0x3f;
-
-    if (charsNeeded > 2) {
-        /* second continuation character */
-        b = *(*buffer)++;
-        if ((b & 0xc0) != 0x80)
-            return ~0U;
-        uc <<= 6;
-        uc |= b & 0x3f;
-
-        if (charsNeeded > 3) {
-            /* third continuation character */
-            b = *(*buffer)++;
-            if ((b & 0xc0) != 0x80)
-                return ~0U;
-            uc <<= 6;
-            uc |= b & 0x3f;
-        }
-    }
-
-    /* overlong sequence? surrogate pair? out or range? */
-    if (uc < min_uc || uc - 0xd800U < 2048U || uc > 0x10ffff)
-        return ~0U;
-
-    return uc;
-}
-
-#endif /* CBOR_UTF8_H */
diff --git a/tests/.gitignore b/tests/.gitignore
deleted file mode 100644
index e65577d..0000000
--- a/tests/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-Makefile
-debug
-moc_predefs.h
-release
-target_wrapper.*
-
-# The executables
-cpp/cpp
-cpp/cpp.exe
-encoder/encoder
-encoder/encoder.exe
-parser/parser
-parser/parser.exe
-tojson/tojson
-tojson/tojson.exe
diff --git a/tests/c90/c90.pro b/tests/c90/c90.pro
deleted file mode 100644
index 59166b4..0000000
--- a/tests/c90/c90.pro
+++ /dev/null
@@ -1,7 +0,0 @@
-CONFIG += testcase parallel_test console
-CONFIG -= qt app_bundle
-gcc: QMAKE_CFLAGS += -std=c90 -pedantic-errors -Wall -Wextra -Werror
-darwin: QMAKE_CFLAGS += -Wno-long-long
-
-SOURCES += tst_c90.c
-INCLUDEPATH += ../../src
diff --git a/tests/c90/tst_c90.c b/tests/c90/tst_c90.c
deleted file mode 100644
index edb49ab..0000000
--- a/tests/c90/tst_c90.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include "cbor.h"
-
-int main()
-{
-    return 0;
-}
diff --git a/tests/cpp/cpp.pro b/tests/cpp/cpp.pro
deleted file mode 100644
index 5e9e608..0000000
--- a/tests/cpp/cpp.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-CONFIG += testcase parallel_test c++11
-QT = core testlib
-
-SOURCES = tst_cpp.cpp
-INCLUDEPATH += ../../src
diff --git a/tests/cpp/tst_cpp.cpp b/tests/cpp/tst_cpp.cpp
deleted file mode 100644
index dcf3d1f..0000000
--- a/tests/cpp/tst_cpp.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include "../../src/cborencoder.c"
-#include "../../src/cborerrorstrings.c"
-#include "../../src/cborparser.c"
-#include "../../src/cborparser_dup_string.c"
-#include "../../src/cborvalidation.c"
-
-#include <QtTest>
-
-// This is a compilation-only test.
-// All it does is verify that the four source files above
-// compile as C++ without errors.
-class tst_Cpp : public QObject
-{
-    Q_OBJECT
-};
-
-QTEST_MAIN(tst_Cpp)
-#include "tst_cpp.moc"
diff --git a/tests/encoder/encoder.pro b/tests/encoder/encoder.pro
deleted file mode 100644
index 62d9b7e..0000000
--- a/tests/encoder/encoder.pro
+++ /dev/null
@@ -1,9 +0,0 @@
-SOURCES += tst_encoder.cpp
-
-CONFIG += testcase parallel_test c++11
-QT = core testlib
-
-INCLUDEPATH += ../../src
-msvc: POST_TARGETDEPS = ../../lib/tinycbor.lib
-else: POST_TARGETDEPS += ../../lib/libtinycbor.a
-LIBS += $$POST_TARGETDEPS
diff --git a/tests/encoder/tst_encoder.cpp b/tests/encoder/tst_encoder.cpp
deleted file mode 100644
index 4a1b146..0000000
--- a/tests/encoder/tst_encoder.cpp
+++ /dev/null
@@ -1,734 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include <QtTest>
-#include "cbor.h"
-
-#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)
-#include <qfloat16.h>
-#endif
-
-Q_DECLARE_METATYPE(CborError)
-namespace QTest {
-template<> char *toString<CborError>(const CborError &err)
-{
-    return qstrdup(cbor_error_string(err));
-}
-}
-
-class tst_Encoder : public QObject
-{
-    Q_OBJECT
-private slots:
-    void fixed_data();
-    void fixed();
-    void strings_data();
-    void strings() { fixed(); }
-    void arraysAndMaps_data();
-    void arraysAndMaps() { fixed(); }
-    void tags_data();
-    void tags();
-    void arrays_data() { tags_data(); }
-    void arrays();
-    void maps_data() { tags_data(); }
-    void maps();
-
-    void shortBuffer_data() { tags_data(); }
-    void shortBuffer();
-    void tooShortArrays_data() { tags_data(); }
-    void tooShortArrays();
-    void tooShortMaps_data() { tags_data(); }
-    void tooShortMaps();
-    void tooBigArrays_data() { tags_data(); }
-    void tooBigArrays();
-    void tooBigMaps_data() { tags_data(); }
-    void tooBigMaps();
-    void illegalSimpleType_data();
-    void illegalSimpleType();
-};
-
-#include "tst_encoder.moc"
-
-static float myNaNf()
-{
-    uint32_t v = 0x7fc00000;
-    float f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsNaN(f));
-    return f;
-}
-
-static float myInff()
-{
-    uint32_t v = 0x7f800000;
-    float f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsInf(f));
-    return f;
-}
-
-static float myNInff()
-{
-    uint32_t v = 0xff800000;
-    float f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsInf(f));
-    return f;
-}
-
-static double myNaN()
-{
-    uint64_t v = UINT64_C(0x7ff8000000000000);
-    double f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsNaN(f));
-    return f;
-}
-
-static double myInf()
-{
-    uint64_t v = UINT64_C(0x7ff0000000000000);
-    double f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsInf(f));
-    return f;
-}
-
-static double myNInf()
-{
-    uint64_t v = UINT64_C(0xfff0000000000000);
-    double f;
-    memcpy(&f, &v, sizeof(f));
-    Q_ASSERT(qIsInf(f));
-    return f;
-}
-
-template <size_t N> QByteArray raw(const char (&data)[N])
-{
-    return QByteArray::fromRawData(data, N - 1);
-}
-
-struct NegativeInteger { quint64 abs; };
-Q_DECLARE_METATYPE(NegativeInteger)
-
-struct SimpleType { uint8_t type; };
-Q_DECLARE_METATYPE(SimpleType)
-
-struct Float16Standin { uint16_t val; };
-Q_DECLARE_METATYPE(Float16Standin)
-
-struct Tag { CborTag tag; QVariant tagged; };
-Q_DECLARE_METATYPE(Tag)
-
-template <typename... Args>
-QVariant make_list(const Args &... args)
-{
-    return QVariantList{args...};
-}
-
-typedef QVector<QPair<QVariant, QVariant>> Map;
-Q_DECLARE_METATYPE(Map)
-QVariant make_map(const std::initializer_list<QPair<QVariant, QVariant>> &list)
-{
-    return QVariant::fromValue(Map(list));
-}
-
-struct IndeterminateLengthArray : QVariantList { using QVariantList::QVariantList; };
-struct IndeterminateLengthMap : Map { using Map::Map; };
-Q_DECLARE_METATYPE(IndeterminateLengthArray)
-Q_DECLARE_METATYPE(IndeterminateLengthMap)
-
-QVariant make_ilarray(const std::initializer_list<QVariant> &list)
-{
-    return QVariant::fromValue(IndeterminateLengthArray(list));
-}
-
-QVariant make_ilmap(const std::initializer_list<QPair<QVariant, QVariant>> &list)
-{
-    return QVariant::fromValue(IndeterminateLengthMap(list));
-}
-
-static inline bool isOomError(CborError err)
-{
-    return err == CborErrorOutOfMemory;
-}
-
-CborError encodeVariant(CborEncoder *encoder, const QVariant &v)
-{
-    int type = v.userType();
-    switch (type) {
-    case QVariant::Int:
-    case QVariant::LongLong:
-        return cbor_encode_int(encoder, v.toLongLong());
-
-    case QVariant::UInt:
-    case QVariant::ULongLong:
-        return cbor_encode_uint(encoder, v.toULongLong());
-
-    case QVariant::Bool:
-        return cbor_encode_boolean(encoder, v.toBool());
-
-    case QVariant::Invalid:
-        return cbor_encode_undefined(encoder);
-
-    case QMetaType::VoidStar:
-        return cbor_encode_null(encoder);
-
-    case QVariant::Double:
-        return cbor_encode_double(encoder, v.toDouble());
-
-    case QMetaType::Float:
-        return cbor_encode_float(encoder, v.toFloat());
-
-    case QVariant::String: {
-        QByteArray string = v.toString().toUtf8();
-        return cbor_encode_text_string(encoder, string.constData(), string.length());
-    }
-
-    case QVariant::ByteArray: {
-        QByteArray string = v.toByteArray();
-        return cbor_encode_byte_string(encoder, reinterpret_cast<const quint8 *>(string.constData()), string.length());
-    }
-
-    default:
-        if (type == qMetaTypeId<NegativeInteger>())
-            return cbor_encode_negative_int(encoder, v.value<NegativeInteger>().abs);
-        if (type == qMetaTypeId<SimpleType>())
-            return cbor_encode_simple_value(encoder, v.value<SimpleType>().type);
-#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)
-        if (type == qMetaTypeId<Float16Standin>())
-            return cbor_encode_half_float(encoder, v.constData());
-#else
-        if (type == qMetaTypeId<qfloat16>())
-            return cbor_encode_half_float(encoder, v.constData());
-#endif
-        if (type == qMetaTypeId<Tag>()) {
-            CborError err = cbor_encode_tag(encoder, v.value<Tag>().tag);
-            if (err && !isOomError(err))
-                return err;
-            return static_cast<CborError>(err | encodeVariant(encoder, v.value<Tag>().tagged));
-        }
-        if (type == QVariant::List || type == qMetaTypeId<IndeterminateLengthArray>()) {
-            CborEncoder sub;
-            QVariantList list = v.toList();
-            size_t len = list.length();
-            if (type == qMetaTypeId<IndeterminateLengthArray>()) {
-                len = CborIndefiniteLength;
-                list = v.value<IndeterminateLengthArray>();
-            }
-            CborError err = cbor_encoder_create_array(encoder, &sub, len);
-            if (err && !isOomError(err))
-                return err;
-            foreach (const QVariant &v2, list) {
-                err = static_cast<CborError>(err | encodeVariant(&sub, v2));
-                if (err && !isOomError(err))
-                    return err;
-            }
-            return cbor_encoder_close_container_checked(encoder, &sub);
-        }
-        if (type == qMetaTypeId<Map>() || type == qMetaTypeId<IndeterminateLengthMap>()) {
-            CborEncoder sub;
-            Map map = v.value<Map>();
-            size_t len = map.length();
-            if (type == qMetaTypeId<IndeterminateLengthMap>()) {
-                len = CborIndefiniteLength;
-                map = v.value<IndeterminateLengthMap>();
-            }
-            CborError err = cbor_encoder_create_map(encoder, &sub, len);
-            if (err && !isOomError(err))
-                return err;
-            for (auto pair : map) {
-                err = static_cast<CborError>(err | encodeVariant(&sub, pair.first));
-                if (err && !isOomError(err))
-                    return err;
-                err = static_cast<CborError>(err | encodeVariant(&sub, pair.second));
-                if (err && !isOomError(err))
-                    return err;
-            }
-            return cbor_encoder_close_container_checked(encoder, &sub);
-        }
-    }
-    return CborErrorUnknownType;
-}
-
-void compare(const QVariant &input, const QByteArray &output)
-{
-    QByteArray buffer(output.length(), Qt::Uninitialized);
-    uint8_t *bufptr = reinterpret_cast<quint8 *>(buffer.data());
-    CborEncoder encoder;
-    cbor_encoder_init(&encoder, bufptr, buffer.length(), 0);
-
-    QCOMPARE(encodeVariant(&encoder, input), CborNoError);
-    QCOMPARE(encoder.remaining, size_t(1));
-    QCOMPARE(cbor_encoder_get_extra_bytes_needed(&encoder), size_t(0));
-
-    buffer.resize(int(cbor_encoder_get_buffer_size(&encoder, bufptr)));
-    QCOMPARE(buffer, output);
-}
-
-void addColumns()
-{
-    QTest::addColumn<QByteArray>("output");
-    QTest::addColumn<QVariant>("input");
-}
-
-void addFixedData()
-{
-    // unsigned integers
-    QTest::newRow("0U") << raw("\x00") << QVariant(0U);
-    QTest::newRow("1U") << raw("\x01") << QVariant(1U);
-    QTest::newRow("10U") << raw("\x0a") << QVariant(10U);
-    QTest::newRow("23U") << raw("\x17") << QVariant(23U);
-    QTest::newRow("24U") << raw("\x18\x18") << QVariant(24U);
-    QTest::newRow("255U") << raw("\x18\xff") << QVariant(255U);
-    QTest::newRow("256U") << raw("\x19\x01\x00") << QVariant(256U);
-    QTest::newRow("65535U") << raw("\x19\xff\xff") << QVariant(65535U);
-    QTest::newRow("65536U") << raw("\x1a\0\1\x00\x00") << QVariant(65536U);
-    QTest::newRow("4294967295U") << raw("\x1a\xff\xff\xff\xff") << QVariant(4294967295U);
-    QTest::newRow("4294967296U") << raw("\x1b\0\0\0\1\0\0\0\0") << QVariant(Q_UINT64_C(4294967296));
-    QTest::newRow("UINT64_MAX") << raw("\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                << QVariant(std::numeric_limits<quint64>::max());
-
-    // signed integers containing non-negative numbers
-    QTest::newRow("0") << raw("\x00") << QVariant(0);
-    QTest::newRow("1") << raw("\x01") << QVariant(1);
-    QTest::newRow("10") << raw("\x0a") << QVariant(10);
-    QTest::newRow("23") << raw("\x17") << QVariant(23);
-    QTest::newRow("24") << raw("\x18\x18") << QVariant(24);
-    QTest::newRow("255") << raw("\x18\xff") << QVariant(255);
-    QTest::newRow("256") << raw("\x19\x01\x00") << QVariant(256);
-    QTest::newRow("65535") << raw("\x19\xff\xff") << QVariant(65535);
-    QTest::newRow("65536") << raw("\x1a\0\1\x00\x00") << QVariant(65536);
-    QTest::newRow("4294967295") << raw("\x1a\xff\xff\xff\xff") << QVariant(Q_INT64_C(4294967295));
-    QTest::newRow("4294967296") << raw("\x1b\0\0\0\1\0\0\0\0") << QVariant(Q_INT64_C(4294967296));
-
-    // signed integers containing negative numbers
-    QTest::newRow("-1") << raw("\x20") << QVariant(-1);
-    QTest::newRow("-2") << raw("\x21") << QVariant(-2);
-    QTest::newRow("-24") << raw("\x37") << QVariant(-24);
-    QTest::newRow("-25") << raw("\x38\x18") << QVariant(-25);
-    QTest::newRow("-UINT8_MAX") << raw("\x38\xff") << QVariant(-256);
-    QTest::newRow("-UINT8_MAX-1") << raw("\x39\x01\x00") << QVariant(-257);
-    QTest::newRow("-UINT16_MAX") << raw("\x39\xff\xff") << QVariant(-65536);
-    QTest::newRow("-UINT16_MAX-1") << raw("\x3a\0\1\x00\x00") << QVariant(-65537);
-    QTest::newRow("-UINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << QVariant(Q_INT64_C(-4294967296));
-    QTest::newRow("-UINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << QVariant(Q_INT64_C(-4294967297));
-
-    // negative integers
-    auto neg = [](quint64 v) { return QVariant::fromValue<NegativeInteger>({v}); };
-    QTest::newRow("negative1") << raw("\x20") << neg(1);
-    QTest::newRow("negative2") << raw("\x21") << neg(2);
-    QTest::newRow("negative24") << raw("\x37") << neg(24);
-    QTest::newRow("negative25") << raw("\x38\x18") << neg(25);
-    QTest::newRow("negativeUINT8_MAX") << raw("\x38\xff") << neg(256);
-    QTest::newRow("negativeUINT8_MAX-1") << raw("\x39\x01\x00") << neg(257);
-    QTest::newRow("negativeUINT16_MAX") << raw("\x39\xff\xff") << neg(65536);
-    QTest::newRow("negativeUINT16_MAX-1") << raw("\x3a\0\1\x00\x00") << neg(65537);
-    QTest::newRow("negativeUINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << neg(Q_UINT64_C(4294967296));
-    QTest::newRow("negativeUINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << neg(Q_UINT64_C(4294967297));
-    QTest::newRow("negativeUINT64_MAX") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe")
-                                        << neg(std::numeric_limits<quint64>::max());
-    QTest::newRow("negativeUINT64_MAX+1") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff") << neg(0);
-
-    QTest::newRow("simple0") << raw("\xe0") << QVariant::fromValue(SimpleType{0});
-    QTest::newRow("simple19") << raw("\xf3") << QVariant::fromValue(SimpleType{19});
-    QTest::newRow("false") << raw("\xf4") << QVariant(false);
-    QTest::newRow("true") << raw("\xf5") << QVariant(true);
-    QTest::newRow("null") << raw("\xf6") << QVariant::fromValue<void *>(nullptr);
-    QTest::newRow("undefined") << raw("\xf7") << QVariant();
-    QTest::newRow("simple32") << raw("\xf8\x20") << QVariant::fromValue(SimpleType{32});
-    QTest::newRow("simple255") << raw("\xf8\xff") << QVariant::fromValue(SimpleType{255});
-
-    // floating point
-#if QT_VERSION < QT_VERSION_CHECK(5, 9, 0)
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << QVariant::fromValue(Float16Standin{0x0000});
-#else
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << QVariant::fromValue(qfloat16(0));
-    QTest::newRow("-1.f16") << raw("\xf9\xbc\0") << QVariant::fromValue(qfloat16(-1));
-    QTest::newRow("1.5f16") << raw("\xf9\x3e\0") << QVariant::fromValue(qfloat16(1.5));
-    QTest::newRow("nan_f16") << raw("\xf9\x7e\0") << QVariant::fromValue<qfloat16>(myNaNf());
-    QTest::newRow("-inf_f16") << raw("\xf9\xfc\0") << QVariant::fromValue<qfloat16>(myNInff());
-    QTest::newRow("+inf_f16") << raw("\xf9\x7c\0") << QVariant::fromValue<qfloat16>(myInff());
-#endif
-
-    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << QVariant::fromValue(0.f);
-    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << QVariant(0.);
-    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << QVariant::fromValue(-1.f);
-    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << QVariant(-1.);
-    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << QVariant::fromValue(16777215.f);
-    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << QVariant::fromValue(16777215.);
-    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << QVariant(-16777215.f);
-    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << QVariant::fromValue(-16777215.);
-
-    QTest::newRow("nan_f") << raw("\xfa\x7f\xc0\0\0") << QVariant::fromValue<float>(myNaNf());
-    QTest::newRow("nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << QVariant(myNaN());
-    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << QVariant::fromValue<float>(myNInff());
-    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << QVariant(myNInf());
-    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << QVariant::fromValue<float>(myInff());
-    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << QVariant(myInf());
-}
-
-void addStringsData()
-{
-    // byte strings
-    QTest::newRow("emptybytestring") << raw("\x40") << QVariant(QByteArray(""));
-    QTest::newRow("bytestring1") << raw("\x41 ") << QVariant(QByteArray(" "));
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << QVariant(QByteArray("", 1));
-    QTest::newRow("bytestring5") << raw("\x45Hello") << QVariant(QByteArray("Hello"));
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234")
-                                  << QVariant(QByteArray("123456789012345678901234"));
-    QTest::newRow("bytestring256") << raw("\x59\1\0") + QByteArray(256, '3')
-                                   << QVariant(QByteArray(256, '3'));
-
-    // text strings
-    QTest::newRow("emptytextstring") << raw("\x60") << QVariant("");
-    QTest::newRow("textstring1") << raw("\x61 ") << QVariant(" ");
-    QTest::newRow("textstring1-nul") << raw("\x61\0") << QVariant(QString::fromLatin1("", 1));
-    QTest::newRow("textstring5") << raw("\x65Hello") << QVariant("Hello");
-    QTest::newRow("textstring24") << raw("\x78\x18""123456789012345678901234")
-                                  << QVariant("123456789012345678901234");
-    QTest::newRow("textstring256") << raw("\x79\1\0") + QByteArray(256, '3')
-                                   << QVariant(QString(256, '3'));
-}
-
-void addArraysAndMaps()
-{
-    QTest::newRow("emptyarray") << raw("\x80") << make_list();
-    QTest::newRow("emptymap") << raw("\xa0") << make_map({});
-
-    QTest::newRow("array-0") << raw("\x81\0") << make_list(0);
-    QTest::newRow("array-{0-0}") << raw("\x82\0\0") << make_list(0, 0);
-    QTest::newRow("array-Hello") << raw("\x81\x65Hello") << make_list("Hello");
-    QTest::newRow("array-array-0") << raw("\x81\x81\0") << make_list(make_list(0));
-    QTest::newRow("array-array-{0-0}") << raw("\x81\x82\0\0") << make_list(make_list(0, 0));
-    QTest::newRow("array-array-0-0") << raw("\x82\x81\0\0") << make_list(make_list(0),0);
-    QTest::newRow("array-array-Hello") << raw("\x81\x81\x65Hello") << make_list(make_list("Hello"));
-
-    QTest::newRow("map-0:0") << raw("\xa1\0\0") << make_map({{0,0}});
-    QTest::newRow("map-0:0-1:1") << raw("\xa2\0\0\1\1") << make_map({{0,0}, {1,1}});
-    QTest::newRow("map-0:{map-0:0-1:1}") << raw("\xa1\0\xa2\0\0\1\1") << make_map({{0, make_map({{0,0}, {1,1}})}});
-
-    QTest::newRow("array-map1") << raw("\x81\xa1\0\0") << make_list(make_map({{0,0}}));
-    QTest::newRow("array-map2") << raw("\x82\xa1\0\0\xa1\1\1") << make_list(make_map({{0,0}}), make_map({{1,1}}));
-
-    QTest::newRow("map-array1") << raw("\xa1\x62oc\x81\0") << make_map({{"oc", make_list(0)}});
-    QTest::newRow("map-array2") << raw("\xa1\x62oc\x84\0\1\2\3") << make_map({{"oc", make_list(0, 1, 2, 3)}});
-    QTest::newRow("map-array3") << raw("\xa2\x62oc\x82\0\1\2\3") << make_map({{"oc", make_list(0, 1)}, {2, 3}});
-
-    // indeterminate length
-    QTest::newRow("_emptyarray") << raw("\x9f\xff") << QVariant::fromValue(IndeterminateLengthArray{});
-    QTest::newRow("_emptymap") << raw("\xbf\xff") << make_ilmap({});
-
-    QTest::newRow("_array-0") << raw("\x9f\0\xff") << make_ilarray({0});
-    QTest::newRow("_array-{0-0}") << raw("\x9f\0\0\xff") << make_ilarray({0, 0});
-    QTest::newRow("_array-Hello") << raw("\x9f\x65Hello\xff") << make_ilarray({"Hello"});
-    QTest::newRow("_array-array-0") << raw("\x9f\x81\0\xff") << make_ilarray({make_list(0)});
-    QTest::newRow("_array-_array-0") << raw("\x9f\x9f\0\xff\xff") << make_ilarray({make_ilarray({0})});
-    QTest::newRow("_array-_array-{0-0}") << raw("\x9f\x9f\0\0\xff\xff") << make_ilarray({make_ilarray({0, 0})});
-    QTest::newRow("_array-_array-0-0") << raw("\x9f\x9f\0\xff\0\xff") << make_ilarray({make_ilarray({0}),0});
-    QTest::newRow("_array-_array-Hello") << raw("\x9f\x9f\x65Hello\xff\xff") << make_ilarray({make_ilarray({"Hello"})});
-
-    QTest::newRow("_map-0:0") << raw("\xbf\0\0\xff") << make_ilmap({{0,0}});
-    QTest::newRow("_map-0:0-1:1") << raw("\xbf\0\0\1\1\xff") << make_ilmap({{0,0}, {1,1}});
-    QTest::newRow("_map-0:{map-0:0-1:1}") << raw("\xbf\0\xa2\0\0\1\1\xff") << make_ilmap({{0, make_map({{0,0}, {1,1}})}});
-    QTest::newRow("_map-0:{_map-0:0-1:1}") << raw("\xbf\0\xbf\0\0\1\1\xff\xff") << make_ilmap({{0, make_ilmap({{0,0}, {1,1}})}});
-
-    QTest::newRow("_array-map1") << raw("\x9f\xa1\0\0\xff") << make_ilarray({make_map({{0,0}})});
-    QTest::newRow("_array-_map1") << raw("\x9f\xbf\0\0\xff\xff") << make_ilarray({make_ilmap({{0,0}})});
-    QTest::newRow("_array-map2") << raw("\x9f\xa1\0\0\xa1\1\1\xff") << make_ilarray({make_map({{0,0}}), make_map({{1,1}})});
-    QTest::newRow("_array-_map2") << raw("\x9f\xbf\0\0\xff\xbf\1\1\xff\xff") << make_ilarray({make_ilmap({{0,0}}), make_ilmap({{1,1}})});
-
-    QTest::newRow("_map-array1") << raw("\xbf\x62oc\x81\0\xff") << make_ilmap({{"oc", make_list(0)}});
-    QTest::newRow("_map-_array1") << raw("\xbf\x62oc\x9f\0\xff\xff") << make_ilmap({{"oc", make_ilarray({0})}});
-    QTest::newRow("_map-array2") << raw("\xbf\x62oc\x84\0\1\2\3\xff") << make_ilmap({{"oc", make_list(0, 1, 2, 3)}});
-    QTest::newRow("_map-_array2") << raw("\xbf\x62oc\x9f\0\1\2\3\xff\xff") << make_ilmap({{"oc", make_ilarray({0, 1, 2, 3})}});
-    QTest::newRow("_map-array3") << raw("\xbf\x62oc\x82\0\1\2\3\xff") << make_ilmap({{"oc", make_list(0, 1)}, {2, 3}});
-    QTest::newRow("_map-_array3") << raw("\xbf\x62oc\x9f\0\1\xff\2\3\xff") << make_ilmap({{"oc", make_ilarray({0, 1})}, {2, 3}});
-
-    // tagged
-    QTest::newRow("array-1(0)") << raw("\x81\xc1\0") << make_list(QVariant::fromValue(Tag{1, 0}));
-    QTest::newRow("array-1(map)") << raw("\x81\xc1\xa0") << make_list(QVariant::fromValue(Tag{1, make_map({})}));
-    QTest::newRow("map-1(2):3(4)") << raw("\xa1\xc1\2\xc3\4") << make_map({{QVariant::fromValue(Tag{1, 2}), QVariant::fromValue(Tag{3, 4})}});
-}
-
-void tst_Encoder::fixed_data()
-{
-    addColumns();
-    addFixedData();
-}
-
-void tst_Encoder::fixed()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    compare(input, output);
-}
-
-void tst_Encoder::strings_data()
-{
-    addColumns();
-    addStringsData();
-}
-
-void tst_Encoder::arraysAndMaps_data()
-{
-    addColumns();
-    addArraysAndMaps();
-}
-
-void tst_Encoder::tags_data()
-{
-    addColumns();
-    addFixedData();
-    addStringsData();
-    addArraysAndMaps();
-}
-
-void tst_Encoder::tags()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-
-    compare(QVariant::fromValue(Tag{1, input}), "\xc1" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{24, input}), "\xd8\x18" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{255, input}), "\xd8\xff" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{256, input}), raw("\xd9\1\0") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{CborSignatureTag, input}), raw("\xd9\xd9\xf7") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{65535, input}), raw("\xd9\xff\xff") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{65536, input}), raw("\xda\0\1\0\0") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{UINT32_MAX, input}), raw("\xda\xff\xff\xff\xff") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{UINT32_MAX + Q_UINT64_C(1), input}), raw("\xdb\0\0\0\1\0\0\0\0") + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(QVariant::fromValue(Tag{UINT64_MAX, input}), raw("\xdb\xff\xff\xff\xff\xff\xff\xff\xff") + output);
-    if (QTest::currentTestFailed()) return;
-
-    // nested tags
-    compare(QVariant::fromValue(Tag{1, QVariant::fromValue(Tag{1, input})}), "\xc1\xc1" + output);
-}
-
-void tst_Encoder::arrays()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-
-    compare(make_list(input), "\x81" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_list(input, input), "\x82" + output + output);
-    if (QTest::currentTestFailed()) return;
-
-    {
-        QVariantList list{input};
-        QByteArray longoutput = output;
-
-        // make a list with 32 elements (1 << 5)
-        for (int i = 0; i < 5; ++i) {
-            list += list;
-            longoutput += longoutput;
-        }
-        compare(list, "\x98\x20" + longoutput);
-        if (QTest::currentTestFailed()) return;
-
-        // now 256 elements (32 << 3)
-        for (int i = 0; i < 3; ++i) {
-            list += list;
-            longoutput += longoutput;
-        }
-        compare(list, raw("\x99\1\0") + longoutput);
-        if (QTest::currentTestFailed()) return;
-    }
-
-    // nested lists
-    compare(make_list(make_list(input)), "\x81\x81" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_list(make_list(input, input)), "\x81\x82" + output + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_list(make_list(input), input), "\x82\x81" + output + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_list(make_list(input), make_list(input)), "\x82\x81" + output + "\x81" + output);
-}
-
-void tst_Encoder::maps()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-
-    compare(make_map({{1, input}}), "\xa1\1" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_map({{1, input}, {input, 24}}), "\xa2\1" + output + output + "\x18\x18");
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_map({{input, input}}), "\xa1" + output + output);
-    if (QTest::currentTestFailed()) return;
-
-    {
-        Map map{{1, input}};
-        QByteArray longoutput = "\1" + output;
-
-        // make a map with 32 elements (1 << 5)
-        for (int i = 0; i < 5; ++i) {
-            map += map;
-            longoutput += longoutput;
-        }
-        compare(QVariant::fromValue(map), "\xb8\x20" + longoutput);
-        if (QTest::currentTestFailed()) return;
-
-        // now 256 elements (32 << 3)
-        for (int i = 0; i < 3; ++i) {
-            map += map;
-            longoutput += longoutput;
-        }
-        compare(QVariant::fromValue(map), raw("\xb9\1\0") + longoutput);
-        if (QTest::currentTestFailed()) return;
-    }
-
-    // nested maps
-    compare(make_map({{1, make_map({{2, input}})}}), "\xa1\1\xa1\2" + output);
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_map({{1, make_map({{2, input}, {input, false}})}}), "\xa1\1\xa2\2" + output + output + "\xf4");
-    if (QTest::currentTestFailed()) return;
-
-    compare(make_map({{1, make_map({{2, input}})}, {input, false}}), "\xa2\1\xa1\2" + output + output + "\xf4");
-    if (QTest::currentTestFailed()) return;
-}
-
-void tst_Encoder::shortBuffer()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    QByteArray buffer(output.length(), Qt::Uninitialized);
-
-    for (int len = 0; len < output.length(); ++len) {
-        CborEncoder encoder;
-        cbor_encoder_init(&encoder, reinterpret_cast<quint8 *>(buffer.data()), len, 0);
-        QCOMPARE(encodeVariant(&encoder, input), CborErrorOutOfMemory);
-        QVERIFY(cbor_encoder_get_extra_bytes_needed(&encoder) != 0);
-        QCOMPARE(len + cbor_encoder_get_extra_bytes_needed(&encoder), size_t(output.length()));
-    }
-}
-
-void tst_Encoder::tooShortArrays()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    QByteArray buffer(output.length() + 1, Qt::Uninitialized);
-
-    CborEncoder encoder, container;
-    cbor_encoder_init(&encoder, reinterpret_cast<quint8 *>(buffer.data()), buffer.length(), 0);
-    QCOMPARE(cbor_encoder_create_array(&encoder, &container, 2), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(container.remaining, size_t(2));
-    QCOMPARE(cbor_encoder_close_container_checked(&encoder, &container), CborErrorTooFewItems);
-}
-
-void tst_Encoder::tooShortMaps()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    QByteArray buffer(output.length() + 1, Qt::Uninitialized);
-
-    CborEncoder encoder, container;
-    cbor_encoder_init(&encoder, reinterpret_cast<quint8 *>(buffer.data()), buffer.length(), 0);
-    QCOMPARE(cbor_encoder_create_map(&encoder, &container, 2), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(container.remaining, size_t(4));
-    QCOMPARE(cbor_encoder_close_container_checked(&encoder, &container), CborErrorTooFewItems);
-}
-
-void tst_Encoder::tooBigArrays()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    QByteArray buffer(output.length() * 2 + 1, Qt::Uninitialized);
-
-    CborEncoder encoder, container;
-    cbor_encoder_init(&encoder, reinterpret_cast<quint8 *>(buffer.data()), buffer.length(), 0);
-    QCOMPARE(cbor_encoder_create_array(&encoder, &container, 1), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(container.remaining, size_t(0));
-    QCOMPARE(cbor_encoder_close_container_checked(&encoder, &container), CborErrorTooManyItems);
-}
-
-void tst_Encoder::tooBigMaps()
-{
-    QFETCH(QVariant, input);
-    QFETCH(QByteArray, output);
-    QByteArray buffer(output.length() * 3 + 1, Qt::Uninitialized);
-
-    CborEncoder encoder, container;
-    cbor_encoder_init(&encoder, reinterpret_cast<quint8 *>(buffer.data()), buffer.length(), 0);
-    QCOMPARE(cbor_encoder_create_map(&encoder, &container, 1), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(encodeVariant(&container, input), CborNoError);
-    QCOMPARE(container.remaining, size_t(0));
-    QCOMPARE(cbor_encoder_close_container_checked(&encoder, &container), CborErrorTooManyItems);
-}
-
-void tst_Encoder::illegalSimpleType_data()
-{
-    QTest::addColumn<int>("type");
-    QTest::newRow("half-float") << 25;
-    QTest::newRow("float") << 26;
-    QTest::newRow("double") << 27;
-    QTest::newRow("28") << 28;
-    QTest::newRow("29") << 29;
-    QTest::newRow("30") << 30;
-    QTest::newRow("31") << 31;
-}
-
-void tst_Encoder::illegalSimpleType()
-{
-    QFETCH(int, type);
-
-    quint8 buf[2];
-    CborEncoder encoder;
-    cbor_encoder_init(&encoder, buf, sizeof(buf), 0);
-    QCOMPARE(cbor_encode_simple_value(&encoder, type), CborErrorIllegalSimpleType);
-}
-
-QTEST_MAIN(tst_Encoder)
diff --git a/tests/parser/parser.pro b/tests/parser/parser.pro
deleted file mode 100644
index a61291a..0000000
--- a/tests/parser/parser.pro
+++ /dev/null
@@ -1,10 +0,0 @@
-SOURCES += tst_parser.cpp ../../src/cborparser.c
-
-CONFIG += testcase parallel_test c++11
-QT = core testlib
-DEFINES += CBOR_PARSER_MAX_RECURSIONS=16
-
-INCLUDEPATH += ../../src
-msvc: POST_TARGETDEPS = ../../lib/tinycbor.lib
-else: POST_TARGETDEPS += ../../lib/libtinycbor.a
-LIBS += $$POST_TARGETDEPS
diff --git a/tests/parser/tst_parser.cpp b/tests/parser/tst_parser.cpp
deleted file mode 100644
index 1890234..0000000
--- a/tests/parser/tst_parser.cpp
+++ /dev/null
@@ -1,2226 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2019 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _XOPEN_SOURCE 700
-#define  _DARWIN_C_SOURCE 1         /* need MAP_ANON */
-#include <QtTest>
-#include "cbor.h"
-#include <stdio.h>
-#include <stdarg.h>
-
-#if defined(Q_OS_UNIX)
-#  include <sys/mman.h>
-#  include <unistd.h>
-#elif defined(Q_OS_WIN)
-#  define WIN32_LEAN_AND_MEAN 1
-#  define NOMINMAX 1
-#  include <windows.h>
-#endif
-
-Q_DECLARE_METATYPE(CborError)
-
-namespace QTest {
-template<> char *toString<CborError>(const CborError &err)
-{
-    return qstrdup(cbor_error_string(err));
-}
-}
-
-class tst_Parser : public QObject
-{
-    Q_OBJECT
-private slots:
-    void initParserEmpty();
-
-    // parsing API
-    void integers_data();
-    void integers();
-    void fixed_data();
-    void fixed();
-    void strings_data();
-    void strings() { fixed(); }
-    void tags_data();
-    void tags() { fixed(); }
-    void tagTags_data() { tags_data(); }
-    void tagTags();
-    void emptyContainers_data();
-    void emptyContainers();
-    void arrays_data();
-    void arrays();
-    void undefLengthArrays_data() { arrays_data(); }
-    void undefLengthArrays();
-    void nestedArrays_data() { arrays_data(); }
-    void nestedArrays();
-    void maps_data();
-    void maps();
-    void undefLengthMaps_data() { maps_data(); }
-    void undefLengthMaps();
-    void nestedMaps_data() { maps_data(); }
-    void nestedMaps();
-    void mapMixed_data();
-    void mapMixed() { arrays(); }
-    void mapsAndArrays_data() { arrays_data(); }
-    void mapsAndArrays();
-
-    // chunked string API
-    void chunkedString_data();
-    void chunkedString();
-    void chunkedStringInUndefArray_data() { chunkedString_data(); }
-    void chunkedStringInUndefArray();
-
-    // convenience API
-    void stringLength_data();
-    void stringLength();
-    void stringCompare_data();
-    void stringCompare();
-    void mapFind_data();
-    void mapFind();
-
-    // validation & errors
-    void checkedIntegers_data();
-    void checkedIntegers();
-    void validation_data();
-    void validation();
-    void strictValidation_data();
-    void strictValidation();
-    void resumeParsing_data();
-    void resumeParsing();
-    void endPointer_data();
-    void endPointer();
-    void recursionLimit_data();
-    void recursionLimit();
-};
-
-struct ParserWrapper
-{
-    void *realdata = nullptr;
-    uint8_t *data;
-    size_t len;
-    CborParser parser;
-    CborValue first;
-
-    ~ParserWrapper() { freeMemory(); }
-
-    CborError init(const QByteArray &ba, uint32_t flags = 0)
-    {
-        return init(ba.constData(), ba.size(), flags);
-    }
-    CborError init(const char *ptr, int n, uint32_t flags = 0)
-    {
-        freeMemory();
-        data = allocateMemory(n);
-        memcpy(data, ptr, len);
-        return cbor_parser_init(data, len, flags, &parser, &first);
-    }
-    uint8_t *begin() { return data; }
-    uint8_t *end()   { return data + len; }
-
-    uint8_t *allocateMemory(size_t);
-    void freeMemory();
-
-    static const size_t PageSize = 4096;
-    static inline size_t mmapAllocation(size_t n)
-    {
-        // round up and add one page
-        return (n + 2*PageSize) & ~(PageSize - 1);
-    }
-    static bool shouldUseMmap();
-};
-
-bool ParserWrapper::shouldUseMmap()
-{
-    static int v = qEnvironmentVariableIntValue("PARSER_NO_MMAP");
-    return !v;
-}
-
-uint8_t *ParserWrapper::allocateMemory(size_t n)
-{
-    len = n;
-    if (shouldUseMmap()) {
-        size_t alloc = mmapAllocation(n);
-#if defined(Q_OS_UNIX)
-        realdata = mmap(nullptr, alloc, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
-        Q_ASSERT_X(realdata != MAP_FAILED, "allocateMemory", "mmap failed!");
-
-        // mark last page inaccessible
-        uint8_t *ptr = static_cast<uint8_t *>(realdata);
-        ptr += alloc - PageSize;
-        mprotect(ptr, PageSize, PROT_NONE);
-
-        ptr -= n;
-        return ptr;
-#elif defined(Q_OS_WIN)
-        DWORD flAllocationType = MEM_COMMIT | MEM_RESERVE;
-        DWORD flProtect = PAGE_READWRITE;
-        realdata = VirtualAlloc(nullptr, alloc, flAllocationType, flProtect);
-        Q_ASSERT_X(realdata, "allocateMemory", "VirtualAlloc failed!");
-
-        // mark last page inaccessible
-        uint8_t *ptr = static_cast<uint8_t *>(realdata);
-        ptr += alloc - PageSize;
-        VirtualProtect(ptr, PageSize, PAGE_NOACCESS, nullptr);
-
-        ptr -= n;
-        return ptr;
-#endif
-    }
-    realdata = malloc(n);
-    return static_cast<uint8_t *>(realdata);
-}
-
-void ParserWrapper::freeMemory()
-{
-    if (shouldUseMmap()) {
-        if (realdata) {
-#if defined(Q_OS_UNIX)
-            size_t alloc = mmapAllocation(len);
-            munmap(realdata, alloc);
-#elif defined(Q_OS_WIN)
-            VirtualFree(realdata, 0, MEM_RELEASE);
-#endif
-        }
-        return;
-    }
-
-    free(realdata);
-}
-
-static CborError qstring_printf(void *out, const char *fmt, ...)
-{
-    auto str = static_cast<QString *>(out);
-    va_list va;
-    va_start(va, fmt);
-    *str += QString::vasprintf(fmt, va);
-    va_end(va);
-    return CborNoError;
-};
-
-CborError parseOne(CborValue *it, QString *parsed)
-{
-    int flags = CborPrettyShowStringFragments | CborPrettyIndicateIndeterminateLength |
-                CborPrettyIndicateOverlongNumbers;
-
-    parsed->clear();
-    return cbor_value_to_pretty_stream(qstring_printf, parsed, it, flags);
-}
-
-template <size_t N> QByteArray raw(const char (&data)[N])
-{
-    return QByteArray::fromRawData(data, N - 1);
-}
-
-void tst_Parser::initParserEmpty()
-{
-    CborParser parser;
-    CborValue first;
-    CborError err = cbor_parser_init((const quint8 *)"", 0, 0, &parser, &first);
-    QCOMPARE(err, CborErrorUnexpectedEOF);
-}
-
-void addColumns()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QString>("expected");
-    QTest::addColumn<int>("n");         // some aux integer, not added in all columns
-}
-
-bool compareFailed = true;
-void compareOne_real(const QByteArray &data, const QString &expected, int line, int n = -1)
-{
-    compareFailed = true;
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) + "\"");
-
-    if (cbor_value_get_type(&w.first) == CborArrayType) {
-        size_t len;
-        if (n >= 0) {
-            QVERIFY(cbor_value_is_length_known(&w.first));
-            QCOMPARE(cbor_value_get_array_length(&w.first, &len), CborNoError);
-            QCOMPARE(len, size_t(len));
-        } else {
-            QVERIFY(!cbor_value_is_length_known(&w.first));
-            QCOMPARE(cbor_value_get_array_length(&w.first, &len), CborErrorUnknownLength);
-        }
-    } else if (cbor_value_get_type(&w.first) == CborMapType) {
-        size_t len;
-        if (n >= 0) {
-            QVERIFY(cbor_value_is_length_known(&w.first));
-            QCOMPARE(cbor_value_get_map_length(&w.first, &len), CborNoError);
-            QCOMPARE(len, size_t(len));
-        } else {
-            QVERIFY(!cbor_value_is_length_known(&w.first));
-            QCOMPARE(cbor_value_get_map_length(&w.first, &len), CborErrorUnknownLength);
-        }
-    } else if (cbor_value_is_text_string(&w.first) || cbor_value_is_byte_string(&w.first)) {
-        size_t len;
-        QCOMPARE(cbor_value_calculate_string_length(&w.first, &len), CborNoError);
-        if (cbor_value_is_length_known(&w.first)) {
-            size_t len2;
-            QCOMPARE(cbor_value_get_string_length(&w.first, &len2), CborNoError);
-            QCOMPARE(len2, len);
-        } else {
-            QCOMPARE(cbor_value_get_string_length(&w.first, &len), CborErrorUnknownLength);
-        }
-    }
-
-    CborError err2 = cbor_value_validate_basic(&w.first);
-
-    QString decoded;
-    err = parseOne(&w.first, &decoded);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) +
-                   "\"; decoded stream:\n" + decoded.toLatin1());
-    QCOMPARE(decoded, expected);
-
-    // check that the errors are the same
-    QCOMPARE(err2, err);
-
-    // check that we consumed everything
-    QCOMPARE((void*)cbor_value_get_next_byte(&w.first), (void*)w.end());
-
-    compareFailed = false;
-}
-#define compareOne(data, expected) compareOne_real(data, expected, __LINE__)
-#define compareOneSize(n, data, expected) compareOne_real(data, expected, __LINE__, n)
-
-void addFixedData()
-{
-    // unsigned integers
-    QTest::newRow("0") << raw("\x00") << "0";
-    QTest::newRow("1") << raw("\x01") << "1";
-    QTest::newRow("10") << raw("\x0a") << "10";
-    QTest::newRow("23") << raw("\x17") << "23";
-    QTest::newRow("24") << raw("\x18\x18") << "24";
-    QTest::newRow("UINT8_MAX") << raw("\x18\xff") << "255";
-    QTest::newRow("UINT8_MAX+1") << raw("\x19\x01\x00") << "256";
-    QTest::newRow("UINT16_MAX") << raw("\x19\xff\xff") << "65535";
-    QTest::newRow("UINT16_MAX+1") << raw("\x1a\0\1\x00\x00") << "65536";
-    QTest::newRow("UINT32_MAX") << raw("\x1a\xff\xff\xff\xff") << "4294967295";
-    QTest::newRow("UINT32_MAX+1") << raw("\x1b\0\0\0\1\0\0\0\0") << "4294967296";
-    QTest::newRow("UINT64_MAX") << raw("\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                << QString::number(std::numeric_limits<uint64_t>::max());
-
-    // negative integers
-    QTest::newRow("-1") << raw("\x20") << "-1";
-    QTest::newRow("-2") << raw("\x21") << "-2";
-    QTest::newRow("-24") << raw("\x37") << "-24";
-    QTest::newRow("-25") << raw("\x38\x18") << "-25";
-    QTest::newRow("-UINT8_MAX") << raw("\x38\xff") << "-256";
-    QTest::newRow("-UINT8_MAX-1") << raw("\x39\x01\x00") << "-257";
-    QTest::newRow("-UINT16_MAX") << raw("\x39\xff\xff") << "-65536";
-    QTest::newRow("-UINT16_MAX-1") << raw("\x3a\0\1\x00\x00") << "-65537";
-    QTest::newRow("-UINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << "-4294967296";
-    QTest::newRow("-UINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << "-4294967297";
-    QTest::newRow("INT64_MIN+1") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xfe")
-                               << QString::number(std::numeric_limits<int64_t>::min() + 1);
-    QTest::newRow("INT64_MIN") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xff")
-                               << QString::number(std::numeric_limits<int64_t>::min());
-    QTest::newRow("INT64_MIN-1") << raw("\x3b\x80\0\0\0""\0\0\0\0") << "-9223372036854775809";
-    QTest::newRow("-UINT64_MAX") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe")
-                                   << '-' + QString::number(std::numeric_limits<uint64_t>::max());
-    QTest::newRow("-UINT64_MAX+1") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                   << "-18446744073709551616";
-
-    // overlongs
-    QTest::newRow("0*1") << raw("\x18\x00") << "0_0";
-    QTest::newRow("0*2") << raw("\x19\x00\x00") << "0_1";
-    QTest::newRow("0*4") << raw("\x1a\0\0\0\0") << "0_2";
-    QTest::newRow("0*8") << raw("\x1b\0\0\0\0\0\0\0\0") << "0_3";
-    QTest::newRow("-1*1") << raw("\x38\x00") << "-1_0";
-    QTest::newRow("-1*2") << raw("\x39\x00\x00") << "-1_1";
-    QTest::newRow("-1*4") << raw("\x3a\0\0\0\0") << "-1_2";
-    QTest::newRow("-1*8") << raw("\x3b\0\0\0\0\0\0\0\0") << "-1_3";
-
-    QTest::newRow("simple0") << raw("\xe0") << "simple(0)";
-    QTest::newRow("simple19") << raw("\xf3") << "simple(19)";
-    QTest::newRow("false") << raw("\xf4") << "false";
-    QTest::newRow("true") << raw("\xf5") << "true";
-    QTest::newRow("null") << raw("\xf6") << "null";
-    QTest::newRow("undefined") << raw("\xf7") << "undefined";
-    QTest::newRow("simple32") << raw("\xf8\x20") << "simple(32)";
-    QTest::newRow("simple255") << raw("\xf8\xff") << "simple(255)";
-
-    // floating point
-
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << "0.f16";
-    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "0.f";
-    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << "0.";
-    QTest::newRow("-1.f16") << raw("\xf9\xbc\x00") << "-1.f16";
-    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "-1.f";
-    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "-1.";
-    QTest::newRow("65504.f16") << raw("\xf9\x7b\xff") << "65504.f16";
-    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
-    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "16777215.";
-    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "-16777215.f";
-    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "-16777215.";
-
-    QTest::newRow("0.5f16") << raw("\xf9\x38\0") << "0.5f16";
-    QTest::newRow("0.5f") << raw("\xfa\x3f\0\0\0") << "0.5f";
-    QTest::newRow("0.5") << raw("\xfb\x3f\xe0\0\0\0\0\0\0") << "0.5";
-    QTest::newRow("2.f16^11-1") << raw("\xf9\x67\xff") << "2047.f16";
-    QTest::newRow("2.f^24-1") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
-    QTest::newRow("2.^53-1") << raw("\xfb\x43\x3f\xff\xff""\xff\xff\xff\xff") << "9007199254740991.";
-    QTest::newRow("2.f^64-epsilon") << raw("\xfa\x5f\x7f\xff\xff") << "18446742974197923840.f";
-    QTest::newRow("2.^64-epsilon") << raw("\xfb\x43\xef\xff\xff""\xff\xff\xff\xff") << "18446744073709549568.";
-    QTest::newRow("2.f^64") << raw("\xfa\x5f\x80\0\0") << "1.8446744073709552e+19f";
-    QTest::newRow("2.^64") << raw("\xfb\x43\xf0\0\0\0\0\0\0") << "1.8446744073709552e+19";
-
-    QTest::newRow("nan_f16") << raw("\xf9\x7e\x00") << "nan";
-    QTest::newRow("nan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
-    QTest::newRow("nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
-    QTest::newRow("-inf_f16") << raw("\xf9\xfc\x00") << "-inf";
-    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "-inf";
-    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "-inf";
-    QTest::newRow("+inf_f16") << raw("\xf9\x7c\x00") << "inf";
-    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "inf";
-    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "inf";
-
-}
-
-static void addIntegers()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<quint64>("expectedRaw");
-    QTest::addColumn<qint64>("expectedValue");
-    QTest::addColumn<bool>("isNegative");
-    QTest::addColumn<bool>("inInt64Range");
-
-    // unsigned integers
-    QTest::newRow("0") << raw("\x00") << Q_UINT64_C(0) << Q_INT64_C(0) << false << true;
-    QTest::newRow("1") << raw("\x01") << Q_UINT64_C(1) << Q_INT64_C(1) << false << true;
-    QTest::newRow("10") << raw("\x0a") << Q_UINT64_C(10) << Q_INT64_C(10) << false << true;
-    QTest::newRow("23") << raw("\x17") << Q_UINT64_C(23) << Q_INT64_C(23) << false << true;
-    QTest::newRow("24") << raw("\x18\x18") << Q_UINT64_C(24) << Q_INT64_C(24) << false << true;
-    QTest::newRow("UINT8_MAX") << raw("\x18\xff") << Q_UINT64_C(255) << Q_INT64_C(255) << false << true;
-    QTest::newRow("UINT8_MAX+1") << raw("\x19\x01\x00") << Q_UINT64_C(256) << Q_INT64_C(256) << false << true;
-    QTest::newRow("UINT16_MAX") << raw("\x19\xff\xff") << Q_UINT64_C(65535) << Q_INT64_C(65535) << false << true;
-    QTest::newRow("UINT16_MAX+1") << raw("\x1a\0\1\x00\x00") << Q_UINT64_C(65536) << Q_INT64_C(65536) << false << true;
-    QTest::newRow("UINT32_MAX") << raw("\x1a\xff\xff\xff\xff") << Q_UINT64_C(4294967295) << Q_INT64_C(4294967295) << false << true;
-    QTest::newRow("UINT32_MAX+1") << raw("\x1b\0\0\0\1\0\0\0\0") << Q_UINT64_C(4294967296) << Q_INT64_C(4294967296) << false << true;
-    QTest::newRow("INT64_MAX") << raw("\x1b" "\x7f\xff\xff\xff" "\xff\xff\xff\xff")
-                                << quint64(std::numeric_limits<qint64>::max())
-                                << std::numeric_limits<qint64>::max() << false << true;
-    QTest::newRow("UINT64_MAX") << raw("\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                << std::numeric_limits<quint64>::max() << qint64(-123456) << false << false;
-
-    // negative integers
-    QTest::newRow("-1") << raw("\x20") << Q_UINT64_C(0) << Q_INT64_C(-1) << true << true;
-    QTest::newRow("-2") << raw("\x21") << Q_UINT64_C(1) << Q_INT64_C(-2) << true << true;
-    QTest::newRow("-24") << raw("\x37") << Q_UINT64_C(23) << Q_INT64_C(-24) << true << true;
-    QTest::newRow("-25") << raw("\x38\x18") << Q_UINT64_C(24) << Q_INT64_C(-25) << true << true;
-    QTest::newRow("-UINT8_MAX") << raw("\x38\xff") << Q_UINT64_C(255) << Q_INT64_C(-256) << true << true;
-    QTest::newRow("-UINT8_MAX-1") << raw("\x39\x01\x00") << Q_UINT64_C(256) << Q_INT64_C(-257) << true << true;
-    QTest::newRow("-UINT16_MAX") << raw("\x39\xff\xff") << Q_UINT64_C(65535) << Q_INT64_C(-65536) << true << true;
-    QTest::newRow("-UINT16_MAX-1") << raw("\x3a\0\1\x00\x00") << Q_UINT64_C(65536) << Q_INT64_C(-65537) << true << true;
-    QTest::newRow("-UINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << Q_UINT64_C(4294967295) << Q_INT64_C(-4294967296) << true << true;
-    QTest::newRow("-UINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << Q_UINT64_C(4294967296) << Q_INT64_C(-4294967297) << true << true;
-    QTest::newRow("INT64_MIN+1") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xfe")
-                               << quint64(std::numeric_limits<qint64>::max() - 1)
-                               << (std::numeric_limits<qint64>::min() + 1)
-                               << true << true;
-    QTest::newRow("INT64_MIN") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xff")
-                               << quint64(std::numeric_limits<qint64>::max())
-                               << std::numeric_limits<qint64>::min()
-                               << true << true;
-    QTest::newRow("INT64_MIN-1") << raw("\x3b\x80\0\0\0""\0\0\0\0") << Q_UINT64_C(9223372036854775808) << qint64(-123456) << true << false;
-    QTest::newRow("-UINT64_MAX") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe")
-                                 << (std::numeric_limits<quint64>::max() - 1) << qint64(-123456) << true << false;
-    QTest::newRow("-UINT64_MAX+1") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                   << std::numeric_limits<quint64>::max() << qint64(-123456) << true << false;
-}
-
-void tst_Parser::integers_data()
-{
-    addIntegers();
-}
-
-void tst_Parser::integers()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(bool, isNegative);
-    QFETCH(quint64, expectedRaw);
-    QFETCH(qint64, expectedValue);
-    QFETCH(bool, inInt64Range);
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QVERIFY(cbor_value_is_integer(&w.first));
-
-    uint64_t raw;
-    cbor_value_get_raw_integer(&w.first, &raw);
-    QCOMPARE(quint64(raw), expectedRaw);
-
-    if (isNegative) {
-        QVERIFY(cbor_value_is_negative_integer(&w.first));
-        QVERIFY(!cbor_value_is_unsigned_integer(&w.first));
-    } else {
-        QVERIFY(!cbor_value_is_negative_integer(&w.first));
-        QVERIFY(cbor_value_is_unsigned_integer(&w.first));
-    }
-
-    int64_t value;
-    if (inInt64Range) {
-        cbor_value_get_int64(&w.first, &value);
-        QCOMPARE(qint64(value), expectedValue);
-    }
-
-    err = cbor_value_get_int64_checked(&w.first, &value);
-    QCOMPARE(err, inInt64Range ? CborNoError : CborErrorDataTooLarge);
-
-    int ivalue;
-    bool inIntRange = inInt64Range && (expectedValue == int(expectedValue));
-    err = cbor_value_get_int_checked(&w.first, &ivalue);
-    QCOMPARE(err, inIntRange ? CborNoError : CborErrorDataTooLarge);
-}
-
-void tst_Parser::fixed_data()
-{
-    addColumns();
-    addFixedData();
-}
-
-void tst_Parser::fixed()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne(data, expected);
-}
-
-void addStringsData()
-{
-    // byte strings
-    QTest::newRow("emptybytestring") << raw("\x40") << "h''";
-    QTest::newRow("bytestring1") << raw("\x41 ") << "h'20'";
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << "h'00'";
-    QTest::newRow("bytestring5") << raw("\x45Hello") << "h'48656c6c6f'";
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234")
-                                  << "h'313233343536373839303132333435363738393031323334'";
-    QTest::newRow("bytestring256") << raw("\x59\1\0") + QByteArray(256, '3')
-                                   << "h'" + QString(256 * 2, '3') + '\'';
-
-    // text strings
-    QTest::newRow("emptytextstring") << raw("\x60") << "\"\"";
-    QTest::newRow("textstring1") << raw("\x61 ") << "\" \"";
-    QTest::newRow("textstring1-nul") << raw("\x61\0") << "\"\\u0000\"";
-    QTest::newRow("textstring5") << raw("\x65Hello") << "\"Hello\"";
-    QTest::newRow("textstring24") << raw("\x78\x18""123456789012345678901234")
-                                  << "\"123456789012345678901234\"";
-    QTest::newRow("textstring256") << raw("\x79\1\0") + QByteArray(256, '3')
-                                   << '"' + QString(256, '3') + '"';
-
-    // some strings with UTF-8 content
-    // we had a bug in the pretty dumper - see issue #54
-    QTest::newRow("textstringutf8-2char") << raw("\x62\xc2\xa0") << "\"\\u00A0\"";
-    QTest::newRow("textstringutf8-2char2") << raw("\x64\xc2\xa0\xc2\xa9") << "\"\\u00A0\\u00A9\"";
-    QTest::newRow("textstringutf8-3char") << raw("\x63\xe2\x88\x80") << "\"\\u2200\"";
-    QTest::newRow("textstringutf8-4char") << raw("\x64\xf0\x90\x88\x83") << "\"\\uD800\\uDE03\"";
-
-    // strings with overlong length
-    QTest::newRow("emptybytestring*1") << raw("\x58\x00") << "h''_0";
-    QTest::newRow("emptytextstring*1") << raw("\x78\x00") << "\"\"_0";
-    QTest::newRow("emptybytestring*2") << raw("\x59\x00\x00") << "h''_1";
-    QTest::newRow("emptytextstring*2") << raw("\x79\x00\x00") << "\"\"_1";
-    QTest::newRow("emptybytestring*4") << raw("\x5a\0\0\0\0") << "h''_2";
-    QTest::newRow("emptytextstring*4") << raw("\x7a\0\0\0\0") << "\"\"_2";
-    QTest::newRow("emptybytestring*8") << raw("\x5b\0\0\0\0\0\0\0\0") << "h''_3";
-    QTest::newRow("emptytextstring*8") << raw("\x7b\0\0\0\0\0\0\0\0") << "\"\"_3";
-    QTest::newRow("bytestring5*1") << raw("\x58\x05Hello") << "h'48656c6c6f'_0";
-    QTest::newRow("textstring5*1") << raw("\x78\x05Hello") << "\"Hello\"_0";
-    QTest::newRow("bytestring5*2") << raw("\x59\0\5Hello") << "h'48656c6c6f'_1";
-    QTest::newRow("textstring5*2") << raw("\x79\0\x05Hello") << "\"Hello\"_1";
-    QTest::newRow("bytestring5*4") << raw("\x5a\0\0\0\5Hello") << "h'48656c6c6f'_2";
-    QTest::newRow("textstring5*4") << raw("\x7a\0\0\0\x05Hello") << "\"Hello\"_2";
-    QTest::newRow("bytestring5*8") << raw("\x5b\0\0\0\0\0\0\0\5Hello") << "h'48656c6c6f'_3";
-    QTest::newRow("textstring5*8") << raw("\x7b\0\0\0\0\0\0\0\x05Hello") << "\"Hello\"_3";
-
-    // strings with undefined length
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << "(_ )";
-    QTest::newRow("_emptytextstring") << raw("\x7f\xff") << "(_ )";
-    QTest::newRow("_emptybytestring2") << raw("\x5f\x40\xff") << "(_ h'')";
-    QTest::newRow("_emptytextstring2") << raw("\x7f\x60\xff") << "(_ \"\")";
-    QTest::newRow("_emptybytestring2*1") << raw("\x5f\x58\x00\xff") << "(_ h''_0)";
-    QTest::newRow("_emptytextstring2*1") << raw("\x7f\x78\x00\xff") << "(_ \"\"_0)";
-    QTest::newRow("_emptybytestring3") << raw("\x5f\x40\x40\xff") << "(_ h'', h'')";
-    QTest::newRow("_emptytextstring3") << raw("\x7f\x60\x60\xff") << "(_ \"\", \"\")";
-    QTest::newRow("_emptybytestring3*2") << raw("\x5f\x59\x00\x00\x40\xff") << "(_ h''_1, h'')";
-    QTest::newRow("_emptytextstring3*2") << raw("\x7f\x79\x00\x00\x60\xff") << "(_ \"\"_1, \"\")";
-    QTest::newRow("_bytestring5x2") << raw("\x5f\x43Hel\x42lo\xff") << "(_ h'48656c', h'6c6f')";
-    QTest::newRow("_textstring5x2") << raw("\x7f\x63Hel\x62lo\xff") << "(_ \"Hel\", \"lo\")";
-    QTest::newRow("_bytestring5x2*8*4") << raw("\x5f\x5b\0\0\0\0\0\0\0\3Hel\x5a\0\0\0\2lo\xff") << "(_ h'48656c'_3, h'6c6f'_2)";
-    QTest::newRow("_textstring5x2*8*4") << raw("\x7f\x7b\0\0\0\0\0\0\0\3Hel\x7a\0\0\0\2lo\xff") << "(_ \"Hel\"_3, \"lo\"_2)";
-    QTest::newRow("_bytestring5x5") << raw("\x5f\x41H\x41""e\x41l\x41l\x41o\xff") << "(_ h'48', h'65', h'6c', h'6c', h'6f')";
-    QTest::newRow("_textstring5x5") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << "(_ \"H\", \"e\", \"l\", \"l\", \"o\")";
-    QTest::newRow("_bytestring5x6") << raw("\x5f\x41H\x41""e\x40\x41l\x41l\x41o\xff") << "(_ h'48', h'65', h'', h'6c', h'6c', h'6f')";
-    QTest::newRow("_textstring5x6") << raw("\x7f\x61H\x61""e\x61l\x60\x61l\x61o\xff") << "(_ \"H\", \"e\", \"l\", \"\", \"l\", \"o\")";
-}
-
-void tst_Parser::strings_data()
-{
-    addColumns();
-    addStringsData();
-}
-
-void addTagsData()
-{
-    // since parseOne() works recursively for tags, we can't test lone tags
-    QTest::newRow("tag0") << raw("\xc0\x00") << "0(0)";
-    QTest::newRow("tag1") << raw("\xc1\x00") << "1(0)";
-    QTest::newRow("tag24") << raw("\xd8\x18\x00") << "24(0)";
-    QTest::newRow("tag255") << raw("\xd8\xff\x00") << "255(0)";
-    QTest::newRow("tag256") << raw("\xd9\1\0\x00") << "256(0)";
-    QTest::newRow("tag65535") << raw("\xd9\xff\xff\x00") << "65535(0)";
-    QTest::newRow("tag65536") << raw("\xda\0\1\0\0\x00") << "65536(0)";
-    QTest::newRow("tagUINT32_MAX-1") << raw("\xda\xff\xff\xff\xff\x00") << "4294967295(0)";
-    QTest::newRow("tagUINT32_MAX") << raw("\xdb\0\0\0\1\0\0\0\0\x00") << "4294967296(0)";
-    QTest::newRow("tagUINT64_MAX") << raw("\xdb" "\xff\xff\xff\xff" "\xff\xff\xff\xff" "\x00")
-                                << QString::number(std::numeric_limits<uint64_t>::max()) + "(0)";
-
-    // overlong tags
-    QTest::newRow("tag0*1") << raw("\xd8\0\x00") << "0_0(0)";
-    QTest::newRow("tag0*2") << raw("\xd9\0\0\x00") << "0_1(0)";
-    QTest::newRow("tag0*4") << raw("\xda\0\0\0\0\x00") << "0_2(0)";
-    QTest::newRow("tag0*8") << raw("\xdb\0\0\0\0\0\0\0\0\x00") << "0_3(0)";
-
-    // tag other things
-    QTest::newRow("unixtime") << raw("\xc1\x1a\x55\x4b\xbf\xd3") << "1(1431027667)";
-    QTest::newRow("rfc3339date") << raw("\xc0\x78\x19" "2015-05-07 12:41:07-07:00")
-                                 << "0(\"2015-05-07 12:41:07-07:00\")";
-    QTest::newRow("tag6+false") << raw("\xc6\xf4") << "6(false)";
-    QTest::newRow("tag25+true") << raw("\xd8\x19\xf5") << "25(true)";
-    QTest::newRow("tag256+null") << raw("\xd9\1\0\xf6") << "256(null)";
-    QTest::newRow("tag65536+simple32") << raw("\xda\0\1\0\0\xf8\x20") << "65536(simple(32))";
-    QTest::newRow("float+unixtime") << raw("\xc1\xfa\x4e\xaa\x97\x80") << "1(1431027712.f)";
-    QTest::newRow("double+unixtime") << raw("\xc1\xfb" "\x41\xd5\x52\xef" "\xf4\xc7\xce\xfe")
-                                     << "1(1431027667.1220088)";
-}
-
-void tst_Parser::tags_data()
-{
-    addColumns();
-    addTagsData();
-}
-
-void tst_Parser::tagTags()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\xd9\xd9\xf7" + data, "55799(" + expected + ')');
-    if (!compareFailed)
-        compareOne("\xd9\xd9\xf7" "\xd9\xd9\xf7" + data, "55799(55799(" + expected + "))");
-}
-
-void addEmptyContainersData()
-{
-    QTest::newRow("emptyarray") << raw("\x80") << "[]" << 0;
-    QTest::newRow("emptymap") << raw("\xa0") << "{}" << 0;
-    QTest::newRow("_emptyarray") << raw("\x9f\xff") << "[_ ]" << -1;
-    QTest::newRow("_emptymap") << raw("\xbf\xff") << "{_ }" << -1;
-}
-
-void tst_Parser::emptyContainers_data()
-{
-    addColumns();
-    addEmptyContainersData();
-}
-
-void tst_Parser::emptyContainers()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-    QFETCH(int, n);
-
-    compareOneSize(n, data, expected);
-}
-
-void tst_Parser::arrays_data()
-{
-    addColumns();
-    addFixedData();
-    addStringsData();
-    addTagsData();
-}
-
-void tst_Parser::arrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOneSize(1, "\x81" + data, '[' + expected + ']');
-    if (compareFailed) return;
-
-    compareOneSize(2, "\x82" + data + data, '[' + expected + ", " + expected + ']');
-    if (compareFailed) return;
-
-    // overlong length
-    compareOneSize(1, "\x98\1" + data, "[_0 " + expected + ']');
-    if (compareFailed) return;
-    compareOneSize(1, raw("\x99\0\1") + data, "[_1 " + expected + ']');
-    if (compareFailed) return;
-    compareOneSize(1, raw("\x9a\0\0\0\1") + data, "[_2 " + expected + ']');
-    if (compareFailed) return;
-    compareOneSize(1, raw("\x9b\0\0\0\0\0\0\0\1") + data, "[_3 " + expected + ']');
-    if (compareFailed) return;
-
-    // medium-sized array: 32 elements (1 << 5)
-    expected += ", ";
-    for (int i = 0; i < 5; ++i) {
-        data += data;
-        expected += expected;
-    }
-    expected.chop(2);   // remove the last ", "
-    compareOneSize(32, "\x98\x20" + data, '[' + expected + ']');
-    if (compareFailed) return;
-
-    // large array: 256 elements (32 << 3)
-    expected += ", ";
-    for (int i = 0; i < 3; ++i) {
-        data += data;
-        expected += expected;
-    }
-    expected.chop(2);   // remove the last ", "
-    compareOneSize(256, raw("\x99\1\0") + data, '[' + expected + ']');
-    if (compareFailed) return;
-}
-
-void tst_Parser::undefLengthArrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\x9f" + data + "\xff", "[_ " + expected + ']');
-    if (compareFailed) return;
-
-    compareOne("\x9f" + data + data + "\xff", "[_ " + expected + ", " + expected + ']');
-}
-
-void tst_Parser::nestedArrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOneSize(1, "\x81\x81" + data, "[[" + expected + "]]");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\x81\x81\x81" + data, "[[[" + expected + "]]]");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\x81\x82" + data + data, "[[" + expected + ", " + expected + "]]");
-    if (compareFailed) return;
-
-    compareOneSize(2, "\x82\x81" + data + data, "[[" + expected + "], " + expected + "]");
-    if (compareFailed) return;
-
-    compareOneSize(2, "\x82\x81" + data + '\x81' + data, "[[" + expected + "], [" + expected + "]]");
-    if (compareFailed) return;
-
-    // undefined length
-    compareOneSize(-1, "\x9f\x9f" + data + data + "\xff\xff", "[_ [_ " + expected + ", " + expected + "]]");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\x9f\x9f" + data + "\xff\x9f" + data + "\xff\xff", "[_ [_ " + expected + "], [_ " + expected + "]]");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\x9f\x9f" + data + data + "\xff\x9f" + data + "\xff\xff",
-               "[_ [_ " + expected + ", " + expected + "], [_ " + expected + "]]");
-    if (compareFailed) return;
-
-    // mix them
-    compareOneSize(1, "\x81\x9f" + data + "\xff", "[[_ " + expected + "]]");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\x9f\x81" + data + "\xff", "[_ [" + expected + "]]");
-}
-
-void tst_Parser::maps_data()
-{
-    arrays_data();
-}
-
-void tst_Parser::maps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    // integer key
-    compareOneSize(1, "\xa1\1" + data, "{1: " + expected + '}');
-    if (compareFailed) return;
-
-    // string key
-    compareOneSize(1, "\xa1\x65" "Hello" + data, "{\"Hello\": " + expected + '}');
-    if (compareFailed) return;
-
-    // map to self
-    compareOneSize(1, "\xa1" + data + data, '{' + expected + ": " + expected + '}');
-    if (compareFailed) return;
-
-    // two integer keys
-    compareOneSize(2, "\xa2\1" + data + "\2" + data, "{1: " + expected + ", 2: " + expected + '}');
-    if (compareFailed) return;
-
-    // OneSize integer and OneSize string key
-    compareOneSize(2, "\xa2\1" + data + "\x65" "Hello" + data, "{1: " + expected + ", \"Hello\": " + expected + '}');
-    if (compareFailed) return;
-}
-
-void tst_Parser::undefLengthMaps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    // integer key
-    compareOne("\xbf\1" + data + '\xff', "{_ 1: " + expected + '}');
-    if (compareFailed) return;
-
-    compareOne("\xbf\1" + data + '\2' + data + '\xff', "{_ 1: " + expected + ", 2: " + expected + '}');
-    if (compareFailed) return;
-
-    compareOne("\xbf\1" + data + "\x65Hello" + data + '\xff', "{_ 1: " + expected + ", \"Hello\": " + expected + '}');
-    if (compareFailed) return;
-
-    compareOne("\xbf\x65Hello" + data + '\1' + data + '\xff', "{_ \"Hello\": " + expected + ", 1: " + expected + '}');
-}
-
-void tst_Parser::nestedMaps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    // nested maps as values
-    compareOneSize(1, "\xa1\1\xa1\2" + data, "{1: {2: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\x65Hello\xa1\2" + data, "{\"Hello\": {2: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\1\xa2\2" + data + '\x20' + data, "{1: {2: " + expected + ", -1: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(2, "\xa2\1\xa1\2" + data + "\2\xa1\x20" + data, "{1: {2: " + expected + "}, 2: {-1: " + expected + "}}");
-    if (compareFailed) return;
-
-    // nested maps as keys
-    compareOneSize(1, "\xa1\xa1\xf4" + data + "\xf5", "{{false: " + expected + "}: true}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\xa1" + data + data + "\xa1" + data + data,
-               "{{" + expected + ": " + expected + "}: {" + expected + ": " + expected + "}}");
-    if (compareFailed) return;
-
-    // undefined length
-    compareOneSize(-1, "\xbf\1\xbf\2" + data + "\xff\xff", "{_ 1: {_ 2: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\xbf\2" + data + '\x20' + data + "\xff\xff", "{_ 1: {_ 2: " + expected + ", -1: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\xbf\2" + data + "\xff\2\xbf\x20" + data + "\xff\xff",
-               "{_ 1: {_ 2: " + expected + "}, 2: {_ -1: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\xbf" + data + data + "\xff\xbf" + data + data + "\xff\xff",
-               "{_ {_ " + expected + ": " + expected + "}: {_ " + expected + ": " + expected + "}}");
-    if (compareFailed) return;
-
-    // mix them
-    compareOneSize(1, "\xa1\1\xbf\2" + data + "\xff", "{1: {_ 2: " + expected + "}}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\xa1\2" + data + "\xff", "{_ 1: {2: " + expected + "}}");
-    if (compareFailed) return;
-}
-
-void addMapMixedData()
-{
-    QTest::newRow("map-0-24") << raw("\xa1\0\x18\x18") << "{0: 24}" << 1;
-    QTest::newRow("map-0*1-24") << raw("\xa1\x18\0\x18\x18") << "{0_0: 24}" << 1;
-    QTest::newRow("map-0*1-24*2") << raw("\xa1\x18\0\x19\0\x18") << "{0_0: 24_1}" << 1;
-    QTest::newRow("map-0*4-24*2") << raw("\xa1\x1a\0\0\0\0\x19\0\x18") << "{0_2: 24_1}" << 1;
-    QTest::newRow("map-24-0") << raw("\xa1\x18\x18\0") << "{24: 0}" << 1;
-    QTest::newRow("map-24-0*1") << raw("\xa1\x18\x18\x18\0") << "{24: 0_0}" << 1;
-    QTest::newRow("map-255-65535") << raw("\xa1\x18\xff\x19\xff\xff") << "{255: 65535}" << 1;
-
-    QTest::newRow("_map-0-24") << raw("\xbf\0\x18\x18\xff") << "{_ 0: 24}" << 1;
-    QTest::newRow("_map-0*1-24") << raw("\xbf\x18\0\x18\x18\xff") << "{_ 0_0: 24}" << 1;
-    QTest::newRow("_map-0*1-24*2") << raw("\xbf\x18\0\x19\0\x18\xff") << "{_ 0_0: 24_1}" << 1;
-    QTest::newRow("_map-0*4-24*2") << raw("\xbf\x1a\0\0\0\0\x19\0\x18\xff") << "{_ 0_2: 24_1}" << 1;
-    QTest::newRow("_map-24-0") << raw("\xbf\x18\x18\0\xff") << "{_ 24: 0}" << 1;
-    QTest::newRow("_map-24-0*1") << raw("\xbf\x18\x18\x18\0\xff") << "{_ 24: 0_0}" << 1;
-    QTest::newRow("_map-255-65535") << raw("\xbf\x18\xff\x19\xff\xff\xff") << "{_ 255: 65535}" << 1;
-}
-
-void tst_Parser::mapMixed_data()
-{
-    addColumns();
-    addMapMixedData();
-}
-
-void tst_Parser::mapsAndArrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    // arrays of maps
-    compareOneSize(1, "\x81\xa1\1" + data, "[{1: " + expected + "}]");
-    if (compareFailed) return;
-
-    compareOneSize(2, "\x82\xa1\1" + data + "\xa1\2" + data, "[{1: " + expected + "}, {2: " + expected + "}]");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\x81\xa2\1" + data + "\2" + data, "[{1: " + expected + ", 2: " + expected + "}]");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\x9f\xa1\1" + data + "\xff", "[_ {1: " + expected + "}]");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\x81\xbf\1" + data + "\xff", "[{_ 1: " + expected + "}]");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\x9f\xbf\1" + data + "\xff\xff", "[_ {_ 1: " + expected + "}]");
-    if (compareFailed) return;
-
-    // maps of arrays
-    compareOneSize(1, "\xa1\1\x81" + data, "{1: [" + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\1\x82" + data + data, "{1: [" + expected + ", " + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(2, "\xa2\1\x81" + data + "\x65Hello\x81" + data, "{1: [" + expected + "], \"Hello\": [" + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\1\x9f" + data + "\xff", "{1: [_ " + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(1, "\xa1\1\x9f" + data + data + "\xff", "{1: [_ " + expected + ", " + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\x81" + data + "\xff", "{_ 1: [" + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\x9f" + data + "\xff\xff", "{_ 1: [_ " + expected + "]}");
-    if (compareFailed) return;
-
-    compareOneSize(-1, "\xbf\1\x9f" + data + data + "\xff\xff", "{_ 1: [_ " + expected + ", " + expected + "]}");
-    if (compareFailed) return;
-
-    // mixed with indeterminate length strings
-    compareOneSize(-1, "\xbf\1\x9f" + data + "\xff\x65Hello\xbf" + data + "\x7f\xff\xff\xff",
-                   "{_ 1: [_ " + expected + "], \"Hello\": {_ " + expected + ": (_ )}}");
-}
-
-void tst_Parser::chunkedString_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QString>("concatenated");
-    QTest::addColumn<QStringList>("chunks");
-
-    // non-chunked:
-    QTest::newRow("emptybytestring") << raw("\x40") << "h''" << QStringList{"h''"};
-    QTest::newRow("bytestring1") << raw("\x41 ") << "h'20'" << QStringList{"h'20'"};
-    QTest::newRow("emptytextstring") << raw("\x60") << "\"\"" << QStringList{"\"\""};
-    QTest::newRow("textstring1") << raw("\x61 ") << "\" \"" << QStringList{"\" \""};
-
-    // empty chunked:
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << "h''" << QStringList{};
-    QTest::newRow("_emptytextstring") << raw("\x7f\xff") << "\"\"" << QStringList{};
-    QTest::newRow("_emptybytestring2") << raw("\x5f\x40\xff") << "h''" << QStringList{"h''"};
-    QTest::newRow("_emptytextstring2") << raw("\x7f\x60\xff") << "\"\"" << QStringList{"\"\""};
-    QTest::newRow("_emptybytestring3") << raw("\x5f\x40\x40\xff") << "h''" << QStringList{"h''", "h''"};
-    QTest::newRow("_emptytextstring3") << raw("\x7f\x60\x60\xff") << "\"\"" << QStringList{"\"\"", "\"\""};
-
-    // regular chunks
-    QTest::newRow("_bytestring1") << raw("\x5f\x41 \xff") << "h'20'" << QStringList{"h'20'"};
-    QTest::newRow("_bytestring2") << raw("\x5f\x41 \x41z\xff") << "h'207a'" << QStringList{"h'20'", "h'7a'"};
-    QTest::newRow("_bytestring3") << raw("\x5f\x41 \x58\x18""123456789012345678901234\x41z\xff")
-                                  << "h'203132333435363738393031323334353637383930313233347a'"
-                                  << QStringList{"h'20'", "h'313233343536373839303132333435363738393031323334'", "h'7a'"};
-
-    QTest::newRow("_textstring1") << raw("\x7f\x61 \xff") << "\" \"" << QStringList{"\" \""};
-    QTest::newRow("_textstring2") << raw("\x7f\x61 \x61z\xff") << "\" z\"" << QStringList{"\" \"", "\"z\""};
-    QTest::newRow("_textstring3") << raw("\x7f\x61 \x78\x18""123456789012345678901234\x61z\xff")
-                                  << "\" 123456789012345678901234z\""
-                                  << QStringList{"\" \"", "\"123456789012345678901234\"", "\"z\""};
-}
-
-static void chunkedStringTest(const QByteArray &data, const QString &concatenated,
-                              QStringList &chunks, CborType ourType)
-{
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    CborValue value;
-    QVERIFY(cbor_value_is_array(&w.first));
-    err = cbor_value_enter_container(&w.first, &value);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QVERIFY(cbor_value_is_byte_string(&value) || cbor_value_is_text_string(&value));
-
-    CborValue copy = value;
-
-    Q_UNUSED(chunks);   // for future API
-    QCOMPARE(cbor_value_advance(&value), CborNoError);
-
-    // compare to the concatenated data
-    {
-        size_t n;
-        err = cbor_value_calculate_string_length(&copy, &n);
-        QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-        size_t nn = n;
-        QByteArray buffer(n + 1, Qt::Uninitialized);
-        QByteArray buffer2(n + 1, Qt::Uninitialized);
-        buffer[int(n)] = 0xff;
-        buffer2[int(n)] = 0xff;
-        QString formatted;
-        if (cbor_value_is_byte_string(&copy)) {
-            err = cbor_value_copy_byte_string(&copy, (uint8_t *)buffer.data(), &nn, nullptr);
-            QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-            QCOMPARE(nn, n);
-
-            formatted = QString::fromLatin1("h'" + QByteArray::fromRawData(buffer.data(), n).toHex() + '\'');
-
-            // repeat by allowing the null termination
-            nn = n + 1;
-            err = cbor_value_copy_byte_string(&copy, (uint8_t *)buffer2.data(), &nn, nullptr);
-        } else {
-            err = cbor_value_copy_text_string(&copy, buffer.data(), &n, nullptr);
-            QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-            QCOMPARE(nn, n);
-
-            formatted = '"' + QString::fromUtf8(buffer.data(), n) + '"';
-
-            // repeat by allowing the null termination
-            nn = n + 1;
-            err = cbor_value_copy_text_string(&copy, buffer2.data(), &nn, nullptr);
-        }
-        QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-        QCOMPARE(formatted, concatenated);
-
-        // verify terminators
-        QCOMPARE(buffer.at(n), char(0xff));
-        QCOMPARE(buffer2.at(n), '\0');
-        QCOMPARE(nn, n);
-
-        buffer.truncate(n);
-        buffer2.truncate(n);
-        QCOMPARE(buffer2, buffer);
-    }
-
-    // confirm that the extra string we appended is still here
-    QVERIFY(!cbor_value_at_end(&value));
-    QCOMPARE(cbor_value_get_type(&value), ourType);
-    size_t len;
-    err = cbor_value_get_string_length(&value, &len);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QCOMPARE(len, size_t(0));
-
-    err = cbor_value_advance(&value);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    // confirm EOF
-    QVERIFY(cbor_value_at_end(&value));
-
-    err = cbor_value_leave_container(&w.first, &value);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QCOMPARE((void*)cbor_value_get_next_byte(&w.first), (void*)w.end());
-}
-
-void tst_Parser::chunkedString()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, concatenated);
-    QFETCH(QStringList, chunks);
-
-    // Make this an array of two entries, with the second an empty byte or text string
-    CborType ourType = CborType(data.at(0) & 0xe0);
-    data.prepend(char(0x82));
-    data.append(ourType);
-
-    chunkedStringTest(data, concatenated, chunks, ourType);
-}
-
-void tst_Parser::chunkedStringInUndefArray()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, concatenated);
-    QFETCH(QStringList, chunks);
-
-    // Make this an array of undefined length entries, with the second entry an empty byte or text string
-    CborType ourType = CborType(data.at(0) & 0xe0);
-    data.prepend(char(0x9f));
-    data.append(ourType);
-    data.append(char(0xff));
-
-    chunkedStringTest(data, concatenated, chunks, ourType);
-}
-
-void tst_Parser::stringLength_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<int>("expected");
-
-    QTest::newRow("emptybytestring") << raw("\x40") << 0;
-    QTest::newRow("bytestring1") << raw("\x41 ") << 1;
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << 1;
-    QTest::newRow("bytestring5") << raw("\x45Hello") << 5;
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234") << 24;
-    QTest::newRow("bytestring256") << raw("\x59\1\0") + QByteArray(256, '3') << 256;
-
-    // text strings
-    QTest::newRow("emptytextstring") << raw("\x60") << 0;
-    QTest::newRow("textstring1") << raw("\x61 ") << 1;
-    QTest::newRow("textstring1-nul") << raw("\x61\0") << 1;
-    QTest::newRow("textstring5") << raw("\x65Hello") << 5;
-    QTest::newRow("textstring24") << raw("\x78\x18""123456789012345678901234") << 24;
-    QTest::newRow("textstring256") << raw("\x79\1\0") + QByteArray(256, '3') << 256;
-
-    // strings with overlong length
-    QTest::newRow("emptybytestring*1") << raw("\x58\x00") << 0;
-    QTest::newRow("emptytextstring*1") << raw("\x78\x00") << 0;
-    QTest::newRow("emptybytestring*2") << raw("\x59\x00\x00") << 0;
-    QTest::newRow("emptytextstring*2") << raw("\x79\x00\x00") << 0;
-    QTest::newRow("emptybytestring*4") << raw("\x5a\0\0\0\0") << 0;
-    QTest::newRow("emptytextstring*4") << raw("\x7a\0\0\0\0") << 0;
-    QTest::newRow("emptybytestring*8") << raw("\x5b\0\0\0\0\0\0\0\0") << 0;
-    QTest::newRow("emptytextstring*8") << raw("\x7b\0\0\0\0\0\0\0\0") << 0;
-    QTest::newRow("bytestring5*1") << raw("\x58\x05Hello") << 5;
-    QTest::newRow("textstring5*1") << raw("\x78\x05Hello") << 5;
-    QTest::newRow("bytestring5*2") << raw("\x59\0\5Hello") << 5;
-    QTest::newRow("textstring5*2") << raw("\x79\0\x05Hello") << 5;
-    QTest::newRow("bytestring5*4") << raw("\x5a\0\0\0\5Hello") << 5;
-    QTest::newRow("textstring5*4") << raw("\x7a\0\0\0\x05Hello") << 5;
-    QTest::newRow("bytestring5*8") << raw("\x5b\0\0\0\0\0\0\0\5Hello") << 5;
-    QTest::newRow("textstring5*8") << raw("\x7b\0\0\0\0\0\0\0\x05Hello") << 5;
-
-    // strings with undefined length
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << 0;
-    QTest::newRow("_emptytextstring") << raw("\x7f\xff") << 0;
-    QTest::newRow("_emptybytestring2") << raw("\x5f\x40\xff") << 0;
-    QTest::newRow("_emptytextstring2") << raw("\x7f\x60\xff") << 0;
-    QTest::newRow("_emptybytestring3") << raw("\x5f\x40\x40\xff") << 0;
-    QTest::newRow("_emptytextstring3") << raw("\x7f\x60\x60\xff") << 0;
-    QTest::newRow("_bytestring5*2") << raw("\x5f\x43Hel\x42lo\xff") << 5;
-    QTest::newRow("_textstring5*2") << raw("\x7f\x63Hel\x62lo\xff") << 5;
-    QTest::newRow("_bytestring5*5") << raw("\x5f\x41H\x41""e\x41l\x41l\x41o\xff") << 5;
-    QTest::newRow("_textstring5*5") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << 5;
-    QTest::newRow("_bytestring5*6") << raw("\x5f\x41H\x41""e\x40\x41l\x41l\x41o\xff") << 5;
-    QTest::newRow("_textstring5*6") << raw("\x7f\x61H\x61""e\x61l\x60\x61l\x61o\xff") << 5;
-}
-
-void tst_Parser::stringLength()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(int, expected);
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    size_t result;
-    err = cbor_value_calculate_string_length(&w.first, &result);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QCOMPARE(result, size_t(expected));
-
-    if (cbor_value_is_length_known(&w.first)) {
-        QCOMPARE(cbor_value_get_string_length(&w.first, &result), CborNoError);
-        QCOMPARE(result, size_t(expected));
-    }
-
-}
-
-void tst_Parser::stringCompare_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QString>("string");
-    QTest::addColumn<bool>("expected");
-
-    // compare empty to empty
-    QTest::newRow("empty-empty") << raw("\x60") << QString() << true;
-    QTest::newRow("_empty-empty") << raw("\x7f\xff") << QString() << true;
-    QTest::newRow("_empty*1-empty") << raw("\x7f\x60\xff") << QString() << true;
-    QTest::newRow("_empty*2-empty") << raw("\x7f\x60\x60\xff") << QString() << true;
-
-    // compare empty to non-empty
-    QTest::newRow("empty-nonempty") << raw("\x60") << "Hello" << false;
-    QTest::newRow("_empty-nonempty") << raw("\x7f\xff") << "Hello" << false;
-    QTest::newRow("_empty*1-nonempty") << raw("\x7f\x60\xff") << "Hello" << false;
-    QTest::newRow("_empty*2-nonempty") << raw("\x7f\x60\x60\xff") << "Hello" << false;
-
-    // compare same strings
-    QTest::newRow("same-short-short") << raw("\x65Hello") << "Hello" << true;
-    QTest::newRow("same-_short*1-short") << raw("\x7f\x65Hello\xff") << "Hello" << true;
-    QTest::newRow("same-_short*2-short") << raw("\x7f\x63Hel\x62lo\xff") << "Hello" << true;
-    QTest::newRow("same-_short*5-short") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << "Hello" << true;
-    QTest::newRow("same-_short*8-short") << raw("\x7f\x61H\x60\x61""e\x60\x61l\x61l\x60\x61o\xff") << "Hello" << true;
-    QTest::newRow("same-long-long") << raw("\x78\x2aGood morning, good afternoon and goodnight")
-                                    << "Good morning, good afternoon and goodnight" << true;
-    QTest::newRow("same-_long*1-long") << raw("\x7f\x78\x2aGood morning, good afternoon and goodnight\xff")
-                                       << "Good morning, good afternoon and goodnight" << true;
-    QTest::newRow("same-_long*2-long") << raw("\x7f\x78\x1cGood morning, good afternoon\x6e and goodnight\xff")
-                                       << "Good morning, good afternoon and goodnight" << true;
-
-    // compare different strings (same length)
-    QTest::newRow("diff-same-length-short-short") << raw("\x65Hello") << "World" << false;
-    QTest::newRow("diff-same-length-_short*1-short") << raw("\x7f\x65Hello\xff") << "World" << false;
-    QTest::newRow("diff-same-length-_short*2-short") << raw("\x7f\x63Hel\x62lo\xff") << "World" << false;
-    QTest::newRow("diff-same-length-_short*5-short") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << "World" << false;
-    QTest::newRow("diff-same-length-_short*8-short") << raw("\x7f\x61H\x60\x61""e\x60\x61l\x61l\x60\x61o\xff") << "World" << false;
-    QTest::newRow("diff-same-length-long-long") << raw("\x78\x2aGood morning, good afternoon and goodnight")
-                                                << "Good morning, good afternoon and goodnight, world" << false;
-    QTest::newRow("diff-same-length-_long*1-long") << raw("\x7f\x78\x2aGood morning, good afternoon and goodnight\xff")
-                                                   << "Good morning, good afternoon and goodnight, world" << false;
-    QTest::newRow("diff-same-length-_long*2-long") << raw("\x7f\x78\x1cGood morning, good afternoon\x6e and goodnight\xff")
-                                                   << "Good morning, good afternoon and goodnight, world" << false;
-
-    // compare different strings (different length)
-    QTest::newRow("diff-diff-length-short-short") << raw("\x65Hello") << "Hello World" << false;
-    QTest::newRow("diff-diff-length-_short*1-short") << raw("\x7f\x65Hello\xff") << "Hello World" << false;
-    QTest::newRow("diff-diff-length-_short*2-short") << raw("\x7f\x63Hel\x62lo\xff") << "Hello World" << false;
-    QTest::newRow("diff-diff-length-_short*5-short") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << "Hello World" << false;
-    QTest::newRow("diff-diff-length-_short*8-short") << raw("\x7f\x61H\x60\x61""e\x60\x61l\x61l\x60\x61o\xff") << "Hello World" << false;
-    QTest::newRow("diff-diff-length-long-long") << raw("\x78\x2aGood morning, good afternoon and goodnight")
-                                                << "Good morning, good afternoon and goodnight World" << false;
-    QTest::newRow("diff-diff-length-_long*1-long") << raw("\x7f\x78\x2aGood morning, good afternoon and goodnight\xff")
-                                                   << "Good morning, good afternoon and goodnight World" << false;
-    QTest::newRow("diff-diff-length-_long*2-long") << raw("\x7f\x78\x1cGood morning, good afternoon\x6e and goodnight\xff")
-                                                   << "Good morning, good afternoon and goodnight World" << false;
-
-    // compare against non-strings
-    QTest::newRow("unsigned") << raw("\0") << "0" << false;
-    QTest::newRow("negative") << raw("\x20") << "-1" << false;
-    QTest::newRow("emptybytestring") << raw("\x40") << "" << false;
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << "" << false;
-    QTest::newRow("shortbytestring") << raw("\x45Hello") << "Hello" << false;
-    QTest::newRow("longbytestring") << raw("\x58\x2aGood morning, good afternoon and goodnight")
-                                    << "Good morning, good afternoon and goodnight" << false;
-    QTest::newRow("emptyarray") << raw("\x80") << "" << false;
-    QTest::newRow("emptymap") << raw("\xa0") << "" << false;
-    QTest::newRow("array") << raw("\x81\x65Hello") << "Hello" << false;
-    QTest::newRow("map") << raw("\xa1\x65Hello\x65World") << "Hello World" << false;
-    QTest::newRow("false") << raw("\xf4") << "false" << false;
-    QTest::newRow("true") << raw("\xf5") << "true" << false;
-    QTest::newRow("null") << raw("\xf6") << "null" << false;
-}
-
-void compareOneString(const QByteArray &data, const QString &string, bool expected, int line)
-{
-    compareFailed = true;
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) + "\"");
-
-    bool result;
-    QByteArray bastring = string.toUtf8();
-    err = cbor_value_text_string_equals(&w.first, bastring.constData(), &result);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) + "\"");
-    QCOMPARE(result, expected);
-
-    if (expected) {
-        size_t len;
-        cbor_value_skip_tag(&w.first);
-        if (cbor_value_is_length_known(&w.first)) {
-            QCOMPARE(cbor_value_get_string_length(&w.first, &len), CborNoError);
-            QCOMPARE(int(len), bastring.size());
-        }
-        QCOMPARE(cbor_value_calculate_string_length(&w.first, &len), CborNoError);
-        QCOMPARE(int(len), bastring.size());
-    }
-
-    compareFailed = false;
-}
-#define compareOneString(data, string, expected) compareOneString(data, string, expected, __LINE__)
-
-void tst_Parser::stringCompare()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, string);
-    QFETCH(bool, expected);
-
-    compareOneString(data, string, expected);
-    if (compareFailed) return;
-
-    // tag it
-    compareOneString("\xc1" + data, string, expected);
-    if (compareFailed) return;
-
-    compareOneString("\xc1\xc2" + data, string, expected);
-}
-
-void tst_Parser::mapFind_data()
-{
-    // Rules:
-    //  we are searching for string "needle"
-    //  if present, the value should be the string "haystack" (with tag 42)
-
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<bool>("expected");
-
-    QTest::newRow("emptymap") << raw("\xa0") << false;
-    QTest::newRow("_emptymap") << raw("\xbf\xff") << false;
-
-    // maps not containing our items
-    QTest::newRow("absent-unsigned-unsigned") << raw("\xa1\0\0") << false;
-    QTest::newRow("absent-taggedunsigned-unsigned") << raw("\xa1\xc0\0\0") << false;
-    QTest::newRow("absent-unsigned-taggedunsigned") << raw("\xa1\0\xc0\0") << false;
-    QTest::newRow("absent-taggedunsigned-taggedunsigned") << raw("\xa1\xc0\0\xc0\0") << false;
-    QTest::newRow("absent-string-unsigned") << raw("\xa1\x68haystack\0") << false;
-    QTest::newRow("absent-taggedstring-unsigned") << raw("\xa1\xc0\x68haystack\0") << false;
-    QTest::newRow("absent-string-taggedunsigned") << raw("\xa1\x68haystack\xc0\0") << false;
-    QTest::newRow("absent-taggedstring-taggedunsigned") << raw("\xa1\xc0\x68haystack\xc0\0") << false;
-    QTest::newRow("absent-string-string") << raw("\xa1\x68haystack\x66needle") << false;
-    QTest::newRow("absent-string-taggedstring") << raw("\xa1\x68haystack\xc0\x66needle") << false;
-    QTest::newRow("absent-taggedstring-string") << raw("\xa1\xc0\x68haystack\x66needle") << false;
-    QTest::newRow("absent-string-taggedstring") << raw("\xa1\xc0\x68haystack\xc0\x66needle") << false;
-
-    QTest::newRow("absent-string-emptyarray") << raw("\xa1\x68haystack\x80") << false;
-    QTest::newRow("absent-string-_emptyarray") << raw("\xa1\x68haystack\x9f\xff") << false;
-    QTest::newRow("absent-string-array1") << raw("\xa1\x68haystack\x81\0") << false;
-    QTest::newRow("absent-string-array2") << raw("\xa1\x68haystack\x85\0\1\2\3\4") << false;
-    QTest::newRow("absent-string-array3") << raw("\xa1\x68haystack\x85\x63one\x63two\x65three\x64""four\x64""five") << false;
-
-    QTest::newRow("absent-string-emptymap") << raw("\xa1\x68haystack\xa0") << false;
-    QTest::newRow("absent-string-_emptymap") << raw("\xa1\x68haystack\xbf\xff") << false;
-    QTest::newRow("absent-string-map") << raw("\xa1\x68haystack\xa1\x68haystack\x66needle") << false;
-    QTest::newRow("absent-string-map2") << raw("\xa1\x68haystack\xa1\x68haystack\x66needle\61z\62yx") << false;
-
-    // maps containing our items
-    QTest::newRow("alone") << raw("\xa1\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("tagged") << raw("\xa1\xc1\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("doubletagged") << raw("\xa1\xc1\xc2\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("chunked") << raw("\xa1\x7f\x66needle\xff\xd8\x2a\x68haystack") << true;
-    QTest::newRow("chunked*2") << raw("\xa1\x7f\x60\x66needle\xff\xd8\x2a\x68haystack") << true;
-    QTest::newRow("chunked*2bis") << raw("\xa1\x7f\x66needle\x60\xff\xd8\x2a\x68haystack") << true;
-    QTest::newRow("chunked*3") << raw("\xa1\x7f\x62ne\x62""ed\x62le\xff\xd8\x2a\x68haystack") << true;
-    QTest::newRow("chunked*8") << raw("\xa1\x7f\x61n\x61""e\x60\x61""e\x61""d\x60\x62le\x60\xff\xd8\x2a\x68haystack") << true;
-
-    QTest::newRow("1before") << raw("\xa2\x68haystack\x66needle\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("tagged-1before") << raw("\xa2\xc1\x68haystack\x66needle\xc1\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("doubletagged-1before2") << raw("\xa2\xc1\xc2\x68haystack\x66needle\xc1\xc2\x66needle\xd8\x2a\x68haystack") << true;
-
-    QTest::newRow("arraybefore") << raw("\xa2\x61z\x80\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("nestedarraybefore") << raw("\xa2\x61z\x81\x81\0\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("arrayarraybefore") << raw("\xa2\x82\1\2\x80\x66needle\xd8\x2a\x68haystack") << true;
-
-    QTest::newRow("mapbefore") << raw("\xa2\x61z\xa0\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("nestedmapbefore") << raw("\xa2\x61z\xa1\0\x81\0\x66needle\xd8\x2a\x68haystack") << true;
-    QTest::newRow("mapmapbefore") << raw("\xa2\xa1\1\2\xa0\x66needle\xd8\x2a\x68haystack") << true;
-}
-
-void tst_Parser::mapFind()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(bool, expected);
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    CborValue element;
-    err = cbor_value_map_find_value(&w.first, "needle", &element);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    if (expected) {
-        QCOMPARE(int(element.type), int(CborTagType));
-
-        CborTag tag;
-        err = cbor_value_get_tag(&element, &tag);
-        QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-        QCOMPARE(int(tag), 42);
-
-        bool equals;
-        err = cbor_value_text_string_equals(&element, "haystack", &equals);
-        QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-        QVERIFY(equals);
-    } else {
-        QCOMPARE(int(element.type), int(CborInvalidType));
-    }
-}
-
-void tst_Parser::checkedIntegers_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QVariant>("result");       // QVariant so we can note numbers out of int64_t range
-
-    QTest::newRow("0") << raw("\x00") << QVariant(Q_INT64_C(0));
-    QTest::newRow("1") << raw("\x01") << QVariant(Q_INT64_C(1));
-    QTest::newRow("10") << raw("\x0a") << QVariant(Q_INT64_C(10));
-    QTest::newRow("23") << raw("\x17") << QVariant(Q_INT64_C(23));
-    QTest::newRow("24") << raw("\x18\x18") << QVariant(Q_INT64_C(24));
-    QTest::newRow("UINT8_MAX") << raw("\x18\xff") << QVariant(Q_INT64_C(255));
-    QTest::newRow("UINT8_MAX+1") << raw("\x19\x01\x00") << QVariant(Q_INT64_C(256));
-    QTest::newRow("UINT16_MAX") << raw("\x19\xff\xff") << QVariant(Q_INT64_C(65535));
-    QTest::newRow("UINT16_MAX+1") << raw("\x1a\0\1\x00\x00") << QVariant(Q_INT64_C(65536));
-    QTest::newRow("INT32_MAX") << raw("\x1a\x7f\xff\xff\xff") << QVariant(Q_INT64_C(2147483647));
-    QTest::newRow("INT32_MAX+1") << raw("\x1a\x80\x00\x00\x00") << QVariant(Q_INT64_C(2147483648));
-    QTest::newRow("UINT32_MAX") << raw("\x1a\xff\xff\xff\xff") << QVariant(Q_INT64_C(4294967295));
-    QTest::newRow("UINT32_MAX+1") << raw("\x1b\0\0\0\1\0\0\0\0") << QVariant(Q_INT64_C(4294967296));
-    QTest::newRow("UINT64_MAX") << raw("\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                << QVariant();  // out of range
-
-    // negative integers
-    QTest::newRow("-1") << raw("\x20") << QVariant(Q_INT64_C(-1));
-    QTest::newRow("-2") << raw("\x21") << QVariant(Q_INT64_C(-2));
-    QTest::newRow("-24") << raw("\x37") << QVariant(Q_INT64_C(-24));
-    QTest::newRow("-25") << raw("\x38\x18") << QVariant(Q_INT64_C(-25));
-    QTest::newRow("-UINT8_MAX") << raw("\x38\xff") << QVariant(Q_INT64_C(-256));
-    QTest::newRow("-UINT8_MAX-1") << raw("\x39\x01\x00") << QVariant(Q_INT64_C(-257));
-    QTest::newRow("-UINT16_MAX") << raw("\x39\xff\xff") << QVariant(Q_INT64_C(-65536));
-    QTest::newRow("-UINT16_MAX-1") << raw("\x3a\0\1\x00\x00") << QVariant(Q_INT64_C(-65537));
-    QTest::newRow("INT32_MIN") << raw("\x3a\x7f\xff\xff\xff") << QVariant(Q_INT64_C(-2147483648));
-    QTest::newRow("INT32_MIN-1") << raw("\x3a\x80\x00\x00\x00") << QVariant(Q_INT64_C(-2147483649));
-    QTest::newRow("-UINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << QVariant(Q_INT64_C(-4294967296));
-    QTest::newRow("-UINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << QVariant(Q_INT64_C(-4294967297));
-    QTest::newRow("INT64_MIN+1") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xfe")
-                               << QVariant(std::numeric_limits<qint64>::min() + 1);
-    QTest::newRow("INT64_MIN") << raw("\x3b\x7f\xff\xff\xff""\xff\xff\xff\xff")
-                               << QVariant(std::numeric_limits<qint64>::min());
-    QTest::newRow("INT64_MIN-1") << raw("\x3b\x80\0\0\0""\0\0\0\0") << QVariant();  // out of range
-    QTest::newRow("-UINT64_MAX") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe")
-                                   << QVariant();   // out of range
-    QTest::newRow("-UINT64_MAX+1") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                   << QVariant();   // out of range
-}
-
-void tst_Parser::checkedIntegers()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QVariant, result);
-    int64_t expected = result.toLongLong();
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    int64_t v;
-    err = cbor_value_get_int64_checked(&w.first, &v);
-    if (result.isNull()) {
-        QCOMPARE(err, CborErrorDataTooLarge);
-    } else {
-        QCOMPARE(v, expected);
-    }
-
-    int v2;
-    err = cbor_value_get_int_checked(&w.first, &v2);
-    if (result.isNull() || expected < std::numeric_limits<int>::min() || expected > std::numeric_limits<int>::max()) {
-        QCOMPARE(err, CborErrorDataTooLarge);
-    } else {
-        QCOMPARE(int64_t(v2), expected);
-    }
-}
-
-static void addValidationColumns()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<int>("flags");     // future
-    QTest::addColumn<CborError>("expectedError");
-}
-
-static void addValidationData()
-{
-    // illegal numbers are future extension points
-    QTest::newRow("illegal-number-in-unsigned-1") << raw("\x81\x1c") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-unsigned-2") << raw("\x81\x1d") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-unsigned-3") << raw("\x81\x1e") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-unsigned-4") << raw("\x81\x1f") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-negative-1") << raw("\x81\x3c") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-negative-2") << raw("\x81\x3d") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-negative-3") << raw("\x81\x3e") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-negative-4") << raw("\x81\x3f") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-bytearray-length-1") << raw("\x81\x5c") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-bytearray-length-2") << raw("\x81\x5d") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-bytearray-length-3") << raw("\x81\x5e") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-string-length-1") << raw("\x81\x7c") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-string-length-2") << raw("\x81\x7d") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-string-length-3") << raw("\x81\x7e") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-array-length-1") << raw("\x81\x9c") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-array-length-2") << raw("\x81\x9d") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-array-length-3") << raw("\x81\x9e") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-map-length-1") << raw("\x81\xbc") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-map-length-2") << raw("\x81\xbd") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-map-length-3") << raw("\x81\xbe") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-tag-1") << raw("\x81\xdc") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-tag-2") << raw("\x81\xdd") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-tag-3") << raw("\x81\xde") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("illegal-number-in-tag-4") << raw("\x81\xdf") << 0 << CborErrorIllegalNumber;
-
-    QTest::newRow("unsigned-too-short-1-0") << raw("\x81\x18") << 0 << CborErrorUnexpectedEOF;   // requires 1 byte, 0 given
-    QTest::newRow("unsigned-too-short-2-0") << raw("\x81\x19") << 0 << CborErrorUnexpectedEOF;   // requires 2 bytes, 0 given
-    QTest::newRow("unsigned-too-short-2-1") << raw("\x81\x19\x01") << 0 << CborErrorUnexpectedEOF; // etc
-    QTest::newRow("unsigned-too-short-4-0") << raw("\x81\x1a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("unsigned-too-short-4-3") << raw("\x81\x1a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("unsigned-too-short-8-0") << raw("\x81\x1b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("unsigned-too-short-8-7") << raw("\x81\x1b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-1-0") << raw("\x81\x38") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-2-0") << raw("\x81\x39") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-2-1") << raw("\x81\x39\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-4-0") << raw("\x81\x3a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-4-3") << raw("\x81\x3a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-8-0") << raw("\x81\x3b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("negative-length-too-short-8-7") << raw("\x81\x3b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-1-0") << raw("\x81\x58") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-2-0") << raw("\x81\x59") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-2-1") << raw("\x81\x59\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-4-0") << raw("\x81\x5a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-4-3") << raw("\x81\x5a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-8-0") << raw("\x81\x5b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-length-too-short-8-7") << raw("\x81\x5b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-1-0") << raw("\x81\x78") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-2-0") << raw("\x81\x79") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-2-1") << raw("\x81\x79\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-4-0") << raw("\x81\x7a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-4-3") << raw("\x81\x7a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-8-0") << raw("\x81\x7b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-length-too-short-8-7") << raw("\x81\x7b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-1-0") << raw("\x81\x5f\x58") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-2-0") << raw("\x81\x5f\x59") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-2-1") << raw("\x81\x5f\x59\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-4-0") << raw("\x81\x5f\x5a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-4-3") << raw("\x81\x5f\x5a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-8-0") << raw("\x81\x5f\x5b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-length-too-short-8-7") << raw("\x81\x5f\x5b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-1-0") << raw("\x81\x7f\x78") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-2-0") << raw("\x81\x7f\x79") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-2-1") << raw("\x81\x7f\x79\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-4-0") << raw("\x81\x7f\x7a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-4-3") << raw("\x81\x7f\x7a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-8-0") << raw("\x81\x7f\x7b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-length-too-short-8-7") << raw("\x81\x7f\x7b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-1-0") << raw("\x81\x5f\x40\x58") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-2-0") << raw("\x81\x5f\x40\x59") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-2-1") << raw("\x81\x5f\x40\x59\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-4-0") << raw("\x81\x5f\x40\x5a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-4-3") << raw("\x81\x5f\x40\x5a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-8-0") << raw("\x81\x5f\x40\x5b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-2-length-too-short-8-7") << raw("\x81\x5f\x40\x5b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-1-0") << raw("\x81\x7f\x60\x78") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-2-0") << raw("\x81\x7f\x60\x79") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-2-1") << raw("\x81\x7f\x60\x79\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-4-0") << raw("\x81\x7f\x60\x7a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-4-3") << raw("\x81\x7f\x60\x7a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-8-0") << raw("\x81\x7f\x60\x7b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-2-length-too-short-8-7") << raw("\x81\x7f\x60\x7b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-1-0") << raw("\x81\x98") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-2-0") << raw("\x81\x99") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-2-1") << raw("\x81\x99\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-4-0") << raw("\x81\x9a") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-4-3") << raw("\x81\x9a\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-8-0") << raw("\x81\x9b") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-length-too-short-8-7") << raw("\x81\x9b\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-1-0") << raw("\x81\xb8") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-2-0") << raw("\x81\xb9") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-2-1") << raw("\x81\xb9\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-4-0") << raw("\x81\xba") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-4-3") << raw("\x81\xba\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-8-0") << raw("\x81\xbb") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-length-too-short-8-7") << raw("\x81\xbb\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-1-0") << raw("\x81\xd8") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-2-0") << raw("\x81\xd9") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-2-1") << raw("\x81\xd9\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-4-0") << raw("\x81\xda") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-4-3") << raw("\x81\xda\x01\x02\x03") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-8-0") << raw("\x81\xdb") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("tag-too-short-8-7") << raw("\x81\xdb\1\2\3\4\5\6\7") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("fp16-too-short1") << raw("\x81\xf9") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("fp16-too-short2") << raw("\x81\xf9\x00") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("float-too-short1") << raw("\x81\xfa") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("float-too-short2") << raw("\x81\xfa\0\0\0") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("double-too-short1") << raw("\x81\xfb") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("double-too-short2") << raw("\x81\xfb\0\0\0\0\0\0\0") << 0 << CborErrorUnexpectedEOF;
-
-    QTest::newRow("bytearray-too-short1") << raw("\x81\x42z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-too-short2") << raw("\x81\x58\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-too-short3") << raw("\x81\x5a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-too-short4") << raw("\x81\x5b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-too-short1") << raw("\x81\x62z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-too-short2") << raw("\x81\x78\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-too-short3") << raw("\x81\x7a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-too-short4") << raw("\x81\x7b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short1") << raw("\x81\x5f\x42z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short2") << raw("\x81\x5f\x58\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short3") << raw("\x81\x5f\x5a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short4") << raw("\x81\x5f\x5b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short1") << raw("\x81\x7f\x62z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short2") << raw("\x81\x7f\x78\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short3") << raw("\x81\x7f\x7a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short4") << raw("\x81\x7f\x7b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short1x2") << raw("\x81\x5f\x40\x42z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short2x2") << raw("\x81\x5f\x40\x58\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short3x2") << raw("\x81\x5f\x40\x5a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-chunked-too-short4x2") << raw("\x81\x5f\x40\x5b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short1x2") << raw("\x81\x7f\x60\x62z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short2x2") << raw("\x81\x7f\x60\x78\x02z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short3x2") << raw("\x81\x7f\x60\x7a\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunked-too-short4x2") << raw("\x81\x7f\x60\x7b\0\0\0\0\0\0\0\2z") << 0 << CborErrorUnexpectedEOF;
-
-    QTest::newRow("bytearray-no-break1") << raw("\x81\x5f") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("bytearray-no-break2") << raw("\x81\x5f\x40") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-no-break1") << raw("\x81\x7f") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-no-break2") << raw("\x81\x7f\x60") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-no-break1") << raw("\x81\x9f") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("array-no-break2") << raw("\x81\x9f\0") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-no-break1") << raw("\x81\xbf") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-no-break2") << raw("\x81\xbf\0\0") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("map-break-after-key") << raw("\x81\xbf\0\xff") << 0 << CborErrorUnexpectedBreak;
-    QTest::newRow("map-break-after-second-key") << raw("\x81\xbf\x64xyzw\x04\x00\xff") << 0 << CborErrorUnexpectedBreak;
-    QTest::newRow("map-break-after-value-tag") << raw("\x81\xbf\0\xc0\xff") << 0 << CborErrorUnexpectedBreak;
-    QTest::newRow("map-break-after-value-tag2") << raw("\x81\xbf\0\xd8\x20\xff") << 0 << CborErrorUnexpectedBreak;
-
-    // check for pointer additions wrapping over the limit of the address space
-    CborError tooLargeOn32bit = (sizeof(void *) == 4) ? CborErrorDataTooLarge : CborErrorUnexpectedEOF;
-    // on 32-bit systems, this is a -1
-    QTest::newRow("bytearray-wraparound1") << raw("\x81\x5a\xff\xff\xff\xff") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-wraparound1") << raw("\x81\x7a\xff\xff\xff\xff") << 0 << CborErrorUnexpectedEOF;
-    // on 32-bit systems, a 4GB addition could be dropped
-    QTest::newRow("bytearray-wraparound2") << raw("\x81\x5b\0\0\0\1\0\0\0\0") << 0 << tooLargeOn32bit;
-    QTest::newRow("string-wraparound2") << raw("\x81\x7b\0\0\0\1\0\0\0\0") << 0 << tooLargeOn32bit;
-    // on 64-bit systems, this could be a -1
-    QTest::newRow("bytearray-wraparound3") << raw("\x81\x5b\xff\xff\xff\xff\xff\xff\xff\xff") << 0 << tooLargeOn32bit;
-    QTest::newRow("string-wraparound3") << raw("\x81\x7b\xff\xff\xff\xff\xff\xff\xff\xff") << 0 << tooLargeOn32bit;
-
-    // ditto on chunks
-    QTest::newRow("bytearray-chunk-wraparound1") << raw("\x81\x5f\x5a\xff\xff\xff\xff") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("string-chunk-wraparound1") << raw("\x81\x7f\x7a\xff\xff\xff\xff") << 0 << CborErrorUnexpectedEOF;
-    // on 32-bit systems, a 4GB addition could be dropped
-    QTest::newRow("bytearray-chunk-wraparound2") << raw("\x81\x5f\x5b\0\0\0\1\0\0\0\0") << 0 << tooLargeOn32bit;
-    QTest::newRow("string-chunk-wraparound2") << raw("\x81\x7f\x7b\0\0\0\1\0\0\0\0") << 0 << tooLargeOn32bit;
-    // on 64-bit systems, this could be a -1
-    QTest::newRow("bytearray-chunk-wraparound3") << raw("\x81\x5f\x5b\xff\xff\xff\xff\xff\xff\xff\xff") << 0 << tooLargeOn32bit;
-    QTest::newRow("string-chunk-wraparound3") << raw("\x81\x7f\x7b\xff\xff\xff\xff\xff\xff\xff\xff") << 0 << tooLargeOn32bit;
-
-    QTest::newRow("eof-after-array") << raw("\x81") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-array2") << raw("\x81\x78\x20") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-array-element") << raw("\x81\x82\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-object") << raw("\x81\xa1") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-object2") << raw("\x81\xb8\x20") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-object-key") << raw("\x81\xa1\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-object-value") << raw("\x81\xa2\x01\x01") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-tag") << raw("\x81\xc0") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("eof-after-tag2") << raw("\x81\xd8\x20") << 0 << CborErrorUnexpectedEOF;
-
-    // major type 7 has future types
-    QTest::newRow("future-type-28") << raw("\x81\xfc") << 0 << CborErrorUnknownType;
-    QTest::newRow("future-type-29") << raw("\x81\xfd") << 0 << CborErrorUnknownType;
-    QTest::newRow("future-type-30") << raw("\x81\xfe") << 0 << CborErrorUnknownType;
-    QTest::newRow("unexpected-break") << raw("\x81\xff") << 0 << CborErrorUnexpectedBreak;
-    QTest::newRow("illegal-simple-0") << raw("\x81\xf8\0") << 0 << CborErrorIllegalSimpleType;
-    QTest::newRow("illegal-simple-31") << raw("\x81\xf8\x1f") << 0 << CborErrorIllegalSimpleType;
-
-    // not only too big (UINT_MAX or UINT_MAX+1 in size), but also incomplete
-    if (sizeof(size_t) < sizeof(uint64_t)) {
-        QTest::newRow("bytearray-too-big1") << raw("\x81\x5b\0\0\0\1\0\0\0\0") << 0 << CborErrorDataTooLarge;
-        QTest::newRow("string-too-big1") << raw("\x81\x7b\0\0\0\1\0\0\0\0") << 0 << CborErrorDataTooLarge;
-    }
-    QTest::newRow("array-too-big1") << raw("\x81\x9a\xff\xff\xff\xff\0\0\0\0") << 0 << CborErrorDataTooLarge;
-    QTest::newRow("array-too-big2") << raw("\x81\x9b\0\0\0\1\0\0\0\0") << 0 << CborErrorDataTooLarge;
-    QTest::newRow("object-too-big1") << raw("\x81\xba\xff\xff\xff\xff\0\0\0\0") << 0 << CborErrorDataTooLarge;
-    QTest::newRow("object-too-big2") << raw("\x81\xbb\0\0\0\1\0\0\0\0") << 0 << CborErrorDataTooLarge;
-
-    QTest::newRow("no-break-for-array0") << raw("\x81\x9f") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("no-break-for-array1") << raw("\x81\x9f\x01") << 0 << CborErrorUnexpectedEOF;
-
-    QTest::newRow("no-break-string0") << raw("\x81\x7f") << 0 << CborErrorUnexpectedEOF;
-    QTest::newRow("no-break-string1") << raw("\x81\x7f\x61Z") << 0 << CborErrorUnexpectedEOF;
-
-    QTest::newRow("nested-indefinite-length-bytearrays") << raw("\x81\x5f\x5f\xff\xff") << 0 << CborErrorIllegalNumber;
-    QTest::newRow("nested-indefinite-length-strings") << raw("\x81\x7f\x7f\xff\xff") << 0 << CborErrorIllegalNumber;
-
-    QTest::newRow("string-chunk-unsigned") << raw("\x81\x7f\0\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-negative") << raw("\x81\x7f\x20\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-bytearray") << raw("\x81\x7f\x40\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-array") << raw("\x81\x7f\x80\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-map") << raw("\x81\x7f\xa0\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-tag") << raw("\x81\x7f\xc0\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-tagged-string") << raw("\x81\x7f\xc0\x60\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-simple0") << raw("\x81\x7f\xe0\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-false") << raw("\x81\x7f\xf4\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-true") << raw("\x81\x7f\xf5\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-null") << raw("\x81\x7f\xf6\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("string-chunk-undefined") << raw("\x81\x7f\xf7\xff") << 0 << CborErrorIllegalType;
-
-    QTest::newRow("bytearray-chunk-string") << raw("\x81\x5f\x60\xff") << 0 << CborErrorIllegalType;
-    QTest::newRow("bytearray-chunk-tagged-bytearray") << raw("\x81\x7f\xc0\x40\xff") << 0 << CborErrorIllegalType;
-
-    // RFC 7049 Section 2.2.2 "Indefinite-Length Byte Strings and Text Strings" says
-    //    Text strings with indefinite lengths act the same as byte strings
-    //    with indefinite lengths, except that all their chunks MUST be
-    //    definite-length text strings.  Note that this implies that the bytes
-    //    of a single UTF-8 character cannot be spread between chunks: a new
-    //    chunk can only be started at a character boundary.
-    // This test technically tests the dumper, not the parser.
-    QTest::newRow("string-utf8-chunk-split") << raw("\x81\x7f\x61\xc2\x61\xa0\xff") << 0 << CborErrorInvalidUtf8TextString;
-}
-
-void tst_Parser::validation_data()
-{
-    addValidationColumns();
-    addValidationData();
-}
-
-void tst_Parser::validation()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(int, flags);
-    QFETCH(CborError, expectedError);
-
-    QString decoded;
-    ParserWrapper w;
-    CborError err = w.init(data, uint32_t(flags));
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    CborError err2 = cbor_value_validate_basic(&w.first);
-    CborError err3 = cbor_value_validate(&w.first, CborValidateBasic);
-    err = parseOne(&w.first, &decoded);
-    QCOMPARE(err, expectedError);
-    if (!QByteArray(QTest::currentDataTag()).contains("utf8")) {
-        QCOMPARE(err2, expectedError);
-        QCOMPARE(err3, expectedError);
-    }
-
-    // see if we've got a map
-    if (QByteArray(QTest::currentDataTag()).startsWith("map")) {
-        w.init(data, uint32_t(flags));      // reinit
-        QVERIFY(cbor_value_is_array(&w.first));
-
-        CborValue map;
-        CborError err = cbor_value_enter_container(&w.first, &map);
-        if (err == CborNoError) {
-            QVERIFY(cbor_value_is_map(&map));
-            CborValue element;
-            err = cbor_value_map_find_value(&map, "foobar", &element);
-            if (err == CborNoError)
-                QVERIFY(!cbor_value_is_valid(&element));
-        }
-
-        QCOMPARE(err, expectedError);
-    }
-}
-
-void tst_Parser::strictValidation_data()
-{
-    addValidationColumns();
-
-    // Canonical validation - fixed types
-    QTest::newRow("unsigned-0") << raw("\x00") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("unsigned-24") << raw("\x18\x18") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("unsigned-256") << raw("\x19\1\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("unsigned-65536") << raw("\x1a\0\1\0\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("unsigned-4294967296") << raw("\x1b\0\0\0\1\0\0\0\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("overlong-unsigned-0*1") << raw("\x18\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-0*2") << raw("\x19\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-0*4") << raw("\x1a\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-0*8") << raw("\x1b\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-24*2") << raw("\x19\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-24*4") << raw("\x1a\0\0\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-24*8") << raw("\x1b\0\0\0\0\0\0\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-256*4") << raw("\x1a\0\0\1\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-256*8") << raw("\x1b\0\0\0\0\0\0\1\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-unsigned-65536*8") << raw("\x1b\0\0\0\0\0\1\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("negative-1") << raw("\x20") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("negative-25") << raw("\x38\x38") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("negative-257") << raw("\x39\1\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("negative-65537") << raw("\x3a\0\1\0\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("negative-4294967297") << raw("\x3b\0\0\0\1\0\0\0\0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("overlong-negative-1*1") << raw("\x38\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-1*2") << raw("\x39\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-1*4") << raw("\x3a\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-1*8") << raw("\x3b\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-25*2") << raw("\x39\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-25*4") << raw("\x3a\0\0\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-25*8") << raw("\x3b\0\0\0\0\0\0\0\x18") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-257*4") << raw("\x3a\0\0\1\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-257*8") << raw("\x3b\0\0\0\0\0\0\1\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-negative-65537*8") << raw("\x3b\0\0\0\0\0\1\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("simple-0") << raw("\xe0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("false") << raw("\xf4") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("true") << raw("\xf5") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("null") << raw("\xf6") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("undefined") << raw("\xf7") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("simple-32") << raw("\xf8\x20") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("fp-nan") << raw("\xf9\x7e\00") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("fp--inf") << raw("\xf9\xfc\00") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("fp-+inf") << raw("\xf9\x7c\00") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("overlong-fp-nan_f") << raw("\xfa\x7f\xc0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-fp--inf_f") << raw("\xfa\xff\x80\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-fp-+inf_f") << raw("\xfa\x7f\x80\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-fp-nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-fp--inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-fp-+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-
-    // canonical - lengths
-    QByteArray data24(24, 0x20);    // also decodes as -1
-    QByteArray data256(256, 0x40);  // also decodes as h''
-    QByteArray data65536(65536, 0x60);// also decodes as ""
-    QTest::newRow("bytearray-0") << raw("\x40") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("bytearray-24") << (raw("\x58\x18") + data24) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("bytearray-256") << (raw("\x59\1\0") + data256) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("bytearray-65536") << (raw("\x5a\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("_bytearray-0") << raw("\x5f\xff") << int(CborValidateCanonicalFormat) << CborErrorUnknownLength;
-    QTest::newRow("overlong-bytearray-0*1") << raw("\x58\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-0*2") << raw("\x59\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-0*4") << raw("\x5a\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-0*8") << raw("\x5b\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-24*2") << (raw("\x59\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-24*4") << (raw("\x5a\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-24*8") << (raw("\x5b\0\0\0\0\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-256*4") << (raw("\x5a\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-256*8") << (raw("\x5b\0\0\0\0\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-bytearray-65536*8") << (raw("\x5b\0\0\0\0\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("string-0") << raw("\x60") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("string-24") << (raw("\x78\x18") + data24) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("string-256") << (raw("\x79\1\0") + data256) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("string-65536") << (raw("\x7a\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("_string-0") << raw("\x7f\xff") << int(CborValidateCanonicalFormat) << CborErrorUnknownLength;
-    QTest::newRow("overlong-string-0*1") << raw("\x78\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-0*2") << raw("\x79\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-0*4") << raw("\x7a\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-0*8") << raw("\x7b\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-24*2") << (raw("\x79\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-24*4") << (raw("\x7a\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-24*8") << (raw("\x7b\0\0\0\0\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-256*4") << (raw("\x7a\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-256*8") << (raw("\x7b\0\0\0\0\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-string-65536*8") << (raw("\x7b\0\0\0\0\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("array-0") << raw("\x80") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("array-24") << (raw("\x98\x18") + data24) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("array-256") << (raw("\x99\1\0") + data256) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("array-65536") << (raw("\x9a\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("_array-0") << raw("\x9f\xff") << int(CborValidateCanonicalFormat) << CborErrorUnknownLength;
-    QTest::newRow("overlong-array-0*1") << raw("\x98\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-0*2") << raw("\x99\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-0*4") << raw("\x9a\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-0*8") << raw("\x9b\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-24*2") << (raw("\x99\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-24*4") << (raw("\x9a\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-24*8") << (raw("\x9b\0\0\0\0\0\0\0\x18") + data24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-256*4") << (raw("\x9a\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-256*8") << (raw("\x9b\0\0\0\0\0\0\1\0") + data256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-array-65536*8") << (raw("\x9b\0\0\0\0\0\1\0\0") + data65536) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-
-    // we need unique, sorted, string keys for map
-    // we'll make all key-value pairs a total of 4 bytes
-    char mapentry[] = { 0x62, 0, 0, 0x20 };
-    QByteArray mapdata24(24 * sizeof(mapentry), Qt::Uninitialized);
-    QByteArray mapdata256(256 * sizeof(mapentry), Qt::Uninitialized);
-    char *mapdata24ptr = mapdata24.data();
-    char *mapdata256ptr = mapdata256.data();
-    for (int i = 0; i < 256; ++i) {
-        mapentry[1] = 'A' + (i >> 4);
-        mapentry[2] = 'a' + (i & 0xf);
-        memcpy(mapdata256ptr + i * sizeof(mapentry), mapentry, sizeof(mapentry));
-        if (i < 24)
-            memcpy(mapdata24ptr + i * sizeof(mapentry), mapentry, sizeof(mapentry));
-    }
-    QTest::newRow("map-0") << raw("\xa0") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("map-24") << (raw("\xb8\x18") + mapdata24) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("map-256") << (raw("\xb9\1\0") + mapdata256) << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("_map-0") << raw("\xbf\xff") << int(CborValidateCanonicalFormat) << CborErrorUnknownLength;
-    QTest::newRow("overlong-map-0*1") << raw("\xb8\x00") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-0*2") << raw("\xb9\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-0*4") << raw("\xba\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-0*8") << raw("\xbb\0\0\0\0\0\0\0\0") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-24*2") << (raw("\xb9\0\x18") + mapdata24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-24*4") << (raw("\xba\0\0\0\x18") + mapdata24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-24*8") << (raw("\xbb\0\0\0\0\0\0\0\x18") + mapdata24) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-256*4") << (raw("\xba\0\0\1\0") + mapdata256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-map-256*8") << (raw("\xbb\0\0\0\0\0\0\1\0") + mapdata256) << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("unsorted-length-map-UU") << raw("\xa2\1\1\0\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-length-map-UUU") << raw("\xa3\1\1\1\1\0\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-length-map-SS") << raw("\xa2\x61z\1\x60\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-length-map-SSS") << raw("\xa3\x61z\1\x61z\2\x60\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-length-map-SB") << raw("\xa2\x61z\1\x40\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-length-map-AS") << raw("\xa2\x83\0\x20\x45Hello\1\x60\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-content-map-SS") << raw("\xa2\x61z\1\x61y\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-    QTest::newRow("unsorted-content-map-AS") << raw("\xa2\x81\x21\1\x61\x21\0") << int(CborValidateCanonicalFormat) << CborErrorMapNotSorted;
-
-    QTest::newRow("tag-0") << raw("\xc0\x60") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("tag-24") << raw("\xd8\x18\x40") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("tag-65536") << raw("\xda\0\1\0\0\x60") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("tag-4294967296") << raw("\xdb\0\0\0\1\0\0\0\0\x60") << int(CborValidateCanonicalFormat) << CborNoError;
-    QTest::newRow("overlong-tag-0*1") << raw("\xd8\x00\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-0*2") << raw("\xd9\0\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-0*4") << raw("\xda\0\0\0\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-0*8") << raw("\xdb\0\0\0\0\0\0\0\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-24*2") << raw("\xd9\0\x18\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-24*4") << raw("\xda\0\0\0\x18\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-24*8") << raw("\xdb\0\0\0\0\0\0\0\x18\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-256*4") << raw("\xda\0\0\1\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-256*8") << raw("\xdb\0\0\0\0\0\0\1\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-tag-65536*8") << raw("\xdb\0\0\0\0\0\1\0\0\x60") << int(CborValidateCanonicalFormat) << CborErrorOverlongEncoding;
-
-    // non-canonical: string length in chunked transfer
-    QTest::newRow("overlong-_bytearray-0*1") << raw("\x5f\x58\x00\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-0*2") << raw("\x5f\x59\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-0*4") << raw("\x5f\x5a\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-0*8") << raw("\x5f\x5b\0\0\0\0\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-24*2") << (raw("\x5f\x59\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-24*4") << (raw("\x5f\x5a\0\0\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-24*8") << (raw("\x5f\x5b\0\0\0\0\0\0\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-256*4") << (raw("\x5f\x5a\0\0\1\0") + data256 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-256*8") << (raw("\x5f\x5b\0\0\0\0\0\0\1\0") + data256 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearray-65536*8") << (raw("\x5f\x5b\0\0\0\0\0\1\0\0") + data65536 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearrayx2-0*1") << raw("\x5f\x40\x58\x00\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearrayx2-0*2") << raw("\x5f\x40\x59\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearrayx2-0*4") << raw("\x5f\x40\x5a\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_bytearrayx2-0*8") << raw("\x5f\x40\x5b\0\0\0\0\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-0*1") << raw("\x7f\x78\x00\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-0*2") << raw("\x7f\x79\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-0*4") << raw("\x7f\x7a\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-0*8") << raw("\x7f\x7b\0\0\0\0\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-24*2") << (raw("\x7f\x79\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-24*4") << (raw("\x7f\x7a\0\0\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-24*8") << (raw("\x7f\x7b\0\0\0\0\0\0\0\x18") + data24 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-256*4") << (raw("\x7f\x7a\0\0\1\0") + data256 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-256*8") << (raw("\x7f\x7b\0\0\0\0\0\0\1\0") + data256 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_string-65536*8") << (raw("\x7f\x7b\0\0\0\0\0\1\0\0") + data65536 + '\xff') << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_stringx2-0*1") << raw("\x7f\x60\x78\x00\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_stringx2-0*2") << raw("\x7f\x60\x79\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_stringx2-0*4") << raw("\x7f\x60\x7a\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-    QTest::newRow("overlong-_stringx2-0*8") << raw("\x7f\x60\x7b\0\0\0\0\0\0\0\0\xff") << int(CborValidateShortestNumbers) << CborErrorOverlongEncoding;
-
-    // strict mode
-    // UTF-8 sequences with invalid continuation bytes
-    QTest::newRow("invalid-utf8-bad-continuation-1char") << raw("\x61\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-2chars-1") << raw("\x62\xc2\xc0") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-2chars-2") << raw("\x62\xc3\xdf") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-2chars-3") << raw("\x62\xc7\xf0") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-3chars-1") << raw("\x63\xe0\xa0\xc0") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-3chars-2") << raw("\x63\xe0\xc0\xa0") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-4chars-1") << raw("\x64\xf0\x90\x80\xc0") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-4chars-2") << raw("\x64\xf0\x90\xc0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-bad-continuation-4chars-3") << raw("\x64\xf0\xc0\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    // Too short UTF-8 sequences (in an array so there's a byte after that would make it valid UTF-8 if it were part of the string)
-    QTest::newRow("invalid-utf8-too-short-2chars") << raw("\x82\x61\xc2\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-too-short-3chars-1") << raw("\x82\x61\xe0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-too-short-3chars-2") << raw("\x82\x62\xe0\xa0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-too-short-4chars-1") << raw("\x82\x61\xf0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-too-short-4chars-2") << raw("\x82\x62\xf0\x90\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-too-short-4chars-3") << raw("\x82\x63\xf0\x90\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    // UTF-16 surrogages encoded in UTF-8
-    QTest::newRow("invalid-utf8-hi-surrogate") << raw("\x63\xed\xa0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-lo-surrogate") << raw("\x63\xed\xb0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-surrogate-pair") << raw("\x66\xed\xa0\x80\xed\xb0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    // Non-Unicode UTF-8 sequences
-    QTest::newRow("invalid-utf8-non-unicode-1") << raw("\x64\xf4\x90\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-non-unicode-2") << raw("\x65\xf8\x88\x80\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-non-unicode-3") << raw("\x66\xfc\x84\x80\x80\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-non-unicode-4") << raw("\x66\xfd\xbf\xbf\xbf\xbf\xbf") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    // invalid bytes in UTF-8
-    QTest::newRow("invalid-utf8-fe") << raw("\x61\xfe") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-ff") << raw("\x61\xff") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    // Overlong sequences
-    QTest::newRow("invalid-utf8-overlong-1-2") << raw("\x62\xc1\x81") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-1-3") << raw("\x63\xe0\x81\x81") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-1-4") << raw("\x64\xf0\x80\x81\x81") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-1-5") << raw("\x65\xf8\x80\x80\x81\x81") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-1-6") << raw("\x66\xfc\x80\x80\x80\x81\x81") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-2-3") << raw("\x63\xe0\x82\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-2-4") << raw("\x64\xf0\x80\x82\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-2-5") << raw("\x65\xf8\x80\x80\x82\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-2-6") << raw("\x66\xfc\x80\x80\x80\x82\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-3-4") << raw("\x64\xf0\x80\xa0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-3-5") << raw("\x65\xf8\x80\x80\xa0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-3-6") << raw("\x66\xfc\x80\x80\x80\xa0\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-4-5") << raw("\x65\xf8\x80\x84\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-    QTest::newRow("invalid-utf8-overlong-4-6") << raw("\x66\xfc\x80\x80\x84\x80\x80") << int(CborValidateStrictMode) << CborErrorInvalidUtf8TextString;
-
-    QTest::newRow("nonunique-content-map-UU") << raw("\xa2\0\1\0\2") << int(CborValidateStrictMode) << CborErrorMapKeysNotUnique;
-    QTest::newRow("nonunique-content-map-SS") << raw("\xa2\x61z\1\x61z\2") << int(CborValidateStrictMode) << CborErrorMapKeysNotUnique;
-    QTest::newRow("nonunique-content-map-AA") << raw("\xa2\x81\x65Hello\1\x81\x65Hello\2") << int(CborValidateStrictMode) << CborErrorMapKeysNotUnique;
-
-    QTest::newRow("tag-0-unsigned") << raw("\xc0\x00") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-0-bytearray") << raw("\xc0\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-0-string") << raw("\xc0\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-0-tag-0-string") << raw("\xc0\xc0\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-1-unsigned") << raw("\xc1\x00") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-1-negative") << raw("\xc1\x20") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-1-bytearray") << raw("\xc1\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-2-bytearray") << raw("\xc2\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-2-string") << raw("\xc2\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-3-bytearray") << raw("\xc3\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-3-string") << raw("\xc3\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-4-string") << raw("\xc4\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-4-array") << raw("\xc4\x82\0\1") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-5-string") << raw("\xc5\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-5-array") << raw("\xc5\x82\0\1") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-21-bytearray") << raw("\xd5\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-21-string") << raw("\xd5\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-21-array") << raw("\xd5\x80") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-21-map") << raw("\xd5\xa0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-22-bytearray") << raw("\xd6\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-22-string") << raw("\xd6\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-22-array") << raw("\xd6\x80") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-22-map") << raw("\xd6\xa0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-23-bytearray") << raw("\xd7\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-23-string") << raw("\xd7\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-23-array") << raw("\xd7\x80") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-23-map") << raw("\xd7\xa0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-24-bytearray") << raw("\xd8\x18\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-24-string") << raw("\xd8\x18\x60") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-32-bytearray") << raw("\xd8\x20\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-32-string") << raw("\xd8\x20\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-33-bytearray") << raw("\xd8\x21\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-33-string") << raw("\xd8\x21\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-34-bytearray") << raw("\xd8\x22\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-34-string") << raw("\xd8\x22\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-35-bytearray") << raw("\xd8\x23\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-35-string") << raw("\xd8\x23\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-36-bytearray") << raw("\xd8\x24\x40") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-36-string") << raw("\xd8\x24\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-unsigned") << raw("\xd9\xd9\xf7\x00") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-negative") << raw("\xd9\xd9\xf7\x20") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-bytearray") << raw("\xd9\xd9\xf7\x40") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-string") << raw("\xd9\xd9\xf7\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-array") << raw("\xd9\xd9\xf7\x80") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-map") << raw("\xd9\xd9\xf7\xa0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-tag-0-unsigned") << raw("\xd9\xd9\xf7\xc0\x00") << int(CborValidateStrictMode) << CborErrorInappropriateTagForType;
-    QTest::newRow("tag-55799-tag-0-string") << raw("\xd9\xd9\xf7\xc0\x60") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-simple0") << raw("\xd9\xd9\xf7\xe0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-false") << raw("\xd9\xd9\xf7\xf4") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-true") << raw("\xd9\xd9\xf7\xf5") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-null") << raw("\xd9\xd9\xf7\xf6") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-undefined") << raw("\xd9\xd9\xf7\xf7") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-simple32") << raw("\xd9\xd9\xf7\xf8\x20") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-half") << raw("\xd9\xd9\xf7\xf9\0\0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-float") << raw("\xd9\xd9\xf7\xfa\0\0\0\0") << int(CborValidateStrictMode) << CborNoError;
-    QTest::newRow("tag-55799-double") << raw("\xd9\xd9\xf7\xfb\0\0\0\0\0\0\0\0") << int(CborValidateStrictMode) << CborNoError;
-
-    // excluded non-finite
-    QTest::newRow("excluded-fp-nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-nan_f") << raw("\xfa\x7f\xc0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp--inf_f") << raw("\xfa\xff\x80\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp--inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-+inf_f") << raw("\xfa\x7f\x80\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-
-    // excluded undefined
-    QTest::newRow("no-undefined") << raw("\xf7") << int(CborValidateNoUndefined) << CborErrorExcludedType;
-
-    // exclude non-finite
-    QTest::newRow("excluded-fp-nan_f16") << raw("\xf9\x7e\00") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp--inf_f16") << raw("\xf9\xfc\00") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-+inf_f16") << raw("\xf9\x7c\00") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-nan_f") << raw("\xfa\x7f\xc0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp--inf_f") << raw("\xfa\xff\x80\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-+inf_f") << raw("\xfa\x7f\x80\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp--inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-    QTest::newRow("excluded-fp-+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << int(CborValidateFiniteFloatingPoint) << CborErrorExcludedValue;
-
-    // exclude non-string keys in maps
-    QTest::newRow("excluded-map-unsigned") << raw("\xa1\x00\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-negative") << raw("\xa1\x20\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-bytearray") << raw("\xa1\x40\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("map-string") << raw("\xa1\x60\1") << int(CborValidateMapKeysAreString) << CborNoError;
-    QTest::newRow("map-tag-0-string") << raw("\xa1\xc0\x60\1") << int(CborValidateMapKeysAreString) << CborNoError;
-    QTest::newRow("excluded-map-array") << raw("\xa1\x80\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-map") << raw("\xa1\xa0\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-simple-0") << raw("\xa1\xe0\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-false") << raw("\xa1\xf4\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-true") << raw("\xa1\xf5\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-null") << raw("\xa1\xf6\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-undefined") << raw("\xa1\xf7\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-half") << raw("\xa1\xf9\0\0\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-float") << raw("\xa1\xfa\0\0\0\0\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-    QTest::newRow("excluded-map-double") << raw("\xa1\xfb\0\0\0\0\0\0\0\0\1") << int(CborValidateMapKeysAreString) << CborErrorMapKeyNotString;
-
-    // unknown simple types
-    QTest::newRow("unknown-simple-type-0") << raw("\xe0") << int(CborValidateNoUnknownSimpleTypes) << CborErrorUnknownSimpleType;
-    QTest::newRow("unknown-simple-type-32") << raw("\xf8\x20") << int(CborValidateNoUnknownSimpleTypes) << CborErrorUnknownSimpleType;
-    QTest::newRow("allowed-simple-type-32") << raw("\xf8\x20") << int(CborValidateNoUnknownSimpleTypesSA) << CborNoError;
-
-    // unknown tags
-    QTest::newRow("unknown-tag-6") << raw("\xc6\x60") << int(CborValidateNoUnknownTags) << CborErrorUnknownTag;
-    QTest::newRow("unknown-tag-31") << raw("\xd8\x1f\x60") << int(CborValidateNoUnknownTags) << CborErrorUnknownTag;
-    QTest::newRow("unknown-tag-256") << raw("\xd9\1\0\x60") << int(CborValidateNoUnknownTags) << CborErrorUnknownTag;
-    QTest::newRow("unknown-tag-65536") << raw("\xda\0\1\0\0\x60") << int(CborValidateNoUnknownTags) << CborErrorUnknownTag;
-    QTest::newRow("unknown-tag-4294967296") << raw("\xdb\0\0\0\1\0\0\0\0\x60") << int(CborValidateNoUnknownTags) << CborErrorUnknownTag;
-    QTest::newRow("allowed-tag-31") << raw("\xd8\x1f\x60") << int(CborValidateNoUnknownTagsSA) << CborNoError;
-    QTest::newRow("allowed-tag-256") << raw("\xd9\1\0\x60") << int(CborValidateNoUnknownTagsSR) << CborNoError;
-
-    // excluded tags
-    QTest::newRow("excluded-tag-0") << raw("\xc0\x60") << int(CborValidateNoTags) << CborErrorExcludedType;
-    QTest::newRow("excluded-tag-24") << raw("\xd8\x18\x40") << int(CborValidateNoTags) << CborErrorExcludedType;
-    QTest::newRow("excluded-tag-55799") << raw("\xd9\xd9\xf7\x60") << int(CborValidateNoTags) << CborErrorExcludedType;
-
-    // complete data
-    QTest::newRow("garbage-data-0") << raw("\0\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-1") << raw("\x20\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-2") << raw("\x40\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-3") << raw("\x60\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-4") << raw("\x80\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-5") << raw("\xa0\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-6") << raw("\xc0\x60\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-7") << raw("\xf4\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-f16") << raw("\xf9\0\0\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-f32") << raw("\xfa\0\0\0\0\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-    QTest::newRow("garbage-data-f64") << raw("\xfb\0\0\0\0\0\0\0\0\1") << int(CborValidateCompleteData) << CborErrorGarbageAtEnd;
-}
-
-void tst_Parser::strictValidation()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(int, flags);
-    QFETCH(CborError, expectedError);
-
-    QString decoded;
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    err = cbor_value_validate(&w.first, flags);
-    QCOMPARE(err, expectedError);
-}
-
-void tst_Parser::resumeParsing_data()
-{
-    addColumns();
-    addFixedData();
-    addStringsData();
-    addTagsData();
-    addMapMixedData();
-}
-
-void tst_Parser::resumeParsing()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    for (int len = 0; len < data.length() - 1; ++len) {
-        ParserWrapper w;
-        CborError err = w.init(data.constData(), len);
-        if (!err) {
-            QString decoded;
-            err = parseOne(&w.first, &decoded);
-        }
-        if (err != CborErrorUnexpectedEOF)
-            qDebug() << "Length is" << len;
-        QCOMPARE(err, CborErrorUnexpectedEOF);
-    }
-}
-
-void tst_Parser::endPointer_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<int>("offset");
-
-    QTest::newRow("number1") << raw("\x81\x01\x01") << 2;
-    QTest::newRow("number24") << raw("\x81\x18\x18\x01") << 3;
-    QTest::newRow("string") << raw("\x81\x61Z\x01") << 3;
-    QTest::newRow("indefinite-string") << raw("\x81\x7f\x61Z\xff\x01") << 5;
-    QTest::newRow("array") << raw("\x81\x02\x01") << 2;
-    QTest::newRow("indefinite-array") << raw("\x81\x9f\x02\xff\x01") << 4;
-    QTest::newRow("object") << raw("\x81\xa1\x03\x02\x01") << 4;
-    QTest::newRow("indefinite-object") << raw("\x81\xbf\x03\x02\xff\x01") << 5;
-}
-
-void tst_Parser::endPointer()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(int, offset);
-
-    QString decoded;
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    err = parseOne(&w.first, &decoded);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    QCOMPARE(int(cbor_value_get_next_byte(&w.first) - w.begin()), offset);
-}
-
-void tst_Parser::recursionLimit_data()
-{
-    static const int recursions = CBOR_PARSER_MAX_RECURSIONS + 2;
-    QTest::addColumn<QByteArray>("data");
-
-    QTest::newRow("array") << QByteArray(recursions, '\x81') + '\x20';
-    QTest::newRow("_array") << QByteArray(recursions, '\x9f') + '\x20' + QByteArray(recursions, '\xff');
-
-    QByteArray data;
-    for (int i = 0; i < recursions; ++i)
-        data += "\xa1\x65Hello";
-    data += '\2';
-    QTest::newRow("map-recursive-values") << data;
-
-    data.clear();
-    for (int i = 0; i < recursions; ++i)
-        data += "\xbf\x65World";
-    data += '\2';
-    for (int i = 0; i < recursions; ++i)
-        data += "\xff";
-    QTest::newRow("_map-recursive-values") << data;
-
-    data = QByteArray(recursions, '\xa1');
-    data += '\2';
-    for (int i = 0; i < recursions; ++i)
-        data += "\x7f\x64quux\xff";
-    QTest::newRow("map-recursive-keys") << data;
-
-    data = QByteArray(recursions, '\xbf');
-    data += '\2';
-    for (int i = 0; i < recursions; ++i)
-        data += "\1\xff";
-    QTest::newRow("_map-recursive-keys") << data;
-
-    data.clear();
-    for (int i = 0; i < recursions / 2; ++i)
-        data += "\x81\xa1\1";
-    data += '\2';
-    QTest::newRow("mixed") << data;
-}
-
-void tst_Parser::recursionLimit()
-{
-    QFETCH(QByteArray, data);
-
-    ParserWrapper w;
-    CborError err = w.init(data);
-    QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-
-    // check that it is valid:
-    CborValue it = w.first;
-    {
-        QString dummy;
-        err = parseOne(&it, &dummy);
-        QVERIFY2(!err, QByteArray("Got error \"") + cbor_error_string(err) + "\"");
-    }
-
-    it = w.first;
-    err = cbor_value_advance(&it);
-    QCOMPARE(err, CborErrorNestingTooDeep);
-
-    it = w.first;
-    if (cbor_value_is_map(&it)) {
-        CborValue dummy;
-        err = cbor_value_map_find_value(&it, "foo", &dummy);
-        QCOMPARE(err, CborErrorNestingTooDeep);
-    }
-}
-
-QTEST_MAIN(tst_Parser)
-#include "tst_parser.moc"
diff --git a/tests/tests.pro b/tests/tests.pro
deleted file mode 100644
index 6036f0f..0000000
--- a/tests/tests.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = parser encoder c90 cpp tojson
-msvc: SUBDIRS -= tojson
diff --git a/tests/tojson/tojson.pro b/tests/tojson/tojson.pro
deleted file mode 100644
index b422652..0000000
--- a/tests/tojson/tojson.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-CONFIG += testcase parallel_test c++11
-QT = core testlib
-
-SOURCES += tst_tojson.cpp
-INCLUDEPATH += ../../src
-msvc: POST_TARGETDEPS = ../../lib/tinycbor.lib
-else: POST_TARGETDEPS += ../../lib/libtinycbor.a
-LIBS += $$POST_TARGETDEPS
diff --git a/tests/tojson/tst_tojson.cpp b/tests/tojson/tst_tojson.cpp
deleted file mode 100644
index 8bf24ef..0000000
--- a/tests/tojson/tst_tojson.cpp
+++ /dev/null
@@ -1,721 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#include <QtTest>
-#include "cbor.h"
-#include "cborjson.h"
-#include <locale.h>
-
-extern "C" FILE *open_memstream(char **bufptr, size_t *sizeptr);
-
-class tst_ToJson : public QObject
-{
-    Q_OBJECT
-private slots:
-    void initTestCase();
-
-    void fixed_data();
-    void fixed();
-    void textstrings_data();
-    void textstrings() { fixed(); }
-    void nonjson_data();
-    void nonjson() { fixed(); }
-    void bytestrings_data();
-    void bytestrings() { fixed(); }
-    void emptyContainers_data();
-    void emptyContainers() { fixed(); }
-    void arrays_data();
-    void arrays();
-    void nestedArrays_data() { arrays_data(); }
-    void nestedArrays();
-    void maps_data() { arrays_data(); }
-    void maps();
-    void nestedMaps_data() { maps_data(); }
-    void nestedMaps();
-    void nonStringKeyMaps_data();
-    void nonStringKeyMaps();
-
-    void tagsToObjects_data();
-    void tagsToObjects();
-    void taggedByteStringsToBase16_data();
-    void taggedByteStringsToBase16();
-    void taggedByteStringsToBase64_data() { taggedByteStringsToBase16_data(); }
-    void taggedByteStringsToBase64();
-    void taggedByteStringsToBigNum_data()  { taggedByteStringsToBase16_data(); }
-    void taggedByteStringsToBigNum();
-    void otherTags_data();
-    void otherTags();
-
-    void metaData_data();
-    void metaData();
-    void metaDataAndTagsToObjects_data() { tagsToObjects_data(); }
-    void metaDataAndTagsToObjects();
-    void metaDataForKeys_data();
-    void metaDataForKeys();
-};
-#include "tst_tojson.moc"
-
-template <size_t N> QByteArray raw(const char (&data)[N])
-{
-    return QByteArray::fromRawData(data, N - 1);
-}
-
-void addColumns()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QString>("expected");
-}
-
-void addFixedData()
-{
-    // unsigned integers
-    QTest::newRow("0") << raw("\x00") << "0";
-    QTest::newRow("1") << raw("\x01") << "1";
-    QTest::newRow("2^53-1") << raw("\x1b\0\x1f\xff\xff""\xff\xff\xff\xff") << "9007199254740991";
-    QTest::newRow("2^64-epsilon") << raw("\x1b\xff\xff\xff\xff""\xff\xff\xf8\x00") << "18446744073709549568";
-
-    // negative integers
-    QTest::newRow("-1") << raw("\x20") << "-1";
-    QTest::newRow("-2") << raw("\x21") << "-2";
-    QTest::newRow("-2^53+1") << raw("\x3b\0\x1f\xff\xff""\xff\xff\xff\xfe") << "-9007199254740991";
-    QTest::newRow("-2^64+epsilon") << raw("\x3b\xff\xff\xff\xff""\xff\xff\xf8\x00") << "-18446744073709549568";
-
-    QTest::newRow("false") << raw("\xf4") << "false";
-    QTest::newRow("true") << raw("\xf5") << "true";
-    QTest::newRow("null") << raw("\xf6") << "null";
-
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << "0";
-    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "0";
-    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << "0";
-    QTest::newRow("-1.f16") << raw("\xf9\xbc\x00") << "-1";
-    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "-1";
-    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "-1";
-    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "16777215";
-    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "16777215";
-    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "-16777215";
-    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "-16777215";
-
-    QTest::newRow("0.5f16") << raw("\xf9\x38\0") << "0.5";
-    QTest::newRow("0.5f") << raw("\xfa\x3f\0\0\0") << "0.5";
-    QTest::newRow("0.5") << raw("\xfb\x3f\xe0\0\0\0\0\0\0") << "0.5";
-    QTest::newRow("2.f^24-1") << raw("\xfa\x4b\x7f\xff\xff") << "16777215";
-    QTest::newRow("2.^53-1") << raw("\xfb\x43\x3f\xff\xff""\xff\xff\xff\xff") << "9007199254740991";
-    QTest::newRow("2.f^64-epsilon") << raw("\xfa\x5f\x7f\xff\xff") << "18446742974197923840";
-    QTest::newRow("2.^64-epsilon") << raw("\xfb\x43\xef\xff\xff""\xff\xff\xff\xff") << "18446744073709549568";
-    QTest::newRow("2.f^64") << raw("\xfa\x5f\x80\0\0") << "1.8446744073709552e+19";
-    QTest::newRow("2.^64") << raw("\xfb\x43\xf0\0\0\0\0\0\0") << "1.8446744073709552e+19";
-
-    // infinities and NaN are not supported in JSON, they convert to null
-    QTest::newRow("nan_f16") << raw("\xf9\x7e\x00") << "null";
-    QTest::newRow("nan_f") << raw("\xfa\x7f\xc0\0\0") << "null";
-    QTest::newRow("nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "null";
-    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "null";
-    QTest::newRow("-inf_f16") << raw("\xf9\xfc\x00") << "null";
-    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "null";
-    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "null";
-    QTest::newRow("+inf_f16") << raw("\xf9\x7c\x00") << "null";
-    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "null";
-}
-
-void addTextStringsData()
-{
-    QTest::newRow("emptytextstring") << raw("\x60") << "\"\"";
-    QTest::newRow("textstring1") << raw("\x61 ") << "\" \"";
-    QTest::newRow("textstring5") << raw("\x65Hello") << "\"Hello\"";
-    QTest::newRow("textstring24") << raw("\x78\x18""123456789012345678901234")
-                                  << "\"123456789012345678901234\"";
-    QTest::newRow("textstring256") << raw("\x79\1\0") + QByteArray(256, '3')
-                                   << '"' + QString(256, '3') + '"';
-
-    // strings with undefined length
-    QTest::newRow("_emptytextstring") << raw("\x7f\xff") << "\"\"";
-    QTest::newRow("_emptytextstring2") << raw("\x7f\x60\xff") << "\"\"";
-    QTest::newRow("_emptytextstring3") << raw("\x7f\x60\x60\xff") << "\"\"";
-    QTest::newRow("_textstring5*2") << raw("\x7f\x63Hel\x62lo\xff") << "\"Hello\"";
-    QTest::newRow("_textstring5*5") << raw("\x7f\x61H\x61""e\x61l\x61l\x61o\xff") << "\"Hello\"";
-    QTest::newRow("_textstring5*6") << raw("\x7f\x61H\x61""e\x61l\x60\x61l\x61o\xff") << "\"Hello\"";
-}
-
-void addNonJsonData()
-{
-    QTest::newRow("undefined") << raw("\xf7") << "\"undefined\"";
-    QTest::newRow("simple0") << raw("\xe0") << "\"simple(0)\"";
-    QTest::newRow("simple19") << raw("\xf3") << "\"simple(19)\"";
-    QTest::newRow("simple32") << raw("\xf8\x20") << "\"simple(32)\"";
-    QTest::newRow("simple255") << raw("\xf8\xff") << "\"simple(255)\"";
-}
-
-void addByteStringsData()
-{
-    QTest::newRow("emptybytestring") << raw("\x40") << "\"\"";
-    QTest::newRow("bytestring1") << raw("\x41 ") << "\"IA\"";
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << "\"AA\"";
-    QTest::newRow("bytestring2") << raw("\x42Hi") << "\"SGk\"";
-    QTest::newRow("bytestring3") << raw("\x43Hey") << "\"SGV5\"";
-    QTest::newRow("bytestring4") << raw("\x44Hola") << "\"SG9sYQ\"";
-    QTest::newRow("bytestring5") << raw("\x45Hello") << "\"SGVsbG8\"";
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234")
-                                  << "\"MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0\"";
-
-    // strings with undefined length
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << "\"\"";
-    QTest::newRow("_emptybytestring2") << raw("\x5f\x40\xff") << "\"\"";
-    QTest::newRow("_emptybytestring3") << raw("\x5f\x40\x40\xff") << "\"\"";
-    QTest::newRow("_bytestring5*2") << raw("\x5f\x43Hel\x42lo\xff") << "\"SGVsbG8\"";
-    QTest::newRow("_bytestring5*5") << raw("\x5f\x41H\x41""e\x41l\x41l\x41o\xff") << "\"SGVsbG8\"";
-    QTest::newRow("_bytestring5*6") << raw("\x5f\x41H\x41""e\x40\x41l\x41l\x41o\xff") << "\"SGVsbG8\"";
-}
-
-void addEmptyContainersData()
-{
-    QTest::newRow("emptyarray") << raw("\x80") << "[]";
-    QTest::newRow("emptymap") << raw("\xa0") << "{}";
-    QTest::newRow("_emptyarray") << raw("\x9f\xff") << "[]";
-    QTest::newRow("_emptymap") << raw("\xbf\xff") << "{}";
-}
-
-CborError parseOne(CborValue *it, QString *parsed, int flags)
-{
-    char *buffer;
-    size_t size;
-
-    FILE *f = open_memstream(&buffer, &size);
-    CborError err = cbor_value_to_json_advance(f, it, flags);
-    fclose(f);
-
-    *parsed = QString::fromLatin1(buffer);
-    free(buffer);
-    return err;
-}
-
-bool compareFailed = true;
-void compareOne_real(const QByteArray &data, const QString &expected, int flags, int line)
-{
-    compareFailed = true;
-    CborParser parser;
-    CborValue first;
-    CborError err = cbor_parser_init(reinterpret_cast<const quint8 *>(data.constData()), data.length(), 0, &parser, &first);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) + "\"");
-
-    QString decoded;
-    err = parseOne(&first, &decoded, flags);
-    QVERIFY2(!err, QByteArray::number(line) + ": Got error \"" + cbor_error_string(err) +
-                   "\"; decoded stream:\n" + decoded.toLatin1());
-    QCOMPARE(decoded, expected);
-
-    // check that we consumed everything
-    QCOMPARE((void*)first.ptr, (void*)data.constEnd());
-
-    compareFailed = false;
-}
-#define compareOne(data, expected, flags) \
-    compareOne_real(data, expected, flags, __LINE__); \
-    if (compareFailed) return
-
-void tst_ToJson::initTestCase()
-{
-    setlocale(LC_ALL, "C");
-}
-
-void tst_ToJson::fixed_data()
-{
-    addColumns();
-    addFixedData();
-}
-
-void tst_ToJson::fixed()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne(data, expected, 0);
-}
-
-void tst_ToJson::textstrings_data()
-{
-    addColumns();
-    addTextStringsData();
-}
-
-void tst_ToJson::nonjson_data()
-{
-    addColumns();
-    addNonJsonData();
-}
-
-void tst_ToJson::bytestrings_data()
-{
-    addColumns();
-    addByteStringsData();
-}
-
-void tst_ToJson::emptyContainers_data()
-{
-    addColumns();
-    addEmptyContainersData();
-}
-
-void tst_ToJson::arrays_data()
-{
-    addColumns();
-    addFixedData();
-    addTextStringsData();
-    addNonJsonData();
-    addByteStringsData();
-}
-
-void tst_ToJson::arrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\x81" + data, '[' + expected + ']', 0);
-    compareOne("\x82" + data + data, '[' + expected + ',' + expected + ']', 0);
-}
-
-void tst_ToJson::nestedArrays()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\x81\x81" + data, "[[" + expected + "]]", 0);
-    compareOne("\x81\x81\x81" + data, "[[[" + expected + "]]]", 0);
-    compareOne("\x81\x82" + data + data, "[[" + expected + ',' + expected + "]]", 0);
-    compareOne("\x82\x81" + data + data, "[[" + expected + "]," + expected + "]", 0);
-    compareOne("\x82\x81" + data + '\x81' + data, "[[" + expected + "],[" + expected + "]]", 0);
-}
-
-void tst_ToJson::maps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\xa1\x65" "Hello" + data, "{\"Hello\":" + expected + '}', 0);
-}
-
-void tst_ToJson::nestedMaps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne("\xa1\x65Hello\xa1\x65World" + data, "{\"Hello\":{\"World\":" + expected + "}}", 0);
-//    compareOne("\xa1\x63""foo\xa1\63""bar" + data + "\63""baz\xa1\x64quux" + data,
-//               "{\"foo\":{\"bar\":" + expected + "},\"baz\":{\"quux\":" + expected + "}", 0);
-}
-
-void tst_ToJson::nonStringKeyMaps_data()
-{
-    addColumns();
-
-    QTest::newRow("0") << raw("\x00") << "0";
-    QTest::newRow("1") << raw("\x01") << "1";
-    QTest::newRow("UINT32_MAX") << raw("\x1a\xff\xff\xff\xff") << "4294967295";
-    QTest::newRow("UINT32_MAX+1") << raw("\x1b\0\0\0\1\0\0\0\0") << "4294967296";
-    QTest::newRow("UINT64_MAX") << raw("\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                << QString::number(std::numeric_limits<uint64_t>::max());
-
-    QTest::newRow("-1") << raw("\x20") << "-1";
-    QTest::newRow("-UINT32_MAX") << raw("\x3a\xff\xff\xff\xff") << "-4294967296";
-    QTest::newRow("-UINT32_MAX-1") << raw("\x3b\0\0\0\1\0\0\0\0") << "-4294967297";
-    QTest::newRow("-UINT64_MAX") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe")
-                                 << '-' + QString::number(std::numeric_limits<uint64_t>::max());
-    QTest::newRow("-UINT64_MAX-1") << raw("\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff")
-                                 << "-18446744073709551616";
-
-    QTest::newRow("simple0") << raw("\xe0") << "simple(0)";
-    QTest::newRow("simple19") << raw("\xf3") << "simple(19)";
-    QTest::newRow("false") << raw("\xf4") << "false";
-    QTest::newRow("true") << raw("\xf5") << "true";
-    QTest::newRow("null") << raw("\xf6") << "null";
-    QTest::newRow("undefined") << raw("\xf7") << "undefined";
-    QTest::newRow("simple32") << raw("\xf8\x20") << "simple(32)";
-    QTest::newRow("simple255") << raw("\xf8\xff") << "simple(255)";
-
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << "0.f16";
-    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "0.f";
-    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << "0.";
-    QTest::newRow("-1.f16") << raw("\xf9\xbc\x00") << "-1.f16";
-    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "-1.f";
-    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "-1.";
-    QTest::newRow("65504.f16") << raw("\xf9\x7b\xff") << "65504.f16";
-    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
-    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "16777215.";
-    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "-16777215.f";
-    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "-16777215.";
-
-    QTest::newRow("0.5f16") << raw("\xf9\x38\0") << "0.5f16";
-    QTest::newRow("0.5f") << raw("\xfa\x3f\0\0\0") << "0.5f";
-    QTest::newRow("0.5") << raw("\xfb\x3f\xe0\0\0\0\0\0\0") << "0.5";
-    QTest::newRow("2.f16^11-1") << raw("\xf9\x67\xff") << "2047.f16";
-    QTest::newRow("2.f^24-1") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
-    QTest::newRow("2.^53-1") << raw("\xfb\x43\x3f\xff\xff""\xff\xff\xff\xff") << "9007199254740991.";
-    QTest::newRow("2.f^64-epsilon") << raw("\xfa\x5f\x7f\xff\xff") << "18446742974197923840.f";
-    QTest::newRow("2.^64-epsilon") << raw("\xfb\x43\xef\xff\xff""\xff\xff\xff\xff") << "18446744073709549568.";
-    QTest::newRow("2.f^64") << raw("\xfa\x5f\x80\0\0") << "1.8446744073709552e+19f";
-    QTest::newRow("2.^64") << raw("\xfb\x43\xf0\0\0\0\0\0\0") << "1.8446744073709552e+19";
-
-    QTest::newRow("nan_f16") << raw("\xf9\x7e\x00") << "nan";
-    QTest::newRow("nan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
-    QTest::newRow("nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
-    QTest::newRow("-inf_f16") << raw("\xf9\xfc\x00") << "-inf";
-    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "-inf";
-    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "-inf";
-    QTest::newRow("+inf_f16") << raw("\xf9\x7c\x00") << "inf";
-    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "inf";
-    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "inf";
-
-    QTest::newRow("emptybytestring") << raw("\x40") << "h''";
-    QTest::newRow("bytestring1") << raw("\x41 ") << "h'20'";
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << "h'00'";
-    QTest::newRow("bytestring5") << raw("\x45Hello") << "h'48656c6c6f'";
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234")
-                                  << "h'313233343536373839303132333435363738393031323334'";
-
-    QTest::newRow("tag0") << raw("\xc0\x00") << "0(0)";
-    QTest::newRow("tag1") << raw("\xc1\x00") << "1(0)";
-    QTest::newRow("tag24") << raw("\xd8\x18\x00") << "24(0)";
-    QTest::newRow("tagUINT64_MAX") << raw("\xdb" "\xff\xff\xff\xff" "\xff\xff\xff\xff" "\x00")
-                                << QString::number(std::numeric_limits<uint64_t>::max()) + "(0)";
-
-    QTest::newRow("emptyarray") << raw("\x80") << "[]";
-    QTest::newRow("emptymap") << raw("\xa0") << "{}";
-    QTest::newRow("_emptyarray") << raw("\x9f\xff") << "[_ ]";
-    QTest::newRow("_emptymap") << raw("\xbf\xff") << "{_ }";
-
-    QTest::newRow("map-0-24") << raw("\xa1\0\x18\x18") << "{0: 24}";
-    QTest::newRow("map-24-0") << raw("\xa1\x18\x18\0") << "{24: 0}";
-    QTest::newRow("_map-0-24") << raw("\xbf\0\x18\x18\xff") << "{_ 0: 24}";
-    QTest::newRow("_map-24-0") << raw("\xbf\x18\x18\0\xff") << "{_ 24: 0}";
-}
-
-void tst_ToJson::nonStringKeyMaps()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    data = "\xa1" + data + "\1";
-    compareOne(data, "{\"" + expected + "\":1}", CborConvertStringifyMapKeys);
-
-    // and verify that they fail if we use CborConvertRequireMapStringKeys
-    CborParser parser;
-    CborValue first;
-    QString decoded;
-    cbor_parser_init(reinterpret_cast<const quint8 *>(data.constData()), data.length(), 0, &parser, &first);
-    CborError err = parseOne(&first, &decoded, CborConvertRequireMapStringKeys);
-    QCOMPARE(err, CborErrorJsonObjectKeyNotString);
-}
-
-void tst_ToJson::tagsToObjects_data()
-{
-    addColumns();
-    QTest::newRow("0(0)") << raw("\xc0\0") << "{\"tag0\":0}";
-    QTest::newRow("0(-1)") << raw("\xc0\x20") << "{\"tag0\":-1}";
-    QTest::newRow("0(\"hello\")") << raw("\xc0\x65hello") << "{\"tag0\":\"hello\"}";
-    QTest::newRow("22(h'48656c6c6f')") << raw("\xd6\x45Hello") << "{\"tag22\":\"SGVsbG8\"}";
-    QTest::newRow("0([1,2,3])") << raw("\xc0\x83\1\2\3") << "{\"tag0\":[1,2,3]}";
-    QTest::newRow("0({\"z\":true,\"y\":1})") << raw("\xc0\xa2\x61z\xf5\x61y\1") << "{\"tag0\":{\"z\":true,\"y\":1}}";
-
-    // large tags
-    QTest::newRow("55799(0)") << raw("\xd9\xd9\xf7\0") << "{\"tag55799\":0}";
-    QTest::newRow("4294967295") << raw("\xda\xff\xff\xff\xff\0") << "{\"tag4294967295\":0}";
-    QTest::newRow("18446744073709551615(0)") << raw("\xdb\xff\xff\xff\xff""\xff\xff\xff\xff\0")
-                                             << "{\"tag18446744073709551615\":0}";
-
-    // nested tags
-    QTest::newRow("0(1(2))") << raw("\xc0\xc1\2") << "{\"tag0\":{\"tag1\":2}}";
-    QTest::newRow("0({\"z\":1(2)})") << raw("\xc0\xa1\x61z\xc1\2") << "{\"tag0\":{\"z\":{\"tag1\":2}}}";
-}
-
-void tst_ToJson::tagsToObjects()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    compareOne(data, expected, CborConvertTagsToObjects);
-}
-
-void tst_ToJson::taggedByteStringsToBase16_data()
-{
-    QTest::addColumn<QByteArray>("data");
-    QTest::addColumn<QString>("base64url");
-    QTest::addColumn<QString>("base64");
-    QTest::addColumn<QString>("base16");
-
-    QTest::newRow("emptybytestring") << raw("\x40") << "" << "" << "";
-    QTest::newRow("bytestring1") << raw("\x41 ") << "IA" << "IA==" << "20";
-    QTest::newRow("bytestring1-nul") << raw("\x41\0") << "AA" << "AA==" << "00";
-    QTest::newRow("bytestring1-ff") << raw("\x41\xff") << "_w" << "/w==" << "ff";
-    QTest::newRow("bytestring2") << raw("\x42Hi") << "SGk" << "SGk=" << "4869";
-    QTest::newRow("bytestring3") << raw("\x43Hey") << "SGV5" << "SGV5" << "486579";
-    QTest::newRow("bytestring4") << raw("\x44Hola") << "SG9sYQ" << "SG9sYQ==" << "486f6c61";
-    QTest::newRow("bytestring5") << raw("\x45Hello") << "SGVsbG8" << "SGVsbG8=" << "48656c6c6f";
-    QTest::newRow("bytestring24") << raw("\x58\x18""123456789012345678901234")
-                                  << "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0"
-                                  << "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0"
-                                  << "313233343536373839303132333435363738393031323334";
-
-    // strings with undefined length
-    QTest::newRow("_emptybytestring") << raw("\x5f\xff") << "" << "" << "";
-    QTest::newRow("_emptybytestring2") << raw("\x5f\x40\xff") << "" << "" << "";
-    QTest::newRow("_emptybytestring3") << raw("\x5f\x40\x40\xff") << "" << "" << "";
-    QTest::newRow("_bytestring5*2") << raw("\x5f\x43Hel\x42lo\xff") << "SGVsbG8" << "SGVsbG8=" << "48656c6c6f";
-    QTest::newRow("_bytestring5*5") << raw("\x5f\x41H\x41""e\x41l\x41l\x41o\xff")
-                                    << "SGVsbG8" << "SGVsbG8=" << "48656c6c6f";
-    QTest::newRow("_bytestring5*6") << raw("\x5f\x41H\x41""e\x40\x41l\x41l\x41o\xff")
-                                    << "SGVsbG8" << "SGVsbG8=" << "48656c6c6f";
-}
-
-void tst_ToJson::taggedByteStringsToBase16()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, base16);
-
-    compareOne('\xd7' + data, '"' + base16 + '"', 0);
-}
-
-void tst_ToJson::taggedByteStringsToBase64()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, base64);
-
-    compareOne('\xd6' + data, '"' + base64 + '"', 0);
-}
-
-void tst_ToJson::taggedByteStringsToBigNum()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, base64url);
-
-    compareOne('\xc3' + data, "\"~" + base64url + '"', 0);
-}
-
-void tst_ToJson::otherTags_data()
-{
-    addColumns();
-    addFixedData();
-    addTextStringsData();
-    addNonJsonData();
-    addByteStringsData();
-    addEmptyContainersData();
-}
-
-void tst_ToJson::otherTags()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-
-    // other tags produce no change in output
-    compareOne("\xc0" + data, expected, 0);
-    compareOne("\xc1" + data, expected, 0);
-    compareOne("\xc2" + data, expected, 0);
-    compareOne("\xc4" + data, expected, 0);
-    compareOne("\xc5" + data, expected, 0);
-    compareOne("\xd8\x20" + data, expected, 0);
-    compareOne("\xd8\x21" + data, expected, 0);
-    compareOne("\xd8\x22" + data, expected, 0);
-    compareOne("\xd8\x23" + data, expected, 0);
-    compareOne("\xd8\x24" + data, expected, 0);
-    compareOne("\xd9\xd9\xf7" + data, expected, 0);
-}
-
-void tst_ToJson::metaData_data()
-{
-    addColumns();
-
-    // booleans, null, strings, double precision numbers, regular maps, arrays and integers that
-    // didn't get rounded don't have metadata
-    QTest::newRow("0") << raw("\x00") << QString();
-    QTest::newRow("1") << raw("\x01") << QString();
-    QTest::newRow("2^53-1") << raw("\x1b\0\x1f\xff\xff""\xff\xff\xff\xff") << QString();
-    QTest::newRow("2^64-epsilon") << raw("\x1b\xff\xff\xff\xff""\xff\xff\xf8\x00") << QString();
-    QTest::newRow("-1") << raw("\x20") << QString();
-    QTest::newRow("-2") << raw("\x21") << QString();
-    QTest::newRow("-2^53+1") << raw("\x3b\0\x1f\xff\xff""\xff\xff\xff\xfe") << QString();
-    QTest::newRow("-2^64+epsilon") << raw("\x3b\xff\xff\xff\xff""\xff\xff\xf8\x00") << QString();
-    QTest::newRow("emptytextstring") << raw("\x60") << QString();
-    QTest::newRow("textstring1") << raw("\x61 ") << QString();
-    QTest::newRow("0.5") << raw("\xfb\x3f\xe0\0\0\0\0\0\0") << QString();
-    QTest::newRow("2.^64") << raw("\xfb\x43\xf0\0\0\0\0\0\0") << QString();
-    QTest::newRow("false") << raw("\xf4") << QString();
-    QTest::newRow("true") << raw("\xf5") << QString();
-    QTest::newRow("null") << raw("\xf6") << QString();
-    QTest::newRow("emptyarray") << raw("\x80") << QString();
-    QTest::newRow("emptymap") << raw("\xa0") << QString();
-    QTest::newRow("array*1") << raw("\x81\xf6") << QString();
-    QTest::newRow("map*1") << raw("\xa1\x61z\xf4") << QString();
-
-    // ---- everything from here on has at least the type ----
-    QTest::newRow("emptybytestring") << raw("\x40") << "\"t\":64";
-    QTest::newRow("bytestring1") << raw("\x41 ") << "\"t\":64";
-    QTest::newRow("undefined") << raw("\xf7") << "\"t\":247";
-    QTest::newRow("0.f16") << raw("\xf9\0\0") << "\"t\":249";
-    QTest::newRow("-1.f16") << raw("\xf9\xbc\x00") << "\"t\":249";
-    QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "\"t\":250";
-    QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "\"t\":250";
-    QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "\"t\":250";
-    QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "\"t\":250";
-    QTest::newRow("0.")  << raw("\xfb\0\0\0\0\0\0\0\0") << "\"t\":251";
-    QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "\"t\":251";
-    QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "\"t\":251";
-    QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "\"t\":251";
-    QTest::newRow("2.^53-1") << raw("\xfb\x43\x3f\xff\xff""\xff\xff\xff\xff") << "\"t\":251";
-    QTest::newRow("2.^64-epsilon") << raw("\xfb\x43\xef\xff\xff""\xff\xff\xff\xff") << "\"t\":251";
-
-    // integers that are too precise for double
-    QTest::newRow("2^53+1") << raw("\x1b\0\x20\0\0""\0\0\0\1")
-                            << "\"t\":0,\"v\":\"+20000000000001\"";
-    QTest::newRow("INT64_MAX-1") << raw("\x1b\x7f\xff\xff\xff""\xff\xff\xff\xfe")
-                                 << "\"t\":0,\"v\":\"+7ffffffffffffffe\"";
-    QTest::newRow("INT64_MAX+1") << raw("\x1b\x80\0\0\0""\0\0\0\1")
-                                 << "\"t\":0,\"v\":\"+8000000000000001\"";
-    QTest::newRow("-2^53-1") << raw("\x3b\0\x20\0\0""\0\0\0\0")
-                             << "\"t\":0,\"v\":\"-20000000000000\"";
-
-    // simple values
-    QTest::newRow("simple0") << raw("\xe0") << "\"t\":224,\"v\":0";
-    QTest::newRow("simple19") << raw("\xf3") << "\"t\":224,\"v\":19";
-    QTest::newRow("simple32") << raw("\xf8\x20") << "\"t\":224,\"v\":32";
-    QTest::newRow("simple255") << raw("\xf8\xff") << "\"t\":224,\"v\":255";
-
-    // infinities and NaN are not supported in JSON, they convert to null
-    QTest::newRow("nan_f16") << raw("\xf9\x7e\x00") << "\"t\":249,\"v\":\"nan\"";
-    QTest::newRow("nan_f") << raw("\xfa\x7f\xc0\0\0") << "\"t\":250,\"v\":\"nan\"";
-    QTest::newRow("nan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "\"t\":251,\"v\":\"nan\"";
-    QTest::newRow("-inf_f16") << raw("\xf9\xfc\x00") << "\"t\":249,\"v\":\"-inf\"";
-    QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "\"t\":250,\"v\":\"-inf\"";
-    QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "\"t\":251,\"v\":\"-inf\"";
-    QTest::newRow("+inf_f16") << raw("\xf9\x7c\x00") << "\"t\":249,\"v\":\"inf\"";
-    QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "\"t\":250,\"v\":\"inf\"";
-    QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "\"t\":251,\"v\":\"inf\"";
-
-    // tags on native types
-    QTest::newRow("tag+0") << raw("\xc0\x00") << "\"tag\":\"0\"";
-    QTest::newRow("tag+-2") << raw("\xc0\x21") << "\"tag\":\"0\"";
-    QTest::newRow("tag+0.5") << raw("\xc0\xfb\x3f\xe0\0\0\0\0\0\0") << "\"tag\":\"0\"";
-    QTest::newRow("tag+emptytextstring") << raw("\xc0\x60") << "\"tag\":\"0\"";
-    QTest::newRow("tag+textstring1") << raw("\xc0\x61 ") << "\"tag\":\"0\"";
-    QTest::newRow("tag+false") << raw("\xc0\xf4") << "\"tag\":\"0\"";
-    QTest::newRow("tag+true") << raw("\xc0\xf5") << "\"tag\":\"0\"";
-    QTest::newRow("tag+null") << raw("\xc0\xf6") << "\"tag\":\"0\"";
-    QTest::newRow("tag+emptyarray") << raw("\xc0\x80") << "\"tag\":\"0\"";
-    QTest::newRow("tag+emptymap") << raw("\xc0\xa0") << "\"tag\":\"0\"";
-    QTest::newRow("tag+array*1") << raw("\xc0\x81\xf6") << "\"tag\":\"0\"";
-    QTest::newRow("tag+map*1") << raw("\xc0\xa1\x61z\xf4") << "\"tag\":\"0\"";
-
-    // tags on non-native types
-    QTest::newRow("tag+emptybytestring") << raw("\xc0\x40") << "\"tag\":\"0\",\"t\":64";
-    QTest::newRow("tag+bytestring1") << raw("\xc0\x41 ") << "\"tag\":\"0\",\"t\":64";
-    QTest::newRow("tag+undefined") << raw("\xc0\xf7") << "\"tag\":\"0\",\"t\":247";
-    QTest::newRow("tag+0.f") << raw("\xc0\xfa\0\0\0\0") << "\"tag\":\"0\",\"t\":250";
-    QTest::newRow("tag+-1.f") << raw("\xc0\xfa\xbf\x80\0\0") << "\"tag\":\"0\",\"t\":250";
-    QTest::newRow("tag+16777215.f") << raw("\xc0\xfa\x4b\x7f\xff\xff") << "\"tag\":\"0\",\"t\":250";
-    QTest::newRow("tag+-16777215.f") << raw("\xc0\xfa\xcb\x7f\xff\xff") << "\"tag\":\"0\",\"t\":250";
-    QTest::newRow("tag+0.")  << raw("\xc0\xfb\0\0\0\0\0\0\0\0") << "\"tag\":\"0\",\"t\":251";
-    QTest::newRow("tag+-1.") << raw("\xc0\xfb\xbf\xf0\0\0\0\0\0\0") << "\"tag\":\"0\",\"t\":251";
-    QTest::newRow("tag+16777215.") << raw("\xc0\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "\"tag\":\"0\",\"t\":251";
-    QTest::newRow("tag+-16777215.") << raw("\xc0\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "\"tag\":\"0\",\"t\":251";
-
-    // big tags (don't fit in JS numbers)
-    QTest::newRow("bigtag1") << raw("\xdb\0\x20\0\0""\0\0\0\1\x60") << "\"tag\":\"9007199254740993\"";
-    QTest::newRow("bigtag2") << raw("\xdb\xff\xff\xff\xff""\xff\xff\xff\xfe\x60")
-                             << "\"tag\":\"18446744073709551614\"";
-
-    // specially-handled tags
-    QTest::newRow("negativebignum") << raw("\xc3\x41 ") << "\"tag\":\"3\",\"t\":64";
-    QTest::newRow("base64") << raw("\xd6\x41 ") << "\"tag\":\"22\",\"t\":64";
-    QTest::newRow("base16") << raw("\xd7\x41 ") << "\"tag\":\"23\",\"t\":64";
-}
-
-void compareMetaData(QByteArray data, const QString &expected, int otherFlags = 0)
-{
-    QString decoded;
-
-    // needs to be in one map, with the entry called "v"
-    data = "\xa1\x61v" + data;
-
-    {
-        CborParser parser;
-        CborValue first;
-        CborError err = cbor_parser_init(reinterpret_cast<const quint8 *>(data.constData()), data.length(), 0, &parser, &first);
-        QVERIFY2(!err, QByteArrayLiteral(": Got error \"") + cbor_error_string(err) + "\"");
-
-        err = parseOne(&first, &decoded, CborConvertAddMetadata | otherFlags);
-        QVERIFY2(!err, QByteArrayLiteral(": Got error \"") + cbor_error_string(err) +
-                 "\"; decoded stream:\n" + decoded.toLatin1());
-
-        // check that we consumed everything
-        QCOMPARE((void*)first.ptr, (void*)data.constEnd());
-    }
-
-    QVERIFY(decoded.startsWith("{\"v\":"));
-    QVERIFY(decoded.endsWith('}'));
-//    qDebug() << "was" << decoded;
-
-    // extract just the metadata
-    static const char needle[] = "\"v$cbor\":{";
-    int pos = decoded.indexOf(needle);
-    QCOMPARE(pos == -1, expected.isEmpty());
-    if (pos != -1) {
-        decoded.chop(2);
-        decoded = std::move(decoded).mid(pos + strlen(needle));
-        QCOMPARE(decoded, expected);
-    }
-}
-
-void tst_ToJson::metaData()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-    compareMetaData(data, expected);
-}
-
-void tst_ToJson::metaDataAndTagsToObjects()
-{
-    QFETCH(QByteArray, data);
-
-    // when a tag is converted to an object, the object gets metadata indicating it was a tag
-    compareMetaData(data, "\"t\":192", CborConvertTagsToObjects);
-}
-
-void tst_ToJson::metaDataForKeys_data()
-{
-    nonStringKeyMaps_data();
-
-    // string keys generate no metadata
-    QTest::newRow("string") << raw("\x60") << QString();
-}
-
-void tst_ToJson::metaDataForKeys()
-{
-    QFETCH(QByteArray, data);
-    QFETCH(QString, expected);
-    if (expected.isEmpty())
-        expected = "{\"\":false}";
-    else
-        expected = "{\"" + expected + "\":false,\"" + expected + "$keycbordump\":true}";
-    compareOne('\xa1' + data + '\xf4', expected,
-               CborConvertAddMetadata | CborConvertStringifyMapKeys);
-}
-
-QTEST_MAIN(tst_ToJson)
diff --git a/tinycbor.pc.in b/tinycbor.pc.in
deleted file mode 100644
index 382779a..0000000
--- a/tinycbor.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: TinyCBOR
-Description: A tiny CBOR encoder and decoder library
-Version: @version@
-Libs: -L${libdir} -ltinycbor
-Libs.private: -lm
-Cflags: -I${includedir}/tinycbor
diff --git a/tools/Makefile b/tools/Makefile
deleted file mode 100644
index fed6108..0000000
--- a/tools/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-CFLAGS = -O2 -g
-CPPFLAGS = -I../src
-VPATH = cbordump:../src
-
-all: ../bin ../bin/cbordump
-../bin:
-	@-mkdir ../bin
-
-../bin/cbordump: cbordump.o cborparser.o cborparser_dup_string.o cbortojson.o cborerrorstrings.o cborpretty.o
-	$(CC) -o $@ $^
-	$(RM) $^
-
diff --git a/tools/cbordump/cbordump.c b/tools/cbordump/cbordump.c
deleted file mode 100644
index 97adef3..0000000
--- a/tools/cbordump/cbordump.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _POSIX_C_SOURCE 200809L
-#include "cbor.h"
-#include "cborjson.h"
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-void *xrealloc(void *old, size_t size, const char *fname)
-{
-    old = realloc(old, size);
-    if (old == NULL) {
-        fprintf(stderr, "%s: %s\n", fname, strerror(errno));
-        exit(EXIT_FAILURE);
-    }
-    return old;
-}
-
-void printerror(CborError err, const char *fname)
-{
-    fprintf(stderr, "%s: %s\n", fname, cbor_error_string(err));
-    exit(EXIT_FAILURE);
-}
-
-void dumpFile(FILE *in, const char *fname, bool printJosn, int flags)
-{
-    static const size_t chunklen = 16 * 1024;
-    static size_t bufsize = 0;
-    static uint8_t *buffer = NULL;
-
-    size_t buflen = 0;
-    do {
-        if (bufsize == buflen)
-            buffer = xrealloc(buffer, bufsize += chunklen, fname);
-
-        size_t n = fread(buffer + buflen, 1, bufsize - buflen, in);
-        buflen += n;
-        if (n == 0) {
-            if (!ferror(in))
-                continue;
-            fprintf(stderr, "%s: %s\n", fname, strerror(errno));
-            exit(EXIT_FAILURE);
-        }
-    } while (!feof(in));
-
-    CborParser parser;
-    CborValue value;
-    CborError err = cbor_parser_init(buffer, buflen, 0, &parser, &value);
-    if (!err) {
-        if (printJosn)
-            err = cbor_value_to_json_advance(stdout, &value, flags);
-        else
-            err = cbor_value_to_pretty_advance_flags(stdout, &value, flags);
-        if (!err)
-            puts("");
-    }
-    if (!err && value.ptr != buffer + buflen)
-        err = CborErrorGarbageAtEnd;
-    if (err)
-        printerror(err, fname);
-}
-
-int main(int argc, char **argv)
-{
-    bool printJson = false;
-    int json_flags = CborConvertDefaultFlags;
-    int cbor_flags = CborPrettyDefaultFlags;
-    int c;
-    while ((c = getopt(argc, argv, "MOSUcjhfn")) != -1) {
-        switch (c) {
-        case 'c':
-            printJson = false;
-            break;
-        case 'j':
-            printJson = true;
-            break;
-
-        case 'f':
-            cbor_flags |= CborPrettyShowStringFragments;
-            break;
-        case 'n':
-            cbor_flags |= CborPrettyIndicateIndeterminateLength | CborPrettyNumericEncodingIndicators;
-            break;
-
-        case 'M':
-            json_flags |= CborConvertAddMetadata;
-            break;
-        case 'O':
-            json_flags |= CborConvertTagsToObjects;
-            break;
-        case 'S':
-            json_flags |= CborConvertStringifyMapKeys;
-            break;
-        case 'U':
-            json_flags |= CborConvertByteStringsToBase64Url;
-            break;
-
-        case '?':
-            fprintf(stderr, "Unknown option -%c.\n", optopt);
-            /* fall through */
-        case 'h':
-            puts("Usage: cbordump [OPTION]... [FILE]...\n"
-                 "Interprets FILEs as CBOR binary data and dumps the content to stdout.\n"
-                 "\n"
-                 "Options:\n"
-                 " -c       Print a CBOR dump (see RFC 7049) (default)\n"
-                 " -j       Print a JSON equivalent version\n"
-                 " -h       Print this help output and exit\n"
-                 "When JSON output is active, the following options are recognized:\n"
-                 " -M       Add metadata so converting back to CBOR is possible\n"
-                 " -O       Convert CBOR tags to JSON objects\n"
-                 " -S       Stringify non-text string map keys\n"
-                 " -U       Convert all CBOR byte strings to Base64url regardless of tags\n"
-                 "When CBOR dump is active, the following options are recognized:\n"
-                 " -f       Show text and byte string fragments\n"
-                 " -n       Show overlong encoding of CBOR numbers and length"
-                 "");
-            return c == '?' ? EXIT_FAILURE : EXIT_SUCCESS;
-        }
-    }
-
-    char **fname = argv + optind;
-    if (!*fname) {
-        dumpFile(stdin, "-", printJson, printJson ? json_flags : cbor_flags);
-    } else {
-        for ( ; *fname; ++fname) {
-            FILE *in = fopen(*fname, "rb");
-            if (!in) {
-                perror("open");
-                return EXIT_FAILURE;
-            }
-
-            dumpFile(in, *fname, printJson, printJson ? json_flags : cbor_flags);
-            fclose(in);
-        }
-    }
-
-    return EXIT_SUCCESS;
-}
diff --git a/tools/cbordump/cbordump.pro b/tools/cbordump/cbordump.pro
deleted file mode 100644
index 71ae6f7..0000000
--- a/tools/cbordump/cbordump.pro
+++ /dev/null
@@ -1,10 +0,0 @@
-TEMPLATE = app
-CONFIG += console
-CONFIG -= app_bundle
-CONFIG -= qt
-DESTDIR = ../../bin
-
-CBORDIR = $$PWD/../../src
-INCLUDEPATH += $$CBORDIR
-SOURCES += cbordump.c
-LIBS += ../../lib/libtinycbor.a
diff --git a/tools/json2cbor/json2cbor.c b/tools/json2cbor/json2cbor.c
deleted file mode 100644
index c13a751..0000000
--- a/tools/json2cbor/json2cbor.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 Intel Corporation
-**
-** 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.
-**
-****************************************************************************/
-
-#define _POSIX_C_SOURCE 200809L
-#define _GNU_SOURCE
-#include "cbor.h"
-#include "cborinternal_p.h"
-#include "compilersupport_p.h"
-
-#include <cjson/cJSON.h>
-
-#include <errno.h>
-#include <math.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-static const char meta_data_marker[] = "$cbor";
-uint8_t *buffer;
-size_t buffersize;
-bool usingMetaData = false;
-
-struct MetaData {
-    CborTag tag;
-    union {
-        const char *v;
-        uint8_t simpleType;
-    };
-    CborType t;
-    bool tagged;
-};
-
-uint8_t *decode_base64_generic(const char *string, size_t *len, const int8_t reverse_alphabet[256])
-{
-    *len = ((strlen(string) + 3) & ~3) * 3 / 4;
-    uint8_t *buffer = malloc(*len);
-    if (buffer == NULL)
-        return NULL;
-
-    uint8_t *out = buffer;
-    const uint8_t *in = (const uint8_t *)string;
-    bool done = false;
-    while (!done) {
-        if (reverse_alphabet[in[0]] < 0 || reverse_alphabet[in[1]] < 0) {
-            if (in[0] == '\0')
-                done = true;
-            break;
-        }
-
-        uint32_t val = reverse_alphabet[in[0]] << 18;
-        val |= reverse_alphabet[in[1]] << 12;
-        if (in[2] == '=' || in[2] == '\0') {
-            if (in[2] == '=' && (in[3] != '=' || in[4] != '\0'))
-                break;
-            val >>= 12;
-            done = true;
-        } else if (in[3] == '=' || in[3] == '\0') {
-            if (in[3] == '=' && in[4] != '\0')
-                break;
-            val >>= 6;
-            val |= reverse_alphabet[in[2]];
-            done = true;
-        } else {
-            val |= reverse_alphabet[in[2]] << 6;
-            val |= reverse_alphabet[in[3]];
-        }
-
-        *out++ = val >> 16;
-        *out++ = val >> 8;
-        *out++ = val;
-        in += 4;
-    }
-
-    if (!done) {
-        free(buffer);
-        return NULL;
-    }
-    *len = out - buffer;
-    return buffer;
-}
-
-uint8_t *decode_base64(const char *string, size_t *len)
-{
-    static const int8_t reverse_alphabet[256] = {
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-        -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-        -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
-    };
-    return decode_base64_generic(string, len, reverse_alphabet);
-}
-
-uint8_t *decode_base64url(const char *string, size_t *len)
-{
-    static const int8_t reverse_alphabet[256] = {
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,
-        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-        -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-        15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,
-        -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-        41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
-    };
-    return decode_base64_generic(string, len, reverse_alphabet);
-}
-
-uint8_t *decode_base16(const char *string, size_t *len)
-{
-    size_t i;
-    *len = strlen(string) / 2;
-    uint8_t *buffer = malloc(*len);
-    if (buffer == NULL)
-        return NULL;
-
-    for (i = 0; i < *len; ++i) {
-        char c = string[i * 2];
-        if (c >= '0' && c <= '9') {
-            buffer[i] = (c - '0') << 4;
-        } else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
-            buffer[i] = ((c | 0x20) - 'a' + 10) << 4;
-        } else {
-            free(buffer);
-            return NULL;
-        }
-
-        c = string[i * 2 + 1];
-        if (c >= '0' && c <= '9') {
-            buffer[i] |= (c - '0');
-        } else if ((c | 0x20) >= 'a' && (c | 0x20) <= 'f') {
-            buffer[i] |= ((c | 0x20) - 'a' + 10);
-        } else {
-            free(buffer);
-            return NULL;
-        }
-    }
-
-    return buffer;
-}
-
-size_t get_cjson_size_limited(cJSON *container)
-{
-    // cJSON_GetArraySize is O(n), so don't go too far
-    unsigned s = 0;
-    cJSON *item;
-    for (item = container->child; item; item = item->next) {
-        if (++s > 255)
-            return CborIndefiniteLength;
-    }
-    return s;
-}
-
-cJSON *get_meta_data(cJSON *object, cJSON *item)
-{
-    cJSON *meta;
-    char *metadatakey;
-
-    if (asprintf(&metadatakey, "%s%s", item->string, meta_data_marker) < 0 || metadatakey == NULL)
-        return NULL;
-    meta = cJSON_GetObjectItem(object, metadatakey);
-    free(metadatakey);
-    return meta;
-}
-
-struct MetaData parse_meta_data(cJSON *md)
-{
-    struct MetaData result = { 0, {NULL}, CborInvalidType, false };
-    if (md == NULL || md->type != cJSON_Object)
-        return result;
-
-    for (md = md->child; md; md = md->next) {
-        if (strcmp(md->string, "tag") == 0) {
-            if (md->type != cJSON_String || sscanf(md->valuestring, "%" PRIu64, &result.tag) < 0)
-                fprintf(stderr, "json2cbor: could not parse tag: %s\n", md->valuestring);
-            else
-                result.tagged = true;
-        } else if (strcmp(md->string, "t") == 0) {
-            result.t = md->valueint;
-        } else if (strcmp(md->string, "v") == 0) {
-            if (md->type == cJSON_Number)
-                result.simpleType = md->valueint;
-            else
-                result.v = md->valuestring;
-        }
-    }
-    return result;
-}
-
-CborError decode_json(cJSON *json, CborEncoder *encoder);
-CborError decode_json_with_metadata(cJSON *item, CborEncoder *encoder, struct MetaData md)
-{
-    switch (md.t) {
-    case CborIntegerType: {
-        // integer that has more than 53 bits of precision
-        uint64_t v;
-        bool positive = *md.v++ == '+';
-        if (sscanf(md.v, "%" PRIx64, &v) < 0) {
-            fprintf(stderr, "json2cbor: could not parse number: %s\n", md.v);
-            break;
-        }
-        return positive ? cbor_encode_uint(encoder, v) : cbor_encode_negative_int(encoder, v);
-    }
-
-    case CborByteStringType: {
-        uint8_t *data;
-        size_t len;
-        if (md.tag == CborExpectedBase64Tag)
-            data = decode_base64(item->valuestring, &len);
-        else if (md.tag == CborExpectedBase16Tag)
-            data = decode_base16(item->valuestring, &len);
-        else if (md.tag == CborNegativeBignumTag)
-            data = decode_base64url(item->valuestring + 1, &len);
-        else
-            data = decode_base64url(item->valuestring, &len);
-
-        if (data != NULL) {
-            CborError err = cbor_encode_byte_string(encoder, data, len);
-            free(data);
-            return err;
-        }
-        fprintf(stderr, "json2cbor: could not decode encoded byte string: %s\n", item->valuestring);
-        break;
-    }
-
-    case CborSimpleType:
-        return cbor_encode_simple_value(encoder, md.simpleType);
-
-    case CborUndefinedType:
-        return cbor_encode_undefined(encoder);
-
-    case CborHalfFloatType:
-    case CborFloatType:
-    case CborDoubleType: {
-        unsigned short half;
-        double v;
-        if (!md.v) {
-            v = item->valuedouble;
-        } else if (strcmp(md.v, "nan") == 0) {
-            v = NAN;
-        } else if (strcmp(md.v, "-inf") == 0) {
-            v = -INFINITY;
-        } else if (strcmp(md.v, "inf") == 0) {
-            v = INFINITY;
-        } else {
-            fprintf(stderr, "json2cbor: invalid floating-point value: %s\n", md.v);
-            break;
-        }
-
-        // we can't get an OOM here because the metadata makes up for space
-        // (the smallest metadata is "$cbor":{"t":250} (17 bytes)
-        return (md.t == CborDoubleType) ? cbor_encode_double(encoder, v) :
-               (md.t == CborFloatType) ? cbor_encode_float(encoder, v) :
-                                         (half = encode_half(v), cbor_encode_half_float(encoder, &half));
-    }
-
-    default:
-        fprintf(stderr, "json2cbor: invalid CBOR type: %d\n", md.t);
-    case CborInvalidType:
-        break;
-    }
-
-    return decode_json(item, encoder);
-}
-
-CborError decode_json(cJSON *json, CborEncoder *encoder)
-{
-    CborEncoder container;
-    CborError err;
-    cJSON *item;
-
-    switch (json->type) {
-    case cJSON_False:
-    case cJSON_True:
-        return cbor_encode_boolean(encoder, json->type == cJSON_True);
-
-    case cJSON_NULL:
-        return cbor_encode_null(encoder);
-
-    case cJSON_Number:
-        if ((double)json->valueint == json->valuedouble)
-            return cbor_encode_int(encoder, json->valueint);
-encode_double:
-        // the only exception that JSON is larger: floating point numbers
-        container = *encoder;   // save the state
-        err = cbor_encode_double(encoder, json->valuedouble);
-
-        if (err == CborErrorOutOfMemory) {
-            buffersize += 1024;
-            uint8_t *newbuffer = realloc(buffer, buffersize);
-            if (newbuffer == NULL)
-                return err;
-
-            *encoder = container;   // restore state
-            encoder->data.ptr = newbuffer + (container.data.ptr - buffer);
-            encoder->end = newbuffer + buffersize;
-            buffer = newbuffer;
-            goto encode_double;
-        }
-        return err;
-
-    case cJSON_String:
-        return cbor_encode_text_stringz(encoder, json->valuestring);
-
-    default:
-        return CborErrorUnknownType;
-
-    case cJSON_Array:
-        err = cbor_encoder_create_array(encoder, &container, get_cjson_size_limited(json));
-        if (err)
-            return err;
-        for (item = json->child; item; item = item->next) {
-            err = decode_json(item, &container);
-            if (err)
-                return err;
-        }
-        return cbor_encoder_close_container_checked(encoder, &container);
-
-    case cJSON_Object:
-        err = cbor_encoder_create_map(encoder, &container,
-                                      usingMetaData ? CborIndefiniteLength : get_cjson_size_limited(json));
-        if (err)
-            return err;
-
-        for (item = json->child ; item; item = item->next) {
-            if (usingMetaData && strlen(item->string) > strlen(meta_data_marker)
-                    && strcmp(item->string + strlen(item->string) - strlen(meta_data_marker), meta_data_marker) == 0)
-                continue;
-
-            err = cbor_encode_text_stringz(&container, item->string);
-            if (err)
-                return err;
-
-            if (usingMetaData) {
-                cJSON *meta = get_meta_data(json, item);
-                struct MetaData md = parse_meta_data(meta);
-                if (md.tagged) {
-                    err = cbor_encode_tag(&container, md.tag);
-                    if (err)
-                        return err;
-                }
-
-                err = decode_json_with_metadata(item, &container, md);
-            } else {
-                err = decode_json(item, &container);
-            }
-            if (err)
-                return err;
-        }
-
-        return cbor_encoder_close_container_checked(encoder, &container);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    int c;
-    while ((c = getopt(argc, argv, "M")) != -1) {
-        switch (c) {
-        case 'M':
-            usingMetaData = true;
-            break;
-
-        case '?':
-            fprintf(stderr, "Unknown option -%c.\n", optopt);
-            // fall through
-        case 'h':
-            puts("Usage: json2cbor [OPTION]... [FILE]...\n"
-                 "Reads JSON content from FILE and converts to CBOR.\n"
-                 "\n"
-                 "Options:\n"
-                 " -M       Interpret metadata added by cbordump tool\n"
-                 "");
-            return c == '?' ? EXIT_FAILURE : EXIT_SUCCESS;
-        }
-    }
-
-    FILE *in;
-    const char *fname = argv[optind];
-    if (fname && strcmp(fname, "-") != 0) {
-        in = fopen(fname, "r");
-        if (!in) {
-            perror("open");
-            return EXIT_FAILURE;
-        }
-    } else {
-        in = stdin;
-        fname = "-";
-    }
-
-    /* 1. read the file */
-    off_t fsize;
-    if (fseeko(in, 0, SEEK_END) == 0 && (fsize = ftello(in)) >= 0) {
-        buffersize = fsize + 1;
-        buffer = malloc(buffersize);
-        if (buffer == NULL) {
-            perror("malloc");
-            return EXIT_FAILURE;
-        }
-
-        rewind(in);
-        fsize = fread(buffer, 1, fsize, in);
-        buffer[fsize] = '\0';
-    } else {
-        const unsigned chunk = 16384;
-        buffersize = 0;
-        buffer = NULL;
-        do {    // it the hard way
-            buffer = realloc(buffer, buffersize + chunk);
-            if (buffer == NULL) {
-                perror("malloc");
-                return EXIT_FAILURE;
-            }
-
-            buffersize += fread(buffer + buffersize, 1, chunk, in);
-        } while (!feof(in) && !ferror(in));
-        buffer[buffersize] = '\0';
-    }
-
-    if (ferror(in)) {
-        perror("read");
-        return EXIT_FAILURE;
-    }
-    if (in != stdin)
-        fclose(in);
-
-    /* 2. parse as JSON */
-    cJSON *doc = cJSON_ParseWithOpts((char *)buffer, NULL, true);
-    if (doc == NULL) {
-        fprintf(stderr, "json2cbor: %s: could not parse.\n", fname);
-        return EXIT_FAILURE;
-    }
-
-    /* 3. encode as CBOR */
-    // We're going to reuse the buffer, as CBOR is usually shorter than the equivalent JSON
-    CborEncoder encoder;
-    cbor_encoder_init(&encoder, buffer, buffersize, 0);
-    CborError err = decode_json(doc, &encoder);
-
-    cJSON_Delete(doc);
-
-    if (err) {
-        fprintf(stderr, "json2cbor: %s: error encoding to CBOR: %s\n", fname,
-                cbor_error_string(err));
-        return EXIT_FAILURE;
-    }
-
-    fwrite(buffer, 1, encoder.data.ptr - buffer, stdout);
-    free(buffer);
-    return EXIT_SUCCESS;
-}
diff --git a/tools/json2cbor/json2cbor.pro b/tools/json2cbor/json2cbor.pro
deleted file mode 100644
index fd6bcd0..0000000
--- a/tools/json2cbor/json2cbor.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = app
-CONFIG += console
-CONFIG -= app_bundle
-CONFIG -= qt
-DESTDIR = ../../bin
-
-CBORDIR = $$PWD/../../src
-INCLUDEPATH += $$CBORDIR
-SOURCES += json2cbor.c
-LIBS += ../../lib/libtinycbor.a
-
-CJSONDIR = .
-!exists($$CJSONDIR/cJSON.h): CJSONDIR = $$CBORDIR/cjson
-exists($$CJSONDIR/cJSON.h) {
-    INCLUDEPATH += $$CJSONDIR
-    SOURCES += $$CJSONDIR/cJSON.c
-} else {
-    message("cJSON not found, not building json2cbor.")
-    TEMPLATE = aux
-}