Split encode source/header files into three (#288)

Split encoding into main, numbers and tags to improve documentation and code readability

Also fix up documentation for private, deprecated and "InMap" methods.



Co-authored-by: Laurence Lundblade <lgl@securitytheory.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3c43988..d2d950a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,12 +38,13 @@
 
 target_sources(qcbor
     PRIVATE
+        src/qcbor_main_encode.c
+        src/qcbor_number_encode.c
         src/ieee754.c
         src/qcbor_main_decode.c
         src/qcbor_spiffy_decode.c
         src/qcbor_tag_decode.c
         src/qcbor_number_decode.c
-        src/qcbor_encode.c
         src/qcbor_err_to_str.c
         src/UsefulBuf.c
 )
diff --git a/Makefile b/Makefile
index 6f00615..ff12907 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 # Makefile -- UNIX-style make for qcbor as a lib and command line test
 #
-# Copyright (c) 2018-2021, Laurence Lundblade. All rights reserved.
+# Copyright (c) 2018-2024, Laurence Lundblade. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
@@ -24,7 +24,15 @@
 CFLAGS=$(CMD_LINE) -I inc -I test -Os -fPIC
 
 
-QCBOR_OBJ=src/UsefulBuf.o src/qcbor_encode.o src/qcbor_main_decode.o src/qcbor_spiffy_decode.o src/qcbor_number_decode.o src/qcbor_tag_decode.o src/ieee754.o src/qcbor_err_to_str.o
+QCBOR_OBJ=src/UsefulBuf.o \
+          src/qcbor_main_encode.o \
+          src/qcbor_number_encode.o \
+          src/qcbor_main_decode.o \
+          src/qcbor_spiffy_decode.o \
+          src/qcbor_number_decode.o \
+          src/qcbor_tag_decode.o \
+          src/ieee754.o \
+          src/qcbor_err_to_str.o
 
 TEST_OBJ=test/UsefulBuf_Tests.o test/qcbor_encode_tests.o \
     test/qcbor_decode_tests.o test/run_tests.o \
diff --git a/QCBOR.xcodeproj/project.pbxproj b/QCBOR.xcodeproj/project.pbxproj
index 9060e9e..7b6289c 100644
--- a/QCBOR.xcodeproj/project.pbxproj
+++ b/QCBOR.xcodeproj/project.pbxproj
@@ -20,7 +20,7 @@
 		E73B575F2161CA7C0080D658 /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
 		E73B57652161F8F80080D658 /* run_tests.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57632161F8F70080D658 /* run_tests.c */; };
 		E743D0F324AD08020017899F /* example.c in Sources */ = {isa = PBXBuildFile; fileRef = E743D0E124AC516D0017899F /* example.c */; };
-		E743D10B24DD4EF50017899F /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E743D10B24DD4EF50017899F /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E743D10C24DD4EF50017899F /* ieee754.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57582161CA690080D658 /* ieee754.c */; };
 		E743D10D24DD4EF50017899F /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
 		E743D10E24DD4EF50017899F /* run_tests.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57632161F8F70080D658 /* run_tests.c */; };
@@ -32,7 +32,7 @@
 		E743D11524DD4EF50017899F /* UsefulBuf_Tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 0FA9BEBC216DE31700BA646B /* UsefulBuf_Tests.c */; };
 		E743D11C24DD51340017899F /* example.c in Sources */ = {isa = PBXBuildFile; fileRef = E743D0E124AC516D0017899F /* example.c */; };
 		E743D11D24DD51350017899F /* example.c in Sources */ = {isa = PBXBuildFile; fileRef = E743D0E124AC516D0017899F /* example.c */; };
-		E743D12024DE05CC0017899F /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E743D12024DE05CC0017899F /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E743D12124DE05CC0017899F /* ieee754.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57582161CA690080D658 /* ieee754.c */; };
 		E743D12224DE05CC0017899F /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
 		E743D12324DE05CC0017899F /* run_tests.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57632161F8F70080D658 /* run_tests.c */; };
@@ -43,7 +43,7 @@
 		E743D12924DE05CC0017899F /* cmd_line_main.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E096214AE0C700E67947 /* cmd_line_main.c */; };
 		E743D12A24DE05CC0017899F /* example.c in Sources */ = {isa = PBXBuildFile; fileRef = E743D0E124AC516D0017899F /* example.c */; };
 		E743D12B24DE05CC0017899F /* UsefulBuf_Tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 0FA9BEBC216DE31700BA646B /* UsefulBuf_Tests.c */; };
-		E772021723B52C02006E966E /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E772021723B52C02006E966E /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E772021823B52C02006E966E /* ieee754.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57582161CA690080D658 /* ieee754.c */; };
 		E772021923B52C02006E966E /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
 		E772021A23B52C02006E966E /* run_tests.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57632161F8F70080D658 /* run_tests.c */; };
@@ -53,10 +53,13 @@
 		E772021F23B52C02006E966E /* qcbor_encode_tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 0FA9BEB8216DC7AD00BA646B /* qcbor_encode_tests.c */; };
 		E772022023B52C02006E966E /* cmd_line_main.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E096214AE0C700E67947 /* cmd_line_main.c */; };
 		E772022123B52C02006E966E /* UsefulBuf_Tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 0FA9BEBC216DE31700BA646B /* UsefulBuf_Tests.c */; };
-		E776E08F214AE07500E67947 /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E776E08F214AE07500E67947 /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E776E090214AE07500E67947 /* UsefulBuf.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08D214AE07500E67947 /* UsefulBuf.c */; };
 		E776E097214AE0C700E67947 /* cmd_line_main.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E096214AE0C700E67947 /* cmd_line_main.c */; };
 		E7864766252CE63100A0C11B /* qcbor_err_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = E7864765252CE63100A0C11B /* qcbor_err_to_str.c */; };
+		E7B6990A2D128AC800D8F78F /* qcbor_number_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7B699092D128AC800D8F78F /* qcbor_number_encode.c */; };
+		E7B6990B2D128AC800D8F78F /* qcbor_number_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7B699092D128AC800D8F78F /* qcbor_number_encode.c */; };
+		E7B6990C2D128AC800D8F78F /* qcbor_number_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7B699092D128AC800D8F78F /* qcbor_number_encode.c */; };
 		E7C6D9972CB7D4010034425D /* tag-examples.c in Sources */ = {isa = PBXBuildFile; fileRef = E7C6D9962CB7D4010034425D /* tag-examples.c */; };
 		E7C960B92800A09E00FB537C /* ub-example.c in Sources */ = {isa = PBXBuildFile; fileRef = E7C960B82800A09E00FB537C /* ub-example.c */; };
 		E7CA1F1E2C8C337E0008F454 /* qcbor_tag_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7CA1F1D2C8C337E0008F454 /* qcbor_tag_decode.c */; };
@@ -65,7 +68,7 @@
 		E7CA1F212C8C337E0008F454 /* qcbor_tag_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7CA1F1D2C8C337E0008F454 /* qcbor_tag_decode.c */; };
 		E7CA1F222C8C337E0008F454 /* qcbor_tag_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7CA1F1D2C8C337E0008F454 /* qcbor_tag_decode.c */; };
 		E7CA1F232C8C337E0008F454 /* qcbor_tag_decode.c in Sources */ = {isa = PBXBuildFile; fileRef = E7CA1F1D2C8C337E0008F454 /* qcbor_tag_decode.c */; };
-		E7FDBF04256C969D007138A8 /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E7FDBF04256C969D007138A8 /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E7FDBF05256C969D007138A8 /* ieee754.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57582161CA690080D658 /* ieee754.c */; };
 		E7FDBF06256C969D007138A8 /* qcbor_err_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = E7864765252CE63100A0C11B /* qcbor_err_to_str.c */; };
 		E7FDBF07256C969D007138A8 /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
@@ -77,7 +80,7 @@
 		E7FDBF0E256C969D007138A8 /* cmd_line_main.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E096214AE0C700E67947 /* cmd_line_main.c */; };
 		E7FDBF0F256C969D007138A8 /* example.c in Sources */ = {isa = PBXBuildFile; fileRef = E743D0E124AC516D0017899F /* example.c */; };
 		E7FDBF10256C969D007138A8 /* UsefulBuf_Tests.c in Sources */ = {isa = PBXBuildFile; fileRef = 0FA9BEBC216DE31700BA646B /* UsefulBuf_Tests.c */; };
-		E7FDBF1A257A6C1F007138A8 /* qcbor_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_encode.c */; };
+		E7FDBF1A257A6C1F007138A8 /* qcbor_main_encode.c in Sources */ = {isa = PBXBuildFile; fileRef = E776E08C214AE07400E67947 /* qcbor_main_encode.c */; };
 		E7FDBF1B257A6C1F007138A8 /* ieee754.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B57582161CA690080D658 /* ieee754.c */; };
 		E7FDBF1C257A6C1F007138A8 /* qcbor_err_to_str.c in Sources */ = {isa = PBXBuildFile; fileRef = E7864765252CE63100A0C11B /* qcbor_err_to_str.c */; };
 		E7FDBF1D257A6C1F007138A8 /* half_to_double_from_rfc7049.c in Sources */ = {isa = PBXBuildFile; fileRef = E73B575D2161CA7C0080D658 /* half_to_double_from_rfc7049.c */; };
@@ -180,7 +183,7 @@
 		E74BF411245D6713002CE8E8 /* UsefulBuf.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = UsefulBuf.h; path = inc/qcbor/UsefulBuf.h; sourceTree = "<group>"; tabWidth = 3; };
 		E772022723B52C02006E966E /* QCBOR_Disable_Exp_Mantissa */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = QCBOR_Disable_Exp_Mantissa; sourceTree = BUILT_PRODUCTS_DIR; };
 		E776E07C214ADF7F00E67947 /* QCBOR */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = QCBOR; sourceTree = BUILT_PRODUCTS_DIR; };
-		E776E08C214AE07400E67947 /* qcbor_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = qcbor_encode.c; path = src/qcbor_encode.c; sourceTree = "<group>"; tabWidth = 3; };
+		E776E08C214AE07400E67947 /* qcbor_main_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = qcbor_main_encode.c; path = src/qcbor_main_encode.c; sourceTree = "<group>"; tabWidth = 3; };
 		E776E08D214AE07500E67947 /* UsefulBuf.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = UsefulBuf.c; path = src/UsefulBuf.c; sourceTree = "<group>"; tabWidth = 3; };
 		E776E094214AE09700E67947 /* UsefulBuf.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = UsefulBuf.h; path = inc/UsefulBuf.h; sourceTree = "<group>"; tabWidth = 3; };
 		E776E096214AE0C700E67947 /* cmd_line_main.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; path = cmd_line_main.c; sourceTree = "<group>"; tabWidth = 3; };
@@ -188,8 +191,12 @@
 		E7864765252CE63100A0C11B /* qcbor_err_to_str.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.c; name = qcbor_err_to_str.c; path = src/qcbor_err_to_str.c; sourceTree = "<group>"; tabWidth = 3; };
 		E78C91DF240C90C100F4CECE /* qcbor_common.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_common.h; path = inc/qcbor/qcbor_common.h; sourceTree = "<group>"; tabWidth = 3; };
 		E78C91E0240C90C100F4CECE /* qcbor_private.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_private.h; path = inc/qcbor/qcbor_private.h; sourceTree = "<group>"; tabWidth = 3; };
-		E78C91E1240C90C100F4CECE /* qcbor_encode.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_encode.h; path = inc/qcbor/qcbor_encode.h; sourceTree = "<group>"; tabWidth = 3; };
+		E78C91E1240C90C100F4CECE /* qcbor_main_encode.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_main_encode.h; path = inc/qcbor/qcbor_main_encode.h; sourceTree = "<group>"; tabWidth = 3; };
 		E7A7B60E2B76FB62009102C2 /* Serialization.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = Serialization.md; path = doc/Serialization.md; sourceTree = "<group>"; };
+		E7B699042D12868C00D8F78F /* qcbor_tag_encode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qcbor_tag_encode.h; path = inc/qcbor/qcbor_tag_encode.h; sourceTree = "<group>"; };
+		E7B699092D128AC800D8F78F /* qcbor_number_encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = qcbor_number_encode.c; path = src/qcbor_number_encode.c; sourceTree = "<group>"; };
+		E7B6990D2D13E56F00D8F78F /* qcbor_number_encode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qcbor_number_encode.h; path = inc/qcbor/qcbor_number_encode.h; sourceTree = "<group>"; };
+		E7B6990E2D13EF4700D8F78F /* qcbor_encode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qcbor_encode.h; path = inc/qcbor/qcbor_encode.h; sourceTree = "<group>"; };
 		E7C6D9952CB7D4010034425D /* tag-examples.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "tag-examples.h"; sourceTree = "<group>"; };
 		E7C6D9962CB7D4010034425D /* tag-examples.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "tag-examples.c"; sourceTree = "<group>"; };
 		E7C960B72800A09E00FB537C /* ub-example.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ub-example.h"; sourceTree = "<group>"; };
@@ -293,7 +300,8 @@
 			isa = PBXGroup;
 			children = (
 				E776E08D214AE07500E67947 /* UsefulBuf.c */,
-				E776E08C214AE07400E67947 /* qcbor_encode.c */,
+				E776E08C214AE07400E67947 /* qcbor_main_encode.c */,
+				E7B699092D128AC800D8F78F /* qcbor_number_encode.c */,
 				E7180F2A2CFCEBE100513186 /* qcbor_main_decode.c */,
 				E7180F272CF917D200513186 /* decode_nesting.h */,
 				E7180F252CF8F2EB00513186 /* qcbor_spiffy_decode.c */,
@@ -311,7 +319,9 @@
 			children = (
 				E74BF411245D6713002CE8E8 /* UsefulBuf.h */,
 				E78C91DF240C90C100F4CECE /* qcbor_common.h */,
-				E78C91E1240C90C100F4CECE /* qcbor_encode.h */,
+				E78C91E1240C90C100F4CECE /* qcbor_main_encode.h */,
+				E7B6990D2D13E56F00D8F78F /* qcbor_number_encode.h */,
+				E7B699042D12868C00D8F78F /* qcbor_tag_encode.h */,
 				E7180F282CFCE9B000513186 /* qcbor_main_decode.h */,
 				E7CA1F152C8ACCAE0008F454 /* qcbor_tag_decode.h */,
 				E743D10824CEDE2D0017899F /* qcbor_spiffy_decode.h */,
@@ -319,6 +329,7 @@
 				E78C91E0240C90C100F4CECE /* qcbor_private.h */,
 				E776E094214AE09700E67947 /* UsefulBuf.h */,
 				E7180F292CFCE9F800513186 /* qcbor_decode.h */,
+				E7B6990E2D13EF4700D8F78F /* qcbor_encode.h */,
 			);
 			name = inc;
 			sourceTree = "<group>";
@@ -490,7 +501,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E743D10B24DD4EF50017899F /* qcbor_encode.c in Sources */,
+				E743D10B24DD4EF50017899F /* qcbor_main_encode.c in Sources */,
 				E743D10C24DD4EF50017899F /* ieee754.c in Sources */,
 				E743D10D24DD4EF50017899F /* half_to_double_from_rfc7049.c in Sources */,
 				E743D10E24DD4EF50017899F /* run_tests.c in Sources */,
@@ -509,7 +520,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E743D12024DE05CC0017899F /* qcbor_encode.c in Sources */,
+				E743D12024DE05CC0017899F /* qcbor_main_encode.c in Sources */,
 				E743D12124DE05CC0017899F /* ieee754.c in Sources */,
 				E743D12224DE05CC0017899F /* half_to_double_from_rfc7049.c in Sources */,
 				E743D12324DE05CC0017899F /* run_tests.c in Sources */,
@@ -528,7 +539,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E772021723B52C02006E966E /* qcbor_encode.c in Sources */,
+				E772021723B52C02006E966E /* qcbor_main_encode.c in Sources */,
 				E772021823B52C02006E966E /* ieee754.c in Sources */,
 				E772021923B52C02006E966E /* half_to_double_from_rfc7049.c in Sources */,
 				E772021A23B52C02006E966E /* run_tests.c in Sources */,
@@ -547,7 +558,7 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E776E08F214AE07500E67947 /* qcbor_encode.c in Sources */,
+				E776E08F214AE07500E67947 /* qcbor_main_encode.c in Sources */,
 				E7180F2B2CFCEBE100513186 /* qcbor_main_decode.c in Sources */,
 				E7C6D9972CB7D4010034425D /* tag-examples.c in Sources */,
 				E7CA1F1E2C8C337E0008F454 /* qcbor_tag_decode.c in Sources */,
@@ -562,6 +573,7 @@
 				E776E097214AE0C700E67947 /* cmd_line_main.c in Sources */,
 				E7C960B92800A09E00FB537C /* ub-example.c in Sources */,
 				E743D0F324AD08020017899F /* example.c in Sources */,
+				E7B6990A2D128AC800D8F78F /* qcbor_number_encode.c in Sources */,
 				0FA9BEBD216DE31700BA646B /* UsefulBuf_Tests.c in Sources */,
 				E7180F262CF8F2EB00513186 /* qcbor_spiffy_decode.c in Sources */,
 				E7180F232CF1657B00513186 /* qcbor_number_decode.c in Sources */,
@@ -572,8 +584,9 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E7FDBF04256C969D007138A8 /* qcbor_encode.c in Sources */,
+				E7FDBF04256C969D007138A8 /* qcbor_main_encode.c in Sources */,
 				E7FDBF05256C969D007138A8 /* ieee754.c in Sources */,
+				E7B6990B2D128AC800D8F78F /* qcbor_number_encode.c in Sources */,
 				E7FDBF06256C969D007138A8 /* qcbor_err_to_str.c in Sources */,
 				E7FDBF07256C969D007138A8 /* half_to_double_from_rfc7049.c in Sources */,
 				E7FDBF08256C969D007138A8 /* run_tests.c in Sources */,
@@ -593,8 +606,9 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				E7FDBF1A257A6C1F007138A8 /* qcbor_encode.c in Sources */,
+				E7FDBF1A257A6C1F007138A8 /* qcbor_main_encode.c in Sources */,
 				E7FDBF1B257A6C1F007138A8 /* ieee754.c in Sources */,
+				E7B6990C2D128AC800D8F78F /* qcbor_number_encode.c in Sources */,
 				E7FDBF1C257A6C1F007138A8 /* qcbor_err_to_str.c in Sources */,
 				E7FDBF1D257A6C1F007138A8 /* half_to_double_from_rfc7049.c in Sources */,
 				E7FDBF1E257A6C1F007138A8 /* run_tests.c in Sources */,
diff --git a/example.c b/example.c
index 99944ff..a336004 100644
--- a/example.c
+++ b/example.c
@@ -13,7 +13,8 @@
 
 #include <stdio.h>
 #include "example.h"
-#include "qcbor/qcbor_encode.h"
+#include "qcbor/qcbor_main_encode.h"
+#include "qcbor/qcbor_number_encode.h"
 #include "qcbor/qcbor_main_decode.h"
 #include "qcbor/qcbor_spiffy_decode.h"
 #include "qcbor/qcbor_number_decode.h"
diff --git a/inc/qcbor/qcbor_encode.h b/inc/qcbor/qcbor_encode.h
index ce087ef..0f7a3a2 100644
--- a/inc/qcbor/qcbor_encode.h
+++ b/inc/qcbor/qcbor_encode.h
@@ -1,5342 +1,20 @@
-/* ===========================================================================
- * Copyright (c) 2016-2018, The Linux Foundation.
- * Copyright (c) 2018-2024, Laurence Lundblade.
- * Copyright (c) 2021, Arm Limited.
- * All rights reserved.
+/* ==========================================================================
+ * qcbor_encode.h -- Backwards compatibility to v1 qcbor_encode.h
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- *     * Neither the name of The Linux Foundation nor the names of its
- *       contributors, nor the name "Laurence Lundblade" may be used to
- *       endorse or promote products derived from this software without
- *       specific prior written permission.
+ * Copyright (c) 2024, Laurence Lundblade. All rights reserved.
  *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * ========================================================================= */
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * See BSD-3-Clause license in file named "LICENSE"
+ *
+ * Created on 12/18/24.
+ * ========================================================================== */
 
 #ifndef qcbor_encode_h
 #define qcbor_encode_h
 
-
-#include "qcbor/qcbor_common.h"
-#include "qcbor/qcbor_private.h"
-#include <stdbool.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#if 0
-} // Keep editor indention formatting happy
-#endif
-#endif
-
-
-/**
- * @file qcbor_encode.h
- *
- * @anchor Overview
- *
- * # QCBOR Overview
- *
- * This implements CBOR -- Concise Binary Object Representation as
- * defined in [RFC 8949] (https://www.rfc-editor.org/rfc/rfc8949.html).
- * More information is at http://cbor.io.  This is a near-complete
- * implementation of the specification. [RFC 8742]
- * (https://www.rfc-editor.org/rfc/rfc8742.html) CBOR Sequences is
- * also supported. Limitations are listed further down.
- *
- * See @ref Encoding for general discussion on encoding,
- * @ref BasicDecode for general discussion on the basic decode features
- * and @ref SpiffyDecode for general discussion on the easier-to-use
- * decoder functions.
- *
- * CBOR is intentionally designed to be translatable to JSON, but not
- * all CBOR can convert to JSON. See RFC 8949 for more info on how to
- * construct CBOR that is the most JSON friendly.
- *
- * The memory model for encoding and decoding is that encoded CBOR must
- * be in a contiguous buffer in memory.  During encoding the caller must
- * supply an output buffer and if the encoding would go off the end of
- * the buffer an error is returned.  During decoding the caller supplies
- * the encoded CBOR in a contiguous buffer and the decoder returns
- * pointers and lengths into that buffer for strings.
- *
- * This implementation does not require malloc. All data structures
- * passed in/out of the APIs can fit on the stack.
- *
- * Decoding of indefinite-length strings is a special case that requires
- * a "string allocator" to allocate memory into which the segments of
- * the string are coalesced. Without this, decoding will error out if an
- * indefinite-length string is encountered (indefinite-length maps and
- * arrays do not require the string allocator). A simple string
- * allocator called MemPool is built-in and will work if supplied with a
- * block of memory to allocate. The string allocator can optionally use
- * malloc() or some other custom scheme.
- *
- * Here are some terms and definitions:
- *
- * - "Item", "Data Item": An integer or string or such. The basic "thing" that
- * CBOR is about. An array is an item itself that contains some items.
- *
- * - "Array": An ordered sequence of items, the same as JSON.
- *
- * - "Map": A collection of label/value pairs. Each pair is a data
- * item. A JSON "object" is the same as a CBOR "map".
- *
- * - "Label": The data item in a pair in a map that names or identifies
- * the pair, not the value. This implementation refers to it as a
- * "label".  JSON refers to it as the "name". The CBOR RFC refers to it
- * this as a "key".  This implementation chooses label instead because
- * key is too easily confused with a cryptographic key. The COSE
- * standard, which uses CBOR, has also chosen to use the term "label"
- * rather than "key" for this same reason.
- *
- * - "Key": See "Label" above.
- *
- * - "Tag": A data item that is an explicitly labeled new data
- * type made up of the tagging integer and the tag content.
- * See @ref Tags-Overview and @ref Tag-Usage.
- *
- * - "Initial Byte": The first byte of an encoded item. Encoding and
- * decoding of this byte is taken care of by the implementation.
- *
- * - "Additional Info": In addition to the major type, all data items
- * have some other info. This is usually the length of the data but can
- * be several other things. Encoding and decoding of this is taken care
- * of by the implementation.
- *
- * CBOR has two mechanisms for tagging and labeling the data values like
- * integers and strings. For example, an integer that represents
- * someone's birthday in epoch seconds since Jan 1, 1970 could be
- * encoded like this:
- *
- * - First it is CBOR_MAJOR_TYPE_POSITIVE_INT (@ref QCBOR_TYPE_INT64),
- * the primitive positive integer.
- *
- * - Next it has a "tag" @ref CBOR_TAG_DATE_EPOCH indicating the integer
- * represents a date in the form of the number of seconds since Jan 1,
- * 1970.
- *
- * - Last it has a string "label" like "BirthDate" indicating the
- * meaning of the data.
- *
- * The encoded binary looks like this:
- *
- *      a1                      # Map of 1 item
- *         69                   # Indicates text string of 9 bytes
- *           426972746844617465 # The text "BirthDate"
- *        c1                    # Tags next integer as epoch date
- *           1a                 # Indicates a 4-byte integer
- *               580d4172       # unsigned integer date 1477263730
- *
- * Implementors using this API will primarily work with
- * labels. Generally, tags are only needed for making up new data
- * types. This implementation covers most of the data types defined in
- * the RFC using tags. It also, allows for the use of custom tags if
- * necessary.
- *
- * This implementation explicitly supports labels that are text strings
- * and integers. Text strings translate nicely into JSON objects and are
- * very readable.  Integer labels are much less readable but can be very
- * compact. If they are in the range of 0 to 23, they take up only one
- * byte.
- *
- * CBOR allows a label to be any type of data including an array or a
- * map. It is possible to use this API to construct and parse such
- * labels, but it is not explicitly supported.
- *
- * @anchor Encoding
- *
- * ## Encoding
- *
- * A common encoding usage mode is to invoke the encoding twice. First
- * with the output buffer as @ref SizeCalculateUsefulBuf to compute the
- * length of the needed output buffer. The correct sized output buffer
- * is allocated. The encoder is invoked a second time with the allocated
- * output buffer.
- *
- * The double invocation is not required if the maximum output buffer
- * size can be predicted. This is usually possible for simple CBOR
- * structures.
- *
- * If a buffer too small to hold the encoded output is given, the error
- * @ref QCBOR_ERR_BUFFER_TOO_SMALL will be returned. Data will never be
- * written off the end of the output buffer no matter which functions
- * here are called or what parameters are passed to them.
- *
- * The encoding error handling is simple. The only possible errors are
- * trying to encode structures that are too large or too complex. There
- * are no internal malloc calls so there will be no failures for out of
- * memory.  The error state is tracked internally, so there is no need
- * to check for errors when encoding. Only the return code from
- * QCBOREncode_Finish() need be checked as once an error happens, the
- * encoder goes into an error state and calls to it to add more data
- * will do nothing. An error check is not needed after every data item
- * is added.
- *
- * Encoding generally proceeds by calling QCBOREncode_Init(), calling
- * lots of @c QCBOREncode_AddXxx() functions and calling
- * QCBOREncode_Finish(). There are many @c QCBOREncode_AddXxx()
- * functions for various data types. The input buffers need only to be
- * valid during the @c QCBOREncode_AddXxx() calls as the data is copied
- * into the output buffer.
- *
- * There are three `Add` functions for each data type. The first / main
- * one for the type is for adding the data item to an array.  The second
- * one's name ends in `ToMap`, is used for adding data items to maps and
- * takes a string argument that is its label in the map. The third one
- * ends in `ToMapN`, is also used for adding data items to maps, and
- * takes an integer argument that is its label in the map.
- *
- * The simplest aggregate type is an array, which is a simple ordered
- * set of items without labels the same as JSON arrays. Call
- * QCBOREncode_OpenArray() to open a new array, then various @c
- * QCBOREncode_AddXxx() functions to put items in the array and then
- * QCBOREncode_CloseArray(). Nesting to the limit @ref
- * QCBOR_MAX_ARRAY_NESTING is allowed.  All opens must be matched by
- * closes or an encoding error will be returned.
- *
- * The other aggregate type is a map which does use labels. The `Add`
- * functions that end in `ToMap` and `ToMapN` are convenient ways to add
- * labeled data items to a map. You can also call any type of `Add`
- * function once to add a label of any type and then call any type of
- * `Add` again to add its value.
- *
- * Note that when you nest arrays or maps in a map, the nested array or
- * map has a label.
- *
- * Many CBOR-based protocols start with an array or map. This makes
- * them self-delimiting. No external length or end marker is needed to
- * know the end. It is also possible not start this way, in which case
- * this it is usually called a CBOR sequence which is described in
- * [RFC 8742] (https://www.rfc-editor.org/rfc/rfc8742.html). This
- * encoder supports either just by whether the first item added is an
- * array, map or other.
- *
- * If QCBOR is compiled with QCBOR_DISABLE_ENCODE_USAGE_GUARDS defined,
- * the errors QCBOR_ERR_CLOSE_MISMATCH, QCBOR_ERR_ARRAY_TOO_LONG,
- * QCBOR_ERR_TOO_MANY_CLOSES, QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN, and
- * QCBOR_ERR_ENCODE_UNSUPPORTED will never be returned. It is up to the
- * caller to make sure that opened maps, arrays and byte-string wrapping
- * is closed correctly and that QCBOREncode_AddType7() is called
- * correctly.  With this defined, it is easier to make a mistake when
- * authoring the encoding of a protocol that will output not well formed
- * CBOR, but as long as the calling code is correct, it is safe to
- * disable these checks. Bounds checking that prevents security issues
- * in the code is still enforced. This define reduces the size of
- * encoding object code by about 150 bytes.
- *
- * @anchor Tags-Overview
- *
- * ## Tags Overview
- *
- * Any CBOR data item can be made into a tag to add semantics, define a
- * new data type or such. Some tags are fully standardized and some are
- * just registered. Others are not registered and used in a proprietary
- * way.
- *
- * Encoding and decoding of many of the registered tags is fully
- * implemented by QCBOR. It is also possible to encode and decode tags
- * that are not directly supported.  For many use cases the built-in tag
- * support should be adequate.
- *
- * For example, the registered epoch date tag is supported in encoding
- * by QCBOREncode_AddTDateEpoch() and in decoding by @ref
- * QCBOR_TYPE_DATE_EPOCH and the @c epochDate member of @ref
- * QCBORItem. This is typical of the built-in tag support. There is an
- * API to encode data for it and a @c QCBOR_TYPE_XXX when it is decoded.
- *
- * Tags are registered in the [IANA CBOR Tags Registry]
- * (https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml). There
- * are roughly three options to create a new tag. First, a public
- * specification can be created and the new tag registered with IANA.
- * This is the most formal. Second, the new tag can be registered with
- * IANA with just a short description rather than a full specification.
- * These tags must be greater than 256. Third, a tag can be used without
- * any IANA registration, though the registry should be checked to see
- * that the new value doesn't collide with one that is registered. The
- * value of these tags must be 256 or larger.
- *
- * See also @ref CBORTags and @ref Tag-Usage
- *
- * The encoding side of tags not built-in is handled by
- * QCBOREncode_AddTagNumber() and is relatively simple. Tag decoding is more
- * complex and mainly handled by QCBORDecode_GetNext(). Decoding of the
- * structure of tagged data not built-in (if there is any) has to be
- * implemented by the caller.
- *
- * @anchor Floating-Point
- *
- * ## Floating-Point
- *
- * By default QCBOR fully supports IEEE 754 floating-point:
- *  - Encode/decode of double, single and half-precision
- *  - CBOR preferred serialization of floating-point
- *  - Floating-point epoch dates
- *
- * For the most part, the type double is used in the interface for
- * floating-point values. In the default configuration, all decoded
- * floating-point values are returned as a double.
- *
- * With CBOR preferred serialization, the encoder outputs the smallest
- * representation of the double or float that preserves precision. Zero,
- * NaN and infinity are always output as a half-precision, each taking
- * just 2 bytes. This reduces the number of bytes needed to encode
- * double and single-precision, especially if zero, NaN and infinity are
- * frequently used.
- *
- * To avoid use of preferred serialization in the standard configuration
- * when encoding, use QCBOREncode_AddDoubleNoPreferred() or
- * QCBOREncode_AddFloatNoPreferred().
- *
- * This implementation of preferred floating-point serialization and
- * half-precision does not depend on the CPU having floating-point HW or
- * the compiler bringing in a (sometimes large) library to compensate
- * for lack of CPU support. This implementation uses shifts and masks
- * rather than floating-point functions.
- *
- * To reduce overall object code by about 900 bytes, define
- * QCBOR_DISABLE_PREFERRED_FLOAT. This will eliminate all support for
- * preferred serialization and half-precision. An error will be returned
- * when attempting to decode half-precision. A float will always be
- * encoded and decoded as 32-bits and a double will always be encoded
- * and decoded as 64 bits.
- *
- * Note that even if QCBOR_DISABLE_PREFERRED_FLOAT is not defined all
- * the float-point encoding object code can be avoided by never calling
- * any functions that encode double or float. Just not calling
- * floating-point functions will reduce object code by about 500 bytes.
- *
- * On CPUs that have no floating-point hardware,
- * QCBOR_DISABLE_FLOAT_HW_USE should be defined in most cases. If it is
- * not, then the compiler will bring in possibly large software
- * libraries to compensate. Defining QCBOR_DISABLE_FLOAT_HW_USE reduces
- * object code size on CPUs with floating-point hardware by a tiny
- * amount and eliminates the need for <math.h>
- *
- * When QCBOR_DISABLE_FLOAT_HW_USE is defined, trying to decoding
- * floating-point dates will give error
- * @ref QCBOR_ERR_FLOAT_DATE_DISABLED and decoded single-precision
- * numbers will be returned as @ref QCBOR_TYPE_FLOAT instead of
- * converting them to double as usual.
- *
- * If both QCBOR_DISABLE_FLOAT_HW_USE and QCBOR_DISABLE_PREFERRED_FLOAT
- * are defined, then the only thing QCBOR can do is encode/decode a C
- * float type as 32-bits and a C double type as 64-bits. Floating-point
- * epoch dates will be unsupported.
- *
- * If USEFULBUF_DISABLE_ALL_FLOAT is defined, then floating point
- * support is completely disabled. Decoding functions return
- * @ref QCBOR_ERR_ALL_FLOAT_DISABLED if a floating point value is
- * encountered during decoding. Functions that are encoding floating
- * point values are not available.
- *
- * ## Limitations
- *
- * Summary limitations:
- * - The entire encoded CBOR must fit into contiguous memory.
- * - Max size of encoded CBOR data is a few bytes less than
- *   @c UINT32_MAX (4GB).
- * - Max array / map nesting level when encoding or decoding is
- *   @ref QCBOR_MAX_ARRAY_NESTING (this is typically 15).
- * - Max items in an array or map when encoding or decoding is
- *   @ref QCBOR_MAX_ITEMS_IN_ARRAY (typically 65,536).
- * - Does not directly support labels in maps other than text strings & integers.
- * - Traversal, duplicate and sort order checking errors out for labels that are arrays or maps.
- * - Does not directly support integer labels beyond whats fits in @c int64_t
- *   or @c uint64_t.
- * - Epoch dates limited to @c INT64_MAX (+/- 292 billion years).
- * - Exponents for bigfloats and decimal integers are limited to whats fits in
- *   @c int64_t.
- * - Tags on labels are ignored during decoding.
- * - The maximum tag nesting is @c QCBOR_MAX_TAGS_PER_ITEM (typically 4).
- * - Works only on 32- and 64-bit CPUs.
- * - QCBORDecode_EnterBstrWrapped() doesn't work on indefinite-length strings.
- *
- * The public interface uses @c size_t for all lengths. Internally the
- * implementation uses 32-bit lengths by design to use less memory and
- * fit structures on the stack. This limits the encoded CBOR it can
- * work with to size @c UINT32_MAX (4GB).
- *
- * This implementation requires two's compliment integers. While
- * C doesn't require two's compliment,  <stdint.h> does. Other
- * parts of this implementation may also require two's compliment.
- */
-
-
-/**
- * The size of the buffer to be passed to QCBOREncode_EncodeHead(). It
- * is one byte larger than sizeof(uint64_t) + 1, the actual maximum
- * size of the head of a CBOR data item because
- * QCBOREncode_EncodeHead() needs one extra byte to work.
- */
-#define QCBOR_HEAD_BUFFER_SIZE  (sizeof(uint64_t) + 2)
-
-
-/**
- * Output the full CBOR tag. See @ref CBORTags, @ref Tag-Usage and
- * @ref Tags-Overview.
- */
-#define QCBOR_ENCODE_AS_TAG      0
-
-/**
- * Output only the 'borrowed' content format for the relevant tag.
- * See @ref CBORTags, @ref Tag-Usage and @ref Tags-Overview.
- */
-#define QCBOR_ENCODE_AS_BORROWED 1
-
-
-
-
-enum QCBOREncodeConfig {
-   /**
-    * This causes maps to be sorted per RFC 8949 section 4.2.1 .
-    * QCBOREncode_CloseMap() becomes equivalent to
-    * QCBOREncode_CloseAndSortMap(). This causes map closing to run
-    * much slower, but this is probably only of consequence in very
-    * constrained environments sorting large maps.
-    *
-    * Note that map sorting causese about 30% more code from the QCBOR
-    * library to be linked. Any call to QCBOREncode_Config(), even if
-    * sorting is not selected, will cause the sorting code to be
-    * linked.  See QCBOREncode_ConfigReduced() to avoid this.
-    */
-   QCBOR_ENCODE_CONFIG_SORT = 0x01,
-
-   /** By default QCBOR will error out when trying to encode a double
-    * or float NaN that has a payload because NaN payloads are not
-    * very interoperable. With this set, NaN payloads can be encoded.
-    *
-    */
-   QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD = 0x02,
-
-   /**
-    * This unifies the integer and floating-point number space such
-    * that there is only one way to encode any particular value. For
-    * example, 0 is always encoded as a type 0 positive integer, never
-    * as a 0.0 as a float or double. This unification never loses
-    * precision. For example, 1.000001 would not be reduced to the
-    * integer 1.
-    *
-    * This specification for this reduction comes from dCBOR. It is
-    * part of a deterministic encoding that that covers integer and
-    * float numbers.  This reduction doesn't cover other number
-    * representations like big numbers and big floats.
-    *
-    * See @ref QCBOR_ENCODE_CONFIG_DCBOR.
-    */
-   QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION = 0x04,
-
-   /** With this set, attempts to encode indefinite length text and
-    * byte strings, arrays and maps will error out. */
-   QCBOR_ENCODE_CONFIG_DISALLOW_INDEFINITE_LENGTHS = 0x08,
-
-   /** This disallows non-preferred floating number encoding,
-   QCBOREncode_AddFloatNoPreferred() and
-   QCBOREncode_AddDoubleNoPreferred().  It is not possible to disable
-   preferred serialization of type 0 and type 1 integers in QCBOR. */
-   QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS = 0x10,
-
-   /**
-    * This enforces a simple rule in dCBOR allows only the simple
-    * values true, false and null.  With this set, any other simple
-    * value will error out. See @ref QCBOR_ENCODE_CONFIG_DCBOR.
-    */
-   QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE = 0x20,
-
-   /** Preferred serialization requires number reduction of big
-    * numbers to type 0 and 1 integers. With this set an error will be
-    * set when trying to encode non-preferred big numbers with
-    * QCBOREncode_AddTBigNumberNoPreferred() or
-    * QCBOREncode_AddTBigNumberRaw(). */
-   QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS = 0x40, // TODO: test this one
-
-
-   /**
-    * Setting this mode will cause QCBOR to return an error if an
-    * attempt is made to use one of the methods that produce
-    * non-preferred serialization. It doesn't change anything else as
-    * QCBOR produces preferred serialization by default.
-    *
-    * The non-preferred methods are:
-    * QCBOREncode_AddFloatNoPreferred(),
-    * QCBOREncode_AddDoubleNoPreferred(),
-    * QCBOREncode_OpenArrayIndefiniteLength(),
-    * QCBOREncode_CloseArrayIndefiniteLength(),
-    * QCBOREncode_OpenMapIndefiniteLength(),
-    * QCBOREncode_CloseMapIndefiniteLength(), plus those derived from
-    * the above listed.
-    *
-    * This mode is just a user guard to prevent accidentally calling
-    * something that produces non-preferred serialization. It doesn't
-    * do anything but causes errors to occur on attempts to call the
-    * above listed functions. This does nothing if the library is
-    * compiled QCBOR_DISABLE_ENCODE_USAGE_GUARDS.
-    *
-    * See @ref Serialization. It is usually not necessary to set this
-    * mode, but there is usually no disadvantage to setting
-    * it. Preferred serialization is defined in RFC 8949, section 4.1.
-    */
-   QCBOR_ENCODE_CONFIG_PREFERRED =
-       QCBOR_ENCODE_CONFIG_DISALLOW_INDEFINITE_LENGTHS |
-       QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS |
-       QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS,
-
-   /**
-    * This causes QCBOR to produce CBOR Deterministic Encoding (CDE).
-    * With CDE, two distant unrelated CBOR encoders will produce
-    * exactly the same encoded CBOR for a given input.
-    *
-    * In addition to doing everything
-    * @ref QCBOR_ENCODE_CONFIG_PREFERRED does (including exclusion of
-    * indefinite lengths), this causes maps to be sorted. The map is
-    * sorted automatically when QCBOREncode_CloseMap() is called. See
-    * @ref QCBOR_ENCODE_CONFIG_SORT.
-    *
-    * See @ref Serialization. It is usually not necessary to set this
-    * mode as determinism is very rarely needed. However it will
-    * usually work with most protocols. CDE is defined in
-    * draft-ietf-cbor-cde and/or RFC 8949 section 4.2.
-    */
-   QCBOR_ENCODE_CONFIG_CDE = QCBOR_ENCODE_CONFIG_PREFERRED |
-                             QCBOR_ENCODE_CONFIG_SORT,
-
-   /**
-    * See draft-mcnally-deterministic-cbor.
-    *
-    * This is a superset of CDE. This function does everything
-    * QCBOREncode_SerializationCDE() does. Also it is a super set of
-    * preferred serialization and does everything
-    * QCBOREncode_SerializationPreferred() does.
-    *
-    * The main feature of dCBOR is that there is only one way to
-    * serialize a particular numeric value. This changes the behavior
-    * of functions that add floating-point numbers.  If the
-    * floating-point number is whole, it will be encoded as an
-    * integer, not a floating-point number.  0.000 will be encoded as
-    * 0x00. Precision is never lost in this conversion.
-    *
-    * dCBOR also disallows NaN payloads. QCBOR will allow NaN payloads
-    * if you pass a NaN to one of the floating-point encoding
-    * functions.  This mode forces all NaNs to the half-precision
-    * queit NaN.
-    *
-    * TODO: confirm and test NaN payload behavior dCBOR reduces all
-    * NaN payloads to half-precision quiet NaN
-    *
-    * dCBOR disallows use of any simple type other than true, false
-    * and NULL. In particular it disallows use of "undef" produced by
-    * QCBOREncode_AddUndef().
-    *
-    * See @ref Serialization. Set this mode only if the protocol you
-    * are implementing requires dCBOR. This mode is usually not
-    * compatible with protocols that don't use dCBOR. dCBOR is defined
-    * in draft-mcnally-deterministic-cbor.
-    */
-   QCBOR_ENCODE_CONFIG_DCBOR = QCBOR_ENCODE_CONFIG_CDE |
-                               QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION |
-                               QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE
-};
-
-
-
-
-/**
- * QCBOREncodeContext is the data type that holds context for all the
- * encoding functions. It is less than 200 bytes, so it can go on the
- * stack. The contents are opaque, and the caller should not access
- * internal members.  A context may be re used serially as long as it is
- * re initialized.
- */
-typedef struct _QCBOREncodeContext QCBOREncodeContext;
-
-
-/**
- * Initialize the encoder.
- *
- * @param[in,out]  pCtx     The encoder context to initialize.
- * @param[in]      Storage  The buffer into which the encoded result
- *                          will be written.
- *
- * Call this once at the start of an encoding of some CBOR. Then call
- * the many functions like QCBOREncode_AddInt64() and
- * QCBOREncode_AddText() to add the different data items. Finally,
- * call QCBOREncode_Finish() to get the pointer and length of the
- * encoded result.
- *
- * The primary purpose of this function is to give the pointer and
- * length of the output buffer into which the encoded CBOR will be
- * written. This is done with a @ref UsefulBuf structure, which is
- * just a pointer and length (it is equivalent to two parameters, one
- * a pointer and one a length, but a little prettier).
- *
- * The output buffer can be allocated any way (malloc, stack,
- * static). It is just some memory that QCBOR writes to. The length
- * must be the length of the allocated buffer. QCBOR will never write
- * past that length, but might write up to that length. If the buffer
- * is too small, encoding will go into an error state and not write
- * anything further.
- *
- * If allocating on the stack, the convenience macro
- * UsefulBuf_MAKE_STACK_UB() can be used, but its use is not required.
- *
- * Since there is no reallocation or such, the output buffer must be
- * correctly sized when passed in here. It is OK, but wasteful if it
- * is too large. One way to pick the size is to figure out the maximum
- * size that will ever be needed and hard code a buffer of that size.
- *
- * Another way to do it is to have QCBOR calculate it for you. To do
- * this, pass @ref SizeCalculateUsefulBuf for @c Storage.  Then call
- * all the functions to add the CBOR exactly as if encoding for
- * real. Finally, call QCBOREncode_FinishGetSize().  Once the length
- * is obtained, allocate a buffer of that size, call
- * QCBOREncode_Init() again with the real buffer. Call all the add
- * functions again and finally, QCBOREncode_Finish() to obtain the
- * final result. This uses twice the CPU time, but that is usually not
- * an issue.
- *
- * See QCBOREncode_Finish() for how the pointer and length for the
- * encoded CBOR is returned.
- *
- * For practical purposes QCBOR can't output encoded CBOR larger than
- * @c UINT32_MAX (4GB) even on 64-bit CPUs because the internal
- * offsets used to track the start of an array/map are 32 bits to
- * reduce the size of the encoding context.
- *
- * A @ref QCBOREncodeContext can be reused over and over as long as
- * QCBOREncode_Init() is called before each use.
- */
-void
-QCBOREncode_Init(QCBOREncodeContext *pCtx, UsefulBuf Storage);
-
-
-/**
- * @brief Configure the encoder.
- *
- * @param[in] pCtx   The encoding context for mode set.
- * @param[in] uConfig  See @ref QCBOREncodeConfig.
- *
- * QCBOR usually as needed without configuration.
- *
- * QCBOR encodes with preferred serialization by default
- * but provides some explicit functions that don't. This
- * can configure QCBOR to error if they are used. This can
- * also be used to encode dCBOR.
- *
- * See @ref QCBOR_ENCODE_CONFIG_PREFERRED, @ref
- * QCBOR_ENCODE_CONFIG_DCBOR, @ref QCBOR_ENCODE_CONFIG_SORT
- * and such.
- *
- * Also see QCBOREncode_ConfigReduced() if you are concerned
- * about the amount of linked.
- */
-static void
-QCBOREncode_Config(QCBOREncodeContext *pCtx, enum QCBOREncodeConfig uConfig);
-
-
-/**
- * @brief Configure the encoder, reduced object code.
- *
- * @param[in] pCtx   The encoding context for mode set.
- * @param[in] uConfig  Bit flags for configuration options.
- *
- * This is the same as QCBOREncode_Config() except it can't
- * configure anything to do with map sorting. That includes
- * both @ref CDE and @ref dCBOR.
- *
- *
- */
-static void
-QCBOREncode_ConfigReduced(QCBOREncodeContext *pCtx, enum QCBOREncodeConfig uConfig);
-
-
-
-
-
-/**
- * @brief  Add a signed 64-bit integer to the encoded output.
- *
- * @param[in] pCtx   The encoding context to add the integer to.
- * @param[in] nNum   The integer to add.
- *
- * The integer will be encoded and added to the CBOR output.
- *
- * This function figures out the size and the sign and encodes using
- * CBOR preferred serialization. Specifically, it will select CBOR major type
- * 0 or 1 based on sign and will encode to 1, 2, 4 or 8 bytes
- * depending on the value of the integer. Values less than 24
- * effectively encode to one byte because they are encoded in with the
- * CBOR major type. This is a neat and efficient characteristic of
- * CBOR that can be taken advantage of when designing CBOR-based
- * protocols. If integers can be kept between -23 and 23
- * they will be encoded in one byte including the major type.
- *
- * If you pass a smaller integer, like @c int16_t or a small value,
- * like 100, the encoding will still be CBOR's most compact that can
- * represent the value.  For example, CBOR always encodes the value 0
- * as one byte, 0x00. The representation as 0x00 includes
- * identification of the type as an integer too as the major type for
- * an integer is 0. See [RFC 8949 Appendix A]
- * (https://www.rfc-editor.org/rfc/rfc8949.html#section-appendix.a)
- * for more examples of CBOR encoding. This compact encoding is
- * preferred serialization CBOR as per [RFC 8949 section 4.1]
- * (https://www.rfc-editor.org/rfc/rfc8949.html#section-4.1)
- *
- * There are no functions to add @c int16_t or @c int32_t because they
- * are not necessary because this always encodes to the smallest
- * number of bytes based on the value.
- *
- * If the encoding context is in an error state, this will do
- * nothing. If an error occurs when adding this integer, the internal
- * error flag will be set, and the error will be returned when
- * QCBOREncode_Finish() is called.
- *
- * See also QCBOREncode_AddUInt64().
- */
-void
-QCBOREncode_AddInt64(QCBOREncodeContext *pCtx, int64_t nNum);
-
-static void
-QCBOREncode_AddInt64ToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nNum);
-
-static void
-QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t nNum);
-
-
-/**
- * @brief  Add an unsigned 64-bit integer to the encoded output.
- *
- * @param[in] pCtx  The encoding context to add the integer to.
- * @param[in] uNum  The integer to add.
- *
- * The integer is encoded and added to the CBOR output.
- *
- * The only reason so use this function is for integers larger than
- * @c INT64_MAX and smaller than @c UINT64_MAX. Otherwise
- * QCBOREncode_AddInt64() will work fine.
- *
- * Error handling is the same as for QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);
-
-static void
-QCBOREncode_AddUInt64ToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
-
-static void
-QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);
-
-
-/**
- * @brief Add a negative 64-bit integer to encoded output
- *
- * @param[in] pCtx  The encoding context to add the integer to.
- * @param[in] uNum  The integer to add.
- *
- * QCBOREncode_AddInt64() is much better to encode negative integers
- * than this.  What this can do is add integers with one more
- * significant bit than an int64_t (a "65-bit" integer if you count
- * the sign as a bit) which is possible because CBOR happens to
- * support such integers.
- *
- * The actual value encoded is -uNum - 1. That is, give 0 for uNum to
- * transmit -1, give 1 to transmit -2 and give UINT64_MAX to transmit
- * -UINT64_MAX-1 (18446744073709551616). The interface is odd like
- * this so all negative values CBOR can represent can be encoded by
- * QCBOR (making this a complete CBOR implementation).
- *
- * The most negative value QCBOREncode_AddInt64() can encode is
- * -9223372036854775808 which is -(2^63) or negative 0x800000000000.
- * This can encode from -9223372036854775809 to -18446744073709551616
- * or -(2^63 +1)  to -(2^64). Note that it is not possible to represent
- * positive or negative 18446744073709551616 in any standard C data
- * type.
- *
- * Negative integers are normally decoded in QCBOR with type
- * @ref QCBOR_TYPE_INT64.  Integers in the range of -9223372036854775809
- * to -18446744073709551616 are returned as @ref QCBOR_TYPE_65BIT_NEG_INT.
- *
- * WARNING: some CBOR decoders will be unable to decode -(2^63 + 1) to
- * -(2^64).  Also, most CPUs do not have registers that can represent
- * this range.  If you need 65-bit negative integers, you likely need
- * negative 66, 67 and 68-bit negative integers so it is likely better
- * to use CBOR big numbers where you can have any number of bits. See
- * QCBOREncode_AddTBigNumber() and @ref Serialization.
- */
-static void
-QCBOREncode_AddNegativeUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);
-
-static void
-QCBOREncode_AddNegativeUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
-
-static void
-QCBOREncode_AddNegativeUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);
-
-
-/**
- * @brief  Add a UTF-8 text string to the encoded output.
- *
- * @param[in] pCtx   The encoding context to add the text to.
- * @param[in] Text   Pointer and length of text to add.
- *
- * The text passed in must be unencoded UTF-8 according to
- * [RFC 3629] (https://www.rfc-editor.org/rfc/rfc3629.html). There is
- * no NULL termination. The text is added as CBOR major type 3.
- *
- * If called with @c nBytesLen equal to 0, an empty string will be
- * added. When @c nBytesLen is 0, @c pBytes may be @c NULL.
- *
- * Note that the restriction of the buffer length to a @c uint32_t is
- * entirely intentional as this encoder is not capable of encoding
- * lengths greater. This limit to 4GB for a text string should not be
- * a problem.
- *
- * Text lines in Internet protocols (on the wire) are delimited by
- * either a CRLF or just an LF. Officially many protocols specify
- * CRLF, but implementations often work with either. CBOR type 3 text
- * can be either line ending, even a mixture of both.
- *
- * Operating systems usually have a line end convention. Windows uses
- * CRLF. Linux and MacOS use LF. Some applications on a given OS may
- * work with either and some may not.
- *
- * The majority of use cases and CBOR protocols using type 3 text will
- * work with either line ending. However, some use cases or protocols
- * may not work with either in which case translation to and/or from
- * the local line end convention, typically that of the OS, is
- * necessary.
- *
- * QCBOR does no line ending translation for type 3 text when encoding
- * and decoding.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddText(QCBOREncodeContext *pCtx, UsefulBufC Text);
-
-static void
-QCBOREncode_AddTextToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text);
-
-static void
-QCBOREncode_AddTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Text);
-
-
-/**
- * @brief  Add a UTF-8 text string to the encoded output.
- *
- * @param[in] pCtx      The encoding context to add the text to.
- * @param[in] szString  Null-terminated text to add.
- *
- * This works the same as QCBOREncode_AddText().
- */
-static void
-QCBOREncode_AddSZString(QCBOREncodeContext *pCtx, const char *szString);
-
-static void
-QCBOREncode_AddSZStringToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);
-
-static void
-QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szString);
-
-
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
-/**
- * @brief Add a double-precision floating-point number to the encoded output.
- *
- * @param[in] pCtx  The encoding context to add the double to.
- * @param[in] dNum  The double-precision number to add.
- *
- * This encodes using preferred serialization, selectively encoding
- * the input floating-point number as either double-precision,
- * single-precision or half-precision. Infinity, NaN and 0 are always
- * encoded as half-precision. The reduction to single-precision or
- * half-precision is only performed if there is no loss or precision.
- *
- * Half-precision floating-point numbers take up 2 bytes, half that of
- * single-precision, one quarter of double-precision. This can reduce
- * the size of encoded output a lot, especially if the values 0,
- * infinity and NaN occur frequently.
- *
- * QCBOR decoding returns double-precision reversing this reduction.
- *
- * Normally this outputs only CBOR major type 7.  If
- * QCBOREncode_SerializationdCBOR() is called to enter dCBOR mode,
- * floating-point inputs that are whole integers are further reduced
- * to CBOR type 0 and 1. This is a unification of the floating-point
- * and integer number spaces such that there is only one encoding of
- * any numeric value. Note that this will result in the whole integers
- * from -(2^63+1) to -(2^64) being encode as CBOR major type 1 which
- * can't be directly decoded into an int64_t or uint64_t. See
- * QCBORDecode_GetNumberConvertPrecisely(), a good method to use to
- * decode dCBOR.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * It is possible that preferred serialization is disabled when the
- * QCBOR library was built. In that case, this functions the same as
- * QCBOREncode_AddDoubleNoPreferred().
- *
- * See also QCBOREncode_AddDoubleNoPreferred(), QCBOREncode_AddFloat()
- * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
- *
- * By default, this will error out on an attempt to encode a NaN with
- * a payload. See QCBOREncode_Allow() and @ref
- * QCBOR_ENCODE_ALLOW_NAN_PAYLOAD.
- * If preferred serialization is disabled at compliation, this check for
- * for NaN payloads is disabled.
- */
-static void
-QCBOREncode_AddDouble(QCBOREncodeContext *pCtx, double dNum);
-
-static void
-QCBOREncode_AddDoubleToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
-
-static void
-QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
-
-
-/**
- * @brief Add a single-precision floating-point number to the encoded output.
- *
- * @param[in] pCtx  The encoding context to add the single to.
- * @param[in] fNum  The single-precision number to add.
- *
- * This is identical to QCBOREncode_AddDouble() except the input is
- * single-precision. It also supports dCBOR.
- *
- * See also QCBOREncode_AddDouble(), QCBOREncode_AddDoubleNoPreferred(),
- * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
- */
-static void
-QCBOREncode_AddFloat(QCBOREncodeContext *pCtx, float fNum);
-
-static void
-QCBOREncode_AddFloatToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
-
-static void
-QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float dNum);
-
-
-/**
- * @brief Add a double-precision floating-point number without preferred encoding.
- *
- * @param[in] pCtx  The encoding context to add the double to.
- * @param[in] dNum  The double-precision number to add.
- *
- * Output a double-precision float straight-through with no checking or
- * processing for preferred serialization, dCBOR or other.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
- * QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
- */
-static void
-QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pCtx, double dNum);
-
-static void
-QCBOREncode_AddDoubleNoPreferredToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
-
-static void
-QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
-
-
-/**
- * @brief Add a single-precision floating-point number without preferred encoding.
- *
- * @param[in] pCtx  The encoding context to add the double to.
- * @param[in] fNum  The single-precision number to add.
- *
- * Output a single-precision float straight-through with no checking or
- * processing for preferred serializtion, dCBOR or other.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
- * QCBOREncode_AddDoubleNoPreferred() and @ref Floating-Point.
- */
-static void
-QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pCtx, float fNum);
-
-static void
-QCBOREncode_AddFloatNoPreferredToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
-
-static void
-QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float fNum);
-#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
-
-
-/**
- * @brief Add a tag number.
- *
- * @param[in] pCtx  The encoding context to add the tag to.
- * @param[in] uTag  The tag to add
- *
- * This outputs a CBOR major type 6 item that tags the next data item
- * that is output usually to indicate it is some new data type.
- *
- * For many of the common standard tags, a function to encode data
- * using it is provided and this is not needed. For example,
- * QCBOREncode_AddTDateEpoch() already exists to output integers
- * representing dates with the right tag.
- *
- * The tag is applied to the next data item added to the encoded
- * output. That data item that is to be tagged can be of any major
- * CBOR type. Any number of tags can be added to a data item by
- * calling this multiple times before the data item is added.
- *
- * See @ref Tags-Overview for discussion of creating new non-standard
- * tags. See QCBORDecode_GetNext() for discussion of decoding custom
- * tags.
- */
-static void
-QCBOREncode_AddTagNumber(QCBOREncodeContext *pCtx, uint64_t uTag);
-
-
-/**
- * @brief  Add an epoch-based date.
- *
- * @param[in] pCtx             The encoding context to add the date to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] nDate            Number of seconds since 1970-01-01T00:00Z
- *                             in UTC time.
- *
- * As per RFC 8949 this is similar to UNIX/Linux/POSIX dates. This is
- * the most compact way to specify a date and time in CBOR. Note that
- * this is always UTC and does not include the time zone.  Use
- * QCBOREncode_AddDateString() if you want to include the time zone.
- *
- * The preferred integer serialization rules apply here so the date will be
- * encoded in a minimal number of bytes. Until about the year 2106
- * these dates will encode in 6 bytes -- one byte for the tag, one
- * byte for the type and 4 bytes for the integer. After that it will
- * encode to 10 bytes.
- *
- * Negative values are supported for dates before 1970.
- *
- * If you care about leap-seconds and that level of accuracy, make sure
- * the system you are running this code on does it correctly. This code
- * just takes the value passed in.
- *
- * This implementation cannot encode fractional seconds using float or
- * double even though that is allowed by CBOR, but you can encode them
- * if you want to by calling QCBOREncode_AddTagNumber() and QCBOREncode_AddDouble().
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * See also QCBOREncode_AddTDaysEpoch().
- */
-static void
-QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pCtx,
-                          uint8_t             uTagRequirement,
-                          int64_t             nDate);
-
-static void
-QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pCtx,
-                                 const char         *szLabel,
-                                 uint8_t             uTagRequirement,
-                                 int64_t             nDate);
-
-static void
-QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pCtx,
-                                int64_t             nLabel,
-                                uint8_t             uTagRequirement,
-                                int64_t             nDate);
-
-
-
-
-
-/**
- *  @brief  Add an epoch-based day-count date.
- *
- *  @param[in] pCtx             The encoding context to add the date to.
- *  @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                              @ref QCBOR_ENCODE_AS_BORROWED.
- *  @param[in] nDays            Number of days before or after 1970-01-0.
- *
- * This date format is described in
- * [RFC 8943] (https://www.rfc-editor.org/rfc/rfc8943.html).
- *
- * The preferred integer serialization rules apply here so the date
- * will be encoded in a minimal number of bytes. Until about the year
- * 2149 these dates will encode in 4 bytes -- one byte for the tag,
- * one byte for the type and 2 bytes for the integer.
- *
- * See also QCBOREncode_AddTDateEpoch().
- */
-static void
-QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pCtx,
-                          uint8_t             uTagRequirement,
-                          int64_t             nDays);
-
-static void
-QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pCtx,
-                                 const char         *szLabel,
-                                 uint8_t             uTagRequirement,
-                                 int64_t             nDays);
-
-static void
-QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pCtx,
-                                int64_t             nLabel,
-                                uint8_t             uTagRequirement,
-                                int64_t             nDays);
-
-
-
-
-/**
- * @brief Add a byte string to the encoded output.
- *
- * @param[in] pCtx   The encoding context to add the bytes to.
- * @param[in] Bytes  Pointer and length of the input data.
- *
- * Simply adds the bytes to the encoded output as CBOR major type 2.
- *
- * If called with @c Bytes.len equal to 0, an empty string will be
- * added. When @c Bytes.len is 0, @c Bytes.ptr may be @c NULL.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
-
-static void
-QCBOREncode_AddBytesToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
-
-static void
-QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
-
-
-/**
- * @brief Set up to write a byte string value directly to encoded output.
- *
- * @param[in] pCtx     The encoding context to add the bytes to.
- * @param[out] pPlace  Pointer and length of place to write byte string value.
- *
- * QCBOREncode_AddBytes() is the normal way to encode a byte string.
- * This is for special cases and by passes some of the pointer safety.
- *
- * The purpose of this is to output the bytes that make up a byte
- * string value directly to the QCBOR output buffer so you don't need
- * to have a copy of it in memory. This is particularly useful if the
- * byte string is large, for example, the encrypted payload of a
- * COSE_Encrypt message. The payload encryption algorithm can output
- * directly to the encoded CBOR buffer, perhaps by making it the
- * output buffer for some function (e.g. symmetric encryption) or by
- * multiple writes.
- *
- * The pointer in @c pPlace is where to start writing. Writing is just
- * copying bytes to the location by the pointer in @c pPlace.  Writing
- * past the length in @c pPlace will be writing off the end of the
- * output buffer.
- *
- * If there is no room in the output buffer @ref NULLUsefulBuf will be
- * returned and there is no need to call QCBOREncode_CloseBytes().
- *
- * The byte string must be closed by calling QCBOREncode_CloseBytes().
- *
- * Warning: this bypasses some of the usual checks provided by QCBOR
- * against writing off the end of the encoded output buffer.
- */
-void
-QCBOREncode_OpenBytes(QCBOREncodeContext *pCtx, UsefulBuf *pPlace);
-
-static void
-QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             UsefulBuf          *pPlace);
-
-static void
-QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pCtx,
-                            int64_t             nLabel,
-                            UsefulBuf          *pPlace);
-
-
-/**
- *  @brief Close out a byte string written directly to encoded output.
- *
- *  @param[in] pCtx      The encoding context to add the bytes to.
- *  @param[out] uAmount  The number of bytes written, the length of the
- *                       byte string.
- *
- * This closes out a call to QCBOREncode_OpenBytes().  This inserts a
- * CBOR header at the front of the byte string value to make it a
- * well-formed byte string.
- *
- * If there was no call to QCBOREncode_OpenBytes() then @ref
- * QCBOR_ERR_TOO_MANY_CLOSES is set.
- */
-void
-QCBOREncode_CloseBytes(QCBOREncodeContext *pCtx, size_t uAmount);
-
-
-/**
- * @brief Add a binary UUID to the encoded output.
- *
- * @param[in] pCtx             The encoding context to add the UUID to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Bytes            Pointer and length of the binary UUID.
- *
- * A binary UUID as defined in [RFC 4122]
- * (https://www.rfc-editor.org/rfc/rfc4122.html) is added to the
- * output.
- *
- * It is output as CBOR major type 2, a binary string, with tag @ref
- * CBOR_TAG_BIN_UUID indicating the binary string is a UUID.
- */
-static void
-QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pCtx,
-                           uint8_t             uTagRequirement,
-                           UsefulBufC          Bytes);
-
-static void
-QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pCtx,
-                                  const char         *szLabel,
-                                  uint8_t             uTagRequirement,
-                                  UsefulBufC          Bytes);
-
-static void
-QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pCtx,
-                                 int64_t             nLabel,
-                                 uint8_t             uTagRequirement,
-                                 UsefulBufC          Bytes);
-
-
-/**
- * @brief Add a big number to encoded output using preferred serialization.
- *
- * @param[in] pCtx             The encoding context to add to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] bNegative        If true, @c BigNumber is negative.
- * @param[in] BigNumber        Pointer and length of the big number,
- *                             most significant byte first (network
- *                             byte order).
- *
- * This encodes CBOR tag numbers 2 and 3, positive and negative big
- * numbers, as defined in [RFC 8949 section 3.4.3]
- * (https://www.rfc-editor.org/rfc/rfc8949.html#section-3.4.3).
- *
- * This performs the offset of one required when encoding negative
- * numbers.
- *
- * Leading zeros are not encoded.
- *
- * This uses preferred serialization described specifically for big
- * numbers. Positive values between 0 and (2^64)-1 are encoded as
- * common type 0 integers. Negative values between -(2^64) and -1 are
- * encoded as common type 1 integers.
- *
- * See @ref BigNumbers for a useful overview of CBOR big numbers and
- * QCBOR's support for them. See
- * QCBOREncode_AddTBigNumberNoPreferred() to encode without conversion
- * to common integer types 0 and 1. See QCBOREncode_AddTBigNumberRaw()
- * for encoding that is simple pass through as a byte string that
- * links in much less object code. See QCBORDecode_GetTBigNumber() for
- * the decoder counter part.
- */
-static void
-QCBOREncode_AddTBigNumber(QCBOREncodeContext *pCtx,
-                          uint8_t             uTagRequirement,
-                          bool                bNegative,
-                          UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberToMapSZ(QCBOREncodeContext *pCtx,
-                                 const char         *szLabel,
-                                 uint8_t             uTagRequirement,
-                                 bool                bNegative,
-                                 UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberToMapN(QCBOREncodeContext *pCtx,
-                                int64_t             nLabel,
-                                uint8_t             uTagRequirement,
-                                bool                bNegative,
-                                UsefulBufC          BigNumber);
-
-
-/**
- * @brief Add a big number to encoded output without preferred serialization.
- *
- * @param[in] pCtx             The encoding context to add to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] bNegative        If true, @c BigNumber is negative.
- * @param[in] BigNumber        Pointer and length of the big number,
- *                             most significant byte first (network
- *                             byte order).
- *
- * This is the same as QCBOREncode_AddTBigNumber(), without preferred
- * serialization. This always outputs tag 2 or 3, never type 0 or 1
- * integers.
- *
- * Leading zeros are removed before encoding.
- *
- * See @ref BigNumbers for a useful overview of CBOR big numbers and
- * QCBOR's support for them. See also QCBOREncode_AddTBigNumber().
- * See QCBORDecode_GetTBigNumberNoPreferred(), the decode counter part
- * for this.
- */
-static void
-QCBOREncode_AddTBigNumberNoPreferred(QCBOREncodeContext *pCtx,
-                                     uint8_t             uTagRequirement,
-                                     bool                bNegative,
-                                     UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberNoPreferredToMapSZ(QCBOREncodeContext *pCtx,
-                                            const char         *szLabel,
-                                            uint8_t             uTagRequirement,
-                                            bool                bNegative,
-                                            UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberNoPreferredToMapN(QCBOREncodeContext *pCtx,
-                                           int64_t             nLabel,
-                                           uint8_t             uTagRequirement,
-                                           bool                bNegative,
-                                           UsefulBufC          BigNumber);
-
-
-/**
- * @brief Add a big number to encoded output with no processing.
- *
- * @param[in] pCtx             The encoding context to add to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] bNegative        If true @c BigNumber is negative.
- * @param[in] BigNumber        Pointer and length of the big number,
- *                             most significant byte first (network
- *                             byte order).
- *
- * All this does is output tag number 2 or 3 depending on @c bNegative
- * and then output @c BigNumber as a byte string. If @c
- * uTagRequirement is @ref QCBOR_ENCODE_AS_BORROWED, the tag number is
- * not even output and this equivalent to QCBOREncode_AddBytes().
- *
- * No leading zeros are removed. No offset of one is performed for
- * negative numbers. There is no conversion to type 0 and type 1
- * integers.
- *
- * This is mostly an inline implementation that links in no additional
- * object from the QCBOR library.
- *
- * This is most useful when a big number library has been linked, and
- * it can be (trivially) used to perform the offset of one for
- * negative numbers.
- *
- * See @ref BigNumbers for a useful overview of CBOR big numbers and
- * QCBOR's support for them. See QCBORDecode_GetTBigNumberRaw(), the
- * decode counter part for this. See also QCBOREncode_AddTBigNumber().
- */
-static void
-QCBOREncode_AddTBigNumberRaw(QCBOREncodeContext *pCtx,
-                             uint8_t             uTagRequirement,
-                             bool                bNegative,
-                             UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberRawToMapSZ(QCBOREncodeContext *pCtx,
-                                    const char         *szLabel,
-                                    uint8_t             uTagRequirement,
-                                    bool                bNegative,
-                                    UsefulBufC          BigNumber);
-
-static void
-QCBOREncode_AddTBigNumberRawToMapN(QCBOREncodeContext *pCtx,
-                                   int64_t             nLabel,
-                                   uint8_t             uTagRequirement,
-                                   bool                bNegative,
-                                   UsefulBufC          BigNumber);
-
-
-
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
-/**
- * @brief Add a decimal fraction.
- *
- * @param[in] pCtx             Encoding context to add the decimal fraction to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] nMantissa        The mantissa.
- * @param[in] nBase10Exponent  The exponent.
- *
- * The value is nMantissa * 10 ^ nBase10Exponent.
- *
- * A decimal fraction is good for exact representation of some values
- * that can't be represented exactly with standard C (IEEE 754)
- * floating-point numbers.  Much larger and much smaller numbers can
- * also be represented than floating-point because of the larger
- * number of bits in the exponent.
- *
- * The decimal fraction is conveyed as two integers, a mantissa and a
- * base-10 scaling factor.
- *
- * For example, 273.15 is represented by the two integers 27315 and -2.
- *
- * The exponent and mantissa have the range from @c INT64_MIN to
- * @c INT64_MAX for both encoding and decoding (CBOR allows
- * @c -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
- * support this range to reduce code size and interface complexity a
- * little).
- *
- * CBOR Preferred serialization of the integers is used, thus they
- * will be encoded in the smallest number of bytes possible.
- *
- * See also QCBOREncode_AddTDecimalFractionBigNumber() for a decimal
- * fraction with arbitrarily large precision and
- * QCBOREncode_AddTBigFloat().
- *
- * There is no representation of positive or negative infinity or NaN
- * (Not a Number). Use QCBOREncode_AddDouble() to encode them.
- *
- * See @ref expAndMantissa for decoded representation.
- */
-static void
-QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pCtx,
-                                uint8_t             uTagRequirement,
-                                int64_t             nMantissa,
-                                int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pCtx,
-                                       const char         *szLabel,
-                                       uint8_t             uTagRequirement,
-                                       int64_t             nMantissa,
-                                       int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pCtx,
-                                      int64_t             nLabel,
-                                      uint8_t             uTagRequirement,
-                                      int64_t             nMantissa,
-                                      int64_t             nBase10Exponent);
-
-
-
-/**
- * @brief Add a decimal fraction with a big number mantissa..
- *
- * @param[in] pCtx             Encoding context to add the decimal fraction to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Mantissa         The big number mantissa.
- * @param[in] bIsNegative      false if mantissa is positive, true if negative.
- * @param[in] nBase10Exponent  The exponent.
- *
- * This is the same as QCBOREncode_AddTDecimalFraction() except the
- * mantissa is a big number (See QCBOREncode_AddTBignumber())
- * allowing for arbitrarily large precision.
- *
- * Preferred serialization of the big number is used. This means it may be converted to
- * a type 0 or type 1 integers making the result the same as QCBOREncode_AddTDecimalFraction().
- * This also offsets negative big numbers by one.
- *
- * If you want the big number to be copied straight through without the conversion to type 0
- * and 1 integers and without the offset of 1 (and much smaller objet code) use QCBOREncode_AddTBigFloatBigMantissaRaw().
- *
- * See @ref expAndMantissa for decoded representation.
- */
-static void
-QCBOREncode_AddTDecimalFractionBigMantissa(QCBOREncodeContext *pCtx,
-                                           uint8_t             uTagRequirement,
-                                           UsefulBufC          Mantissa,
-                                           bool                bIsNegative,
-                                           int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionBigMantissaToMapSZ(QCBOREncodeContext *pCtx,
-                                                  const char         *szLabel,
-                                                  uint8_t             uTagRequirement,
-                                                  UsefulBufC          Mantissa,
-                                                  bool                bIsNegative,
-                                                  int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionBigMantissaToMapN(QCBOREncodeContext *pCtx,
-                                                 int64_t             nLabel,
-                                                 uint8_t             uTagRequirement,
-                                                 UsefulBufC          Mantissa,
-                                                 bool                bIsNegative,
-                                                 int64_t             nBase10Exponent);
-/**
- * @brief Add a decimal fraction with a raw big number mantissa.
- *
- * @param[in] pCtx             The encoding context to add the bigfloat to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Mantissa         The mantissa.
- * @param[in] bIsNegative      false if mantissa is positive, true if negative.
- * @param[in] nBase10Exponent   The exponent.
- *
- * This is the same as QCBOREncode_AddTDecimalFractionBigMantissa() except the mantissa
- * is not corrected by one and links in much less object code.
- */static void
-QCBOREncode_AddTDecimalFractionBigMantissaRaw(QCBOREncodeContext *pCtx,
-                                              uint8_t             uTagRequirement,
-                                              UsefulBufC          Mantissa,
-                                              bool                bIsNegative,
-                                              int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(QCBOREncodeContext *pCtx,
-                                                     const char         *szLabel,
-                                                     uint8_t             uTagRequirement,
-                                                     UsefulBufC          Mantissa,
-                                                     bool                bIsNegative,
-                                                     int64_t             nBase10Exponent);
-
-static void
-QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(QCBOREncodeContext *pCtx,
-                                                    int64_t             nLabel,
-                                                    uint8_t             uTagRequirement,
-                                                    UsefulBufC          Mantissa,
-                                                    bool                bIsNegative,
-                                                    int64_t             nBase10Exponent);
-
-
-
-/**
- * @brief Add a big floating-point number to the encoded output.
- *
- * @param[in] pCtx             The encoding context to add the bigfloat to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] nMantissa        The mantissa.
- * @param[in] nBase2Exponent   The exponent.
- *
- * The value is nMantissa * 2 ^ nBase2Exponent.
- *
- * "Bigfloats", as CBOR terms them, are similar to IEEE floating-point
- * numbers in having a mantissa and base-2 exponent, but they are not
- * supported by hardware or encoded the same. They explicitly use two
- * CBOR-encoded integers to convey the mantissa and exponent, each of
- * which can be 8, 16, 32 or 64 bits. With both the mantissa and
- * exponent 64 bits they can express more precision and a larger range
- * than an IEEE double floating-point number. See
- * QCBOREncode_AddTBigFloatBigMantissa() for even more precision.
- *
- * For example, 1.5 would be represented by a mantissa of 3 and an
- * exponent of -1.
- *
- * The exponent has a range from @c INT64_MIN to
- * @c INT64_MAX for both encoding and decoding (CBOR allows @c
- * -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
- * support this range to reduce code size and interface complexity a
- * little).
- *
- * CBOR preferred serialization of the integers is used, thus they will
- * be encoded in the smallest number of bytes possible.
- *
- * This can also be used to represent floating-point numbers in
- * environments that don't support IEEE 754.
- *
- * See @ref expAndMantissa for decoded representation.
- */
-static void
-QCBOREncode_AddTBigFloat(QCBOREncodeContext *pCtx,
-                         uint8_t             uTagRequirement,
-                         int64_t             nMantissa,
-                         int64_t             nBase2Exponent);
-
-static void
-QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pCtx,
-                                const char         *szLabel,
-                                uint8_t             uTagRequirement,
-                                int64_t             nMantissa,
-                                int64_t             nBase2Exponent);
-
-static void
-QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pCtx,
-                               int64_t             nLabel,
-                               uint8_t             uTagRequirement,
-                               int64_t             nMantissa,
-                               int64_t             nBase2Exponent);
-
-
-/**
- * @brief Add a big floating-point number with a big number mantissa.
- *
- * @param[in] pCtx             The encoding context to add the bigfloat to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Mantissa         The mantissa.
- * @param[in] bIsNegative      false if mantissa is positive, true if negative.
- * @param[in] nBase2Exponent   The exponent.
- *
- * This is the same as QCBOREncode_AddTBigFloat() except the mantissa
- * is a big number (See QCBOREncode_AddTBigMantissa()) allowing for
- * arbitrary precision.
- *
- *The big number will be offset by 1 if negative and preferred serialization will be used (tag 0 and 1).
- *
- * If you want the big number to be copied straight through without the conversion to type 0
- * and 1 integers and without the offset of 1 (and much smaller objet code) use QCBOREncode_AddTBigFloatBigMantissa().
- *
- * See @ref expAndMantissa for decoded representation.
- */
-static void
-QCBOREncode_AddTBigFloatBigMantissa(QCBOREncodeContext *pCtx,
-                                    uint8_t             uTagRequirement,
-                                    UsefulBufC          Mantissa,
-                                    bool                bIsNegative,
-                                    int64_t             nBase2Exponent);
-
-static void
-QCBOREncode_AddTBigFloatBigMantissaToMapSZ(QCBOREncodeContext *pCtx,
-                                           const char         *szLabel,
-                                           uint8_t             uTagRequirement,
-                                           UsefulBufC          Mantissa,
-                                           bool                bIsNegative,
-                                           int64_t             nBase2Exponent);
-
-static void
-QCBOREncode_AddTBigFloatBigMantissaToMapN(QCBOREncodeContext *pCtx,
-                                          int64_t             nLabel,
-                                          uint8_t             uTagRequirement,
-                                          UsefulBufC          Mantissa,
-                                          bool                bIsNegative,
-                                          int64_t             nBase2Exponent);
-
-
-/**
- * @brief Add a big floating-point number with a big number mantissa.
- *
- * @param[in] pCtx             The encoding context to add the bigfloat to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Mantissa         The mantissa.
- * @param[in] bIsNegative      false if mantissa is positive, true if negative.
- * @param[in] nBase2Exponent   The exponent.
- *
- * This is the same as QCBOREncode_AddTBigFloatBigMantissa() except the mantissa
- * is not corrected by one and links in much less object code.
- */
-static void
-QCBOREncode_AddTBigFloatBigMantissaRaw(QCBOREncodeContext *pCtx,
-                                       uint8_t             uTagRequirement,
-                                       UsefulBufC          Mantissa,
-                                       bool                bIsNegative,
-                                       int64_t             nBase2Exponent);
-
-
-static void
-QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(QCBOREncodeContext *pCtx,
-                                              const char         *szLabel,
-                                              uint8_t             uTagRequirement,
-                                              UsefulBufC          Mantissa,
-                                              bool                bIsNegative,
-                                              int64_t             nBase2Exponent);
-
-static void
-QCBOREncode_AddTBigFloatBigMantissaRawToMapN(QCBOREncodeContext *pCtx,
-                                             int64_t             nLabel,
-                                             uint8_t             uTagRequirement,
-                                             UsefulBufC          Mantissa,
-                                             bool                bIsNegative,
-                                             int64_t             nBase2Exponent);
-
-
-#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
-
-
-/**
- * @brief Add a text URI to the encoded output.
- *
- * @param[in] pCtx             The encoding context to add the URI to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] URI              Pointer and length of the URI.
- *
- * The format of URI must be per [RFC 3986]
- * (https://www.rfc-editor.org/rfc/rfc3986.html).
- *
- * It is output as CBOR major type 3, a text string, with tag @ref
- * CBOR_TAG_URI indicating the text string is a URI.
- *
- * A URI in a NULL-terminated string, @c szURI, can be easily added with
- * this code:
- *
- *      QCBOREncode_AddTURI(pCtx, QCBOR_ENCODE_AS_TAG, UsefulBuf_FromSZ(szURI));
- */
-static void
-QCBOREncode_AddTURI(QCBOREncodeContext *pCtx,
-                    uint8_t             uTagRequirement,
-                    UsefulBufC          URI);
-
-static void
-QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pCtx,
-                           const char         *szLabel,
-                           uint8_t             uTagRequirement,
-                           UsefulBufC          URI);
-
-static void
-QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pCtx,
-                          int64_t             nLabel,
-                          uint8_t             uTagRequirement,
-                          UsefulBufC          URI);
-
-
-/**
- * @brief Add Base64-encoded text to encoded output.
- *
- * @param[in] pCtx             The encoding context to add the base-64 text to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] B64Text          Pointer and length of the base-64 encoded text.
- *
- * The text content is Base64 encoded data per [RFC 4648]
- * (https://www.rfc-editor.org/rfc/rfc4648.html).
- *
- * It is output as CBOR major type 3, a text string, with tag @ref
- * CBOR_TAG_B64 indicating the text string is Base64 encoded.
- */
-static void
-QCBOREncode_AddTB64Text(QCBOREncodeContext *pCtx,
-                        uint8_t             uTagRequirement,
-                        UsefulBufC          B64Text);
-
-static void
-QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pCtx,
-                               const char         *szLabel,
-                               uint8_t             uTagRequirement,
-                               UsefulBufC          B64Text);
-
-static void
-QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pCtx,
-                              int64_t nLabel,
-                              uint8_t uTagRequirement,
-                              UsefulBufC B64Text);
-
-
-/**
- * @brief Add base64url encoded data to encoded output.
- *
- * @param[in] pCtx             The encoding context to add the base64url to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] B64Text          Pointer and length of the base64url encoded text.
- *
- * The text content is base64URL encoded text as per
- * [RFC 4648] (https://www.rfc-editor.org/rfc/rfc4648.html).
- *
- * It is output as CBOR major type 3, a text string, with tag
- * @ref CBOR_TAG_B64URL indicating the text string is a Base64url
- * encoded.
- */
-static void
-QCBOREncode_AddTB64URLText(QCBOREncodeContext *pCtx,
-                           uint8_t             uTagRequirement,
-                           UsefulBufC          B64Text);
-
-static void
-QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pCtx,
-                                  const char         *szLabel,
-                                  uint8_t             uTagRequirement,
-                                  UsefulBufC          B64Text);
-
-static void
-QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pCtx,
-                                 int64_t             nLabel,
-                                 uint8_t             uTagRequirement,
-                                 UsefulBufC          B64Text);
-
-
-/**
- * @brief Add Perl Compatible Regular Expression.
- *
- * @param[in] pCtx             Encoding context to add the regular expression to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] Regex            Pointer and length of the regular expression.
- *
- * The text content is Perl Compatible Regular
- * Expressions (PCRE) / JavaScript syntax [ECMA262].
- *
- * It is output as CBOR major type 3, a text string, with tag @ref
- * CBOR_TAG_REGEX indicating the text string is a regular expression.
- */
-static void
-QCBOREncode_AddTRegex(QCBOREncodeContext *pCtx,
-                      uint8_t            uTagRequirement,
-                      UsefulBufC         Regex);
-
-static void
-QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             uint8_t             uTagRequirement,
-                             UsefulBufC          Regex);
-
-static void
-QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pCtx,
-                            int64_t             nLabel,
-                            uint8_t             uTagRequirement,
-                            UsefulBufC          Regex);
-
-
-/**
- * @brief MIME encoded data to the encoded output.
- *
- * @param[in] pCtx             The encoding context to add the MIME data to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] MIMEData         Pointer and length of the MIME data.
- *
- * The text content is in MIME format per [RFC 2045]
- * (https://www.rfc-editor.org/rfc/rfc2045.html) including the headers.
- *
- * It is output as CBOR major type 2, a binary string, with tag
- * @ref CBOR_TAG_BINARY_MIME indicating the string is MIME data.  This
- * outputs tag 257, not tag 36, as it can carry any type of MIME
- * binary, 7-bit, 8-bit, quoted-printable and base64 where tag 36
- * cannot.
- *
- * Previous versions of QCBOR, those before spiffy decode, output tag
- * 36. Decoding supports both tag 36 and 257.  (if the old behavior
- * with tag 36 is needed, copy the inline functions below and change
- * the tag number).
- *
- * See also QCBORDecode_GetMIMEMessage() and
- * @ref QCBOR_TYPE_BINARY_MIME.
- *
- * This does no translation of line endings. See QCBOREncode_AddText()
- * for a discussion of line endings in CBOR.
- */
-static void
-QCBOREncode_AddTMIMEData(QCBOREncodeContext *pCtx,
-                         uint8_t             uTagRequirement,
-                         UsefulBufC          MIMEData);
-
-static void
-QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pCtx,
-                                const char         *szLabel,
-                                uint8_t             uTagRequirement,
-                                UsefulBufC          MIMEData);
-
-static void
-QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pCtx,
-                               int64_t             nLabel,
-                               uint8_t             uTagRequirement,
-                               UsefulBufC          MIMEData);
-
-
-/**
- * @brief  Add an RFC 3339 date string
- *
- * @param[in] pCtx             The encoding context to add the date to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] szDate           Null-terminated string with date to add.
- *
- * The string szDate should be in the form of
- * [RFC 3339] (https://www.rfc-editor.org/rfc/rfc3339.html) as defined
- * by section 3.3 in [RFC 4287] (https://www.rfc-editor.org/rfc/rfc4287.html).
- * This is as described in section 3.4.1 in [RFC 8949]
- * (https://www.rfc-editor.org/rfc/rfc8949.html#section3.1.4).
- *
- * Note that this function doesn't validate the format of the date
- * string at all. If you add an incorrect format date string, the
- * generated CBOR will be incorrect and the receiver may not be able
- * to handle it.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * See also QCBOREncode_AddTDayString().
- */
-static void
-QCBOREncode_AddTDateString(QCBOREncodeContext *pCtx,
-                           uint8_t             uTagRequirement,
-                           const char         *szDate);
-
-static void
-QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pCtx,
-                                  const char         *szLabel,
-                                  uint8_t             uTagRequirement,
-                                  const char         *szDate);
-
-static void
-QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pCtx,
-                                 int64_t             nLabel,
-                                 uint8_t             uTagRequirement,
-                                 const char         *szDate);
-
-
-/**
- * @brief  Add a date-only string.
- *
- * @param[in] pCtx             The encoding context to add the date to.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] szDate           Null-terminated string with date to add.
- *
- * This date format is described in
- * [RFC 8943] (https://www.rfc-editor.org/rfc/rfc8943.html), but that mainly
- * references RFC 3339.  The string szDate must be in the forrm
- * specified the ABNF for a full-date in
- * [RFC 3339] (https://www.rfc-editor.org/rfc/rfc3339.html). Examples of this
- * are "1985-04-12" and "1937-01-01".  The time and the time zone are
- * never included.
- *
- * Note that this function doesn't validate the format of the date
- * string at all. If you add an incorrect format date string, the
- * generated CBOR will be incorrect and the receiver may not be able
- * to handle it.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- *
- * See also QCBOREncode_AddTDateString().
- */
-static void
-QCBOREncode_AddTDaysString(QCBOREncodeContext *pCtx,
-                           uint8_t             uTagRequirement,
-                           const char         *szDate);
-
-static void
-QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pCtx,
-                                  const char         *szLabel,
-                                  uint8_t             uTagRequirement,
-                                  const char         *szDate);
-
-static void
-QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pCtx,
-                                 int64_t             nLabel,
-                                 uint8_t             uTagRequirement,
-                                 const char         *szDate);
-
-
-/**
- * @brief  Add a standard Boolean.
- *
- * @param[in] pCtx  The encoding context to add the Boolean to.
- * @param[in] b     true or false from @c <stdbool.h>.
- *
- * Adds a Boolean value as CBOR major type 7.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddBool(QCBOREncodeContext *pCtx, bool b);
-
-static void
-QCBOREncode_AddBoolToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, bool b);
-
-static void
-QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, bool b);
-
-
-/**
- * @brief  Add a NULL to the encoded output.
- *
- * @param[in] pCtx  The encoding context to add the NULL to.
- *
- * Adds the NULL value as CBOR major type 7.
- *
- * This NULL doesn't have any special meaning in CBOR such as a
- * terminating value for a string or an empty value.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddNULL(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_AddNULLToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
-
-static void
-QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
-
-
-/**
- * @brief  Add an "undef" to the encoded output.
- *
- * @param[in] pCtx  The encoding context to add the "undef" to.
- *
- * Adds the undef value as CBOR major type 7.
- *
- * Note that this value will not translate to JSON.
- *
- * "undef" doesn't have any special meaning in CBOR such as a
- * terminating value for a string or an empty value.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static void
-QCBOREncode_AddUndef(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_AddUndefToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
-
-static void
-QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
-
-
-/**
- * @brief Add a simple value.
- *
- * @param[in] pCtx    The encode context.
- * @param[in] uNum   The simple value.
- *
- * QCBOREncode_AddBool(), QCBOREncode_AddUndef() and
- * QCBOREncode_AddNull() are preferred to this for the simple values
- * defined in RFC 8949, but this can be used for them too.
- *
- * The main purpose of this is to add simple values beyond those in
- * defined RFC 8949. Note that simple values must be registered with
- * IANA. Those in the range of 0 to 19 must be standardized.  Those in
- * the range of 32 to 255 do not require a standard, but must be
- * publically specified. There is no range of values for proprietary
- * use. See
- * https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xhtml
- */
-static void
-QCBOREncode_AddSimple(QCBOREncodeContext *pCtx, const uint8_t uNum);
-
-static void
-QCBOREncode_AddSimpleToMapSZ(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             const uint8_t       uSimple);
-
-static void
-QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pCtx,
-                            const int64_t       nLabel,
-                            const uint8_t       uSimple);
-
-
-/**
- * @brief  Indicates that the next items added are in an array.
- *
- * @param[in] pCtx The encoding context to open the array in.
- *
- * Arrays are the basic CBOR aggregate or structure type. Call this
- * function to start or open an array. Then call the various
- * @c QCBOREncode_AddXxx() functions to add the items that go into the
- * array. Then call QCBOREncode_CloseArray() when all items have been
- * added. The data items in the array can be of any type and can be of
- * mixed types.
- *
- * Nesting of arrays and maps is allowed and supported just by calling
- * QCBOREncode_OpenArray() again before calling
- * QCBOREncode_CloseArray().  While CBOR has no limit on nesting, this
- * implementation does in order to keep it smaller and simpler.  The
- * limit is @ref QCBOR_MAX_ARRAY_NESTING. This is the max number of
- * times this can be called without calling
- * QCBOREncode_CloseArray(). QCBOREncode_Finish() will return
- * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP when it is called as this
- * function just sets an error state and returns no value when this
- * occurs.
- *
- * If you try to add more than @ref QCBOR_MAX_ITEMS_IN_ARRAY items to
- * a single array or map, @ref QCBOR_ERR_ARRAY_TOO_LONG will be
- * returned when QCBOREncode_Finish() is called.
- *
- * An array itself must have a label if it is being added to a map.
- * Note that array elements do not have labels (but map elements do).
- *
- * An array itself may be tagged by calling QCBOREncode_AddTagNumber()
- * before this call.
- */
-static void
-QCBOREncode_OpenArray(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_OpenArrayInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
-
-static void
-QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pCtx,  int64_t nLabel);
-
-
-/**
- * @brief Close an open array.
- *
- * @param[in] pCtx The encoding context to close the array in.
- *
- * The closes an array opened by QCBOREncode_OpenArray(). It reduces
- * nesting level by one. All arrays (and maps) must be closed before
- * calling QCBOREncode_Finish().
- *
- * When an error occurs as a result of this call, the encoder records
- * the error and enters the error state. The error will be returned
- * when QCBOREncode_Finish() is called.
- *
- * If this has been called more times than QCBOREncode_OpenArray(), then
- * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when QCBOREncode_Finish()
- * is called.
- *
- * If this is called and it is not an array that is currently open,
- * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
- * QCBOREncode_Finish() is called.
- */
-static void
-QCBOREncode_CloseArray(QCBOREncodeContext *pCtx);
-
-
-
-
-/**
- * @brief  Indicates that the next items added are in a map.
- *
- * @param[in] pCtx The encoding context to open the map in.
- *
- * See QCBOREncode_OpenArray() for more information, particularly
- * error handling.
- *
- * CBOR maps are an aggregate type where each item in the map consists
- * of a label and a value. They are similar to JSON objects.
- *
- * The value can be any CBOR type including another map.
- *
- * The label can also be any CBOR type, but in practice they are
- * typically, integers as this gives the most compact output. They
- * might also be text strings which gives readability and translation
- * to JSON.
- *
- * Every @c QCBOREncode_AddXxx() call has one version that ends with
- * @c InMap for adding items to maps with string labels and one that
- * ends with @c InMapN that is for adding with integer labels.
- *
- * RFC 8949 uses the term "key" instead of "label".
- *
- * If you wish to use map labels that are neither integer labels nor
- * text strings, then just call the QCBOREncode_AddXxx() function
- * explicitly to add the label. Then call it again to add the value.
- *
- * See the [RFC 8949] (https://www.rfc-editor.org/rfc/rfc8949.html)
- * for a lot more information on creating maps.
- */
-static void
-QCBOREncode_OpenMap(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_OpenMapInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
-
-static void
-QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
-
-
-/**
- * @brief Close an open map.
- *
- * @param[in] pCtx The encoding context to close the map in.
- *
- * This closes a map opened by QCBOREncode_OpenMap(). It reduces
- * nesting level by one.
- *
- * When an error occurs as a result of this call, the encoder records
- * the error and enters the error state. The error will be returned
- * when QCBOREncode_Finish() is called.
- *
- * If this has been called more times than QCBOREncode_OpenMap(), then
- * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
- * QCBOREncode_Finish() is called.
- *
- * If this is called and it is not a map that is currently open,
- * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
- * QCBOREncode_Finish() is called.
- */
-static void
-QCBOREncode_CloseMap(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Indicates that the next items added are in an indefinite length array.
- *
- * @param[in] pCtx The encoding context to open the array in.
- *
- * This is the same as QCBOREncode_OpenArray() except the array is
- * indefinite length.
- *
- * This must be closed with QCBOREncode_CloseArrayIndefiniteLength().
- */
-static void
-QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(QCBOREncodeContext *pCtx,
-                                             const char         *szLabel);
-
-static void
-QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
-                                            int64_t            nLabel);
-
-
-/**
- * @brief Close an open indefinite length array.
- *
- * @param[in] pCtx The encoding context to close the array in.
- *
- * This is the same as QCBOREncode_CloseArray(), but the open array
- * that is being close must be of indefinite length.
- */
-static void
-QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Indicates that the next items added are in an indefinite length map.
- *
- * @param[in] pCtx The encoding context to open the map in.
- *
- * This is the same as QCBOREncode_OpenMap() except the array is
- * indefinite length.
- *
- * This must be closed with QCBOREncode_CloseMapIndefiniteLength().
- */
-static void
-QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_OpenMapIndefiniteLengthInMapSZ(QCBOREncodeContext *pCtx,
-                                           const char         *szLabel);
-
-static void
-QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
-                                         int64_t              nLabel);
-
-
-
-
-/**
- * @brief Close an open indefinite length map.
- *
- * @param[in] pCtx The encoding context to close the map in.
- *
- * This is the same as QCBOREncode_CloseMap(), but the open map that
- * is being close must be of indefinite length.
- */
-static void
-QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Close and sort an open map.
- *
- * @param[in] pCtx The encoding context to close the map in .
- *
- * This is the same as QCBOREncode_CloseMap() except it sorts the map
- * per RFC 8949 Section 4.2.1 and checks for duplicate map keys. This
- * sort is lexicographic of the CBOR-encoded map labels.
- *
- * This is more expensive than most things in the encoder. It uses
- * bubble sort which runs in n-squared time where @c n is the number
- * of map items. Sorting large maps on slow CPUs might be slow. This
- * is also increases the object code size of the encoder by about 30%
- * (500-1000 bytes).
- *
- * Bubble sort was selected so as to not need require configuration of
- * a buffer to track map item offsets. Bubble sort works well even
- * though map items are not all the same size because it always swaps
- * adjacent items.
- */
-void 
-QCBOREncode_CloseAndSortMap(QCBOREncodeContext *pCtx);
-
-void 
-QCBOREncode_CloseAndSortMapIndef(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Indicate start of encoded CBOR to be wrapped in a bstr.
- *
- * @param[in] pCtx The encoding context to open the bstr-wrapped CBOR in.
- *
- * All added encoded items between this call and a call to
- * QCBOREncode_CloseBstrWrap2() will be wrapped in a bstr. They will
- * appear in the final output as a byte string.  That byte string will
- * contain encoded CBOR. This increases nesting level by one.
- *
- * The typical use case is for encoded CBOR that is to be
- * cryptographically hashed, as part of a [RFC 9052, COSE]
- * (https://www.rfc-editor.org/rfc/rfc9052.html) implementation. The
- * wrapping byte string is taken as input by the hash function (which
- * is why it is returned by QCBOREncode_CloseBstrWrap2()).  It is also
- * easy to recover on decoding with standard CBOR decoders.
- *
- * Using QCBOREncode_BstrWrap() and QCBOREncode_CloseBstrWrap2()
- * avoids having to encode the items first in one buffer (e.g., the
- * COSE payload) and then add that buffer as a bstr to another
- * encoding (e.g. the COSE to-be-signed bytes, the @c Sig_structure)
- * potentially halving the memory needed.
- *
- * CBOR by nature must be decoded item by item in order from the
- * start.  By wrapping some CBOR in a byte string, the decoding of
- * that wrapped CBOR can be skipped. This is another use of wrapping,
- * perhaps because the CBOR is large and deeply nested. Perhaps APIs
- * for handling one defined CBOR message that is being embedded in
- * another only take input as a byte string. Perhaps the desire is to
- * be able to decode the out layer even in the wrapped has errors.
- */
-static void
-QCBOREncode_BstrWrap(QCBOREncodeContext *pCtx);
-
-static void
-QCBOREncode_BstrWrapInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
-
-static void
-QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
-
-
-/**
- * @brief Close a wrapping bstr.
- *
- * @param[in] pCtx              The encoding context to close of bstr wrapping in.
- * @param[in] bIncludeCBORHead  Include the encoded CBOR head of the bstr
- *                              as well as the bytes in @c pWrappedCBOR.
- * @param[out] pWrappedCBOR     A @ref UsefulBufC containing wrapped bytes.
- *
- * The closes a wrapping bstr opened by QCBOREncode_BstrWrap(). It reduces
- * nesting level by one.
- *
- * A pointer and length of the enclosed encoded CBOR is returned in @c
- * *pWrappedCBOR if it is not @c NULL. The main purpose of this is so
- * this data can be hashed (e.g., with SHA-256) as part of a
- * [RFC 9052, COSE] (https://www.rfc-editor.org/rfc/rfc9052.html)
- * implementation. **WARNING**, this pointer and length should be used
- * right away before any other calls to @c QCBOREncode_CloseXxx() as
- * they will move data around and the pointer and length will no
- * longer be to the correct encoded CBOR.
- *
- * When an error occurs as a result of this call, the encoder records
- * the error and enters the error state. The error will be returned
- * when QCBOREncode_Finish() is called.
- *
- * If this has been called more times than QCBOREncode_BstrWrap(),
- * then @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
- * QCBOREncode_Finish() is called.
- *
- * If this is called and it is not a wrapping bstr that is currently
- * open, @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
- * QCBOREncode_Finish() is called.
- *
- * QCBOREncode_CloseBstrWrap() is a deprecated version of this function
- * that is equivalent to the call with @c bIncludeCBORHead @c true.
- */
-void
-QCBOREncode_CloseBstrWrap2(QCBOREncodeContext *pCtx, bool bIncludeCBORHead, UsefulBufC *pWrappedCBOR);
-
-static void
-QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pCtx, UsefulBufC *pWrappedCBOR);
-
-
-/**
- * @brief Cancel byte string wrapping.
- *
- * @param[in] pCtx       The encoding context.
- *
- * This cancels QCBOREncode_BstrWrap() making the encoding as if it
- * were never called.
- *
- * WARNING: This does not work on QCBOREncode_BstrWrapInMapSZ()
- * or QCBOREncode_BstrWrapInMapN() and there is no error detection
- * of an attempt at their use.
- *
- * This only works if nothing has been added into the wrapped byte
- * string.  If something has been added, this sets the error
- * @ref QCBOR_ERR_CANNOT_CANCEL.
- */
-void
-QCBOREncode_CancelBstrWrap(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Add some already-encoded CBOR bytes.
- *
- * @param[in] pCtx     The encoding context to add the already-encode CBOR to.
- * @param[in] Encoded  The already-encoded CBOR to add to the context.
- *
- * The encoded CBOR being added must be fully conforming CBOR. It must
- * be complete with no arrays or maps that are incomplete. it is OK for the
- * raw CBOR added here to have indefinite lengths.
- *
- * The raw CBOR added here is not checked in anyway. If it is not
- * conforming or has open arrays or such, the final encoded CBOR
- * will probably be wrong or not what was intended.
- *
- * If the encoded CBOR being added here contains multiple items, they
- * must be enclosed in a map or array. At the top level the raw
- * CBOR must be a single data item.
- */
-void
-QCBOREncode_AddEncoded(QCBOREncodeContext *pCtx, UsefulBufC Encoded);
-
-static void
-QCBOREncode_AddEncodedToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);
-
-static void
-QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Encoded);
-
-
-/**
- * @brief Get the encoded result.
- *
- * @param[in] pCtx           The context to finish encoding with.
- * @param[out] pEncodedCBOR  Structure in which the pointer and length of
- *                           the encoded CBOR is returned.
- *
- * @retval QCBOR_SUCCESS                     Encoded CBOR is returned.
- *
- * @retval QCBOR_ERR_TOO_MANY_CLOSES         Nesting error
- *
- * @retval QCBOR_ERR_CLOSE_MISMATCH          Nesting error
- *
- * @retval QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN Nesting error
- *
- * @retval QCBOR_ERR_BUFFER_TOO_LARGE        Encoded output buffer size
- *
- * @retval QCBOR_ERR_BUFFER_TOO_SMALL        Encoded output buffer size
- *
- * @retval QCBOR_ERR_ARRAY_NESTING_TOO_DEEP  Implementation limit
- *
- * @retval QCBOR_ERR_ARRAY_TOO_LONG          Implementation limit
- *
- * On success, the pointer and length of the encoded CBOR are returned
- * in @c *pEncodedCBOR. The pointer is the same pointer that was passed
- * in to QCBOREncode_Init(). Note that it is not const when passed to
- * QCBOREncode_Init(), but it is const when returned here.  The length
- * will be smaller than or equal to the length passed in when
- * QCBOREncode_Init() as this is the length of the actual result, not
- * the size of the buffer it was written to.
- *
- * If a @c NULL was passed for @c Storage.ptr when QCBOREncode_Init()
- * was called, @c NULL will be returned here, but the length will be
- * that of the CBOR that would have been encoded.
- *
- * Encoding errors primarily manifest here as most other encoding function
- * do no return an error. They just set the error state in the encode
- * context after which no encoding function does anything.
- *
- * Three types of errors manifest here. The first type are nesting
- * errors where the number of @c QCBOREncode_OpenXxx() calls do not
- * match the number @c QCBOREncode_CloseXxx() calls. The solution is to
- * fix the calling code.
- *
- * The second type of error is because the buffer given is either too
- * small or too large. The remedy is to give a correctly sized buffer.
- *
- * The third type are due to limits in this implementation.
- * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP can be worked around by
- * encoding the CBOR in two (or more) phases and adding the CBOR from
- * the first phase to the second with @c QCBOREncode_AddEncoded().
- *
- * If an error is returned, the buffer may have partially encoded
- * incorrect CBOR in it and it should not be used. Likewise, the length
- * may be incorrect and should not be used.
- *
- * Note that the error could have occurred in one of the many
- * @c QCBOREncode_AddXxx() calls long before QCBOREncode_Finish() was
- * called. This error handling reduces the CBOR implementation size
- * but makes debugging harder.
- *
- * This may be called multiple times. It will always return the
- * same. It can also be interleaved with calls to
- * QCBOREncode_FinishGetSize(). See QCBOREncode_SubString() for a
- * means to get the thus-far-encoded CBOR.
- *
- * QCBOREncode_GetErrorState() can be called to get the current
- * error state in order to abort encoding early as an optimization, but
- * calling it is is never required.
- */
-QCBORError
-QCBOREncode_Finish(QCBOREncodeContext *pCtx, UsefulBufC *pEncodedCBOR);
-
-
-/**
- * @brief Get the encoded CBOR and error status.
- *
- * @param[in] pCtx          The context to finish encoding with.
- * @param[out] uEncodedLen  The length of the encoded or potentially
- *                          encoded CBOR in bytes.
- *
- * @return The same errors as QCBOREncode_Finish().
- *
- * This functions the same as QCBOREncode_Finish(), but only returns the
- * size of the encoded output.
- */
-QCBORError
-QCBOREncode_FinishGetSize(QCBOREncodeContext *pCtx, size_t *uEncodedLen);
-
-
-/**
- * @brief Indicate whether the output storage buffer is NULL.
- *
- * @param[in] pCtx  The encoding context.
- *
- * @return 1 if the output buffer is @c NULL.
- *
- * As described in QCBOREncode_Init(), @c Storage.ptr may be give as @c NULL
- * for output size calculation. This returns 1 when that is the true, and 0 if not.
- */
-static int
-QCBOREncode_IsBufferNULL(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Retrieve the storage buffer passed in to QCBOREncode_Init().
- *
- * @param[in] pCtx  The encoding context.
- *
- * @return The output storage buffer passed to QCBOREncode_Init().
- *
- * This doesn't give any information about how much has been encoded
- * or the error state. It just returns the exact @ref UsefulOutBuf given
- * to QCBOREncode_Init().
- */
-static UsefulBuf
-QCBOREncode_RetrieveOutputStorage(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Get the encoding error state.
- *
- * @param[in] pCtx  The encoding context.
- *
- * @return One of @ref QCBORError. See return values from
- *         QCBOREncode_Finish()
- *
- * Normally encoding errors need only be handled at the end of
- * encoding when QCBOREncode_Finish() is called. This can be called to
- * get the error result before finish should there be a need to halt
- * encoding before QCBOREncode_Finish() is called.
- */
-static QCBORError
-QCBOREncode_GetErrorState(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Returns current end of encoded data.
- *
- * @param[in] pCtx  The encoding context.
- *
- * @return Byte offset of end of encoded data.
- *
- * The purpose of this is to enable cryptographic hashing over a
- * subpart of thus far CBOR-encoded data. Then perhaps a signature
- * over the hashed CBOR is added to the encoded output. There is
- * nothing specific to hashing or signing in this, so this can be used
- * for other too.
- *
- * Call this to get the offset of the start of the encoded
- * to-be-hashed CBOR items, then call QCBOREncode_SubString().
- * QCBOREncode_Tell() can also be called twice, first to get the
- * offset of the start and second for the offset of the end. Those
- * offsets can be applied to the output storage buffer.
- *
- * This will return successfully even if the encoder is in the error
- * state.
- *
- * WARNING: All definite-length arrays and maps opened before the
- * first call to QCBOREncode_Tell() must not be closed until the
- * substring is obtained and processed. Similarly, every
- * definite-length array or map opened after the first call to
- * QCBOREncode_Tell() must be closed before the substring is obtained
- * and processed.  The same applies for opened byte strings. There is
- * no detection of these errors. This occurs because QCBOR goes back
- * and inserts the lengths of definite-length arrays and maps when
- * they are closed. This insertion will make the offsets incorrect.
- */
-static size_t
-QCBOREncode_Tell(QCBOREncodeContext *pCtx);
-
-
-/**
- * @brief Get a substring of encoded CBOR for cryptographic hash
- *
- * @param[in] pCtx  The encoding context.
- * @param[in] uStart  The start offset of substring.
- *
- * @return Pointer and length of of substring.
- *
- * @c uStart is obtained by calling QCBOREncode_Tell() before encoding
- * the first item in the substring. Then encode some data items. Then
- * call this. The substring returned contains the encoded data items.
- *
- * The substring may have deeply nested arrays and maps as long as any
- * opened after the call to QCBOREncode_Tell() are closed before this
- * is called.
- *
- * This will return @c NULLUsefulBufC if the encoder is in the error
- * state or if @c uStart is beyond the end of the thus-far encoded
- * data items.
- *
- * If @c uStart is 0, all the thus-far-encoded CBOR will be returned.
- * Unlike QCBOREncode_Finish(), this will succeed even if some arrays
- * and maps are not closed.
- *
- * See important usage WARNING in QCBOREncode_Tell()
- */
-UsefulBufC
-QCBOREncode_SubString(QCBOREncodeContext *pCtx, const size_t uStart);
-
-
-/**
- * @brief Encode the head of a CBOR data item.
- *
- * @param Buffer       Buffer to output the encoded head to; must be
- *                     @ref QCBOR_HEAD_BUFFER_SIZE bytes in size.
- * @param uMajorType   One of CBOR_MAJOR_TYPE_XX.
- * @param uMinLen      The minimum number of bytes to encode uNumber. Almost
- *                     always this is 0 to use preferred
- *                     serialization. If this is 4, then even the
- *                     values 0xffff and smaller will be encoded in 4
- *                     bytes. This is used primarily when encoding a
- *                     float or double put into uNumber as the leading
- *                     zero bytes for them must be encoded.
- * @param uNumber      The numeric argument part of the CBOR head.
- * @return             Pointer and length of the encoded head or
- *                     @ref NULLUsefulBufC if the output buffer is too small.
- *
- * Callers do not to need to call this for normal CBOR encoding. Note
- * that it doesn't even take a @ref QCBOREncodeContext argument.
- *
- * This encodes the major type and argument part of a data item. The
- * argument is an integer that is usually either the value or the length
- * of the data item.
- *
- * This is exposed in the public interface to allow hashing of some CBOR
- * data types, bstr in particular, a chunk at a time so the full CBOR
- * doesn't have to be encoded in a contiguous buffer.
- *
- * For example, if you have a 100,000 byte binary blob in a buffer that
- * needs to be bstr encoded and then hashed. You could allocate a
- * 100,010 byte buffer and encode it normally. Alternatively, you can
- * encode the head in a 10 byte buffer with this function, hash that and
- * then hash the 100,000 bytes using the same hash context.
- */
-UsefulBufC
-QCBOREncode_EncodeHead(UsefulBuf Buffer,
-                       uint8_t   uMajorType,
-                       uint8_t   uMinLen,
-                       uint64_t  uNumber);
-
-
-
-
-/* ========================================================================= *
- *    BEGINNING OF DEPRECATED FUNCTION DECLARATIONS                          *
- *                                                                           *
- *    There is no plan to remove these in future versions.                   *
- *    They just have been replaced by something better.                      *
- * ========================================================================= */
-
-/* Use QCBOREncode_AddInt64ToMapSZ() instead */
-static void
-QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nNum);
-
-/* Use QCBOREncode_AddUInt64ToMapSZ() instead */
-static void
-QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
-
-/* Use QCBOREncode_AddTextToMapSZ() instead */
-static void
-QCBOREncode_AddTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text);
-
-/* Use QCBOREncode_AddSZStringToMapSZ() instead */
-static void
-QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);
-
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
-/* Use QCBOREncode_AddDoubleToMapSZ() instead */
-static void
-QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
-
-/* Use QCBOREncode_AddFloatToMapSZ() instead */
-static void
-QCBOREncode_AddFloatToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
-
-/* Use QCBOREncode_AddDoubleNoPreferredToMapSZ() instead */
-static void
-QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
-
-/* Use QCBOREncode_AddFloatNoPreferredToMapSZ() instead */
-static void
-QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
-#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
-
-/* Use QCBOREncode_AddTDateEpoch() instead */
-static void
-QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx, int64_t nDate);
-
-/* Use QCBOREncode_AddTDateEpochToMapSZ() instead */
-static void
-QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nDate);
-
-/* Use QCBOREncode_AddTDateEpochToMapN() instead */
-static void
-QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t nDate);
-
-/* Use QCBOREncode_AddBytesToMapSZ() instead */
-static void
-QCBOREncode_AddBytesToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
-
-/* Use QCBOREncode_AddTBinaryUUID() instead */
-static void
-QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
-
-/* Use QCBOREncode_AddTBinaryUUIDToMapSZ() instead */
-static void
-QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
-
-/* Use QCBOREncode_AddTBinaryUUIDToMapN() instead */
-static void
-QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
-
-/* Deprecated. Use QCBOREncode_AddTagNumber() instead */
-static void
-QCBOREncode_AddTag(QCBOREncodeContext *pCtx, uint64_t uTag);
-
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRaw() instead */
-static void
-QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pCtx,
-                               uint8_t             uTagRequirement,
-                               UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapSZ() instead */
-static void
-QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pCtx,
-                                      const char         *szLabel,
-                                      uint8_t             uTagRequirement,
-                                      UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapN() instead */
-static void
-QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pCtx,
-                                     int64_t             nLabel,
-                                     uint8_t             uTagRequirement,
-                                     UsefulBufC          BigNumber);
-
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRaw() instead */
-static void
-QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pCtx,
-                              UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapSZ() instead */
-static void
-QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pCtx,
-                                   const char         *szLabel,
-                                   UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapN() instead */
-static void
-QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pCtx,
-                                    int64_t             nLabel,
-                                    UsefulBufC          BigNumber);
-
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRaw() instead */
-static void
-QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pCtx,
-                               uint8_t             uTagRequirement,
-                               UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapSZ() instead */
-static void
-QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pCtx,
-                                      const char         *szLabel,
-                                      uint8_t             uTagRequirement,
-                                      UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapN() instead */
-static void
-QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pCtx,
-                                     int64_t             nLabel,
-                                     uint8_t             uTagRequirement,
-                                     UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRaw() instead */
-static void
-QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pCtx,
-                              UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapSZ() instead */
-static void
-QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pCtx,
-                                   const char         *szLabel,
-                                   UsefulBufC          BigNumber);
-
-/* Deprecated. Use QCBOREncode_AddTBigNumberRawToMapN() instead */
-static void
-QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pCtx,
-                                    int64_t             nLabel,
-                                    UsefulBufC          BigNumber);
-
-
-#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-/* Deprecated. Use QCBOREncode_AddTDecimalFraction() instead */
-
-static void
-QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pCtx,
-                               int64_t             nMantissa,
-                               int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionToMapSZ() instead */
-static void
-QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pCtx,
-                                    const char         *szLabel,
-                                    int64_t             nMantissa,
-                                    int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionToMapN() instead */
-static void
-QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pCtx,
-                                     int64_t             nLabel,
-                                     int64_t             nMantissa,
-                                     int64_t             nBase10Exponent);
-
-/*  Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRaw() instead */
-static void
-QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pCtx,
-                                      uint8_t             uTagRequirement,
-                                      UsefulBufC          Mantissa,
-                                      bool                bIsNegative,
-                                      int64_t             nBase10Exponent);
-
-/*  Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ() instead */
-static void
-QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
-                                             const char         *szLabel,
-                                             uint8_t             uTagRequirement,
-                                             UsefulBufC          Mantissa,
-                                             bool                bIsNegative,
-                                             int64_t             nBase10Exponent);
-
-/*  Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN() instead */
-static void
-QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
-                                            int64_t             nLabel,
-                                            uint8_t             uTagRequirement,
-                                            UsefulBufC          Mantissa,
-                                            bool                bIsNegative,
-                                            int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRaw() instead */
-static void
-QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pCtx,
-                                     UsefulBufC          Mantissa,
-                                     bool                bIsNegative,
-                                     int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ() instead */
-static void
-QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
-                                            const char         *szLabel,
-                                            UsefulBufC          Mantissa,
-                                            bool                bIsNegative,
-                                            int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN() instead */
-static void
-QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
-                                           int64_t             nLabel,
-                                           UsefulBufC          Mantissa,
-                                           bool                bIsNegative,
-                                           int64_t             nBase10Exponent);
-
-
-/* Deprecated. Use QCBOREncode_AddTBigFloat() instead. */
-static void
-QCBOREncode_AddBigFloat(QCBOREncodeContext *pCtx,
-                        int64_t             nMantissa,
-                        int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatToMapSZ() instead. */
-static void
-QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             int64_t             nMantissa,
-                             int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatToMapN() instead. */
-static void
-QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pCtx,
-                              int64_t             nLabel,
-                              int64_t             nMantissa,
-                              int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRaw() instead. */
-static void
-QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pCtx,
-                               uint8_t             uTagRequirement,
-                               UsefulBufC          Mantissa,
-                               bool                bIsNegative,
-                               int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ() instead. */
-static void
-QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pCtx,
-                                      const char         *szLabel,
-                                      uint8_t             uTagRequirement,
-                                      UsefulBufC          Mantissa,
-                                      bool                bIsNegative,
-                                      int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRawToMapN() instead. */
-static void
-QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
-                                     int64_t             nLabel,
-                                     uint8_t             uTagRequirement,
-                                     UsefulBufC          Mantissa,
-                                     bool                bIsNegative,
-                                     int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRaw() instead. */
-static void
-QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pCtx,
-                              UsefulBufC          Mantissa,
-                              bool                bIsNegative,
-                              int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ() instead. */
-static void
-QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pCtx,
-                                   const char         *szLabel,
-                                   UsefulBufC          Mantissa,
-                                   bool                bIsNegative,
-                                   int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigMantissaRawToMapN() instead. */
-static void
-QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
-                                    int64_t             nLabel,
-                                    UsefulBufC          Mantissa,
-                                    bool                bIsNegative,
-                                    int64_t             nBase2Exponent);
-
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFraction() instead. */
-static void
-QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pCtx,
-                               int64_t             nMantissa,
-                               int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionToMapSZ() instead. */
-static void
-QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pCtx,
-                                    const char         *szLabel,
-                                    int64_t             nMantissa,
-                                    int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionToMapN() instead. */
-static void
-QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pCtx,
-                                     int64_t             nLabel,
-                                     int64_t             nMantissa,
-                                     int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigNum() instead. */
-static void
-QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pCtx,
-                                     UsefulBufC          Mantissa,
-                                     bool                bIsNegative,
-                                     int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigNumToMapSZ() instead. */
-static void
-QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
-                                            const char         *szLabel,
-                                            UsefulBufC          Mantissa,
-                                            bool                bIsNegative,
-                                            int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTDecimalFractionBigNumToMapN() instead. */
-static void
-QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
-                                           int64_t             nLabel,
-                                           UsefulBufC          Mantissa,
-                                           bool                bIsNegative,
-                                           int64_t             nBase10Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloat() instead. */
-static void
-QCBOREncode_AddBigFloat(QCBOREncodeContext *pCtx,
-                        int64_t             nMantissa,
-                        int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatToMapSZ() instead. */
-static void
-QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             int64_t             nMantissa,
-                             int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatToMapN() instead. */
-static void
-QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pCtx,
-                              int64_t             nLabel,
-                              int64_t             nMantissa,
-                              int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigNum() instead. */
-static void
-QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pCtx,
-                              UsefulBufC          Mantissa,
-                              bool                bIsNegative,
-                              int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigNumToMapSZ() instead. */
-static void
-QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pCtx,
-                                   const char         *szLabel,
-                                   UsefulBufC          Mantissa,
-                                   bool                bIsNegative,
-                                   int64_t             nBase2Exponent);
-
-/* Deprecated. Use QCBOREncode_AddTBigFloatBigNumToMapN() instead. */
-static void
-QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
-                                    int64_t             nLabel,
-                                    UsefulBufC          Mantissa,
-                                    bool                bIsNegative,
-                                    int64_t             nBase2Exponent);
-#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
-
-/* Deprecated. Use QCBOREncode_AddTURI() instead. */
-static void
-QCBOREncode_AddURI(QCBOREncodeContext *pCtx, UsefulBufC URI);
-
-/* Deprecated. Use QCBOREncode_AddTURIToMapSZ() instead. */
-static void
-QCBOREncode_AddURIToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC URI);
-
-/* Deprecated. Use QCBOREncode_AddTURIToMapN() instead */
-static void
-QCBOREncode_AddURIToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC URI);
-
-/* Deprecated. Use QCBOREncode_AddTB64Text() instead. */
-static void
-QCBOREncode_AddB64Text(QCBOREncodeContext *pCtx, UsefulBufC B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTB64TextToMapSZ() instead. */
-static void
-QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTB64TextToMapN() instead. */
-static void
-QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTB64URLText() instead. */
-static void
-QCBOREncode_AddB64URLText(QCBOREncodeContext *pCtx, UsefulBufC B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTB64URLTextToMapSZ() instead. */
-static void
-QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pCtx,
-                               const char         *szLabel,
-                               UsefulBufC          B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTB64URLTextToMapN() instead. */
-static void
-QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pCtx,
-                                int64_t             nLabel,
-                                UsefulBufC          B64Text);
-
-/* Deprecated. Use QCBOREncode_AddTRegex() instead. */
-static void
-QCBOREncode_AddRegex(QCBOREncodeContext *pCtx, UsefulBufC Regex);
-
-/* Deprecated. Use QCBOREncode_AddTRegexToMapSZ() instead. */
-static void
-QCBOREncode_AddRegexToMap(QCBOREncodeContext *pCtx,
-                          const char         *szLabel,
-                          UsefulBufC          Regex);
-
-/* Deprecated. Use QCBOREncode_AddTRegexToMapN() instead. */
-static void
-QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pCtx,
-                           int64_t             nLabel,
-                           UsefulBufC          Regex);
-
-/* Deprecated. Use QCBOREncode_AddTMIMEData() instead. */
-static void
-QCBOREncode_AddMIMEData(QCBOREncodeContext *pCtx, UsefulBufC MIMEData);
-
-/* Deprecated. Use QCBOREncode_AddTMIMEDataToMapSZ() instead. */
-static void
-QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pCtx,
-                             const char         *szLabel,
-                             UsefulBufC          MIMEData);
-
-/* Deprecated. Use QCBOREncode_AddTMIMEDataToMapN() instead. */
-static void
-QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pCtx,
-                              int64_t             nLabel,
-                              UsefulBufC          MIMEData);
-
-/* Deprecated. Use QCBOREncode_AddTDateString() instead. */
-static void
-QCBOREncode_AddDateString(QCBOREncodeContext *pCtx, const char *szDate);
-
-/* Deprecated. Use QCBOREncode_AddTDateStringToMapSZ() instead. */
-static void
-QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pCtx,
-                               const char         *szLabel,
-                               const char         *szDate);
-
-/* Deprecated. Use QCBOREncode_AddTDateStringToMapN instead. */
-static void
-QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pCtx,
-                                int64_t             nLabel,
-                                const char         *szDate);
-
-/* Deprecated. Use QCBOREncode_AddBoolToMapSZ() instead. */
-static void
-QCBOREncode_AddBoolToMap(QCBOREncodeContext *pCtx, const char *szLabel, bool b);
-
-/* Deprecated. Use QCBOREncode_AddNULLToMapSZ() instead. */
-static void
-QCBOREncode_AddNULLToMap(QCBOREncodeContext *pCtx, const char *szLabel);
-
-/* Deprecated. Use QCBOREncode_AddUndefToMapSZ() instead. */
-static void
-QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel);
-
-/* Deprecated. Use QCBOREncode_AddSimpleToMapSZ instead. */
-static void
-QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pCtx,
-                           const char         *szLabel,
-                           const uint8_t       uSimple);
-
-/* Deprecated. Use QCBOREncode_OpenArrayInMapSZ() instead. */
-static void
-QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pCtx, const char *szLabel);
-
-/* Deprecated. Use QCBOREncode_OpenMapInMapSZ() instead. */
-static void
-QCBOREncode_OpenMapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
-
-/* Deprecated. Use QCBOREncode_OpenArrayIndefiniteLengthInMapSZ() instead. */
-static void
-QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
-                                           const char         *szLabel);
-
-/* Deprecated. Use QCBOREncode_OpenMapIndefiniteLengthInMapSZ() instead. */
-static void
-QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
-                                         const char         *szLabel);
-
-/* Deprecated. Use QCBOREncode_BstrWrapInMapSZ() instead. */
-static void
-QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
-
-/* Deprecated. Use QCBOREncode_AddEncodedToMapSZ() instead. */
-static void
-QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);
-
-
-/* ========================================================================= *
- *    END OF DEPRECATED FUNCTION DECLARATIONS                                *
- * ========================================================================= */
-
-
-
-
-
-/* ========================================================================= *
- *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION                             *
- * ========================================================================= */
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void QCBOREncode_Private_AppendCBORHead(QCBOREncodeContext *pMe,
-                                        const uint8_t       uMajorType,
-                                        const uint64_t      uArgument,
-                                        const uint8_t       uMinLen);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddBuffer(QCBOREncodeContext *pCtx,
-                              uint8_t             uMajorType,
-                              UsefulBufC          Bytes);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddPreferredDouble(QCBOREncodeContext *pMe, const double dNum);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddPreferredFloat(QCBOREncodeContext *pMe, const float fNum);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_OpenMapOrArray(QCBOREncodeContext *pCtx,
-                                   uint8_t             uMajorType);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
-                                                   uint8_t             uMajorType);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_CloseMapOrArray(QCBOREncodeContext *pCtx,
-                                    uint8_t             uMajorType);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
-                                                    uint8_t             uMajorType);
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddTBigNumberMain(QCBOREncodeContext *pMe,
-                                      const uint8_t       uTagRequirement,
-                                      bool                bPreferred,
-                                      const bool          bNegative,
-                                      const UsefulBufC    BigNumber);
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddTExpIntMantissa(QCBOREncodeContext *pMe,
-                                       const int           uTagRequirement,
-                                       const uint64_t      uTagNumber,
-                                       const int64_t       nExponent,
-                                       const int64_t       nMantissa);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddTExpBigMantissa(QCBOREncodeContext *pMe,
-                                       const int           uTagRequirement,
-                                       const uint64_t      uTagNumber,
-                                       const int64_t       nExponent,
-                                       const UsefulBufC    BigNumMantissa,
-                                       const bool          bBigNumIsNegative);
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_AddTExpBigMantissaRaw(QCBOREncodeContext *pMe,
-                                          const int           uTagRequirement,
-                                          const uint64_t      uTagNumber,
-                                          const int64_t       nExponent,
-                                          const UsefulBufC    BigNumMantissa,
-                                          const bool          bBigNumIsNegative);
-
-/**
- * @private
- *
- * @brief  Semi-private method to add simple items and floating-point.
- *
- * @param[in] pMe        The encoding context.
- * @param[in] uMinLen    Minimum encoding size for uNum. Usually 0.
- * @param[in] uArgument  The value to add.
- *
- * This is used to add simple types like true and false and float-point
- * values, both of which are type 7.
- *
- * Call QCBOREncode_AddBool(), QCBOREncode_AddNULL(),
- * QCBOREncode_AddUndef() QCBOREncode_AddDouble() instead of this.
- *
- * Error handling is the same as QCBOREncode_AddInt64().
- */
-static inline void
-QCBOREncode_Private_AddType7(QCBOREncodeContext *pMe,
-                             const uint8_t       uMinLen,
-                             const uint64_t      uArgument)
-{
-   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_SIMPLE, uArgument, uMinLen);
-}
-
-
-/** @private  Semi-private function. See qcbor_encode.c */
-void
-QCBOREncode_Private_CloseMapUnsorted(QCBOREncodeContext *pMe);
-
-
-static inline void
-QCBOREncode_Config(QCBOREncodeContext *pMe, enum QCBOREncodeConfig uConfig)
-{
-   if(uConfig & QCBOR_ENCODE_CONFIG_SORT) {
-      pMe->pfnCloseMap = QCBOREncode_CloseAndSortMap;
-   } else {
-      pMe->pfnCloseMap = QCBOREncode_Private_CloseMapUnsorted;
-   }
-   pMe->uConfigFlags = (int)uConfig;
-}
-
-
-
-static inline void
-QCBOREncode_ConfigReduced(QCBOREncodeContext *pMe, enum QCBOREncodeConfig uConfig)
-{
-   if(uConfig & QCBOR_ENCODE_CONFIG_SORT) {
-      pMe->uError = 99;
-   } else {
-      pMe->uConfigFlags = (int)uConfig;
-   }
-}
-
-
-
-static inline void
-QCBOREncode_AddInt64ToMapSZ(QCBOREncodeContext *pMe,
-                            const char        *szLabel,
-                            const int64_t      nNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddInt64(pMe, nNum);
-}
-
-static inline void
-QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, int64_t nNum)
-{
-   QCBOREncode_AddInt64ToMapSZ(pMe, szLabel, nNum);
-}
-
-static inline void
-QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pMe,
-                           const int64_t       nLabel,
-                           const int64_t       nNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddInt64(pMe, nNum);
-}
-
-
-static inline void
-QCBOREncode_AddUInt64(QCBOREncodeContext *pMe, const uint64_t uValue)
-{
-   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_POSITIVE_INT, uValue, 0);
-}
-
-
-static inline void
-QCBOREncode_AddUInt64ToMapSZ(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const uint64_t      uNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddUInt64(pMe, uNum);
-}
-
-static inline void
-QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, uint64_t uNum)
-{
-   QCBOREncode_AddUInt64ToMapSZ(pMe, szLabel, uNum);
-}
-
-static inline void
-QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pMe,
-                            const int64_t       nLabel,
-                            const uint64_t      uNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddUInt64(pMe, uNum);
-}
-
-
-static inline void
-QCBOREncode_AddNegativeUInt64(QCBOREncodeContext *pMe, const uint64_t uValue)
-{
-   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_NEGATIVE_INT, uValue, 0);
-}
-
-static inline void
-QCBOREncode_AddNegativeUInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, uint64_t uNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddNegativeUInt64(pMe, uNum);
-}
-
-static inline void
-QCBOREncode_AddNegativeUInt64ToMapN(QCBOREncodeContext *pMe, int64_t nLabel, uint64_t uNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddNegativeUInt64(pMe, uNum);
-}
-
-
-static inline void
-QCBOREncode_AddText(QCBOREncodeContext *pMe, const UsefulBufC Text)
-{
-   QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_TEXT_STRING, Text);
-}
-
-static inline void
-QCBOREncode_AddTextToMapSZ(QCBOREncodeContext *pMe,
-                           const char         *szLabel,
-                           const UsefulBufC    Text)
-{
-   QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szLabel));
-   QCBOREncode_AddText(pMe, Text);
-}
-
-static inline void
-QCBOREncode_AddTextToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Text)
-{
-   QCBOREncode_AddTextToMapSZ(pMe, szLabel, Text);
-}
-
-static inline void
-QCBOREncode_AddTextToMapN(QCBOREncodeContext *pMe,
-                          const int64_t       nLabel,
-                          const UsefulBufC    Text)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddText(pMe, Text);
-}
-
-
-inline static void
-QCBOREncode_AddSZString(QCBOREncodeContext *pMe, const char *szString)
-{
-   QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szString));
-}
-
-static inline void
-QCBOREncode_AddSZStringToMapSZ(QCBOREncodeContext *pMe,
-                               const char         *szLabel,
-                               const char         *szString)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddSZString(pMe, szString);
-}
-
-static inline void
-QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pMe, const char *szLabel, const char *szString)
-{
-   QCBOREncode_AddSZStringToMapSZ(pMe, szLabel, szString);
-}
-
-static inline void
-QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pMe,
-                              const int64_t       nLabel,
-                              const char         *szString)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddSZString(pMe, szString);
-}
-
-
-static inline void
-QCBOREncode_AddTagNumber(QCBOREncodeContext *pMe, const uint64_t uTag)
-{
-   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_TAG, uTag, 0);
-}
-
-
-static inline void
-QCBOREncode_AddTag(QCBOREncodeContext *pMe, const uint64_t uTag)
-{
-   QCBOREncode_AddTagNumber(pMe, uTag);
-}
-
-
-
-
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
-
-/** @private */
-static inline void
-QCBOREncode_Private_AddDoubleRaw(QCBOREncodeContext *pMe, const double dNum)
-{
-   QCBOREncode_Private_AddType7(pMe,
-                                sizeof(uint64_t),
-                                UsefulBufUtil_CopyDoubleToUint64(dNum));
-}
-
-static inline void
-QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pMe, const double dNum)
-{
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS) {
-      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   QCBOREncode_Private_AddDoubleRaw(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddDouble(QCBOREncodeContext *pMe, const double dNum)
-{
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-   QCBOREncode_Private_AddPreferredDouble(pMe, dNum);
-#else /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
-   QCBOREncode_Private_AddDoubleRaw(pMe, dNum);
-#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
-}
-
-static inline void
-QCBOREncode_AddDoubleToMapSZ(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const double        dNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddDouble(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pMe, const char *szLabel, double dNum)
-{
-   QCBOREncode_AddDoubleToMapSZ(pMe, szLabel, dNum);
-}
-
-static inline void
-QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pMe,
-                            const int64_t       nLabel,
-                            const double        dNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddDouble(pMe, dNum);
-}
-
-
-/** @private */
-static inline void
-QCBOREncode_Private_AddFloatRaw(QCBOREncodeContext *pMe, const float fNum)
-{
-   QCBOREncode_Private_AddType7(pMe,
-                                sizeof(uint32_t),
-                                UsefulBufUtil_CopyFloatToUint32(fNum));
-}
-
-static inline void
-QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pMe, const float fNum)
-{
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS) {
-      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   QCBOREncode_Private_AddFloatRaw(pMe, fNum);
-}
-
-static inline void
-QCBOREncode_AddFloat(QCBOREncodeContext *pMe, const float fNum)
-{
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-   QCBOREncode_Private_AddPreferredFloat(pMe, fNum);
-#else /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
-   QCBOREncode_Private_AddFloatRaw(pMe, fNum);
-#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
-}
-
-static inline void
-QCBOREncode_AddFloatToMapSZ(QCBOREncodeContext *pMe,
-                            const char         *szLabel,
-                            const float         dNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddFloat(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddFloatToMap(QCBOREncodeContext *pMe, const char *szLabel, float fNum)
-{
-   QCBOREncode_AddFloatToMapSZ(pMe, szLabel, fNum);
-}
-
-static inline void
-QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pMe,
-                           const int64_t       nLabel,
-                           const float         fNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddFloat(pMe, fNum);
-}
-
-static inline void
-QCBOREncode_AddDoubleNoPreferredToMapSZ(QCBOREncodeContext *pMe,
-                                        const char         *szLabel,
-                                        const double        dNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pMe, const char *szLabel, double dNum)
-{
-   QCBOREncode_AddDoubleNoPreferredToMapSZ(pMe, szLabel, dNum);
-}
-
-static inline void
-QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pMe,
-                                       const int64_t       nLabel,
-                                       const double        dNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddFloatNoPreferredToMapSZ(QCBOREncodeContext *pMe,
-                                       const char         *szLabel,
-                                       const float         dNum)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddFloatNoPreferred(pMe, dNum);
-}
-
-static inline void
-QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pMe, const char *szLabel, float fNum)
-{
-   QCBOREncode_AddFloatNoPreferredToMapSZ(pMe, szLabel, fNum);
-}
-
-static inline void
-QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pMe,
-                                      const int64_t       nLabel,
-                                      const float         dNum)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddFloatNoPreferred(pMe, dNum);
-}
-#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
-
-
-
-
-
-static inline void
-QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pMe,
-                          const uint8_t       uTag,
-                          const int64_t       nDate)
-{
-   if(uTag == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DATE_EPOCH);
-   }
-   QCBOREncode_AddInt64(pMe, nDate);
-}
-
-static inline void
-QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pMe,
-                                 const char         *szLabel,
-                                 const uint8_t       uTag,
-                                 const int64_t       nDate)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
-}
-
-static inline void
-QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pMe,
-                                const int64_t       nLabel,
-                                const uint8_t       uTag,
-                                const int64_t       nDate)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
-}
-
-static inline void
-QCBOREncode_AddDateEpoch(QCBOREncodeContext *pMe,
-                         const int64_t       nDate)
-{
-   QCBOREncode_AddTDateEpoch(pMe, QCBOR_ENCODE_AS_TAG, nDate);
-}
-
-static inline void
-QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pMe,
-                              const char         *szLabel,
-                              const int64_t       nDate)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddDateEpoch(pMe, nDate);
-}
-
-static inline void
-QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pMe,
-                               const int64_t       nLabel,
-                               const int64_t       nDate)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddDateEpoch(pMe, nDate);
-}
-
-
-static inline void
-QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pMe,
-                          const uint8_t       uTag,
-                          const int64_t       nDays)
-{
-   if(uTag == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DAYS_EPOCH);
-   }
-   QCBOREncode_AddInt64(pMe, nDays);
-}
-
-static inline void
-QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pMe,
-                                 const char         *szLabel,
-                                 const uint8_t       uTag,
-                                 const int64_t       nDays)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
-}
-
-static inline void
-QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pMe,
-                                const int64_t       nLabel,
-                                const uint8_t       uTag,
-                                const int64_t       nDays)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
-}
-
-
-static inline void
-QCBOREncode_AddBytes(QCBOREncodeContext *pMe,
-                     const UsefulBufC    Bytes)
-{
-   QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBytesToMapSZ(QCBOREncodeContext *pMe,
-                            const char         *szLabel,
-                            const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddBytes(pMe, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBytesToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Bytes)
-{
-   QCBOREncode_AddBytesToMapSZ(pMe, szLabel, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pMe,
-                           const int64_t       nLabel,
-                           const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddBytes(pMe, Bytes);
-}
-
-static inline void
-QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             UsefulBuf          *pPlace)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_OpenBytes(pMe, pPlace);
-}
-
-static inline void
-QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pMe,
-                            const int64_t       nLabel,
-                            UsefulBuf          *pPlace)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_OpenBytes(pMe, pPlace);
-}
-
-
-
-static inline void
-QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pMe,
-                           const uint8_t       uTagRequirement,
-                           const UsefulBufC    Bytes)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_BIN_UUID);
-   }
-   QCBOREncode_AddBytes(pMe, Bytes);
-}
-
-static inline void
-QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pMe,
-                                  const char         *szLabel,
-                                  const uint8_t       uTagRequirement,
-                                  const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
-}
-
-static inline void
-QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pMe,
-                                 const int64_t       nLabel,
-                                 const uint8_t       uTagRequirement,
-                                 const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
-{
-   QCBOREncode_AddTBinaryUUID(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pMe,
-                               const char         *szLabel,
-                               const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddTBinaryUUIDToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
-}
-
-static inline void
-QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pMe,
-                                const int64_t       nLabel,
-                                const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddTBinaryUUIDToMapN(pMe,
-                                    nLabel,
-                                    QCBOR_ENCODE_AS_TAG,
-                                    Bytes);
-}
-
-
-
-
-static inline void
-QCBOREncode_AddTBigNumber(QCBOREncodeContext *pMe,
-                          const uint8_t       uTagRequirement,
-                          const bool          bNegative,
-                          const UsefulBufC    BigNumber)
-{
-   QCBOREncode_Private_AddTBigNumberMain(pMe, uTagRequirement, true, bNegative, BigNumber);
-}
-
-
-static inline void
-QCBOREncode_AddTBigNumberToMapSZ(QCBOREncodeContext *pMe,
-                                 const char         *szLabel,
-                                 uint8_t             uTagRequirement,
-                                 bool                bNegative,
-                                 UsefulBufC          BigNumber)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigNumber(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-static inline void
-QCBOREncode_AddTBigNumberToMapN(QCBOREncodeContext *pMe,
-                                int64_t             nLabel,
-                                uint8_t             uTagRequirement,
-                                bool                bNegative,
-                                UsefulBufC          BigNumber)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigNumber(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-static inline void
-QCBOREncode_AddTBigNumberNoPreferred(QCBOREncodeContext *pMe,
-                                     const uint8_t       uTagRequirement,
-                                     const bool          bNegative,
-                                     const UsefulBufC    BigNumber)
-{
-   QCBOREncode_Private_AddTBigNumberMain(pMe, uTagRequirement, false, bNegative, BigNumber);
-}
-
-static inline void
-QCBOREncode_AddTBigNumberNoPreferredToMapSZ(QCBOREncodeContext *pMe,
-                                            const char         *szLabel,
-                                            uint8_t             uTagRequirement,
-                                            bool                bNegative,
-                                            UsefulBufC          BigNumber)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigNumberNoPreferred(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-static inline void
-QCBOREncode_AddTBigNumberNoPreferredToMapN(QCBOREncodeContext *pMe,
-                                           int64_t             nLabel,
-                                           uint8_t             uTagRequirement,
-                                           bool                bNegative,
-                                           UsefulBufC          BigNumber)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigNumberNoPreferred(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-/**
- * @private
- * @brief Add the tag number for a big number (private).
- *
- * @param[in] pMe  The decode context.
- * @param[in] uTagRequirement TODO: fill in
- * @param[in] bNegative  If true, big number is negative.
- */
-static inline void
-QCBOREncode_Private_BigNumberTag(QCBOREncodeContext *pMe,
-                                 const uint8_t       uTagRequirement,
-                                 bool                bNegative)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, bNegative ? CBOR_TAG_NEG_BIGNUM : CBOR_TAG_POS_BIGNUM);
-   }
-}
-
-static inline void
-QCBOREncode_AddTBigNumberRaw(QCBOREncodeContext *pMe,
-                             const uint8_t       uTagRequirement,
-                             bool                bNegative,
-                             const UsefulBufC    BigNumber)
-{
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS) {
-      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   QCBOREncode_Private_BigNumberTag(pMe, uTagRequirement, bNegative);
-   QCBOREncode_AddBytes(pMe, BigNumber);
-}
-
-static inline void
-QCBOREncode_AddTBigNumberRawToMapSZ(QCBOREncodeContext *pMe,
-                                    const char         *szLabel,
-                                    const uint8_t       uTagRequirement,
-                                    bool                bNegative,
-                                    const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-
-static inline void
-QCBOREncode_AddTBigNumberRawToMapN(QCBOREncodeContext *pMe,
-                                   int64_t             nLabel,
-                                   const uint8_t       uTagRequirement,
-                                   bool                bNegative,
-                                   const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, bNegative, BigNumber);
-}
-
-
-
-
-
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
-
-static inline void
-QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pMe,
-                                const uint8_t       uTagRequirement,
-                                const int64_t       nMantissa,
-                                const int64_t       nBase10Exponent)
-{
-   QCBOREncode_Private_AddTExpIntMantissa(pMe,
-                                          uTagRequirement,
-                                          CBOR_TAG_DECIMAL_FRACTION,
-                                          nBase10Exponent,
-                                          nMantissa);
-}
-
-static inline void
-QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pMe,
-                                       const char         *szLabel,
-                                       const uint8_t       uTagRequirement,
-                                       const int64_t       nMantissa,
-                                       const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDecimalFraction(pMe,
-                                   uTagRequirement,
-                                   nMantissa,
-                                   nBase10Exponent);
-}
-
-static inline void
-QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pMe,
-                                      const int64_t       nLabel,
-                                      const uint8_t       uTagRequirement,
-                                      const int64_t       nMantissa,
-                                      const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDecimalFraction(pMe,
-                                   uTagRequirement,
-                                   nMantissa,
-                                   nBase10Exponent);
-}
-
-
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissa(QCBOREncodeContext *pMe,
-                                           const uint8_t       uTagRequirement,
-                                           const UsefulBufC    Mantissa,
-                                           const bool          bIsNegative,
-                                           const int64_t       nBase10Exponent)
-{
-   QCBOREncode_Private_AddTExpBigMantissa(pMe,
-                                          uTagRequirement,
-                                          CBOR_TAG_DECIMAL_FRACTION,
-                                          nBase10Exponent,
-                                          Mantissa,
-                                          bIsNegative);
-}
-
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissaToMapSZ(QCBOREncodeContext *pMe,
-                                                  const char         *szLabel,
-                                                  const uint8_t       uTagRequirement,
-                                                  const UsefulBufC    Mantissa,
-                                                  const bool          bIsNegative,
-                                                  const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDecimalFractionBigMantissa(pMe,
-                                              uTagRequirement,
-                                              Mantissa,
-                                              bIsNegative,
-                                              nBase10Exponent);
-}
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissaToMapN(QCBOREncodeContext *pMe,
-                                                 const int64_t       nLabel,
-                                                 const uint8_t       uTagRequirement,
-                                                 const UsefulBufC    Mantissa,
-                                                 const bool          bIsNegative,
-                                                 const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDecimalFractionBigMantissa(pMe,
-                                              uTagRequirement,
-                                              Mantissa,
-                                              bIsNegative,
-                                              nBase10Exponent);
-}
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissaRaw(QCBOREncodeContext *pMe,
-                                              const uint8_t       uTagRequirement,
-                                              const UsefulBufC    Mantissa,
-                                              const bool          bIsNegative,
-                                              const int64_t       nBase10Exponent)
-{
-   QCBOREncode_Private_AddTExpBigMantissaRaw(pMe,
-                                             uTagRequirement,
-                                             CBOR_TAG_DECIMAL_FRACTION,
-                                             nBase10Exponent,
-                                             Mantissa,
-                                             bIsNegative);
-}
-
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(QCBOREncodeContext *pMe,
-                                                     const char         *szLabel,
-                                                     const uint8_t       uTagRequirement,
-                                                     const UsefulBufC    Mantissa,
-                                                     const bool          bIsNegative,
-                                                     const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
-                                                 uTagRequirement,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase10Exponent);
-}
-
-static inline void
-QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(QCBOREncodeContext *pMe,
-                                                    const int64_t       nLabel,
-                                                    const uint8_t       uTagRequirement,
-                                                    const UsefulBufC    Mantissa,
-                                                    const bool          bIsNegative,
-                                                    const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
-                                                 uTagRequirement,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase10Exponent);
-}
-
-
-static inline void
-QCBOREncode_AddTBigFloat(QCBOREncodeContext *pMe,
-                         const uint8_t       uTagRequirement,
-                         const int64_t       nMantissa,
-                         const int64_t       nBase2Exponent)
-{
-   QCBOREncode_Private_AddTExpIntMantissa(pMe,
-                                          uTagRequirement,
-                                          CBOR_TAG_BIGFLOAT,
-                                          nBase2Exponent,
-                                          nMantissa);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pMe,
-                                const char         *szLabel,
-                                const uint8_t       uTagRequirement,
-                                const int64_t       nMantissa,
-                                const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pMe,
-                               const int64_t       nLabel,
-                               const uint8_t       uTagRequirement,
-                               const int64_t       nMantissa,
-                               const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
-}
-
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissa(QCBOREncodeContext *pMe,
-                                    const uint8_t       uTagRequirement,
-                                    const UsefulBufC    Mantissa,
-                                    const bool          bIsNegative,
-                                    const int64_t       nBase2Exponent)
-{
-   QCBOREncode_Private_AddTExpBigMantissa(pMe,
-                                          uTagRequirement,
-                                          CBOR_TAG_BIGFLOAT,
-                                          nBase2Exponent,
-                                          Mantissa,
-                                          bIsNegative);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissaToMapSZ(QCBOREncodeContext *pMe,
-                                           const char         *szLabel,
-                                           const uint8_t       uTagRequirement,
-                                           const UsefulBufC    Mantissa,
-                                           const bool          bIsNegative,
-                                           const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigFloatBigMantissa(pMe,
-                                       uTagRequirement,
-                                       Mantissa,
-                                       bIsNegative,
-                                       nBase2Exponent);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissaToMapN(QCBOREncodeContext *pMe,
-                                          const int64_t       nLabel,
-                                          const uint8_t       uTagRequirement,
-                                          const UsefulBufC    Mantissa,
-                                          const bool          bIsNegative,
-                                          const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigFloatBigMantissa(pMe,
-                                       uTagRequirement,
-                                       Mantissa,
-                                       bIsNegative,
-                                       nBase2Exponent);
-}
-
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissaRaw(QCBOREncodeContext *pMe,
-                                       const uint8_t       uTagRequirement,
-                                       const UsefulBufC    Mantissa,
-                                       const bool          bIsNegative,
-                                       const int64_t       nBase2Exponent)
-{
-   QCBOREncode_Private_AddTExpBigMantissaRaw(pMe,
-                                             uTagRequirement,
-                                             CBOR_TAG_BIGFLOAT,
-                                             nBase2Exponent,
-                                             Mantissa,
-                                             bIsNegative);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(QCBOREncodeContext *pMe,
-                                              const char         *szLabel,
-                                              const uint8_t       uTagRequirement,
-                                              const UsefulBufC    Mantissa,
-                                              const bool          bIsNegative,
-                                              const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
-                                          uTagRequirement,
-                                          Mantissa,
-                                          bIsNegative,
-                                          nBase2Exponent);
-}
-
-static inline void
-QCBOREncode_AddTBigFloatBigMantissaRawToMapN(QCBOREncodeContext *pMe,
-                                             const int64_t       nLabel,
-                                             const uint8_t       uTagRequirement,
-                                             const UsefulBufC    Mantissa,
-                                             const bool          bIsNegative,
-                                             const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
-                                          uTagRequirement,
-                                          Mantissa,
-                                          bIsNegative,
-                                          nBase2Exponent);
-}
-
-#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
-
-
-static inline void
-QCBOREncode_AddTURI(QCBOREncodeContext *pMe,
-                    const uint8_t       uTagRequirement,
-                    const UsefulBufC    URI)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_URI);
-   }
-   QCBOREncode_AddText(pMe, URI);
-}
-
-static inline void
-QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pMe,
-                           const char         *szLabel,
-                           const uint8_t       uTagRequirement,
-                           const UsefulBufC    URI)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
-}
-
-static inline void
-QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pMe,
-                          const int64_t       nLabel,
-                          const uint8_t       uTagRequirement,
-                          const UsefulBufC    URI)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
-}
-
-static inline void
-QCBOREncode_AddURI(QCBOREncodeContext *pMe, const UsefulBufC URI)
-{
-   QCBOREncode_AddTURI(pMe, QCBOR_ENCODE_AS_TAG, URI);
-}
-
-static inline void
-QCBOREncode_AddURIToMap(QCBOREncodeContext *pMe,
-                        const char         *szLabel,
-                        const UsefulBufC    URI)
-{
-   QCBOREncode_AddTURIToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, URI);
-}
-
-static inline void
-QCBOREncode_AddURIToMapN(QCBOREncodeContext *pMe,
-                         const int64_t       nLabel,
-                         const UsefulBufC    URI)
-{
-   QCBOREncode_AddTURIToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, URI);
-}
-
-
-
-static inline void
-QCBOREncode_AddTB64Text(QCBOREncodeContext *pMe,
-                        const uint8_t       uTagRequirement,
-                        const UsefulBufC    B64Text)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_B64);
-   }
-   QCBOREncode_AddText(pMe, B64Text);
-}
-
-static inline void
-QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pMe,
-                               const char         *szLabel,
-                               const uint8_t       uTagRequirement,
-                               const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
-}
-
-static inline void
-QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pMe,
-                              const int64_t       nLabel,
-                              const uint8_t       uTagRequirement,
-                              const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64Text(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
-{
-   QCBOREncode_AddTB64Text(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pMe,
-                            const char         *szLabel,
-                            const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddTB64TextToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pMe,
-                             const int64_t       nLabel,
-                             const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddTB64TextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
-}
-
-
-
-static inline void
-QCBOREncode_AddTB64URLText(QCBOREncodeContext *pMe,
-                           const uint8_t       uTagRequirement,
-                           const UsefulBufC    B64Text)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_B64URL);
-   }
-   QCBOREncode_AddText(pMe, B64Text);
-}
-
-static inline void
-QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pMe,
-                                  const char         *szLabel,
-                                  const uint8_t       uTagRequirement,
-                                  const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
-}
-
-static inline void
-QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pMe,
-                                 const int64_t       nLabel,
-                                 const uint8_t       uTagRequirement,
-                                 const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64URLText(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
-{
-   QCBOREncode_AddTB64URLText(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pMe,
-                               const char         *szLabel,
-                               const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddTB64URLTextToMapSZ(pMe,
-                                     szLabel,
-                                     QCBOR_ENCODE_AS_TAG,
-                                     B64Text);
-}
-
-static inline void
-QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pMe,
-                                const int64_t       nLabel,
-                                const UsefulBufC    B64Text)
-{
-   QCBOREncode_AddTB64URLTextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
-}
-
-
-
-static inline void
-QCBOREncode_AddTRegex(QCBOREncodeContext *pMe,
-                      const uint8_t       uTagRequirement,
-                      const UsefulBufC    Bytes)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_REGEX);
-   }
-   QCBOREncode_AddText(pMe, Bytes);
-}
-
-static inline void
-QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const uint8_t       uTagRequirement,
-                             const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
-}
-
-static inline void
-QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pMe,
-                            const int64_t       nLabel,
-                            const uint8_t       uTagRequirement,
-                            const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
-}
-
-static inline void
-QCBOREncode_AddRegex(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
-{
-   QCBOREncode_AddTRegex(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
-}
-
-static inline void
-QCBOREncode_AddRegexToMap(QCBOREncodeContext *pMe,
-                          const char         *szLabel,
-                          const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddTRegexToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
-}
-
-static inline void
-QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pMe,
-                           const int64_t       nLabel,
-                           const UsefulBufC    Bytes)
-{
-   QCBOREncode_AddTRegexToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, Bytes);
-
-}
-
-
-static inline void
-QCBOREncode_AddTMIMEData(QCBOREncodeContext *pMe,
-                         const uint8_t       uTagRequirement,
-                         const UsefulBufC    MIMEData)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_BINARY_MIME);
-   }
-   QCBOREncode_AddBytes(pMe, MIMEData);
-}
-
-static inline void
-QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pMe,
-                                const char         *szLabel,
-                                const uint8_t       uTagRequirement,
-                                const UsefulBufC    MIMEData)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
-}
-
-static inline void
-QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pMe,
-                               const int64_t       nLabel,
-                               const uint8_t       uTagRequirement,
-                               const UsefulBufC    MIMEData)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
-}
-
-static inline void
-QCBOREncode_AddMIMEData(QCBOREncodeContext *pMe, UsefulBufC MIMEData)
-{
-   QCBOREncode_AddTMIMEData(pMe, QCBOR_ENCODE_AS_TAG, MIMEData);
-}
-
-static inline void
-QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const UsefulBufC    MIMEData)
-{
-   QCBOREncode_AddTMIMEDataToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
-}
-
-static inline void
-QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pMe,
-                              const int64_t       nLabel,
-                              const UsefulBufC    MIMEData)
-{
-   QCBOREncode_AddTMIMEDataToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
-}
-
-
-static inline void
-QCBOREncode_AddTDateString(QCBOREncodeContext *pMe,
-                           const uint8_t       uTagRequirement,
-                           const char         *szDate)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DATE_STRING);
-   }
-   QCBOREncode_AddSZString(pMe, szDate);
-}
-
-static inline void
-QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pMe,
-                                  const char         *szLabel,
-                                  const uint8_t       uTagRequirement,
-                                  const char         *szDate)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
-}
-
-static inline void
-QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pMe,
-                                 const int64_t       nLabel,
-                                 const uint8_t       uTagRequirement,
-                                 const char         *szDate)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
-}
-
-static inline void
-QCBOREncode_AddDateString(QCBOREncodeContext *pMe, const char *szDate)
-{
-   QCBOREncode_AddTDateString(pMe, QCBOR_ENCODE_AS_TAG, szDate);
-}
-
-static inline void
-QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pMe,
-                               const char         *szLabel,
-                               const char         *szDate)
-{
-   QCBOREncode_AddTDateStringToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, szDate);
-}
-
-static inline void
-QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pMe,
-                                const int64_t       nLabel,
-                                const char         *szDate)
-{
-   QCBOREncode_AddTDateStringToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, szDate);
-}
-
-
-static inline void
-QCBOREncode_AddTDaysString(QCBOREncodeContext *pMe,
-                           const uint8_t       uTagRequirement,
-                           const char         *szDate)
-{
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DAYS_STRING);
-   }
-   QCBOREncode_AddSZString(pMe, szDate);
-}
-
-static inline void
-QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pMe,
-                                  const char         *szLabel,
-                                  const uint8_t       uTagRequirement,
-                                  const char         *szDate)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
-}
-
-static inline void
-QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pMe,
-                                 const int64_t       nLabel,
-                                 const uint8_t       uTagRequirement,
-                                 const char         *szDate)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
-}
-
-
-static inline void
-QCBOREncode_AddSimple(QCBOREncodeContext *pMe, const uint8_t uNum)
-{
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE) {
-      if(uNum < CBOR_SIMPLEV_FALSE || uNum > CBOR_SIMPLEV_NULL) {
-         pMe->uError = QCBOR_ERR_NOT_PREFERRED;
-         return;
-      }
-   }
-   /* This check often is optimized out because uNum is known at compile time. */
-   if(uNum >= CBOR_SIMPLEV_RESERVED_START && uNum <= CBOR_SIMPLEV_RESERVED_END) {
-      pMe->uError = QCBOR_ERR_ENCODE_UNSUPPORTED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   QCBOREncode_Private_AddType7(pMe, 0, uNum);
-}
-
-static inline void
-QCBOREncode_AddSimpleToMapSZ(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const uint8_t       uSimple)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddSimple(pMe, uSimple);
-}
-
-static inline void
-QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pMe,
-                           const char         *szLabel,
-                           const uint8_t       uSimple)
-{
-   QCBOREncode_AddSimpleToMapSZ(pMe, szLabel, uSimple);
-}
-
-static inline void
-QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pMe,
-                            const int64_t       nLabel,
-                            const uint8_t       uSimple)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddSimple(pMe, uSimple);
-}
-
-
-static inline void
-QCBOREncode_AddBool(QCBOREncodeContext *pMe, const bool b)
-{
-   uint8_t uSimple = CBOR_SIMPLEV_FALSE;
-   if(b) {
-      uSimple = CBOR_SIMPLEV_TRUE;
-   }
-   QCBOREncode_AddSimple(pMe, uSimple);
-}
-
-static inline void
-QCBOREncode_AddBoolToMapSZ(QCBOREncodeContext *pMe, const char *szLabel, const bool b)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddBool(pMe, b);
-}
-
-static inline void
-QCBOREncode_AddBoolToMap(QCBOREncodeContext *pMe, const char *szLabel, bool b)
-{
-   QCBOREncode_AddBoolToMapSZ(pMe, szLabel, b);
-}
-
-static inline void
-QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pMe, const int64_t nLabel, const bool b)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddBool(pMe, b);
-}
-
-
-static inline void
-QCBOREncode_AddNULL(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_NULL);
-}
-
-static inline void
-QCBOREncode_AddNULLToMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddNULL(pMe);
-}
-
-static inline void
-QCBOREncode_AddNULLToMap(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddNULLToMapSZ(pMe, szLabel);
-}
-
-static inline void
-QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddNULL(pMe);
-}
-
-
-static inline void
-QCBOREncode_AddUndef(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_UNDEF);
-}
-
-static inline void
-QCBOREncode_AddUndefToMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddUndef(pMe);
-}
-
-static inline void
-QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel)
-{
-   QCBOREncode_AddUndefToMapSZ(pCtx, szLabel);
-}
-
-static inline void
-QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddUndef(pMe);
-}
-
-
-static inline void
-QCBOREncode_OpenArray(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
-}
-
-static inline void
-QCBOREncode_OpenArrayInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_OpenArray(pMe);
-}
-
-static inline void
-QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_OpenArrayInMapSZ(pMe, szLabel);
-}
-
-
-static inline void
-QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pMe,  const int64_t nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_OpenArray(pMe);
-}
-
-
-static inline void
-QCBOREncode_CloseArray(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_CloseMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
-}
-
-
-static inline void
-QCBOREncode_OpenMap(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_MAP);
-}
-
-static inline void
-QCBOREncode_OpenMapInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_OpenMap(pMe);
-}
-
-static inline void
-QCBOREncode_OpenMapInMap(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_OpenMapInMapSZ(pMe, szLabel);
-}
-
-static inline void
-QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_OpenMap(pMe);
-}
-
-static inline void
-QCBOREncode_CloseMap(QCBOREncodeContext *pMe)
-{
-   (pMe->pfnCloseMap)(pMe);
-}
-
-static inline void
-QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
-}
-
-static inline void
-QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(QCBOREncodeContext *pMe,
-                                           const char         *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_OpenArrayIndefiniteLength(pMe);
-}
-
-static inline void
-QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pMe,
-                                           const char         *szLabel)
-{
-   QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(pMe, szLabel);
-}
-
-static inline void
-QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
-                                            const int64_t       nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_OpenArrayIndefiniteLength(pMe);
-}
-
-static inline void
-QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
-}
-
-
-static inline void
-QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
-}
-
-static inline void
-QCBOREncode_OpenMapIndefiniteLengthInMapSZ(QCBOREncodeContext *pMe,
-                                           const char         *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_OpenMapIndefiniteLength(pMe);
-}
-
-static inline void
-QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pMe,
-                                         const char         *szLabel)
-{
-   QCBOREncode_OpenMapIndefiniteLengthInMapSZ(pMe, szLabel);
-}
-
-static inline void
-QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
-                                          const int64_t       nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_OpenMapIndefiniteLength(pMe);
-}
-
-static inline void
-QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
-}
-
-
-static inline void
-QCBOREncode_BstrWrap(QCBOREncodeContext *pMe)
-{
-   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_BYTE_STRING);
-}
-
-static inline void
-QCBOREncode_BstrWrapInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_BstrWrap(pMe);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pMe, const char *szLabel)
-{
-   QCBOREncode_BstrWrapInMapSZ(pMe, szLabel);
-}
-
-static inline void
-QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_BstrWrap(pMe);
-}
-
-static inline void
-QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pMe, UsefulBufC *pWrappedCBOR)
-{
-   QCBOREncode_CloseBstrWrap2(pMe, true, pWrappedCBOR);
-}
-
-
-
-static inline void
-QCBOREncode_AddEncodedToMapSZ(QCBOREncodeContext *pMe,
-                            const char         *szLabel,
-                            const UsefulBufC    Encoded)
-{
-   QCBOREncode_AddSZString(pMe, szLabel);
-   QCBOREncode_AddEncoded(pMe, Encoded);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Encoded)
-{
-   QCBOREncode_AddEncodedToMapSZ(pMe, szLabel, Encoded);
-}
-
-static inline void
-QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pMe,
-                             const int64_t       nLabel,
-                             const UsefulBufC    Encoded)
-{
-   QCBOREncode_AddInt64(pMe, nLabel);
-   QCBOREncode_AddEncoded(pMe, Encoded);
-}
-
-
-static inline int
-QCBOREncode_IsBufferNULL(QCBOREncodeContext *pMe)
-{
-   return UsefulOutBuf_IsBufferNULL(&(pMe->OutBuf));
-}
-
-
-static inline UsefulBuf
-QCBOREncode_RetrieveOutputStorage(QCBOREncodeContext *pMe)
-{
-   return UsefulOutBuf_RetrieveOutputStorage(&(pMe->OutBuf));
-}
-
-
-static inline QCBORError
-QCBOREncode_GetErrorState(QCBOREncodeContext *pMe)
-{
-   if(UsefulOutBuf_GetError(&(pMe->OutBuf))) {
-      /* Items didn't fit in the buffer. This check catches this
-       * condition for all the appends and inserts so checks aren't
-       * needed when the appends and inserts are performed.  And of
-       * course UsefulBuf will never overrun the input buffer given to
-       * it. No complex analysis of the error handling in this file is
-       * needed to know that is true. Just read the UsefulBuf code.
-       */
-      pMe->uError = QCBOR_ERR_BUFFER_TOO_SMALL;
-      /* QCBOR_ERR_BUFFER_TOO_SMALL masks other errors, but that is
-       * OK. Once the caller fixes this, they'll be unmasked.
-       */
-   }
-
-   return (QCBORError)pMe->uError;
-}
-
-
-static inline size_t
-QCBOREncode_Tell(QCBOREncodeContext *pMe)
-{
-   return UsefulOutBuf_GetEndPosition(&(pMe->OutBuf));
-}
-
-
-/* ======================================================================== *
- *    END OF PRIVATE INLINE IMPLEMENTATION                                  *
- * ======================================================================== */
-
-
-
-
-/* ========================================================================= *
- *    BEGINNING OF INLINES FOR DEPRECATED FUNCTIONS                          *
- * ========================================================================= */
-
-
-static inline void /* Deprecated */
-QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pMe,
-                               const uint8_t       uTagRequirement,
-                               const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pMe,
-                                      const char         *szLabel,
-                                      const uint8_t       uTagRequirement,
-                                      const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, uTagRequirement, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pMe,
-                                     const int64_t       nLabel,
-                                     const uint8_t       uTagRequirement,
-                                     const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, uTagRequirement, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pMe, const UsefulBufC BigNumber)
-{
-   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pMe,
-                                   const char         *szLabel,
-                                   const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pMe,
-                                    const int64_t       nLabel,
-                                    const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, false, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pMe,
-                               const uint8_t       uTagRequirement,
-                               const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, true, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pMe,
-                                      const char         *szLabel,
-                                      const uint8_t       uTagRequirement,
-                                      const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapSZ(pMe,
-                                       szLabel,
-                                       uTagRequirement,
-                                       true,
-                                       BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pMe,
-                                     const int64_t       nLabel,
-                                     const uint8_t       uTagRequirement,
-                                     const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapN(pMe,
-                                      nLabel,
-                                      uTagRequirement,
-                                      true,
-                                      BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pMe, const UsefulBufC BigNumber)
-{
-   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, true, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pMe,
-                                   const char         *szLabel,
-                                   const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, true, BigNumber);
-}
-
-static inline void  /* Deprecated */
-QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pMe,
-                                    const int64_t       nLabel,
-                                    const UsefulBufC    BigNumber)
-{
-   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, true, BigNumber);
-
-}
-
-#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pMe,
-                               const int64_t       nMantissa,
-                               const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFraction(pMe,
-                                   QCBOR_ENCODE_AS_TAG,
-                                   nMantissa,
-                                   nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pMe,
-                                    const char         *szLabel,
-                                    const int64_t       nMantissa,
-                                    const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionToMapSZ(pMe,
-                                          szLabel,
-                                          QCBOR_ENCODE_AS_TAG,
-                                          nMantissa,
-                                          nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pMe,
-                                     const int64_t       nLabel,
-                                     const int64_t       nMantissa,
-                                     const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionToMapN(pMe,
-                                         nLabel,
-                                         QCBOR_ENCODE_AS_TAG,
-                                         nMantissa,
-                                         nBase10Exponent);
-}
-
-
-static inline void /* Deprecated */
-QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pMe,
-                                      const uint8_t       uTagRequirement,
-                                      const UsefulBufC    Mantissa,
-                                      const bool          bIsNegative,
-                                      const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
-                                                 uTagRequirement,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase10Exponent);
-}
-
-
-static inline void /* Deprecated */
-QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
-                                             const char         *szLabel,
-                                             const uint8_t       uTagRequirement,
-                                             const UsefulBufC    Mantissa,
-                                             const bool          bIsNegative,
-                                             const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(pMe,
-                                                        szLabel,
-                                                        uTagRequirement,
-                                                        Mantissa,
-                                                        bIsNegative,
-                                                        nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
-                                            const int64_t       nLabel,
-                                            const uint8_t       uTagRequirement,
-                                            const UsefulBufC    Mantissa,
-                                            const bool          bIsNegative,
-                                            const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(pMe,
-                                                       nLabel,
-                                                       uTagRequirement,
-                                                       Mantissa,
-                                                       bIsNegative,
-                                                       nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pMe,
-                                     const UsefulBufC    Mantissa,
-                                     const bool          bIsNegative,
-                                     const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
-                                                 QCBOR_ENCODE_AS_TAG,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
-                                            const char         *szLabel,
-                                            const UsefulBufC    Mantissa,
-                                            const bool          bIsNegative,
-                                            const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(pMe,
-                                                        szLabel,
-                                                        QCBOR_ENCODE_AS_TAG,
-                                                        Mantissa,
-                                                        bIsNegative,
-                                                        nBase10Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
-                                           const int64_t       nLabel,
-                                           const UsefulBufC    Mantissa,
-                                           const bool          bIsNegative,
-                                           const int64_t       nBase10Exponent)
-{
-   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(pMe,
-                                                       nLabel,
-                                                       QCBOR_ENCODE_AS_TAG,
-                                                       Mantissa,
-                                                       bIsNegative,
-                                                       nBase10Exponent);
-}
-
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloat(QCBOREncodeContext *pMe,
-                        const int64_t       nMantissa,
-                        const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloat(pMe,
-                            QCBOR_ENCODE_AS_TAG,
-                            nMantissa,
-                            nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pMe,
-                             const char         *szLabel,
-                             const int64_t       nMantissa,
-                             const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatToMapSZ(pMe,
-                                   szLabel,
-                                   QCBOR_ENCODE_AS_TAG,
-                                   nMantissa,
-                                   nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pMe,
-                              const int64_t       nLabel,
-                              const int64_t       nMantissa,
-                              const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatToMapN(pMe,
-                                  nLabel,
-                                  QCBOR_ENCODE_AS_TAG,
-                                  nMantissa,
-                                  nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pMe,
-                               const uint8_t       uTagRequirement,
-                               const UsefulBufC    Mantissa,
-                               const bool          bIsNegative,
-                               const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
-                                          uTagRequirement,
-                                          Mantissa,
-                                          bIsNegative,
-                                          nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pMe,
-                                      const char         *szLabel,
-                                      const uint8_t       uTagRequirement,
-                                      const UsefulBufC    Mantissa,
-                                      const bool          bIsNegative,
-                                      const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(pMe,
-                                                 szLabel,
-                                                 uTagRequirement,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
-                                     const int64_t       nLabel,
-                                     const uint8_t       uTagRequirement,
-                                     const UsefulBufC    Mantissa,
-                                     const bool          bIsNegative,
-                                     const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRawToMapN(pMe,
-                                                nLabel,
-                                                uTagRequirement,
-                                                Mantissa,
-                                                bIsNegative,
-                                                nBase2Exponent);
-}
-
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pMe,
-                              const UsefulBufC    Mantissa,
-                              const bool          bIsNegative,
-                              const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
-                                          QCBOR_ENCODE_AS_TAG,
-                                          Mantissa,
-                                          bIsNegative,
-                                          nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pMe,
-                                   const char         *szLabel,
-                                   const UsefulBufC    Mantissa,
-                                   const bool          bIsNegative,
-                                   const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(pMe,
-                                                 szLabel,
-                                                 QCBOR_ENCODE_AS_TAG,
-                                                 Mantissa,
-                                                 bIsNegative,
-                                                 nBase2Exponent);
-}
-
-static inline void /* Deprecated */
-QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
-                                    const int64_t       nLabel,
-                                    const UsefulBufC    Mantissa,
-                                    const bool          bIsNegative,
-                                    const int64_t       nBase2Exponent)
-{
-   QCBOREncode_AddTBigFloatBigMantissaRawToMapN(pMe,
-                                                nLabel,
-                                                QCBOR_ENCODE_AS_TAG,
-                                                Mantissa,
-                                                bIsNegative,
-                                                nBase2Exponent);
-}
-
-#endif /* ! QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
-
-/* ========================================================================= *
- *    END OF INLINES FOR DEPRECATED FUNCTIONS                                *
- * ========================================================================= */
-
-
-#ifdef __cplusplus
-}
-#endif
+#include "qcbor/qcbor_main_encode.h"
+#include "qcbor/qcbor_number_encode.h"
+#include "qcbor/qcbor_tag_encode.h"
 
 #endif /* qcbor_encode_h */
diff --git a/inc/qcbor/qcbor_main_encode.h b/inc/qcbor/qcbor_main_encode.h
new file mode 100644
index 0000000..9b4396d
--- /dev/null
+++ b/inc/qcbor/qcbor_main_encode.h
@@ -0,0 +1,2122 @@
+/* ===========================================================================
+ * Copyright (c) 2016-2018, The Linux Foundation.
+ * Copyright (c) 2018-2024, Laurence Lundblade.
+ * Copyright (c) 2021, Arm Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors, nor the name "Laurence Lundblade" may be used to
+ *       endorse or promote products derived from this software without
+ *       specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ========================================================================= */
+
+#ifndef qcbor_main_encode_h
+#define qcbor_main_encode_h
+
+
+#include "qcbor/qcbor_common.h"
+#include "qcbor/qcbor_private.h"
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} // Keep editor indention formatting happy
+#endif
+#endif
+
+
+/**
+ * @file qcbor_main_encode.h
+ *
+ * @anchor Overview
+ *
+ * # QCBOR Overview
+ *
+ * This implements CBOR -- Concise Binary Object Representation as
+ * defined in [RFC 8949] (https://www.rfc-editor.org/rfc/rfc8949.html).
+ * More information is at http://cbor.io.  This is a near-complete
+ * implementation of the specification. [RFC 8742]
+ * (https://www.rfc-editor.org/rfc/rfc8742.html) CBOR Sequences is
+ * also supported. Limitations are listed further down.
+ *
+ * See @ref Encoding for general discussion on encoding,
+ * @ref BasicDecode for general discussion on the basic decode features
+ * and @ref SpiffyDecode for general discussion on the easier-to-use
+ * decoder functions.
+ *
+ * CBOR is intentionally designed to be translatable to JSON, but not
+ * all CBOR can convert to JSON. See RFC 8949 for more info on how to
+ * construct CBOR that is the most JSON friendly.
+ *
+ * The memory model for encoding and decoding is that encoded CBOR must
+ * be in a contiguous buffer in memory.  During encoding the caller must
+ * supply an output buffer and if the encoding would go off the end of
+ * the buffer an error is returned.  During decoding the caller supplies
+ * the encoded CBOR in a contiguous buffer and the decoder returns
+ * pointers and lengths into that buffer for strings.
+ *
+ * This implementation does not require malloc. All data structures
+ * passed in/out of the APIs can fit on the stack.
+ *
+ * Decoding of indefinite-length strings is a special case that requires
+ * a "string allocator" to allocate memory into which the segments of
+ * the string are coalesced. Without this, decoding will error out if an
+ * indefinite-length string is encountered (indefinite-length maps and
+ * arrays do not require the string allocator). A simple string
+ * allocator called MemPool is built-in and will work if supplied with a
+ * block of memory to allocate. The string allocator can optionally use
+ * malloc() or some other custom scheme.
+ *
+ * Here are some terms and definitions:
+ *
+ * - "Item", "Data Item": An integer or string or such. The basic "thing" that
+ * CBOR is about. An array is an item itself that contains some items.
+ *
+ * - "Array": An ordered sequence of items, the same as JSON.
+ *
+ * - "Map": A collection of label/value pairs. Each pair is a data
+ * item. A JSON "object" is the same as a CBOR "map".
+ *
+ * - "Label": The data item in a pair in a map that names or identifies
+ * the pair, not the value. This implementation refers to it as a
+ * "label".  JSON refers to it as the "name". The CBOR RFC refers to it
+ * this as a "key".  This implementation chooses label instead because
+ * key is too easily confused with a cryptographic key. The COSE
+ * standard, which uses CBOR, has also chosen to use the term "label"
+ * rather than "key" for this same reason.
+ *
+ * - "Key": See "Label" above.
+ *
+ * - "Tag": A data item that is an explicitly labeled new data
+ * type made up of the tagging integer and the tag content.
+ * See @ref Tags-Overview and @ref Tag-Usage.
+ *
+ * - "Initial Byte": The first byte of an encoded item. Encoding and
+ * decoding of this byte is taken care of by the implementation.
+ *
+ * - "Additional Info": In addition to the major type, all data items
+ * have some other info. This is usually the length of the data but can
+ * be several other things. Encoding and decoding of this is taken care
+ * of by the implementation.
+ *
+ * CBOR has two mechanisms for tagging and labeling the data values like
+ * integers and strings. For example, an integer that represents
+ * someone's birthday in epoch seconds since Jan 1, 1970 could be
+ * encoded like this:
+ *
+ * - First it is CBOR_MAJOR_TYPE_POSITIVE_INT (@ref QCBOR_TYPE_INT64),
+ * the primitive positive integer.
+ *
+ * - Next it has a "tag" @ref CBOR_TAG_DATE_EPOCH indicating the integer
+ * represents a date in the form of the number of seconds since Jan 1,
+ * 1970.
+ *
+ * - Last it has a string "label" like "BirthDate" indicating the
+ * meaning of the data.
+ *
+ * The encoded binary looks like this:
+ *
+ *      a1                      # Map of 1 item
+ *         69                   # Indicates text string of 9 bytes
+ *           426972746844617465 # The text "BirthDate"
+ *        c1                    # Tags next integer as epoch date
+ *           1a                 # Indicates a 4-byte integer
+ *               580d4172       # unsigned integer date 1477263730
+ *
+ * Implementors using this API will primarily work with
+ * labels. Generally, tags are only needed for making up new data
+ * types. This implementation covers most of the data types defined in
+ * the RFC using tags. It also, allows for the use of custom tags if
+ * necessary.
+ *
+ * This implementation explicitly supports labels that are text strings
+ * and integers. Text strings translate nicely into JSON objects and are
+ * very readable.  Integer labels are much less readable but can be very
+ * compact. If they are in the range of 0 to 23, they take up only one
+ * byte.
+ *
+ * CBOR allows a label to be any type of data including an array or a
+ * map. It is possible to use this API to construct and parse such
+ * labels, but it is not explicitly supported.
+ *
+ * @anchor Encoding
+ *
+ * ## Encoding
+ *
+ * A common encoding usage mode is to invoke the encoding twice. First
+ * with the output buffer as @ref SizeCalculateUsefulBuf to compute the
+ * length of the needed output buffer. The correct sized output buffer
+ * is allocated. The encoder is invoked a second time with the allocated
+ * output buffer.
+ *
+ * The double invocation is not required if the maximum output buffer
+ * size can be predicted. This is usually possible for simple CBOR
+ * structures.
+ *
+ * If a buffer too small to hold the encoded output is given, the error
+ * @ref QCBOR_ERR_BUFFER_TOO_SMALL will be returned. Data will never be
+ * written off the end of the output buffer no matter which functions
+ * here are called or what parameters are passed to them.
+ *
+ * The encoding error handling is simple. The only possible errors are
+ * trying to encode structures that are too large or too complex. There
+ * are no internal malloc calls so there will be no failures for out of
+ * memory.  The error state is tracked internally, so there is no need
+ * to check for errors when encoding. Only the return code from
+ * QCBOREncode_Finish() need be checked as once an error happens, the
+ * encoder goes into an error state and calls to it to add more data
+ * will do nothing. An error check is not needed after every data item
+ * is added.
+ *
+ * Encoding generally proceeds by calling QCBOREncode_Init(), calling
+ * lots of @c QCBOREncode_AddXxx() functions and calling
+ * QCBOREncode_Finish(). There are many @c QCBOREncode_AddXxx()
+ * functions for various data types. The input buffers need only to be
+ * valid during the @c QCBOREncode_AddXxx() calls as the data is copied
+ * into the output buffer.
+ *
+ * There are three `Add` functions for each data type. The first / main
+ * one for the type is for adding the data item to an array.  The second
+ * one's name ends in `ToMap`, is used for adding data items to maps and
+ * takes a string argument that is its label in the map. The third one
+ * ends in `ToMapN`, is also used for adding data items to maps, and
+ * takes an integer argument that is its label in the map.
+ *
+ * The simplest aggregate type is an array, which is a simple ordered
+ * set of items without labels the same as JSON arrays. Call
+ * QCBOREncode_OpenArray() to open a new array, then various @c
+ * QCBOREncode_AddXxx() functions to put items in the array and then
+ * QCBOREncode_CloseArray(). Nesting to the limit @ref
+ * QCBOR_MAX_ARRAY_NESTING is allowed.  All opens must be matched by
+ * closes or an encoding error will be returned.
+ *
+ * The other aggregate type is a map which does use labels. The `Add`
+ * functions that end in `ToMap` and `ToMapN` are convenient ways to add
+ * labeled data items to a map. You can also call any type of `Add`
+ * function once to add a label of any type and then call any type of
+ * `Add` again to add its value.
+ *
+ * Note that when you nest arrays or maps in a map, the nested array or
+ * map has a label.
+ *
+ * Many CBOR-based protocols start with an array or map. This makes
+ * them self-delimiting. No external length or end marker is needed to
+ * know the end. It is also possible not start this way, in which case
+ * this it is usually called a CBOR sequence which is described in
+ * [RFC 8742] (https://www.rfc-editor.org/rfc/rfc8742.html). This
+ * encoder supports either just by whether the first item added is an
+ * array, map or other.
+ *
+ * If QCBOR is compiled with QCBOR_DISABLE_ENCODE_USAGE_GUARDS defined,
+ * the errors QCBOR_ERR_CLOSE_MISMATCH, QCBOR_ERR_ARRAY_TOO_LONG,
+ * QCBOR_ERR_TOO_MANY_CLOSES, QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN, and
+ * QCBOR_ERR_ENCODE_UNSUPPORTED will never be returned. It is up to the
+ * caller to make sure that opened maps, arrays and byte-string wrapping
+ * is closed correctly and that QCBOREncode_AddType7() is called
+ * correctly.  With this defined, it is easier to make a mistake when
+ * authoring the encoding of a protocol that will output not well formed
+ * CBOR, but as long as the calling code is correct, it is safe to
+ * disable these checks. Bounds checking that prevents security issues
+ * in the code is still enforced. This define reduces the size of
+ * encoding object code by about 150 bytes.
+ *
+ * ## Limitations
+ *
+ * Summary limitations:
+ * - The entire encoded CBOR must fit into contiguous memory.
+ * - Max size of encoded CBOR data is a few bytes less than
+ *   @c UINT32_MAX (4GB).
+ * - Max array / map nesting level when encoding or decoding is
+ *   @ref QCBOR_MAX_ARRAY_NESTING (this is typically 15).
+ * - Max items in an array or map when encoding or decoding is
+ *   @ref QCBOR_MAX_ITEMS_IN_ARRAY (typically 65,536).
+ * - Does not directly support labels in maps other than text strings & integers.
+ * - Traversal, duplicate and sort order checking errors out for labels that are arrays or maps.
+ * - Does not directly support integer labels beyond whats fits in @c int64_t
+ *   or @c uint64_t.
+ * - Epoch dates limited to @c INT64_MAX (+/- 292 billion years).
+ * - Exponents for bigfloats and decimal integers are limited to whats fits in
+ *   @c int64_t.
+ * - Tags on labels are ignored during decoding.
+ * - The maximum tag nesting is @c QCBOR_MAX_TAGS_PER_ITEM (typically 4).
+ * - Works only on 32- and 64-bit CPUs.
+ * - QCBORDecode_EnterBstrWrapped() doesn't work on indefinite-length strings.
+ *
+ * The public interface uses @c size_t for all lengths. Internally the
+ * implementation uses 32-bit lengths by design to use less memory and
+ * fit structures on the stack. This limits the encoded CBOR it can
+ * work with to size @c UINT32_MAX (4GB).
+ *
+ * This implementation requires two's compliment integers. While
+ * C doesn't require two's compliment,  <stdint.h> does. Other
+ * parts of this implementation may also require two's compliment.
+ */
+
+
+/**
+ * The size of the buffer to be passed to QCBOREncode_EncodeHead(). It
+ * is one byte larger than sizeof(uint64_t) + 1, the actual maximum
+ * size of the head of a CBOR data item because
+ * QCBOREncode_EncodeHead() needs one extra byte to work.
+ */
+#define QCBOR_HEAD_BUFFER_SIZE  (sizeof(uint64_t) + 2)
+
+
+/**
+ * Output the full CBOR tag. See @ref CBORTags, @ref Tag-Usage and
+ * @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_TAG      0
+
+/**
+ * Output only the 'borrowed' content format for the relevant tag.
+ * See @ref CBORTags, @ref Tag-Usage and @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_BORROWED 1
+
+
+
+/**
+ * This enum is the bit flags for configuring the encoder for things
+ * like the sorting of maps.
+ */
+enum QCBOREncodeConfig {
+   /**
+    * This causes maps to be sorted per RFC 8949 section 4.2.1 .
+    * QCBOREncode_CloseMap() becomes equivalent to
+    * QCBOREncode_CloseAndSortMap(). This causes map closing to run
+    * much slower, but this is probably only of consequence in very
+    * constrained environments sorting large maps.
+    *
+    * Note that map sorting causese about 30% more code from the QCBOR
+    * library to be linked. Any call to QCBOREncode_Config(), even if
+    * sorting is not selected, will cause the sorting code to be
+    * linked.  See QCBOREncode_ConfigReduced() to avoid this.
+    */
+   QCBOR_ENCODE_CONFIG_SORT = 0x01,
+
+   /** By default QCBOR will error out when trying to encode a double
+    * or float NaN that has a payload because NaN payloads are not
+    * very interoperable. With this set, NaN payloads can be encoded.
+    *
+    */
+   QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD = 0x02,
+
+   /**
+    * This unifies the integer and floating-point number space such
+    * that there is only one way to encode any particular value. For
+    * example, 0 is always encoded as a type 0 positive integer, never
+    * as a 0.0 as a float or double. This unification never loses
+    * precision. For example, 1.000001 would not be reduced to the
+    * integer 1.
+    *
+    * This specification for this reduction comes from dCBOR. It is
+    * part of a deterministic encoding that that covers integer and
+    * float numbers.  This reduction doesn't cover other number
+    * representations like big numbers and big floats.
+    *
+    * See @ref QCBOR_ENCODE_CONFIG_DCBOR.
+    */
+   QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION = 0x04,
+
+   /** With this set, attempts to encode indefinite length text and
+    * byte strings, arrays and maps will error out. */
+   QCBOR_ENCODE_CONFIG_DISALLOW_INDEFINITE_LENGTHS = 0x08,
+
+   /** This disallows non-preferred floating number encoding,
+   QCBOREncode_AddFloatNoPreferred() and
+   QCBOREncode_AddDoubleNoPreferred().  It is not possible to disable
+   preferred serialization of type 0 and type 1 integers in QCBOR. */
+   QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS = 0x10,
+
+   /**
+    * This enforces a simple rule in dCBOR allows only the simple
+    * values true, false and null.  With this set, any other simple
+    * value will error out. See @ref QCBOR_ENCODE_CONFIG_DCBOR.
+    */
+   QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE = 0x20,
+
+   /** Preferred serialization requires number reduction of big
+    * numbers to type 0 and 1 integers. With this set an error will be
+    * set when trying to encode non-preferred big numbers with
+    * QCBOREncode_AddTBigNumberNoPreferred() or
+    * QCBOREncode_AddTBigNumberRaw(). */
+   QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS = 0x40, // TODO: test this one
+
+
+   /**
+    * Setting this mode will cause QCBOR to return an error if an
+    * attempt is made to use one of the methods that produce
+    * non-preferred serialization. It doesn't change anything else as
+    * QCBOR produces preferred serialization by default.
+    *
+    * The non-preferred methods are:
+    * QCBOREncode_AddFloatNoPreferred(),
+    * QCBOREncode_AddDoubleNoPreferred(),
+    * QCBOREncode_OpenArrayIndefiniteLength(),
+    * QCBOREncode_CloseArrayIndefiniteLength(),
+    * QCBOREncode_OpenMapIndefiniteLength(),
+    * QCBOREncode_CloseMapIndefiniteLength(), plus those derived from
+    * the above listed.
+    *
+    * This mode is just a user guard to prevent accidentally calling
+    * something that produces non-preferred serialization. It doesn't
+    * do anything but causes errors to occur on attempts to call the
+    * above listed functions. This does nothing if the library is
+    * compiled QCBOR_DISABLE_ENCODE_USAGE_GUARDS.
+    *
+    * See @ref Serialization. It is usually not necessary to set this
+    * mode, but there is usually no disadvantage to setting
+    * it. Preferred serialization is defined in RFC 8949, section 4.1.
+    */
+   QCBOR_ENCODE_CONFIG_PREFERRED =
+       QCBOR_ENCODE_CONFIG_DISALLOW_INDEFINITE_LENGTHS |
+       QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS |
+       QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS,
+
+   /**
+    * This causes QCBOR to produce CBOR Deterministic Encoding (CDE).
+    * With CDE, two distant unrelated CBOR encoders will produce
+    * exactly the same encoded CBOR for a given input.
+    *
+    * In addition to doing everything
+    * @ref QCBOR_ENCODE_CONFIG_PREFERRED does (including exclusion of
+    * indefinite lengths), this causes maps to be sorted. The map is
+    * sorted automatically when QCBOREncode_CloseMap() is called. See
+    * @ref QCBOR_ENCODE_CONFIG_SORT.
+    *
+    * See @ref Serialization. It is usually not necessary to set this
+    * mode as determinism is very rarely needed. However it will
+    * usually work with most protocols. CDE is defined in
+    * draft-ietf-cbor-cde and/or RFC 8949 section 4.2.
+    */
+   QCBOR_ENCODE_CONFIG_CDE = QCBOR_ENCODE_CONFIG_PREFERRED |
+                             QCBOR_ENCODE_CONFIG_SORT,
+
+   /**
+    * See draft-mcnally-deterministic-cbor.
+    *
+    * This is a superset of CDE. This function does everything
+    * QCBOREncode_SerializationCDE() does. Also it is a super set of
+    * preferred serialization and does everything
+    * QCBOREncode_SerializationPreferred() does.
+    *
+    * The main feature of dCBOR is that there is only one way to
+    * serialize a particular numeric value. This changes the behavior
+    * of functions that add floating-point numbers.  If the
+    * floating-point number is whole, it will be encoded as an
+    * integer, not a floating-point number.  0.000 will be encoded as
+    * 0x00. Precision is never lost in this conversion.
+    *
+    * dCBOR also disallows NaN payloads. QCBOR will allow NaN payloads
+    * if you pass a NaN to one of the floating-point encoding
+    * functions.  This mode forces all NaNs to the half-precision
+    * queit NaN.
+    *
+    * TODO: confirm and test NaN payload behavior dCBOR reduces all
+    * NaN payloads to half-precision quiet NaN
+    *
+    * dCBOR disallows use of any simple type other than true, false
+    * and NULL. In particular it disallows use of "undef" produced by
+    * QCBOREncode_AddUndef().
+    *
+    * See @ref Serialization. Set this mode only if the protocol you
+    * are implementing requires dCBOR. This mode is usually not
+    * compatible with protocols that don't use dCBOR. dCBOR is defined
+    * in draft-mcnally-deterministic-cbor.
+    */
+   QCBOR_ENCODE_CONFIG_DCBOR = QCBOR_ENCODE_CONFIG_CDE |
+                               QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION |
+                               QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE
+};
+
+
+
+
+/**
+ * QCBOREncodeContext is the data type that holds context for all the
+ * encoding functions. It is less than 200 bytes, so it can go on the
+ * stack. The contents are opaque, and the caller should not access
+ * internal members.  A context may be re used serially as long as it is
+ * re initialized.
+ */
+typedef struct _QCBOREncodeContext QCBOREncodeContext;
+
+
+/**
+ * Initialize the encoder.
+ *
+ * @param[in,out]  pCtx     The encoder context to initialize.
+ * @param[in]      Storage  The buffer into which the encoded result
+ *                          will be written.
+ *
+ * Call this once at the start of an encoding of some CBOR. Then call
+ * the many functions like QCBOREncode_AddInt64() and
+ * QCBOREncode_AddText() to add the different data items. Finally,
+ * call QCBOREncode_Finish() to get the pointer and length of the
+ * encoded result.
+ *
+ * The primary purpose of this function is to give the pointer and
+ * length of the output buffer into which the encoded CBOR will be
+ * written. This is done with a @ref UsefulBuf structure, which is
+ * just a pointer and length (it is equivalent to two parameters, one
+ * a pointer and one a length, but a little prettier).
+ *
+ * The output buffer can be allocated any way (malloc, stack,
+ * static). It is just some memory that QCBOR writes to. The length
+ * must be the length of the allocated buffer. QCBOR will never write
+ * past that length, but might write up to that length. If the buffer
+ * is too small, encoding will go into an error state and not write
+ * anything further.
+ *
+ * If allocating on the stack, the convenience macro
+ * UsefulBuf_MAKE_STACK_UB() can be used, but its use is not required.
+ *
+ * Since there is no reallocation or such, the output buffer must be
+ * correctly sized when passed in here. It is OK, but wasteful if it
+ * is too large. One way to pick the size is to figure out the maximum
+ * size that will ever be needed and hard code a buffer of that size.
+ *
+ * Another way to do it is to have QCBOR calculate it for you. To do
+ * this, pass @ref SizeCalculateUsefulBuf for @c Storage.  Then call
+ * all the functions to add the CBOR exactly as if encoding for
+ * real. Finally, call QCBOREncode_FinishGetSize().  Once the length
+ * is obtained, allocate a buffer of that size, call
+ * QCBOREncode_Init() again with the real buffer. Call all the add
+ * functions again and finally, QCBOREncode_Finish() to obtain the
+ * final result. This uses twice the CPU time, but that is usually not
+ * an issue.
+ *
+ * See QCBOREncode_Finish() for how the pointer and length for the
+ * encoded CBOR is returned.
+ *
+ * For practical purposes QCBOR can't output encoded CBOR larger than
+ * @c UINT32_MAX (4GB) even on 64-bit CPUs because the internal
+ * offsets used to track the start of an array/map are 32 bits to
+ * reduce the size of the encoding context.
+ *
+ * A @ref QCBOREncodeContext can be reused over and over as long as
+ * QCBOREncode_Init() is called before each use.
+ */
+void
+QCBOREncode_Init(QCBOREncodeContext *pCtx, UsefulBuf Storage);
+
+
+/**
+ * @brief Configure the encoder.
+ *
+ * @param[in] pCtx   The encoding context for mode set.
+ * @param[in] uConfig  See @ref QCBOREncodeConfig.
+ *
+ * QCBOR usually as needed without configuration.
+ *
+ * QCBOR encodes with preferred serialization by default
+ * but provides some explicit functions that don't. This
+ * can configure QCBOR to error if they are used. This can
+ * also be used to encode dCBOR.
+ *
+ * See @ref QCBOR_ENCODE_CONFIG_PREFERRED, @ref
+ * QCBOR_ENCODE_CONFIG_DCBOR, @ref QCBOR_ENCODE_CONFIG_SORT
+ * and such.
+ *
+ * Also see QCBOREncode_ConfigReduced() if you are concerned
+ * about the amount of linked.
+ */
+static void
+QCBOREncode_Config(QCBOREncodeContext *pCtx, enum QCBOREncodeConfig uConfig);
+
+
+/**
+ * @brief Configure the encoder, reduced object code.
+ *
+ * @param[in] pCtx   The encoding context for mode set.
+ * @param[in] uConfig  Bit flags for configuration options.
+ *
+ * This is the same as QCBOREncode_Config() except it can't
+ * configure anything to do with map sorting. That includes
+ * both @ref CDE and @ref dCBOR.
+ *
+ *
+ */
+static void
+QCBOREncode_ConfigReduced(QCBOREncodeContext *pCtx, enum QCBOREncodeConfig uConfig);
+
+
+
+
+/**
+ * @brief  Add a UTF-8 text string to the encoded output.
+ *
+ * @param[in] pCtx   The encoding context to add the text to.
+ * @param[in] Text   Pointer and length of text to add.
+ *
+ * The text passed in must be unencoded UTF-8 according to
+ * [RFC 3629] (https://www.rfc-editor.org/rfc/rfc3629.html). There is
+ * no NULL termination. The text is added as CBOR major type 3.
+ *
+ * If called with @c nBytesLen equal to 0, an empty string will be
+ * added. When @c nBytesLen is 0, @c pBytes may be @c NULL.
+ *
+ * Note that the restriction of the buffer length to a @c uint32_t is
+ * entirely intentional as this encoder is not capable of encoding
+ * lengths greater. This limit to 4GB for a text string should not be
+ * a problem.
+ *
+ * Text lines in Internet protocols (on the wire) are delimited by
+ * either a CRLF or just an LF. Officially many protocols specify
+ * CRLF, but implementations often work with either. CBOR type 3 text
+ * can be either line ending, even a mixture of both.
+ *
+ * Operating systems usually have a line end convention. Windows uses
+ * CRLF. Linux and MacOS use LF. Some applications on a given OS may
+ * work with either and some may not.
+ *
+ * The majority of use cases and CBOR protocols using type 3 text will
+ * work with either line ending. However, some use cases or protocols
+ * may not work with either in which case translation to and/or from
+ * the local line end convention, typically that of the OS, is
+ * necessary.
+ *
+ * QCBOR does no line ending translation for type 3 text when encoding
+ * and decoding.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddText(QCBOREncodeContext *pCtx, UsefulBufC Text);
+
+/** See QCBOREncode_AddText(). */
+static void
+QCBOREncode_AddTextToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text);
+
+/** See QCBOREncode_AddText(). */
+static void
+QCBOREncode_AddTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Text);
+
+
+/**
+ * @brief  Add a UTF-8 text string to the encoded output.
+ *
+ * @param[in] pCtx      The encoding context to add the text to.
+ * @param[in] szString  Null-terminated text to add.
+ *
+ * This works the same as QCBOREncode_AddText().
+ */
+static void
+QCBOREncode_AddSZString(QCBOREncodeContext *pCtx, const char *szString);
+
+/** See QCBOREncode_AddSZStringToMap(). */
+static void
+QCBOREncode_AddSZStringToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);
+
+/** See QCBOREncode_AddSZStringToMap(). */
+static void
+QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szString);
+
+
+/**
+ * @brief Add a byte string to the encoded output.
+ *
+ * @param[in] pCtx   The encoding context to add the bytes to.
+ * @param[in] Bytes  Pointer and length of the input data.
+ *
+ * Simply adds the bytes to the encoded output as CBOR major type 2.
+ *
+ * If called with @c Bytes.len equal to 0, an empty string will be
+ * added. When @c Bytes.len is 0, @c Bytes.ptr may be @c NULL.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
+
+/** See QCBOREncode_AddBytesToMap(). */
+static void
+QCBOREncode_AddBytesToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
+
+/** See QCBOREncode_AddBytesToMap(). */
+static void
+QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
+
+
+/**
+ * @brief Set up to write a byte string value directly to encoded output.
+ *
+ * @param[in] pCtx     The encoding context to add the bytes to.
+ * @param[out] pPlace  Pointer and length of place to write byte string value.
+ *
+ * QCBOREncode_AddBytes() is the normal way to encode a byte string.
+ * This is for special cases and by passes some of the pointer safety.
+ *
+ * The purpose of this is to output the bytes that make up a byte
+ * string value directly to the QCBOR output buffer so you don't need
+ * to have a copy of it in memory. This is particularly useful if the
+ * byte string is large, for example, the encrypted payload of a
+ * COSE_Encrypt message. The payload encryption algorithm can output
+ * directly to the encoded CBOR buffer, perhaps by making it the
+ * output buffer for some function (e.g. symmetric encryption) or by
+ * multiple writes.
+ *
+ * The pointer in @c pPlace is where to start writing. Writing is just
+ * copying bytes to the location by the pointer in @c pPlace.  Writing
+ * past the length in @c pPlace will be writing off the end of the
+ * output buffer.
+ *
+ * If there is no room in the output buffer @ref NULLUsefulBuf will be
+ * returned and there is no need to call QCBOREncode_CloseBytes().
+ *
+ * The byte string must be closed by calling QCBOREncode_CloseBytes().
+ *
+ * Warning: this bypasses some of the usual checks provided by QCBOR
+ * against writing off the end of the encoded output buffer.
+ */
+void
+QCBOREncode_OpenBytes(QCBOREncodeContext *pCtx, UsefulBuf *pPlace);
+
+/** See QCBOREncode_OpenBytesInMap(). */
+static void
+QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             UsefulBuf          *pPlace);
+
+/** See QCBOREncode_OpenBytesInMap(). */
+static void
+QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pCtx,
+                            int64_t             nLabel,
+                            UsefulBuf          *pPlace);
+
+
+/**
+ *  @brief Close out a byte string written directly to encoded output.
+ *
+ *  @param[in] pCtx      The encoding context to add the bytes to.
+ *  @param[out] uAmount  The number of bytes written, the length of the
+ *                       byte string.
+ *
+ * This closes out a call to QCBOREncode_OpenBytes().  This inserts a
+ * CBOR header at the front of the byte string value to make it a
+ * well-formed byte string.
+ *
+ * If there was no call to QCBOREncode_OpenBytes() then @ref
+ * QCBOR_ERR_TOO_MANY_CLOSES is set.
+ */
+void
+QCBOREncode_CloseBytes(QCBOREncodeContext *pCtx, size_t uAmount);
+
+
+/**
+ * @brief  Add a standard Boolean.
+ *
+ * @param[in] pCtx  The encoding context to add the Boolean to.
+ * @param[in] b     true or false from @c <stdbool.h>.
+ *
+ * Adds a Boolean value as CBOR major type 7.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddBool(QCBOREncodeContext *pCtx, bool b);
+
+/** See QCBOREncode_AddBoolToMap(). */
+static void
+QCBOREncode_AddBoolToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, bool b);
+
+/** See QCBOREncode_AddBoolToMap(). */
+static void
+QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, bool b);
+
+
+/**
+ * @brief  Add a NULL to the encoded output.
+ *
+ * @param[in] pCtx  The encoding context to add the NULL to.
+ *
+ * Adds the NULL value as CBOR major type 7.
+ *
+ * This NULL doesn't have any special meaning in CBOR such as a
+ * terminating value for a string or an empty value.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddNULL(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_AddNULL(). */
+static void
+QCBOREncode_AddNULLToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** See QCBOREncode_AddNULL(). */
+static void
+QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
+
+
+/**
+ * @brief  Add an "undef" to the encoded output.
+ *
+ * @param[in] pCtx  The encoding context to add the "undef" to.
+ *
+ * Adds the undef value as CBOR major type 7.
+ *
+ * Note that this value will not translate to JSON.
+ *
+ * "undef" doesn't have any special meaning in CBOR such as a
+ * terminating value for a string or an empty value.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddUndef(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_AddUndef(). */
+static void
+QCBOREncode_AddUndefToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** See QCBOREncode_AddUndef(). */
+static void
+QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
+
+
+/**
+ * @brief Add a simple value.
+ *
+ * @param[in] pCtx    The encode context.
+ * @param[in] uNum   The simple value.
+ *
+ * QCBOREncode_AddBool(), QCBOREncode_AddUndef() and
+ * QCBOREncode_AddNull() are preferred to this for the simple values
+ * defined in RFC 8949, but this can be used for them too.
+ *
+ * The main purpose of this is to add simple values beyond those in
+ * defined RFC 8949. Note that simple values must be registered with
+ * IANA. Those in the range of 0 to 19 must be standardized.  Those in
+ * the range of 32 to 255 do not require a standard, but must be
+ * publically specified. There is no range of values for proprietary
+ * use. See
+ * https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xhtml
+ */
+static void
+QCBOREncode_AddSimple(QCBOREncodeContext *pCtx, const uint8_t uNum);
+
+/** See QCBOREncode_AddSimple(). */
+static void
+QCBOREncode_AddSimpleToMapSZ(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             const uint8_t       uSimple);
+
+/** See QCBOREncode_AddSimple(). */
+static void
+QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pCtx,
+                            const int64_t       nLabel,
+                            const uint8_t       uSimple);
+
+
+/**
+ * @brief  Indicates that the next items added are in an array.
+ *
+ * @param[in] pCtx The encoding context to open the array in.
+ *
+ * Arrays are the basic CBOR aggregate or structure type. Call this
+ * function to start or open an array. Then call the various
+ * @c QCBOREncode_AddXxx() functions to add the items that go into the
+ * array. Then call QCBOREncode_CloseArray() when all items have been
+ * added. The data items in the array can be of any type and can be of
+ * mixed types.
+ *
+ * Nesting of arrays and maps is allowed and supported just by calling
+ * QCBOREncode_OpenArray() again before calling
+ * QCBOREncode_CloseArray().  While CBOR has no limit on nesting, this
+ * implementation does in order to keep it smaller and simpler.  The
+ * limit is @ref QCBOR_MAX_ARRAY_NESTING. This is the max number of
+ * times this can be called without calling
+ * QCBOREncode_CloseArray(). QCBOREncode_Finish() will return
+ * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP when it is called as this
+ * function just sets an error state and returns no value when this
+ * occurs.
+ *
+ * If you try to add more than @ref QCBOR_MAX_ITEMS_IN_ARRAY items to
+ * a single array or map, @ref QCBOR_ERR_ARRAY_TOO_LONG will be
+ * returned when QCBOREncode_Finish() is called.
+ *
+ * An array itself must have a label if it is being added to a map.
+ * Note that array elements do not have labels (but map elements do).
+ *
+ * An array itself may be tagged by calling QCBOREncode_AddTagNumber()
+ * before this call.
+ */
+static void
+QCBOREncode_OpenArray(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_OpenArray(). */
+static void
+QCBOREncode_OpenArrayInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** See QCBOREncode_OpenArray(). */
+static void
+QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pCtx,  int64_t nLabel);
+
+
+/**
+ * @brief Close an open array.
+ *
+ * @param[in] pCtx The encoding context to close the array in.
+ *
+ * The closes an array opened by QCBOREncode_OpenArray(). It reduces
+ * nesting level by one. All arrays (and maps) must be closed before
+ * calling QCBOREncode_Finish().
+ *
+ * When an error occurs as a result of this call, the encoder records
+ * the error and enters the error state. The error will be returned
+ * when QCBOREncode_Finish() is called.
+ *
+ * If this has been called more times than QCBOREncode_OpenArray(), then
+ * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when QCBOREncode_Finish()
+ * is called.
+ *
+ * If this is called and it is not an array that is currently open,
+ * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
+ * QCBOREncode_Finish() is called.
+ */
+static void
+QCBOREncode_CloseArray(QCBOREncodeContext *pCtx);
+
+
+
+
+/**
+ * @brief  Indicates that the next items added are in a map.
+ *
+ * @param[in] pCtx The encoding context to open the map in.
+ *
+ * See QCBOREncode_OpenArray() for more information, particularly
+ * error handling.
+ *
+ * CBOR maps are an aggregate type where each item in the map consists
+ * of a label and a value. They are similar to JSON objects.
+ *
+ * The value can be any CBOR type including another map.
+ *
+ * The label can also be any CBOR type, but in practice they are
+ * typically, integers as this gives the most compact output. They
+ * might also be text strings which gives readability and translation
+ * to JSON.
+ *
+ * Every @c QCBOREncode_AddXxx() call has one version that ends with
+ * @c InMap for adding items to maps with string labels and one that
+ * ends with @c InMapN that is for adding with integer labels.
+ *
+ * RFC 8949 uses the term "key" instead of "label".
+ *
+ * If you wish to use map labels that are neither integer labels nor
+ * text strings, then just call the QCBOREncode_AddXxx() function
+ * explicitly to add the label. Then call it again to add the value.
+ *
+ * See the [RFC 8949] (https://www.rfc-editor.org/rfc/rfc8949.html)
+ * for a lot more information on creating maps.
+ */
+static void
+QCBOREncode_OpenMap(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_OpenMap(). */
+static void
+QCBOREncode_OpenMapInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** See QCBOREncode_OpenMap(). */
+static void
+QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
+
+
+/**
+ * @brief Close an open map.
+ *
+ * @param[in] pCtx The encoding context to close the map in.
+ *
+ * This closes a map opened by QCBOREncode_OpenMap(). It reduces
+ * nesting level by one.
+ *
+ * When an error occurs as a result of this call, the encoder records
+ * the error and enters the error state. The error will be returned
+ * when QCBOREncode_Finish() is called.
+ *
+ * If this has been called more times than QCBOREncode_OpenMap(), then
+ * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
+ * QCBOREncode_Finish() is called.
+ *
+ * If this is called and it is not a map that is currently open,
+ * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
+ * QCBOREncode_Finish() is called.
+ */
+static void
+QCBOREncode_CloseMap(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Indicates that the next items added are in an indefinite length array.
+ *
+ * @param[in] pCtx The encoding context to open the array in.
+ *
+ * This is the same as QCBOREncode_OpenArray() except the array is
+ * indefinite length.
+ *
+ * This must be closed with QCBOREncode_CloseArrayIndefiniteLength().
+ */
+static void
+QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_OpenArrayIndefiniteLength(). */
+static void
+QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(QCBOREncodeContext *pCtx,
+                                             const char         *szLabel);
+
+/** See QCBOREncode_OpenArrayIndefiniteLength(). */
+static void
+QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
+                                            int64_t            nLabel);
+
+
+/**
+ * @brief Close an open indefinite length array.
+ *
+ * @param[in] pCtx The encoding context to close the array in.
+ *
+ * This is the same as QCBOREncode_CloseArray(), but the open array
+ * that is being close must be of indefinite length.
+ */
+static void
+QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Indicates that the next items added are in an indefinite length map.
+ *
+ * @param[in] pCtx The encoding context to open the map in.
+ *
+ * This is the same as QCBOREncode_OpenMap() except the array is
+ * indefinite length.
+ *
+ * This must be closed with QCBOREncode_CloseMapIndefiniteLength().
+ */
+static void
+QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_OpenMapIndefiniteLength(). */
+static void
+QCBOREncode_OpenMapIndefiniteLengthInMapSZ(QCBOREncodeContext *pCtx,
+                                           const char         *szLabel);
+
+/** See QCBOREncode_OpenMapIndefiniteLength(). */
+static void
+QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
+                                         int64_t              nLabel);
+
+
+
+
+/**
+ * @brief Close an open indefinite length map.
+ *
+ * @param[in] pCtx The encoding context to close the map in.
+ *
+ * This is the same as QCBOREncode_CloseMap(), but the open map that
+ * is being close must be of indefinite length.
+ */
+static void
+QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Close and sort an open map.
+ *
+ * @param[in] pCtx The encoding context to close the map in .
+ *
+ * This is the same as QCBOREncode_CloseMap() except it sorts the map
+ * per RFC 8949 Section 4.2.1 and checks for duplicate map keys. This
+ * sort is lexicographic of the CBOR-encoded map labels.
+ *
+ * This is more expensive than most things in the encoder. It uses
+ * bubble sort which runs in n-squared time where @c n is the number
+ * of map items. Sorting large maps on slow CPUs might be slow. This
+ * is also increases the object code size of the encoder by about 30%
+ * (500-1000 bytes).
+ *
+ * Bubble sort was selected so as to not need require configuration of
+ * a buffer to track map item offsets. Bubble sort works well even
+ * though map items are not all the same size because it always swaps
+ * adjacent items.
+ */
+void 
+QCBOREncode_CloseAndSortMap(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_CloseAndSortMapIndef(). */
+void
+QCBOREncode_CloseAndSortMapIndef(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Indicate start of encoded CBOR to be wrapped in a bstr.
+ *
+ * @param[in] pCtx The encoding context to open the bstr-wrapped CBOR in.
+ *
+ * All added encoded items between this call and a call to
+ * QCBOREncode_CloseBstrWrap2() will be wrapped in a bstr. They will
+ * appear in the final output as a byte string.  That byte string will
+ * contain encoded CBOR. This increases nesting level by one.
+ *
+ * The typical use case is for encoded CBOR that is to be
+ * cryptographically hashed, as part of a [RFC 9052, COSE]
+ * (https://www.rfc-editor.org/rfc/rfc9052.html) implementation. The
+ * wrapping byte string is taken as input by the hash function (which
+ * is why it is returned by QCBOREncode_CloseBstrWrap2()).  It is also
+ * easy to recover on decoding with standard CBOR decoders.
+ *
+ * Using QCBOREncode_BstrWrap() and QCBOREncode_CloseBstrWrap2()
+ * avoids having to encode the items first in one buffer (e.g., the
+ * COSE payload) and then add that buffer as a bstr to another
+ * encoding (e.g. the COSE to-be-signed bytes, the @c Sig_structure)
+ * potentially halving the memory needed.
+ *
+ * CBOR by nature must be decoded item by item in order from the
+ * start.  By wrapping some CBOR in a byte string, the decoding of
+ * that wrapped CBOR can be skipped. This is another use of wrapping,
+ * perhaps because the CBOR is large and deeply nested. Perhaps APIs
+ * for handling one defined CBOR message that is being embedded in
+ * another only take input as a byte string. Perhaps the desire is to
+ * be able to decode the out layer even in the wrapped has errors.
+ */
+static void
+QCBOREncode_BstrWrap(QCBOREncodeContext *pCtx);
+
+/** See QCBOREncode_BstrWrap(). */
+static void
+QCBOREncode_BstrWrapInMapSZ(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** See QCBOREncode_BstrWrap(). */
+static void
+QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
+
+
+/**
+ * @brief Close a wrapping bstr.
+ *
+ * @param[in] pCtx              The encoding context to close of bstr wrapping in.
+ * @param[in] bIncludeCBORHead  Include the encoded CBOR head of the bstr
+ *                              as well as the bytes in @c pWrappedCBOR.
+ * @param[out] pWrappedCBOR     A @ref UsefulBufC containing wrapped bytes.
+ *
+ * The closes a wrapping bstr opened by QCBOREncode_BstrWrap(). It reduces
+ * nesting level by one.
+ *
+ * A pointer and length of the enclosed encoded CBOR is returned in @c
+ * *pWrappedCBOR if it is not @c NULL. The main purpose of this is so
+ * this data can be hashed (e.g., with SHA-256) as part of a
+ * [RFC 9052, COSE] (https://www.rfc-editor.org/rfc/rfc9052.html)
+ * implementation. **WARNING**, this pointer and length should be used
+ * right away before any other calls to @c QCBOREncode_CloseXxx() as
+ * they will move data around and the pointer and length will no
+ * longer be to the correct encoded CBOR.
+ *
+ * When an error occurs as a result of this call, the encoder records
+ * the error and enters the error state. The error will be returned
+ * when QCBOREncode_Finish() is called.
+ *
+ * If this has been called more times than QCBOREncode_BstrWrap(),
+ * then @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
+ * QCBOREncode_Finish() is called.
+ *
+ * If this is called and it is not a wrapping bstr that is currently
+ * open, @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
+ * QCBOREncode_Finish() is called.
+ *
+ * QCBOREncode_CloseBstrWrap() is a deprecated version of this function
+ * that is equivalent to the call with @c bIncludeCBORHead @c true.
+ */
+void
+QCBOREncode_CloseBstrWrap2(QCBOREncodeContext *pCtx, bool bIncludeCBORHead, UsefulBufC *pWrappedCBOR);
+
+/** See QCBOREncode_CloseBstrWrap2(). */
+static void
+QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pCtx, UsefulBufC *pWrappedCBOR);
+
+
+/**
+ * @brief Cancel byte string wrapping.
+ *
+ * @param[in] pCtx       The encoding context.
+ *
+ * This cancels QCBOREncode_BstrWrap() making the encoding as if it
+ * were never called.
+ *
+ * WARNING: This does not work on QCBOREncode_BstrWrapInMapSZ()
+ * or QCBOREncode_BstrWrapInMapN() and there is no error detection
+ * of an attempt at their use.
+ *
+ * This only works if nothing has been added into the wrapped byte
+ * string.  If something has been added, this sets the error
+ * @ref QCBOR_ERR_CANNOT_CANCEL.
+ */
+void
+QCBOREncode_CancelBstrWrap(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Add some already-encoded CBOR bytes.
+ *
+ * @param[in] pCtx     The encoding context to add the already-encode CBOR to.
+ * @param[in] Encoded  The already-encoded CBOR to add to the context.
+ *
+ * The encoded CBOR being added must be fully conforming CBOR. It must
+ * be complete with no arrays or maps that are incomplete. it is OK for the
+ * raw CBOR added here to have indefinite lengths.
+ *
+ * The raw CBOR added here is not checked in anyway. If it is not
+ * conforming or has open arrays or such, the final encoded CBOR
+ * will probably be wrong or not what was intended.
+ *
+ * If the encoded CBOR being added here contains multiple items, they
+ * must be enclosed in a map or array. At the top level the raw
+ * CBOR must be a single data item.
+ */
+void
+QCBOREncode_AddEncoded(QCBOREncodeContext *pCtx, UsefulBufC Encoded);
+
+
+/** See QCBOREncode_AddEncoded(). */
+static void
+QCBOREncode_AddEncodedToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);
+
+/** See QCBOREncode_AddEncoded(). */
+static void
+QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Encoded);
+
+
+/**
+ * @brief Get the encoded result.
+ *
+ * @param[in] pCtx           The context to finish encoding with.
+ * @param[out] pEncodedCBOR  Structure in which the pointer and length of
+ *                           the encoded CBOR is returned.
+ *
+ * @retval QCBOR_SUCCESS                     Encoded CBOR is returned.
+ *
+ * @retval QCBOR_ERR_TOO_MANY_CLOSES         Nesting error
+ *
+ * @retval QCBOR_ERR_CLOSE_MISMATCH          Nesting error
+ *
+ * @retval QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN Nesting error
+ *
+ * @retval QCBOR_ERR_BUFFER_TOO_LARGE        Encoded output buffer size
+ *
+ * @retval QCBOR_ERR_BUFFER_TOO_SMALL        Encoded output buffer size
+ *
+ * @retval QCBOR_ERR_ARRAY_NESTING_TOO_DEEP  Implementation limit
+ *
+ * @retval QCBOR_ERR_ARRAY_TOO_LONG          Implementation limit
+ *
+ * On success, the pointer and length of the encoded CBOR are returned
+ * in @c *pEncodedCBOR. The pointer is the same pointer that was passed
+ * in to QCBOREncode_Init(). Note that it is not const when passed to
+ * QCBOREncode_Init(), but it is const when returned here.  The length
+ * will be smaller than or equal to the length passed in when
+ * QCBOREncode_Init() as this is the length of the actual result, not
+ * the size of the buffer it was written to.
+ *
+ * If a @c NULL was passed for @c Storage.ptr when QCBOREncode_Init()
+ * was called, @c NULL will be returned here, but the length will be
+ * that of the CBOR that would have been encoded.
+ *
+ * Encoding errors primarily manifest here as most other encoding function
+ * do no return an error. They just set the error state in the encode
+ * context after which no encoding function does anything.
+ *
+ * Three types of errors manifest here. The first type are nesting
+ * errors where the number of @c QCBOREncode_OpenXxx() calls do not
+ * match the number @c QCBOREncode_CloseXxx() calls. The solution is to
+ * fix the calling code.
+ *
+ * The second type of error is because the buffer given is either too
+ * small or too large. The remedy is to give a correctly sized buffer.
+ *
+ * The third type are due to limits in this implementation.
+ * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP can be worked around by
+ * encoding the CBOR in two (or more) phases and adding the CBOR from
+ * the first phase to the second with @c QCBOREncode_AddEncoded().
+ *
+ * If an error is returned, the buffer may have partially encoded
+ * incorrect CBOR in it and it should not be used. Likewise, the length
+ * may be incorrect and should not be used.
+ *
+ * Note that the error could have occurred in one of the many
+ * @c QCBOREncode_AddXxx() calls long before QCBOREncode_Finish() was
+ * called. This error handling reduces the CBOR implementation size
+ * but makes debugging harder.
+ *
+ * This may be called multiple times. It will always return the
+ * same. It can also be interleaved with calls to
+ * QCBOREncode_FinishGetSize(). See QCBOREncode_SubString() for a
+ * means to get the thus-far-encoded CBOR.
+ *
+ * QCBOREncode_GetErrorState() can be called to get the current
+ * error state in order to abort encoding early as an optimization, but
+ * calling it is is never required.
+ */
+QCBORError
+QCBOREncode_Finish(QCBOREncodeContext *pCtx, UsefulBufC *pEncodedCBOR);
+
+
+/**
+ * @brief Get the encoded CBOR and error status.
+ *
+ * @param[in] pCtx          The context to finish encoding with.
+ * @param[out] uEncodedLen  The length of the encoded or potentially
+ *                          encoded CBOR in bytes.
+ *
+ * @return The same errors as QCBOREncode_Finish().
+ *
+ * This functions the same as QCBOREncode_Finish(), but only returns the
+ * size of the encoded output.
+ */
+QCBORError
+QCBOREncode_FinishGetSize(QCBOREncodeContext *pCtx, size_t *uEncodedLen);
+
+
+/**
+ * @brief Indicate whether the output storage buffer is NULL.
+ *
+ * @param[in] pCtx  The encoding context.
+ *
+ * @return 1 if the output buffer is @c NULL.
+ *
+ * As described in QCBOREncode_Init(), @c Storage.ptr may be give as @c NULL
+ * for output size calculation. This returns 1 when that is the true, and 0 if not.
+ */
+static int
+QCBOREncode_IsBufferNULL(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Retrieve the storage buffer passed in to QCBOREncode_Init().
+ *
+ * @param[in] pCtx  The encoding context.
+ *
+ * @return The output storage buffer passed to QCBOREncode_Init().
+ *
+ * This doesn't give any information about how much has been encoded
+ * or the error state. It just returns the exact @ref UsefulOutBuf given
+ * to QCBOREncode_Init().
+ */
+static UsefulBuf
+QCBOREncode_RetrieveOutputStorage(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Get the encoding error state.
+ *
+ * @param[in] pCtx  The encoding context.
+ *
+ * @return One of @ref QCBORError. See return values from
+ *         QCBOREncode_Finish()
+ *
+ * Normally encoding errors need only be handled at the end of
+ * encoding when QCBOREncode_Finish() is called. This can be called to
+ * get the error result before finish should there be a need to halt
+ * encoding before QCBOREncode_Finish() is called.
+ */
+static QCBORError
+QCBOREncode_GetErrorState(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Returns current end of encoded data.
+ *
+ * @param[in] pCtx  The encoding context.
+ *
+ * @return Byte offset of end of encoded data.
+ *
+ * The purpose of this is to enable cryptographic hashing over a
+ * subpart of thus far CBOR-encoded data. Then perhaps a signature
+ * over the hashed CBOR is added to the encoded output. There is
+ * nothing specific to hashing or signing in this, so this can be used
+ * for other too.
+ *
+ * Call this to get the offset of the start of the encoded
+ * to-be-hashed CBOR items, then call QCBOREncode_SubString().
+ * QCBOREncode_Tell() can also be called twice, first to get the
+ * offset of the start and second for the offset of the end. Those
+ * offsets can be applied to the output storage buffer.
+ *
+ * This will return successfully even if the encoder is in the error
+ * state.
+ *
+ * WARNING: All definite-length arrays and maps opened before the
+ * first call to QCBOREncode_Tell() must not be closed until the
+ * substring is obtained and processed. Similarly, every
+ * definite-length array or map opened after the first call to
+ * QCBOREncode_Tell() must be closed before the substring is obtained
+ * and processed.  The same applies for opened byte strings. There is
+ * no detection of these errors. This occurs because QCBOR goes back
+ * and inserts the lengths of definite-length arrays and maps when
+ * they are closed. This insertion will make the offsets incorrect.
+ */
+static size_t
+QCBOREncode_Tell(QCBOREncodeContext *pCtx);
+
+
+/**
+ * @brief Get a substring of encoded CBOR for cryptographic hash
+ *
+ * @param[in] pCtx  The encoding context.
+ * @param[in] uStart  The start offset of substring.
+ *
+ * @return Pointer and length of of substring.
+ *
+ * @c uStart is obtained by calling QCBOREncode_Tell() before encoding
+ * the first item in the substring. Then encode some data items. Then
+ * call this. The substring returned contains the encoded data items.
+ *
+ * The substring may have deeply nested arrays and maps as long as any
+ * opened after the call to QCBOREncode_Tell() are closed before this
+ * is called.
+ *
+ * This will return @c NULLUsefulBufC if the encoder is in the error
+ * state or if @c uStart is beyond the end of the thus-far encoded
+ * data items.
+ *
+ * If @c uStart is 0, all the thus-far-encoded CBOR will be returned.
+ * Unlike QCBOREncode_Finish(), this will succeed even if some arrays
+ * and maps are not closed.
+ *
+ * See important usage WARNING in QCBOREncode_Tell()
+ */
+UsefulBufC
+QCBOREncode_SubString(QCBOREncodeContext *pCtx, const size_t uStart);
+
+
+/**
+ * @brief Encode the head of a CBOR data item.
+ *
+ * @param Buffer       Buffer to output the encoded head to; must be
+ *                     @ref QCBOR_HEAD_BUFFER_SIZE bytes in size.
+ * @param uMajorType   One of CBOR_MAJOR_TYPE_XX.
+ * @param uMinLen      The minimum number of bytes to encode uNumber. Almost
+ *                     always this is 0 to use preferred
+ *                     serialization. If this is 4, then even the
+ *                     values 0xffff and smaller will be encoded in 4
+ *                     bytes. This is used primarily when encoding a
+ *                     float or double put into uNumber as the leading
+ *                     zero bytes for them must be encoded.
+ * @param uNumber      The numeric argument part of the CBOR head.
+ * @return             Pointer and length of the encoded head or
+ *                     @ref NULLUsefulBufC if the output buffer is too small.
+ *
+ * Callers do not to need to call this for normal CBOR encoding. Note
+ * that it doesn't even take a @ref QCBOREncodeContext argument.
+ *
+ * This encodes the major type and argument part of a data item. The
+ * argument is an integer that is usually either the value or the length
+ * of the data item.
+ *
+ * This is exposed in the public interface to allow hashing of some CBOR
+ * data types, bstr in particular, a chunk at a time so the full CBOR
+ * doesn't have to be encoded in a contiguous buffer.
+ *
+ * For example, if you have a 100,000 byte binary blob in a buffer that
+ * needs to be bstr encoded and then hashed. You could allocate a
+ * 100,010 byte buffer and encode it normally. Alternatively, you can
+ * encode the head in a 10 byte buffer with this function, hash that and
+ * then hash the 100,000 bytes using the same hash context.
+ */
+UsefulBufC
+QCBOREncode_EncodeHead(UsefulBuf Buffer,
+                       uint8_t   uMajorType,
+                       uint8_t   uMinLen,
+                       uint64_t  uNumber);
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF DEPRECATED FUNCTION DECLARATIONS                          *
+ *                                                                           *
+ *    There is no plan to remove these in future versions.                   *
+ *    They just have been replaced by something better.                      *
+ * ========================================================================= */
+
+
+/** @deprecated Use QCBOREncode_AddTextToMapSZ() instead. */
+static void
+QCBOREncode_AddTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text);
+
+/** @deprecated Use QCBOREncode_AddSZStringToMapSZ() instead. */
+static void
+QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);
+
+/** @deprecated Use QCBOREncode_AddBytesToMapSZ() instead. */
+static void
+QCBOREncode_AddBytesToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
+
+/** @deprecated Use QCBOREncode_AddBoolToMapSZ() instead. */
+static void
+QCBOREncode_AddBoolToMap(QCBOREncodeContext *pCtx, const char *szLabel, bool b);
+
+/** @deprecated Use QCBOREncode_AddNULLToMapSZ() instead. */
+static void
+QCBOREncode_AddNULLToMap(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** @deprecated Use QCBOREncode_AddUndefToMapSZ() instead. */
+static void
+QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** @deprecated Use QCBOREncode_AddSimpleToMapSZ() instead. */
+static void
+QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pCtx,
+                           const char         *szLabel,
+                           const uint8_t       uSimple);
+
+/** @deprecated Use QCBOREncode_OpenArrayInMapSZ() instead. */
+static void
+QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** @deprecated Use QCBOREncode_OpenMapInMapSZ() instead. */
+static void
+QCBOREncode_OpenMapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** @deprecated Use QCBOREncode_OpenArrayIndefiniteLengthInMapSZ() instead. */
+static void
+QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
+                                           const char         *szLabel);
+
+/** @deprecated Use QCBOREncode_OpenMapIndefiniteLengthInMapSZ() instead. */
+static void
+QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
+                                         const char         *szLabel);
+
+/** @deprecated Use QCBOREncode_BstrWrapInMapSZ() instead. */
+static void
+QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
+
+/** @deprecated Use QCBOREncode_AddEncodedToMapSZ() instead. */
+static void
+QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);
+
+
+/* ========================================================================= *
+ *    END OF DEPRECATED FUNCTION DECLARATIONS                                *
+ * ========================================================================= */
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION                             *
+ * ========================================================================= */
+
+/** @private See qcbor_main_encode.c */
+void QCBOREncode_Private_AppendCBORHead(QCBOREncodeContext *pMe,
+                                        const uint8_t       uMajorType,
+                                        const uint64_t      uArgument,
+                                        const uint8_t       uMinLen);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_AddBuffer(QCBOREncodeContext *pCtx,
+                              uint8_t             uMajorType,
+                              UsefulBufC          Bytes);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_OpenMapOrArray(QCBOREncodeContext *pCtx,
+                                   uint8_t             uMajorType);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
+                                                   uint8_t             uMajorType);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_CloseMapOrArray(QCBOREncodeContext *pCtx,
+                                    uint8_t             uMajorType);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
+                                                    uint8_t             uMajorType);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_Private_CloseMapUnsorted(QCBOREncodeContext *pMe);
+
+/** @private See qcbor_main_encode.c */
+void
+QCBOREncode_AddInt64(QCBOREncodeContext *pCtx, int64_t nNum);
+
+
+/**
+ * @brief  Semi-private method to add simple items and floating-point.
+ * @private
+ *
+ * @param[in] pMe        The encoding context.
+ * @param[in] uMinLen    Minimum encoding size for uNum. Usually 0.
+ * @param[in] uArgument  The value to add.
+ *
+ * This is used to add simple types like true and false and float-point
+ * values, both of which are type 7.
+ *
+ * Call QCBOREncode_AddBool(), QCBOREncode_AddNULL(),
+ * QCBOREncode_AddUndef() QCBOREncode_AddDouble() instead of this.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static inline void
+QCBOREncode_Private_AddType7(QCBOREncodeContext *pMe,
+                             const uint8_t       uMinLen,
+                             const uint64_t      uArgument)
+{
+   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_SIMPLE, uArgument, uMinLen);
+}
+
+
+
+
+static inline void
+QCBOREncode_Config(QCBOREncodeContext *pMe, enum QCBOREncodeConfig uConfig)
+{
+   if(uConfig & QCBOR_ENCODE_CONFIG_SORT) {
+      pMe->pfnCloseMap = QCBOREncode_CloseAndSortMap;
+   } else {
+      pMe->pfnCloseMap = QCBOREncode_Private_CloseMapUnsorted;
+   }
+   pMe->uConfigFlags = (int)uConfig;
+}
+
+
+static inline void
+QCBOREncode_ConfigReduced(QCBOREncodeContext *pMe, enum QCBOREncodeConfig uConfig)
+{
+   if(uConfig & QCBOR_ENCODE_CONFIG_SORT) {
+      pMe->uError = 99;
+   } else {
+      pMe->uConfigFlags = (int)uConfig;
+   }
+}
+
+
+
+static inline void
+QCBOREncode_AddText(QCBOREncodeContext *pMe, const UsefulBufC Text)
+{
+   QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_TEXT_STRING, Text);
+}
+
+static inline void
+QCBOREncode_AddTextToMapSZ(QCBOREncodeContext *pMe,
+                           const char         *szLabel,
+                           const UsefulBufC    Text)
+{
+   QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szLabel));
+   QCBOREncode_AddText(pMe, Text);
+}
+
+static inline void
+QCBOREncode_AddTextToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Text)
+{
+   QCBOREncode_AddTextToMapSZ(pMe, szLabel, Text);
+}
+
+static inline void
+QCBOREncode_AddTextToMapN(QCBOREncodeContext *pMe,
+                          const int64_t       nLabel,
+                          const UsefulBufC    Text)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddText(pMe, Text);
+}
+
+
+inline static void
+QCBOREncode_AddSZString(QCBOREncodeContext *pMe, const char *szString)
+{
+   QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szString));
+}
+
+static inline void
+QCBOREncode_AddSZStringToMapSZ(QCBOREncodeContext *pMe,
+                               const char         *szLabel,
+                               const char         *szString)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddSZString(pMe, szString);
+}
+
+static inline void
+QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pMe, const char *szLabel, const char *szString)
+{
+   QCBOREncode_AddSZStringToMapSZ(pMe, szLabel, szString);
+}
+
+static inline void
+QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pMe,
+                              const int64_t       nLabel,
+                              const char         *szString)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddSZString(pMe, szString);
+}
+
+
+
+
+static inline void
+QCBOREncode_AddBytes(QCBOREncodeContext *pMe,
+                     const UsefulBufC    Bytes)
+{
+   QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBytesToMapSZ(QCBOREncodeContext *pMe,
+                            const char         *szLabel,
+                            const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddBytes(pMe, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBytesToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Bytes)
+{
+   QCBOREncode_AddBytesToMapSZ(pMe, szLabel, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pMe,
+                           const int64_t       nLabel,
+                           const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddBytes(pMe, Bytes);
+}
+
+static inline void
+QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             UsefulBuf          *pPlace)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_OpenBytes(pMe, pPlace);
+}
+
+static inline void
+QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pMe,
+                            const int64_t       nLabel,
+                            UsefulBuf          *pPlace)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_OpenBytes(pMe, pPlace);
+}
+
+
+static inline void
+QCBOREncode_AddSimple(QCBOREncodeContext *pMe, const uint8_t uNum)
+{
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_DCBOR_SIMPLE) {
+      if(uNum < CBOR_SIMPLEV_FALSE || uNum > CBOR_SIMPLEV_NULL) {
+         pMe->uError = QCBOR_ERR_NOT_PREFERRED;
+         return;
+      }
+   }
+   /* This check often is optimized out because uNum is known at compile time. */
+   if(uNum >= CBOR_SIMPLEV_RESERVED_START && uNum <= CBOR_SIMPLEV_RESERVED_END) {
+      pMe->uError = QCBOR_ERR_ENCODE_UNSUPPORTED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   QCBOREncode_Private_AddType7(pMe, 0, uNum);
+}
+
+static inline void
+QCBOREncode_AddSimpleToMapSZ(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const uint8_t       uSimple)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddSimple(pMe, uSimple);
+}
+
+static inline void
+QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pMe,
+                           const char         *szLabel,
+                           const uint8_t       uSimple)
+{
+   QCBOREncode_AddSimpleToMapSZ(pMe, szLabel, uSimple);
+}
+
+static inline void
+QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pMe,
+                            const int64_t       nLabel,
+                            const uint8_t       uSimple)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddSimple(pMe, uSimple);
+}
+
+
+static inline void
+QCBOREncode_AddBool(QCBOREncodeContext *pMe, const bool b)
+{
+   uint8_t uSimple = CBOR_SIMPLEV_FALSE;
+   if(b) {
+      uSimple = CBOR_SIMPLEV_TRUE;
+   }
+   QCBOREncode_AddSimple(pMe, uSimple);
+}
+
+static inline void
+QCBOREncode_AddBoolToMapSZ(QCBOREncodeContext *pMe, const char *szLabel, const bool b)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddBool(pMe, b);
+}
+
+static inline void
+QCBOREncode_AddBoolToMap(QCBOREncodeContext *pMe, const char *szLabel, bool b)
+{
+   QCBOREncode_AddBoolToMapSZ(pMe, szLabel, b);
+}
+
+static inline void
+QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pMe, const int64_t nLabel, const bool b)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddBool(pMe, b);
+}
+
+
+static inline void
+QCBOREncode_AddNULL(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_NULL);
+}
+
+static inline void
+QCBOREncode_AddNULLToMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddNULL(pMe);
+}
+
+static inline void
+QCBOREncode_AddNULLToMap(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddNULLToMapSZ(pMe, szLabel);
+}
+
+static inline void
+QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddNULL(pMe);
+}
+
+
+static inline void
+QCBOREncode_AddUndef(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_UNDEF);
+}
+
+static inline void
+QCBOREncode_AddUndefToMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddUndef(pMe);
+}
+
+static inline void
+QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel)
+{
+   QCBOREncode_AddUndefToMapSZ(pCtx, szLabel);
+}
+
+static inline void
+QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddUndef(pMe);
+}
+
+
+static inline void
+QCBOREncode_OpenArray(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
+}
+
+static inline void
+QCBOREncode_OpenArrayInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_OpenArray(pMe);
+}
+
+static inline void
+QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_OpenArrayInMapSZ(pMe, szLabel);
+}
+
+
+static inline void
+QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pMe,  const int64_t nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_OpenArray(pMe);
+}
+
+
+static inline void
+QCBOREncode_CloseArray(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_CloseMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
+}
+
+
+static inline void
+QCBOREncode_OpenMap(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_MAP);
+}
+
+static inline void
+QCBOREncode_OpenMapInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_OpenMap(pMe);
+}
+
+static inline void
+QCBOREncode_OpenMapInMap(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_OpenMapInMapSZ(pMe, szLabel);
+}
+
+static inline void
+QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_OpenMap(pMe);
+}
+
+static inline void
+QCBOREncode_CloseMap(QCBOREncodeContext *pMe)
+{
+   (pMe->pfnCloseMap)(pMe);
+}
+
+static inline void
+QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
+}
+
+static inline void
+QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(QCBOREncodeContext *pMe,
+                                           const char         *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_OpenArrayIndefiniteLength(pMe);
+}
+
+static inline void
+QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pMe,
+                                           const char         *szLabel)
+{
+   QCBOREncode_OpenArrayIndefiniteLengthInMapSZ(pMe, szLabel);
+}
+
+static inline void
+QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
+                                            const int64_t       nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_OpenArrayIndefiniteLength(pMe);
+}
+
+static inline void
+QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
+}
+
+
+static inline void
+QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
+}
+
+static inline void
+QCBOREncode_OpenMapIndefiniteLengthInMapSZ(QCBOREncodeContext *pMe,
+                                           const char         *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_OpenMapIndefiniteLength(pMe);
+}
+
+static inline void
+QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pMe,
+                                         const char         *szLabel)
+{
+   QCBOREncode_OpenMapIndefiniteLengthInMapSZ(pMe, szLabel);
+}
+
+static inline void
+QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
+                                          const int64_t       nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_OpenMapIndefiniteLength(pMe);
+}
+
+static inline void
+QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
+}
+
+
+static inline void
+QCBOREncode_BstrWrap(QCBOREncodeContext *pMe)
+{
+   QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_BYTE_STRING);
+}
+
+static inline void
+QCBOREncode_BstrWrapInMapSZ(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_BstrWrap(pMe);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pMe, const char *szLabel)
+{
+   QCBOREncode_BstrWrapInMapSZ(pMe, szLabel);
+}
+
+static inline void
+QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_BstrWrap(pMe);
+}
+
+static inline void
+QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pMe, UsefulBufC *pWrappedCBOR)
+{
+   QCBOREncode_CloseBstrWrap2(pMe, true, pWrappedCBOR);
+}
+
+
+
+static inline void
+QCBOREncode_AddEncodedToMapSZ(QCBOREncodeContext *pMe,
+                            const char         *szLabel,
+                            const UsefulBufC    Encoded)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddEncoded(pMe, Encoded);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pMe, const char *szLabel, UsefulBufC Encoded)
+{
+   QCBOREncode_AddEncodedToMapSZ(pMe, szLabel, Encoded);
+}
+
+static inline void
+QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pMe,
+                             const int64_t       nLabel,
+                             const UsefulBufC    Encoded)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddEncoded(pMe, Encoded);
+}
+
+
+static inline int
+QCBOREncode_IsBufferNULL(QCBOREncodeContext *pMe)
+{
+   return UsefulOutBuf_IsBufferNULL(&(pMe->OutBuf));
+}
+
+
+static inline UsefulBuf
+QCBOREncode_RetrieveOutputStorage(QCBOREncodeContext *pMe)
+{
+   return UsefulOutBuf_RetrieveOutputStorage(&(pMe->OutBuf));
+}
+
+
+static inline QCBORError
+QCBOREncode_GetErrorState(QCBOREncodeContext *pMe)
+{
+   if(UsefulOutBuf_GetError(&(pMe->OutBuf))) {
+      /* Items didn't fit in the buffer. This check catches this
+       * condition for all the appends and inserts so checks aren't
+       * needed when the appends and inserts are performed.  And of
+       * course UsefulBuf will never overrun the input buffer given to
+       * it. No complex analysis of the error handling in this file is
+       * needed to know that is true. Just read the UsefulBuf code.
+       */
+      pMe->uError = QCBOR_ERR_BUFFER_TOO_SMALL;
+      /* QCBOR_ERR_BUFFER_TOO_SMALL masks other errors, but that is
+       * OK. Once the caller fixes this, they'll be unmasked.
+       */
+   }
+
+   return (QCBORError)pMe->uError;
+}
+
+
+static inline size_t
+QCBOREncode_Tell(QCBOREncodeContext *pMe)
+{
+   return UsefulOutBuf_GetEndPosition(&(pMe->OutBuf));
+}
+
+
+/* ======================================================================== *
+ *    END OF PRIVATE INLINE IMPLEMENTATION                                  *
+ * ======================================================================== */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* qcbor_encode_h */
diff --git a/inc/qcbor/qcbor_number_encode.h b/inc/qcbor/qcbor_number_encode.h
new file mode 100644
index 0000000..783b832
--- /dev/null
+++ b/inc/qcbor/qcbor_number_encode.h
@@ -0,0 +1,2316 @@
+/* ===========================================================================
+ * Copyright (c) 2016-2018, The Linux Foundation.
+ * Copyright (c) 2018-2024, Laurence Lundblade.
+ * Copyright (c) 2021, Arm Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors, nor the name "Laurence Lundblade" may be used to
+ *       endorse or promote products derived from this software without
+ *       specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ========================================================================= */
+
+#ifndef qcbor_number_encode_h
+#define qcbor_number_encode_h
+
+
+#include "qcbor/qcbor_common.h"
+#include "qcbor/qcbor_private.h"
+#include "qcbor/qcbor_main_encode.h"
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} // Keep editor indention formatting happy
+#endif
+#endif
+
+
+/**
+ * @file qcbor_number_encode.h
+ *
+ * This file contains functions for encoding numbers.
+ *
+ * @anchor Floating-Point
+ *
+ * ## Floating-Point
+ *
+ * By default QCBOR fully supports IEEE 754 floating-point:
+ *  - Encode/decode of double, single and half-precision
+ *  - CBOR preferred serialization of floating-point
+ *  - Floating-point epoch dates
+ *
+ * For the most part, the type double is used in the interface for
+ * floating-point values. In the default configuration, all decoded
+ * floating-point values are returned as a double.
+ *
+ * With CBOR preferred serialization, the encoder outputs the smallest
+ * representation of the double or float that preserves precision. Zero,
+ * NaN and infinity are always output as a half-precision, each taking
+ * just 2 bytes. This reduces the number of bytes needed to encode
+ * double and single-precision, especially if zero, NaN and infinity are
+ * frequently used.
+ *
+ * To avoid use of preferred serialization in the standard configuration
+ * when encoding, use QCBOREncode_AddDoubleNoPreferred() or
+ * QCBOREncode_AddFloatNoPreferred().
+ *
+ * This implementation of preferred floating-point serialization and
+ * half-precision does not depend on the CPU having floating-point HW or
+ * the compiler bringing in a (sometimes large) library to compensate
+ * for lack of CPU support. This implementation uses shifts and masks
+ * rather than floating-point functions.
+ *
+ * To reduce overall object code by about 900 bytes, define
+ * QCBOR_DISABLE_PREFERRED_FLOAT. This will eliminate all support for
+ * preferred serialization and half-precision. An error will be returned
+ * when attempting to decode half-precision. A float will always be
+ * encoded and decoded as 32-bits and a double will always be encoded
+ * and decoded as 64 bits.
+ *
+ * Note that even if QCBOR_DISABLE_PREFERRED_FLOAT is not defined all
+ * the float-point encoding object code can be avoided by never calling
+ * any functions that encode double or float. Just not calling
+ * floating-point functions will reduce object code by about 500 bytes.
+ *
+ * On CPUs that have no floating-point hardware,
+ * QCBOR_DISABLE_FLOAT_HW_USE should be defined in most cases. If it is
+ * not, then the compiler will bring in possibly large software
+ * libraries to compensate. Defining QCBOR_DISABLE_FLOAT_HW_USE reduces
+ * object code size on CPUs with floating-point hardware by a tiny
+ * amount and eliminates the need for <math.h>
+ *
+ * When QCBOR_DISABLE_FLOAT_HW_USE is defined, trying to decoding
+ * floating-point dates will give error
+ * @ref QCBOR_ERR_FLOAT_DATE_DISABLED and decoded single-precision
+ * numbers will be returned as @ref QCBOR_TYPE_FLOAT instead of
+ * converting them to double as usual.
+ *
+ * If both QCBOR_DISABLE_FLOAT_HW_USE and QCBOR_DISABLE_PREFERRED_FLOAT
+ * are defined, then the only thing QCBOR can do is encode/decode a C
+ * float type as 32-bits and a C double type as 64-bits. Floating-point
+ * epoch dates will be unsupported.
+ *
+ * If USEFULBUF_DISABLE_ALL_FLOAT is defined, then floating point
+ * support is completely disabled. Decoding functions return
+ * @ref QCBOR_ERR_ALL_FLOAT_DISABLED if a floating point value is
+ * encountered during decoding. Functions that are encoding floating
+ * point values are not available.
+ */
+
+
+/**
+ * The size of the buffer to be passed to QCBOREncode_EncodeHead(). It
+ * is one byte larger than sizeof(uint64_t) + 1, the actual maximum
+ * size of the head of a CBOR data item because
+ * QCBOREncode_EncodeHead() needs one extra byte to work.
+ */
+#define QCBOR_HEAD_BUFFER_SIZE  (sizeof(uint64_t) + 2)
+
+
+/**
+ * Output the full CBOR tag. See @ref CBORTags, @ref Tag-Usage and
+ * @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_TAG      0
+
+/**
+ * Output only the 'borrowed' content format for the relevant tag.
+ * See @ref CBORTags, @ref Tag-Usage and @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_BORROWED 1
+
+
+
+
+/**
+ * @brief  Add a signed 64-bit integer to the encoded output.
+ *
+ * @param[in] pCtx   The encoding context to add the integer to.
+ * @param[in] nNum   The integer to add.
+ *
+ * The integer will be encoded and added to the CBOR output.
+ *
+ * This function figures out the size and the sign and encodes using
+ * CBOR preferred serialization. Specifically, it will select CBOR major type
+ * 0 or 1 based on sign and will encode to 1, 2, 4 or 8 bytes
+ * depending on the value of the integer. Values less than 24
+ * effectively encode to one byte because they are encoded in with the
+ * CBOR major type. This is a neat and efficient characteristic of
+ * CBOR that can be taken advantage of when designing CBOR-based
+ * protocols. If integers can be kept between -23 and 23
+ * they will be encoded in one byte including the major type.
+ *
+ * If you pass a smaller integer, like @c int16_t or a small value,
+ * like 100, the encoding will still be CBOR's most compact that can
+ * represent the value.  For example, CBOR always encodes the value 0
+ * as one byte, 0x00. The representation as 0x00 includes
+ * identification of the type as an integer too as the major type for
+ * an integer is 0. See [RFC 8949 Appendix A]
+ * (https://www.rfc-editor.org/rfc/rfc8949.html#section-appendix.a)
+ * for more examples of CBOR encoding. This compact encoding is
+ * preferred serialization CBOR as per [RFC 8949 section 4.1]
+ * (https://www.rfc-editor.org/rfc/rfc8949.html#section-4.1)
+ *
+ * There are no functions to add @c int16_t or @c int32_t because they
+ * are not necessary because this always encodes to the smallest
+ * number of bytes based on the value.
+ *
+ * If the encoding context is in an error state, this will do
+ * nothing. If an error occurs when adding this integer, the internal
+ * error flag will be set, and the error will be returned when
+ * QCBOREncode_Finish() is called.
+ *
+ * See also QCBOREncode_AddUInt64().
+ */
+void
+QCBOREncode_AddInt64(QCBOREncodeContext *pCtx, int64_t nNum);
+
+/** See QCBOREncode_AddInt64(). */
+static void
+QCBOREncode_AddInt64ToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nNum);
+
+/** See QCBOREncode_AddInt64(). */
+static void
+QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t nNum);
+
+
+/**
+ * @brief  Add an unsigned 64-bit integer to the encoded output.
+ *
+ * @param[in] pCtx  The encoding context to add the integer to.
+ * @param[in] uNum  The integer to add.
+ *
+ * The integer is encoded and added to the CBOR output.
+ *
+ * The only reason so use this function is for integers larger than
+ * @c INT64_MAX and smaller than @c UINT64_MAX. Otherwise
+ * QCBOREncode_AddInt64() will work fine.
+ *
+ * Error handling is the same as for QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);
+
+/** See QCBOREncode_AddUInt64(). */
+static void
+QCBOREncode_AddUInt64ToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
+
+/** See QCBOREncode_AddUInt64(). */
+static void
+QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);
+
+
+/**
+ * @brief Add a negative 64-bit integer to encoded output
+ *
+ * @param[in] pCtx  The encoding context to add the integer to.
+ * @param[in] uNum  The integer to add.
+ *
+ * QCBOREncode_AddInt64() is much better to encode negative integers
+ * than this.  What this can do is add integers with one more
+ * significant bit than an int64_t (a "65-bit" integer if you count
+ * the sign as a bit) which is possible because CBOR happens to
+ * support such integers.
+ *
+ * The actual value encoded is -uNum - 1. That is, give 0 for uNum to
+ * transmit -1, give 1 to transmit -2 and give UINT64_MAX to transmit
+ * -UINT64_MAX-1 (18446744073709551616). The interface is odd like
+ * this so all negative values CBOR can represent can be encoded by
+ * QCBOR (making this a complete CBOR implementation).
+ *
+ * The most negative value QCBOREncode_AddInt64() can encode is
+ * -9223372036854775808 which is -(2^63) or negative 0x800000000000.
+ * This can encode from -9223372036854775809 to -18446744073709551616
+ * or -(2^63 +1)  to -(2^64). Note that it is not possible to represent
+ * positive or negative 18446744073709551616 in any standard C data
+ * type.
+ *
+ * Negative integers are normally decoded in QCBOR with type
+ * @ref QCBOR_TYPE_INT64.  Integers in the range of -9223372036854775809
+ * to -18446744073709551616 are returned as @ref QCBOR_TYPE_65BIT_NEG_INT.
+ *
+ * WARNING: some CBOR decoders will be unable to decode -(2^63 + 1) to
+ * -(2^64).  Also, most CPUs do not have registers that can represent
+ * this range.  If you need 65-bit negative integers, you likely need
+ * negative 66, 67 and 68-bit negative integers so it is likely better
+ * to use CBOR big numbers where you can have any number of bits. See
+ * QCBOREncode_AddTBigNumber() and @ref Serialization.
+ */
+static void
+QCBOREncode_AddNegativeUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);
+
+/** See QCBOREncode_AddNegativeUInt64(). */
+static void
+QCBOREncode_AddNegativeUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
+
+/** See QCBOREncode_AddNegativeUInt64(). */
+static void
+QCBOREncode_AddNegativeUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);
+
+
+#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+/**
+ * @brief Add a double-precision floating-point number to the encoded output.
+ *
+ * @param[in] pCtx  The encoding context to add the double to.
+ * @param[in] dNum  The double-precision number to add.
+ *
+ * This encodes using preferred serialization, selectively encoding
+ * the input floating-point number as either double-precision,
+ * single-precision or half-precision. Infinity, NaN and 0 are always
+ * encoded as half-precision. The reduction to single-precision or
+ * half-precision is only performed if there is no loss or precision.
+ *
+ * Half-precision floating-point numbers take up 2 bytes, half that of
+ * single-precision, one quarter of double-precision. This can reduce
+ * the size of encoded output a lot, especially if the values 0,
+ * infinity and NaN occur frequently.
+ *
+ * QCBOR decoding returns double-precision reversing this reduction.
+ *
+ * Normally this outputs only CBOR major type 7.  If
+ * QCBOREncode_SerializationdCBOR() is called to enter dCBOR mode,
+ * floating-point inputs that are whole integers are further reduced
+ * to CBOR type 0 and 1. This is a unification of the floating-point
+ * and integer number spaces such that there is only one encoding of
+ * any numeric value. Note that this will result in the whole integers
+ * from -(2^63+1) to -(2^64) being encode as CBOR major type 1 which
+ * can't be directly decoded into an int64_t or uint64_t. See
+ * QCBORDecode_GetNumberConvertPrecisely(), a good method to use to
+ * decode dCBOR.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * It is possible that preferred serialization is disabled when the
+ * QCBOR library was built. In that case, this functions the same as
+ * QCBOREncode_AddDoubleNoPreferred().
+ *
+ * See also QCBOREncode_AddDoubleNoPreferred(), QCBOREncode_AddFloat()
+ * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
+ *
+ * By default, this will error out on an attempt to encode a NaN with
+ * a payload. See QCBOREncode_Allow() and @ref
+ * QCBOR_ENCODE_ALLOW_NAN_PAYLOAD.
+ * If preferred serialization is disabled at compliation, this check for
+ * for NaN payloads is disabled.
+ */
+static void
+QCBOREncode_AddDouble(QCBOREncodeContext *pCtx, double dNum);
+
+/** See QCBOREncode_AddDouble(). */
+static void
+QCBOREncode_AddDoubleToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
+
+/** See QCBOREncode_AddDouble(). */
+static void
+QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
+
+
+/**
+ * @brief Add a single-precision floating-point number to the encoded output.
+ *
+ * @param[in] pCtx  The encoding context to add the single to.
+ * @param[in] fNum  The single-precision number to add.
+ *
+ * This is identical to QCBOREncode_AddDouble() except the input is
+ * single-precision. It also supports dCBOR.
+ *
+ * See also QCBOREncode_AddDouble(), QCBOREncode_AddDoubleNoPreferred(),
+ * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
+ */
+static void
+QCBOREncode_AddFloat(QCBOREncodeContext *pCtx, float fNum);
+
+/** See QCBOREncode_AddFloat(). */
+static void
+QCBOREncode_AddFloatToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
+
+/** See QCBOREncode_AddFloat(). */
+static void
+QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float dNum);
+
+
+/**
+ * @brief Add a double-precision floating-point number without preferred encoding.
+ *
+ * @param[in] pCtx  The encoding context to add the double to.
+ * @param[in] dNum  The double-precision number to add.
+ *
+ * Output a double-precision float straight-through with no checking or
+ * processing for preferred serialization, dCBOR or other.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
+ * QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
+ */
+static void
+QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pCtx, double dNum);
+
+/** See QCBOREncode_AddDoubleNoPreferred(). */
+static void
+QCBOREncode_AddDoubleNoPreferredToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
+
+/** See QCBOREncode_AddDoubleNoPreferred(). */
+static void
+QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
+
+
+/**
+ * @brief Add a single-precision floating-point number without preferred encoding.
+ *
+ * @param[in] pCtx  The encoding context to add the double to.
+ * @param[in] fNum  The single-precision number to add.
+ *
+ * Output a single-precision float straight-through with no checking or
+ * processing for preferred serializtion, dCBOR or other.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
+ * QCBOREncode_AddDoubleNoPreferred() and @ref Floating-Point.
+ */
+static void
+QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pCtx, float fNum);
+
+/** See QCBOREncode_AddFloatNoPreferred(). */
+static void
+QCBOREncode_AddFloatNoPreferredToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
+
+/** See QCBOREncode_AddFloatNoPreferred(). */
+static void
+QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float fNum);
+#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
+
+
+
+/**
+ * @brief Add a byte string to the encoded output.
+ *
+ * @param[in] pCtx   The encoding context to add the bytes to.
+ * @param[in] Bytes  Pointer and length of the input data.
+ *
+ * Simply adds the bytes to the encoded output as CBOR major type 2.
+ *
+ * If called with @c Bytes.len equal to 0, an empty string will be
+ * added. When @c Bytes.len is 0, @c Bytes.ptr may be @c NULL.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ */
+static void
+QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
+
+/** See QCBOREncode_AddBytes(). */
+static void
+QCBOREncode_AddBytesToMapSZ(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
+
+/** See QCBOREncode_AddBytes(). */
+static void
+QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
+
+
+/**
+ * @brief Set up to write a byte string value directly to encoded output.
+ *
+ * @param[in] pCtx     The encoding context to add the bytes to.
+ * @param[out] pPlace  Pointer and length of place to write byte string value.
+ *
+ * QCBOREncode_AddBytes() is the normal way to encode a byte string.
+ * This is for special cases and by passes some of the pointer safety.
+ *
+ * The purpose of this is to output the bytes that make up a byte
+ * string value directly to the QCBOR output buffer so you don't need
+ * to have a copy of it in memory. This is particularly useful if the
+ * byte string is large, for example, the encrypted payload of a
+ * COSE_Encrypt message. The payload encryption algorithm can output
+ * directly to the encoded CBOR buffer, perhaps by making it the
+ * output buffer for some function (e.g. symmetric encryption) or by
+ * multiple writes.
+ *
+ * The pointer in @c pPlace is where to start writing. Writing is just
+ * copying bytes to the location by the pointer in @c pPlace.  Writing
+ * past the length in @c pPlace will be writing off the end of the
+ * output buffer.
+ *
+ * If there is no room in the output buffer @ref NULLUsefulBuf will be
+ * returned and there is no need to call QCBOREncode_CloseBytes().
+ *
+ * The byte string must be closed by calling QCBOREncode_CloseBytes().
+ *
+ * Warning: this bypasses some of the usual checks provided by QCBOR
+ * against writing off the end of the encoded output buffer.
+ */
+void
+QCBOREncode_OpenBytes(QCBOREncodeContext *pCtx, UsefulBuf *pPlace);
+
+/** See QCBOREncode_OpenBytes(). */
+static void
+QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             UsefulBuf          *pPlace);
+
+/** See QCBOREncode_OpenBytes(). */
+static void
+QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pCtx,
+                            int64_t             nLabel,
+                            UsefulBuf          *pPlace);
+
+
+/**
+ *  @brief Close out a byte string written directly to encoded output.
+ *
+ *  @param[in] pCtx      The encoding context to add the bytes to.
+ *  @param[out] uAmount  The number of bytes written, the length of the
+ *                       byte string.
+ *
+ * This closes out a call to QCBOREncode_OpenBytes().  This inserts a
+ * CBOR header at the front of the byte string value to make it a
+ * well-formed byte string.
+ *
+ * If there was no call to QCBOREncode_OpenBytes() then @ref
+ * QCBOR_ERR_TOO_MANY_CLOSES is set.
+ */
+void
+QCBOREncode_CloseBytes(QCBOREncodeContext *pCtx, size_t uAmount);
+
+
+/**
+ * @brief Add a big number to encoded output using preferred serialization.
+ *
+ * @param[in] pCtx             The encoding context to add to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] bNegative        If true, @c BigNumber is negative.
+ * @param[in] BigNumber        Pointer and length of the big number,
+ *                             most significant byte first (network
+ *                             byte order).
+ *
+ * This encodes CBOR tag numbers 2 and 3, positive and negative big
+ * numbers, as defined in [RFC 8949 section 3.4.3]
+ * (https://www.rfc-editor.org/rfc/rfc8949.html#section-3.4.3).
+ *
+ * This performs the offset of one required when encoding negative
+ * numbers.
+ *
+ * Leading zeros are not encoded.
+ *
+ * This uses preferred serialization described specifically for big
+ * numbers. Positive values between 0 and (2^64)-1 are encoded as
+ * common type 0 integers. Negative values between -(2^64) and -1 are
+ * encoded as common type 1 integers.
+ *
+ * See @ref BigNumbers for a useful overview of CBOR big numbers and
+ * QCBOR's support for them. See
+ * QCBOREncode_AddTBigNumberNoPreferred() to encode without conversion
+ * to common integer types 0 and 1. See QCBOREncode_AddTBigNumberRaw()
+ * for encoding that is simple pass through as a byte string that
+ * links in much less object code. See QCBORDecode_GetTBigNumber() for
+ * the decoder counter part.
+ */
+static void
+QCBOREncode_AddTBigNumber(QCBOREncodeContext *pCtx,
+                          uint8_t             uTagRequirement,
+                          bool                bNegative,
+                          UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumber(). */
+static void
+QCBOREncode_AddTBigNumberToMapSZ(QCBOREncodeContext *pCtx,
+                                 const char         *szLabel,
+                                 uint8_t             uTagRequirement,
+                                 bool                bNegative,
+                                 UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumber(). */
+static void
+QCBOREncode_AddTBigNumberToMapN(QCBOREncodeContext *pCtx,
+                                int64_t             nLabel,
+                                uint8_t             uTagRequirement,
+                                bool                bNegative,
+                                UsefulBufC          BigNumber);
+
+
+/**
+ * @brief Add a big number to encoded output without preferred serialization.
+ *
+ * @param[in] pCtx             The encoding context to add to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] bNegative        If true, @c BigNumber is negative.
+ * @param[in] BigNumber        Pointer and length of the big number,
+ *                             most significant byte first (network
+ *                             byte order).
+ *
+ * This is the same as QCBOREncode_AddTBigNumber(), without preferred
+ * serialization. This always outputs tag 2 or 3, never type 0 or 1
+ * integers.
+ *
+ * Leading zeros are removed before encoding.
+ *
+ * See @ref BigNumbers for a useful overview of CBOR big numbers and
+ * QCBOR's support for them. See also QCBOREncode_AddTBigNumber().
+ * See QCBORDecode_GetTBigNumberNoPreferred(), the decode counter part
+ * for this.
+ */
+static void
+QCBOREncode_AddTBigNumberNoPreferred(QCBOREncodeContext *pCtx,
+                                     uint8_t             uTagRequirement,
+                                     bool                bNegative,
+                                     UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumberNoPreferred(). */
+static void
+QCBOREncode_AddTBigNumberNoPreferredToMapSZ(QCBOREncodeContext *pCtx,
+                                            const char         *szLabel,
+                                            uint8_t             uTagRequirement,
+                                            bool                bNegative,
+                                            UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumberNoPreferred(). */
+static void
+QCBOREncode_AddTBigNumberNoPreferredToMapN(QCBOREncodeContext *pCtx,
+                                           int64_t             nLabel,
+                                           uint8_t             uTagRequirement,
+                                           bool                bNegative,
+                                           UsefulBufC          BigNumber);
+
+
+/**
+ * @brief Add a big number to encoded output with no processing.
+ *
+ * @param[in] pCtx             The encoding context to add to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] bNegative        If true @c BigNumber is negative.
+ * @param[in] BigNumber        Pointer and length of the big number,
+ *                             most significant byte first (network
+ *                             byte order).
+ *
+ * All this does is output tag number 2 or 3 depending on @c bNegative
+ * and then output @c BigNumber as a byte string. If @c
+ * uTagRequirement is @ref QCBOR_ENCODE_AS_BORROWED, the tag number is
+ * not even output and this equivalent to QCBOREncode_AddBytes().
+ *
+ * No leading zeros are removed. No offset of one is performed for
+ * negative numbers. There is no conversion to type 0 and type 1
+ * integers.
+ *
+ * This is mostly an inline implementation that links in no additional
+ * object from the QCBOR library.
+ *
+ * This is most useful when a big number library has been linked, and
+ * it can be (trivially) used to perform the offset of one for
+ * negative numbers.
+ *
+ * See @ref BigNumbers for a useful overview of CBOR big numbers and
+ * QCBOR's support for them. See QCBORDecode_GetTBigNumberRaw(), the
+ * decode counter part for this. See also QCBOREncode_AddTBigNumber().
+ */
+static void
+QCBOREncode_AddTBigNumberRaw(QCBOREncodeContext *pCtx,
+                             uint8_t             uTagRequirement,
+                             bool                bNegative,
+                             UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumberRaw(). */
+static void
+QCBOREncode_AddTBigNumberRawToMapSZ(QCBOREncodeContext *pCtx,
+                                    const char         *szLabel,
+                                    uint8_t             uTagRequirement,
+                                    bool                bNegative,
+                                    UsefulBufC          BigNumber);
+
+/** See QCBOREncode_AddTBigNumberRaw(). */
+static void
+QCBOREncode_AddTBigNumberRawToMapN(QCBOREncodeContext *pCtx,
+                                   int64_t             nLabel,
+                                   uint8_t             uTagRequirement,
+                                   bool                bNegative,
+                                   UsefulBufC          BigNumber);
+
+
+
+#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
+/**
+ * @brief Add a decimal fraction.
+ *
+ * @param[in] pCtx             Encoding context to add the decimal fraction to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] nMantissa        The mantissa.
+ * @param[in] nBase10Exponent  The exponent.
+ *
+ * The value is nMantissa * 10 ^ nBase10Exponent.
+ *
+ * A decimal fraction is good for exact representation of some values
+ * that can't be represented exactly with standard C (IEEE 754)
+ * floating-point numbers.  Much larger and much smaller numbers can
+ * also be represented than floating-point because of the larger
+ * number of bits in the exponent.
+ *
+ * The decimal fraction is conveyed as two integers, a mantissa and a
+ * base-10 scaling factor.
+ *
+ * For example, 273.15 is represented by the two integers 27315 and -2.
+ *
+ * The exponent and mantissa have the range from @c INT64_MIN to
+ * @c INT64_MAX for both encoding and decoding (CBOR allows
+ * @c -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
+ * support this range to reduce code size and interface complexity a
+ * little).
+ *
+ * CBOR Preferred serialization of the integers is used, thus they
+ * will be encoded in the smallest number of bytes possible.
+ *
+ * See also QCBOREncode_AddTDecimalFractionBigNumber() for a decimal
+ * fraction with arbitrarily large precision and
+ * QCBOREncode_AddTBigFloat().
+ *
+ * There is no representation of positive or negative infinity or NaN
+ * (Not a Number). Use QCBOREncode_AddDouble() to encode them.
+ *
+ * See @ref expAndMantissa for decoded representation.
+ */
+static void
+QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pCtx,
+                                uint8_t             uTagRequirement,
+                                int64_t             nMantissa,
+                                int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFraction(). */
+static void
+QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pCtx,
+                                       const char         *szLabel,
+                                       uint8_t             uTagRequirement,
+                                       int64_t             nMantissa,
+                                       int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFraction(). */
+static void
+QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pCtx,
+                                      int64_t             nLabel,
+                                      uint8_t             uTagRequirement,
+                                      int64_t             nMantissa,
+                                      int64_t             nBase10Exponent);
+
+
+
+/**
+ * @brief Add a decimal fraction with a big number mantissa..
+ *
+ * @param[in] pCtx             Encoding context to add the decimal fraction to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Mantissa         The big number mantissa.
+ * @param[in] bIsNegative      false if mantissa is positive, true if negative.
+ * @param[in] nBase10Exponent  The exponent.
+ *
+ * This is the same as QCBOREncode_AddTDecimalFraction() except the
+ * mantissa is a big number (See QCBOREncode_AddTBignumber())
+ * allowing for arbitrarily large precision.
+ *
+ * Preferred serialization of the big number is used. This means it may be converted to
+ * a type 0 or type 1 integers making the result the same as QCBOREncode_AddTDecimalFraction().
+ * This also offsets negative big numbers by one.
+ *
+ * If you want the big number to be copied straight through without the conversion to type 0
+ * and 1 integers and without the offset of 1 (and much smaller objet code) use QCBOREncode_AddTBigFloatBigMantissaRaw().
+ *
+ * See @ref expAndMantissa for decoded representation.
+ */
+static void
+QCBOREncode_AddTDecimalFractionBigMantissa(QCBOREncodeContext *pCtx,
+                                           uint8_t             uTagRequirement,
+                                           UsefulBufC          Mantissa,
+                                           bool                bIsNegative,
+                                           int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFractionBigMantissa(). */
+static void
+QCBOREncode_AddTDecimalFractionBigMantissaToMapSZ(QCBOREncodeContext *pCtx,
+                                                  const char         *szLabel,
+                                                  uint8_t             uTagRequirement,
+                                                  UsefulBufC          Mantissa,
+                                                  bool                bIsNegative,
+                                                  int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFractionBigMantissa(). */
+static void
+QCBOREncode_AddTDecimalFractionBigMantissaToMapN(QCBOREncodeContext *pCtx,
+                                                 int64_t             nLabel,
+                                                 uint8_t             uTagRequirement,
+                                                 UsefulBufC          Mantissa,
+                                                 bool                bIsNegative,
+                                                 int64_t             nBase10Exponent);
+/**
+ * @brief Add a decimal fraction with a raw big number mantissa.
+ *
+ * @param[in] pCtx             The encoding context to add the bigfloat to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Mantissa         The mantissa.
+ * @param[in] bIsNegative      false if mantissa is positive, true if negative.
+ * @param[in] nBase10Exponent   The exponent.
+ *
+ * This is the same as QCBOREncode_AddTDecimalFractionBigMantissa() except the mantissa
+ * is not corrected by one and links in much less object code.
+ */static void
+QCBOREncode_AddTDecimalFractionBigMantissaRaw(QCBOREncodeContext *pCtx,
+                                              uint8_t             uTagRequirement,
+                                              UsefulBufC          Mantissa,
+                                              bool                bIsNegative,
+                                              int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFractionBigMantissaRaw(). */
+static void
+QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(QCBOREncodeContext *pCtx,
+                                                     const char         *szLabel,
+                                                     uint8_t             uTagRequirement,
+                                                     UsefulBufC          Mantissa,
+                                                     bool                bIsNegative,
+                                                     int64_t             nBase10Exponent);
+
+/** See QCBOREncode_AddTDecimalFractionBigMantissaRaw(). */
+static void
+QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(QCBOREncodeContext *pCtx,
+                                                    int64_t             nLabel,
+                                                    uint8_t             uTagRequirement,
+                                                    UsefulBufC          Mantissa,
+                                                    bool                bIsNegative,
+                                                    int64_t             nBase10Exponent);
+
+
+
+/**
+ * @brief Add a big floating-point number to the encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the bigfloat to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] nMantissa        The mantissa.
+ * @param[in] nBase2Exponent   The exponent.
+ *
+ * The value is nMantissa * 2 ^ nBase2Exponent.
+ *
+ * "Bigfloats", as CBOR terms them, are similar to IEEE floating-point
+ * numbers in having a mantissa and base-2 exponent, but they are not
+ * supported by hardware or encoded the same. They explicitly use two
+ * CBOR-encoded integers to convey the mantissa and exponent, each of
+ * which can be 8, 16, 32 or 64 bits. With both the mantissa and
+ * exponent 64 bits they can express more precision and a larger range
+ * than an IEEE double floating-point number. See
+ * QCBOREncode_AddTBigFloatBigMantissa() for even more precision.
+ *
+ * For example, 1.5 would be represented by a mantissa of 3 and an
+ * exponent of -1.
+ *
+ * The exponent has a range from @c INT64_MIN to
+ * @c INT64_MAX for both encoding and decoding (CBOR allows @c
+ * -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
+ * support this range to reduce code size and interface complexity a
+ * little).
+ *
+ * CBOR preferred serialization of the integers is used, thus they will
+ * be encoded in the smallest number of bytes possible.
+ *
+ * This can also be used to represent floating-point numbers in
+ * environments that don't support IEEE 754.
+ *
+ * See @ref expAndMantissa for decoded representation.
+ */
+static void
+QCBOREncode_AddTBigFloat(QCBOREncodeContext *pCtx,
+                         uint8_t             uTagRequirement,
+                         int64_t             nMantissa,
+                         int64_t             nBase2Exponent);
+
+/** See QCBOREncode_AddTBigFloat(). */
+static void
+QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pCtx,
+                                const char         *szLabel,
+                                uint8_t             uTagRequirement,
+                                int64_t             nMantissa,
+                                int64_t             nBase2Exponent);
+
+/** See QCBOREncode_AddTBigFloat(). */
+static void
+QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pCtx,
+                               int64_t             nLabel,
+                               uint8_t             uTagRequirement,
+                               int64_t             nMantissa,
+                               int64_t             nBase2Exponent);
+
+
+/**
+ * @brief Add a big floating-point number with a big number mantissa.
+ *
+ * @param[in] pCtx             The encoding context to add the bigfloat to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Mantissa         The mantissa.
+ * @param[in] bIsNegative      false if mantissa is positive, true if negative.
+ * @param[in] nBase2Exponent   The exponent.
+ *
+ * This is the same as QCBOREncode_AddTBigFloat() except the mantissa
+ * is a big number (See QCBOREncode_AddTBigMantissa()) allowing for
+ * arbitrary precision.
+ *
+ *The big number will be offset by 1 if negative and preferred serialization will be used (tag 0 and 1).
+ *
+ * If you want the big number to be copied straight through without the conversion to type 0
+ * and 1 integers and without the offset of 1 (and much smaller objet code) use QCBOREncode_AddTBigFloatBigMantissa().
+ *
+ * See @ref expAndMantissa for decoded representation.
+ */
+static void
+QCBOREncode_AddTBigFloatBigMantissa(QCBOREncodeContext *pCtx,
+                                    uint8_t             uTagRequirement,
+                                    UsefulBufC          Mantissa,
+                                    bool                bIsNegative,
+                                    int64_t             nBase2Exponent);
+
+/** See QCBOREncode_AddTBigFloatBigMantissa(). */
+static void
+QCBOREncode_AddTBigFloatBigMantissaToMapSZ(QCBOREncodeContext *pCtx,
+                                           const char         *szLabel,
+                                           uint8_t             uTagRequirement,
+                                           UsefulBufC          Mantissa,
+                                           bool                bIsNegative,
+                                           int64_t             nBase2Exponent);
+
+/** See QCBOREncode_AddTBigFloatBigMantissa(). */
+static void
+QCBOREncode_AddTBigFloatBigMantissaToMapN(QCBOREncodeContext *pCtx,
+                                          int64_t             nLabel,
+                                          uint8_t             uTagRequirement,
+                                          UsefulBufC          Mantissa,
+                                          bool                bIsNegative,
+                                          int64_t             nBase2Exponent);
+
+
+/**
+ * @brief Add a big floating-point number with a big number mantissa.
+ *
+ * @param[in] pCtx             The encoding context to add the bigfloat to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Mantissa         The mantissa.
+ * @param[in] bIsNegative      false if mantissa is positive, true if negative.
+ * @param[in] nBase2Exponent   The exponent.
+ *
+ * This is the same as QCBOREncode_AddTBigFloatBigMantissa() except the mantissa
+ * is not corrected by one and links in much less object code.
+ */
+static void
+QCBOREncode_AddTBigFloatBigMantissaRaw(QCBOREncodeContext *pCtx,
+                                       uint8_t             uTagRequirement,
+                                       UsefulBufC          Mantissa,
+                                       bool                bIsNegative,
+                                       int64_t             nBase2Exponent);
+
+
+/** See QCBOREncode_AddTBigFloatBigMantissaRaw(). */
+static void
+QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(QCBOREncodeContext *pCtx,
+                                              const char         *szLabel,
+                                              uint8_t             uTagRequirement,
+                                              UsefulBufC          Mantissa,
+                                              bool                bIsNegative,
+                                              int64_t             nBase2Exponent);
+
+/** See QCBOREncode_AddTBigFloatBigMantissaRaw(). */
+static void
+QCBOREncode_AddTBigFloatBigMantissaRawToMapN(QCBOREncodeContext *pCtx,
+                                             int64_t             nLabel,
+                                             uint8_t             uTagRequirement,
+                                             UsefulBufC          Mantissa,
+                                             bool                bIsNegative,
+                                             int64_t             nBase2Exponent);
+
+
+#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
+
+
+/* ========================================================================= *
+ *    BEGINNING OF DEPRECATED FUNCTION DECLARATIONS                          *
+ *                                                                           *
+ *    There is no plan to remove these in future versions.                   *
+ *    They just have been replaced by something better.                      *
+ * ========================================================================= */
+
+/** @deprecated Use QCBOREncode_AddInt64ToMapSZ() instead. */
+static void
+QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nNum);
+
+/** @deprecated Use QCBOREncode_AddUInt64ToMapSZ() instead. */
+static void
+QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
+
+#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+/** @deprecated Use QCBOREncode_AddDoubleToMapSZ() instead. */
+static void
+QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
+
+/** @deprecated Use QCBOREncode_AddFloatToMapSZ() instead. */
+static void
+QCBOREncode_AddFloatToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
+
+/** @deprecated Use QCBOREncode_AddDoubleNoPreferredToMapSZ() instead. */
+static void
+QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
+
+/** @deprecated Use QCBOREncode_AddFloatNoPreferredToMapSZ() instead. */
+static void
+QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
+#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
+
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRaw() instead. */
+static void
+QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pCtx,
+                               uint8_t             uTagRequirement,
+                               UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapSZ() instead. */
+static void
+QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pCtx,
+                                      const char         *szLabel,
+                                      uint8_t             uTagRequirement,
+                                      UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapN() instead. */
+static void
+QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pCtx,
+                                     int64_t             nLabel,
+                                     uint8_t             uTagRequirement,
+                                     UsefulBufC          BigNumber);
+
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRaw() instead. */
+static void
+QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pCtx,
+                              UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapSZ() instead. */
+static void
+QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pCtx,
+                                   const char         *szLabel,
+                                   UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapN() instead. */
+static void
+QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pCtx,
+                                    int64_t             nLabel,
+                                    UsefulBufC          BigNumber);
+
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRaw() instead. */
+static void
+QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pCtx,
+                               uint8_t             uTagRequirement,
+                               UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapSZ() instead. */
+static void
+QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pCtx,
+                                      const char         *szLabel,
+                                      uint8_t             uTagRequirement,
+                                      UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapN() instead. */
+static void
+QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pCtx,
+                                     int64_t             nLabel,
+                                     uint8_t             uTagRequirement,
+                                     UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRaw() instead. */
+static void
+QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pCtx,
+                              UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapSZ() instead. */
+static void
+QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pCtx,
+                                   const char         *szLabel,
+                                   UsefulBufC          BigNumber);
+
+/** @deprecated Use QCBOREncode_AddTBigNumberRawToMapN() instead. */
+static void
+QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pCtx,
+                                    int64_t             nLabel,
+                                    UsefulBufC          BigNumber);
+
+
+#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
+/** @deprecated Use QCBOREncode_AddTDecimalFraction() instead.*/
+static void
+QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pCtx,
+                               int64_t             nMantissa,
+                               int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionToMapSZ() instead. */
+static void
+QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pCtx,
+                                    const char         *szLabel,
+                                    int64_t             nMantissa,
+                                    int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionToMapN() instead. */
+static void
+QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pCtx,
+                                     int64_t             nLabel,
+                                     int64_t             nMantissa,
+                                     int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRaw() instead. */
+static void
+QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pCtx,
+                                      uint8_t             uTagRequirement,
+                                      UsefulBufC          Mantissa,
+                                      bool                bIsNegative,
+                                      int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ() instead. */
+static void
+QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
+                                             const char         *szLabel,
+                                             uint8_t             uTagRequirement,
+                                             UsefulBufC          Mantissa,
+                                             bool                bIsNegative,
+                                             int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN() instead. */
+static void
+QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
+                                            int64_t             nLabel,
+                                            uint8_t             uTagRequirement,
+                                            UsefulBufC          Mantissa,
+                                            bool                bIsNegative,
+                                            int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRaw() instead. */
+static void
+QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pCtx,
+                                     UsefulBufC          Mantissa,
+                                     bool                bIsNegative,
+                                     int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ() instead. */
+static void
+QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
+                                            const char         *szLabel,
+                                            UsefulBufC          Mantissa,
+                                            bool                bIsNegative,
+                                            int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN() instead. */
+static void
+QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
+                                           int64_t             nLabel,
+                                           UsefulBufC          Mantissa,
+                                           bool                bIsNegative,
+                                           int64_t             nBase10Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloat() instead. */
+static void
+QCBOREncode_AddBigFloat(QCBOREncodeContext *pCtx,
+                        int64_t             nMantissa,
+                        int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatToMapSZ() instead. */
+static void
+QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             int64_t             nMantissa,
+                             int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatToMapN() instead. */
+static void
+QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pCtx,
+                              int64_t             nLabel,
+                              int64_t             nMantissa,
+                              int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRaw() instead. */
+static void
+QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pCtx,
+                               uint8_t             uTagRequirement,
+                               UsefulBufC          Mantissa,
+                               bool                bIsNegative,
+                               int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ() instead. */
+static void
+QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pCtx,
+                                      const char         *szLabel,
+                                      uint8_t             uTagRequirement,
+                                      UsefulBufC          Mantissa,
+                                      bool                bIsNegative,
+                                      int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRawToMapN() instead. */
+static void
+QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
+                                     int64_t             nLabel,
+                                     uint8_t             uTagRequirement,
+                                     UsefulBufC          Mantissa,
+                                     bool                bIsNegative,
+                                     int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRaw() instead. */
+static void
+QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pCtx,
+                              UsefulBufC          Mantissa,
+                              bool                bIsNegative,
+                              int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ() instead. */
+static void
+QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pCtx,
+                                   const char         *szLabel,
+                                   UsefulBufC          Mantissa,
+                                   bool                bIsNegative,
+                                   int64_t             nBase2Exponent);
+
+/** @deprecated Use QCBOREncode_AddTBigFloatBigMantissaRawToMapN() instead. */
+static void
+QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
+                                    int64_t             nLabel,
+                                    UsefulBufC          Mantissa,
+                                    bool                bIsNegative,
+                                    int64_t             nBase2Exponent);
+
+#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
+
+
+
+/* ========================================================================= *
+ *    END OF DEPRECATED FUNCTION DECLARATIONS                                *
+ * ========================================================================= */
+
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION                             *
+ * ========================================================================= */
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddPreferredDouble(QCBOREncodeContext *pMe, const double dNum);
+
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddPreferredFloat(QCBOREncodeContext *pMe, const float fNum);
+
+
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddTBigNumberMain(QCBOREncodeContext *pMe,
+                                      const uint8_t       uTagRequirement,
+                                      bool                bPreferred,
+                                      const bool          bNegative,
+                                      const UsefulBufC    BigNumber);
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddTExpIntMantissa(QCBOREncodeContext *pMe,
+                                       const int           uTagRequirement,
+                                       const uint64_t      uTagNumber,
+                                       const int64_t       nExponent,
+                                       const int64_t       nMantissa);
+
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddTExpBigMantissa(QCBOREncodeContext *pMe,
+                                       const int           uTagRequirement,
+                                       const uint64_t      uTagNumber,
+                                       const int64_t       nExponent,
+                                       const UsefulBufC    BigNumMantissa,
+                                       const bool          bBigNumIsNegative);
+
+
+/** @private See qcbor_main_number_encode.c */
+void
+QCBOREncode_Private_AddTExpBigMantissaRaw(QCBOREncodeContext *pMe,
+                                          const int           uTagRequirement,
+                                          const uint64_t      uTagNumber,
+                                          const int64_t       nExponent,
+                                          const UsefulBufC    BigNumMantissa,
+                                          const bool          bBigNumIsNegative);
+
+
+#include "qcbor/qcbor_tag_encode.h"
+
+
+static inline void
+QCBOREncode_AddInt64ToMapSZ(QCBOREncodeContext *pMe,
+                            const char        *szLabel,
+                            const int64_t      nNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddInt64(pMe, nNum);
+}
+
+static inline void
+QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, int64_t nNum)
+{
+   QCBOREncode_AddInt64ToMapSZ(pMe, szLabel, nNum);
+}
+
+static inline void
+QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pMe,
+                           const int64_t       nLabel,
+                           const int64_t       nNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddInt64(pMe, nNum);
+}
+
+
+static inline void
+QCBOREncode_AddUInt64(QCBOREncodeContext *pMe, const uint64_t uValue)
+{
+   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_POSITIVE_INT, uValue, 0);
+}
+
+
+static inline void
+QCBOREncode_AddUInt64ToMapSZ(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const uint64_t      uNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddUInt64(pMe, uNum);
+}
+
+static inline void
+QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, uint64_t uNum)
+{
+   QCBOREncode_AddUInt64ToMapSZ(pMe, szLabel, uNum);
+}
+
+static inline void
+QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pMe,
+                            const int64_t       nLabel,
+                            const uint64_t      uNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddUInt64(pMe, uNum);
+}
+
+
+static inline void
+QCBOREncode_AddNegativeUInt64(QCBOREncodeContext *pMe, const uint64_t uValue)
+{
+   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_NEGATIVE_INT, uValue, 0);
+}
+
+static inline void
+QCBOREncode_AddNegativeUInt64ToMap(QCBOREncodeContext *pMe, const char *szLabel, uint64_t uNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddNegativeUInt64(pMe, uNum);
+}
+
+static inline void
+QCBOREncode_AddNegativeUInt64ToMapN(QCBOREncodeContext *pMe, int64_t nLabel, uint64_t uNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddNegativeUInt64(pMe, uNum);
+}
+
+
+
+
+
+#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+
+/**
+ * @brief Add a double in with no processing.
+ * @private
+ */
+static inline void
+QCBOREncode_Private_AddDoubleRaw(QCBOREncodeContext *pMe, const double dNum)
+{
+   QCBOREncode_Private_AddType7(pMe,
+                                sizeof(uint64_t),
+                                UsefulBufUtil_CopyDoubleToUint64(dNum));
+}
+
+static inline void
+QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pMe, const double dNum)
+{
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS) {
+      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   QCBOREncode_Private_AddDoubleRaw(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddDouble(QCBOREncodeContext *pMe, const double dNum)
+{
+#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
+   QCBOREncode_Private_AddPreferredDouble(pMe, dNum);
+#else /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
+   QCBOREncode_Private_AddDoubleRaw(pMe, dNum);
+#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
+}
+
+static inline void
+QCBOREncode_AddDoubleToMapSZ(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const double        dNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddDouble(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pMe, const char *szLabel, double dNum)
+{
+   QCBOREncode_AddDoubleToMapSZ(pMe, szLabel, dNum);
+}
+
+static inline void
+QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pMe,
+                            const int64_t       nLabel,
+                            const double        dNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddDouble(pMe, dNum);
+}
+
+/**
+ * @brief Add a float in with no processing.
+ * @private
+ */
+static inline void
+QCBOREncode_Private_AddFloatRaw(QCBOREncodeContext *pMe, const float fNum)
+{
+   QCBOREncode_Private_AddType7(pMe,
+                                sizeof(uint32_t),
+                                UsefulBufUtil_CopyFloatToUint32(fNum));
+}
+
+static inline void
+QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pMe, const float fNum)
+{
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_DISALLOW_NON_PREFERRED_NUMBERS) {
+      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   QCBOREncode_Private_AddFloatRaw(pMe, fNum);
+}
+
+static inline void
+QCBOREncode_AddFloat(QCBOREncodeContext *pMe, const float fNum)
+{
+#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
+   QCBOREncode_Private_AddPreferredFloat(pMe, fNum);
+#else /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
+   QCBOREncode_Private_AddFloatRaw(pMe, fNum);
+#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
+}
+
+static inline void
+QCBOREncode_AddFloatToMapSZ(QCBOREncodeContext *pMe,
+                            const char         *szLabel,
+                            const float         dNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddFloat(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddFloatToMap(QCBOREncodeContext *pMe, const char *szLabel, float fNum)
+{
+   QCBOREncode_AddFloatToMapSZ(pMe, szLabel, fNum);
+}
+
+static inline void
+QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pMe,
+                           const int64_t       nLabel,
+                           const float         fNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddFloat(pMe, fNum);
+}
+
+static inline void
+QCBOREncode_AddDoubleNoPreferredToMapSZ(QCBOREncodeContext *pMe,
+                                        const char         *szLabel,
+                                        const double        dNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pMe, const char *szLabel, double dNum)
+{
+   QCBOREncode_AddDoubleNoPreferredToMapSZ(pMe, szLabel, dNum);
+}
+
+static inline void
+QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pMe,
+                                       const int64_t       nLabel,
+                                       const double        dNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddFloatNoPreferredToMapSZ(QCBOREncodeContext *pMe,
+                                       const char         *szLabel,
+                                       const float         dNum)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddFloatNoPreferred(pMe, dNum);
+}
+
+static inline void
+QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pMe, const char *szLabel, float fNum)
+{
+   QCBOREncode_AddFloatNoPreferredToMapSZ(pMe, szLabel, fNum);
+}
+
+static inline void
+QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pMe,
+                                      const int64_t       nLabel,
+                                      const float         dNum)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddFloatNoPreferred(pMe, dNum);
+}
+#endif /* ! USEFULBUF_DISABLE_ALL_FLOAT */
+
+
+
+
+static inline void
+QCBOREncode_AddTBigNumber(QCBOREncodeContext *pMe,
+                          const uint8_t       uTagRequirement,
+                          const bool          bNegative,
+                          const UsefulBufC    BigNumber)
+{
+   QCBOREncode_Private_AddTBigNumberMain(pMe, uTagRequirement, true, bNegative, BigNumber);
+}
+
+
+static inline void
+QCBOREncode_AddTBigNumberToMapSZ(QCBOREncodeContext *pMe,
+                                 const char         *szLabel,
+                                 uint8_t             uTagRequirement,
+                                 bool                bNegative,
+                                 UsefulBufC          BigNumber)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigNumber(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+static inline void
+QCBOREncode_AddTBigNumberToMapN(QCBOREncodeContext *pMe,
+                                int64_t             nLabel,
+                                uint8_t             uTagRequirement,
+                                bool                bNegative,
+                                UsefulBufC          BigNumber)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigNumber(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+static inline void
+QCBOREncode_AddTBigNumberNoPreferred(QCBOREncodeContext *pMe,
+                                     const uint8_t       uTagRequirement,
+                                     const bool          bNegative,
+                                     const UsefulBufC    BigNumber)
+{
+   QCBOREncode_Private_AddTBigNumberMain(pMe, uTagRequirement, false, bNegative, BigNumber);
+}
+
+static inline void
+QCBOREncode_AddTBigNumberNoPreferredToMapSZ(QCBOREncodeContext *pMe,
+                                            const char         *szLabel,
+                                            uint8_t             uTagRequirement,
+                                            bool                bNegative,
+                                            UsefulBufC          BigNumber)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigNumberNoPreferred(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+static inline void
+QCBOREncode_AddTBigNumberNoPreferredToMapN(QCBOREncodeContext *pMe,
+                                           int64_t             nLabel,
+                                           uint8_t             uTagRequirement,
+                                           bool                bNegative,
+                                           UsefulBufC          BigNumber)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigNumberNoPreferred(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+/**
+ * @brief Add the tag number for a big number (private).
+ * @private
+ *
+ * @param[in] pMe  The decode context.
+ * @param[in] uTagRequirement
+ * @param[in] bNegative  If true, big number is negative.
+ */
+static inline void
+QCBOREncode_Private_BigNumberTag(QCBOREncodeContext *pMe,
+                                 const uint8_t       uTagRequirement,
+                                 bool                bNegative)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, bNegative ? CBOR_TAG_NEG_BIGNUM : CBOR_TAG_POS_BIGNUM);
+   }
+}
+
+
+static inline void
+QCBOREncode_AddTBigNumberRaw(QCBOREncodeContext *pMe,
+                             const uint8_t       uTagRequirement,
+                             bool                bNegative,
+                             const UsefulBufC    BigNumber)
+{
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS) {
+      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   QCBOREncode_Private_BigNumberTag(pMe, uTagRequirement, bNegative);
+   QCBOREncode_AddBytes(pMe, BigNumber);
+}
+
+static inline void
+QCBOREncode_AddTBigNumberRawToMapSZ(QCBOREncodeContext *pMe,
+                                    const char         *szLabel,
+                                    const uint8_t       uTagRequirement,
+                                    bool                bNegative,
+                                    const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+
+static inline void
+QCBOREncode_AddTBigNumberRawToMapN(QCBOREncodeContext *pMe,
+                                   int64_t             nLabel,
+                                   const uint8_t       uTagRequirement,
+                                   bool                bNegative,
+                                   const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, bNegative, BigNumber);
+}
+
+
+
+
+
+#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
+
+static inline void
+QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pMe,
+                                const uint8_t       uTagRequirement,
+                                const int64_t       nMantissa,
+                                const int64_t       nBase10Exponent)
+{
+   QCBOREncode_Private_AddTExpIntMantissa(pMe,
+                                          uTagRequirement,
+                                          CBOR_TAG_DECIMAL_FRACTION,
+                                          nBase10Exponent,
+                                          nMantissa);
+}
+
+static inline void
+QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pMe,
+                                       const char         *szLabel,
+                                       const uint8_t       uTagRequirement,
+                                       const int64_t       nMantissa,
+                                       const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDecimalFraction(pMe,
+                                   uTagRequirement,
+                                   nMantissa,
+                                   nBase10Exponent);
+}
+
+static inline void
+QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pMe,
+                                      const int64_t       nLabel,
+                                      const uint8_t       uTagRequirement,
+                                      const int64_t       nMantissa,
+                                      const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDecimalFraction(pMe,
+                                   uTagRequirement,
+                                   nMantissa,
+                                   nBase10Exponent);
+}
+
+
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissa(QCBOREncodeContext *pMe,
+                                           const uint8_t       uTagRequirement,
+                                           const UsefulBufC    Mantissa,
+                                           const bool          bIsNegative,
+                                           const int64_t       nBase10Exponent)
+{
+   QCBOREncode_Private_AddTExpBigMantissa(pMe,
+                                          uTagRequirement,
+                                          CBOR_TAG_DECIMAL_FRACTION,
+                                          nBase10Exponent,
+                                          Mantissa,
+                                          bIsNegative);
+}
+
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissaToMapSZ(QCBOREncodeContext *pMe,
+                                                  const char         *szLabel,
+                                                  const uint8_t       uTagRequirement,
+                                                  const UsefulBufC    Mantissa,
+                                                  const bool          bIsNegative,
+                                                  const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDecimalFractionBigMantissa(pMe,
+                                              uTagRequirement,
+                                              Mantissa,
+                                              bIsNegative,
+                                              nBase10Exponent);
+}
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissaToMapN(QCBOREncodeContext *pMe,
+                                                 const int64_t       nLabel,
+                                                 const uint8_t       uTagRequirement,
+                                                 const UsefulBufC    Mantissa,
+                                                 const bool          bIsNegative,
+                                                 const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDecimalFractionBigMantissa(pMe,
+                                              uTagRequirement,
+                                              Mantissa,
+                                              bIsNegative,
+                                              nBase10Exponent);
+}
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissaRaw(QCBOREncodeContext *pMe,
+                                              const uint8_t       uTagRequirement,
+                                              const UsefulBufC    Mantissa,
+                                              const bool          bIsNegative,
+                                              const int64_t       nBase10Exponent)
+{
+   QCBOREncode_Private_AddTExpBigMantissaRaw(pMe,
+                                             uTagRequirement,
+                                             CBOR_TAG_DECIMAL_FRACTION,
+                                             nBase10Exponent,
+                                             Mantissa,
+                                             bIsNegative);
+}
+
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(QCBOREncodeContext *pMe,
+                                                     const char         *szLabel,
+                                                     const uint8_t       uTagRequirement,
+                                                     const UsefulBufC    Mantissa,
+                                                     const bool          bIsNegative,
+                                                     const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
+                                                 uTagRequirement,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase10Exponent);
+}
+
+static inline void
+QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(QCBOREncodeContext *pMe,
+                                                    const int64_t       nLabel,
+                                                    const uint8_t       uTagRequirement,
+                                                    const UsefulBufC    Mantissa,
+                                                    const bool          bIsNegative,
+                                                    const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
+                                                 uTagRequirement,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase10Exponent);
+}
+
+
+static inline void
+QCBOREncode_AddTBigFloat(QCBOREncodeContext *pMe,
+                         const uint8_t       uTagRequirement,
+                         const int64_t       nMantissa,
+                         const int64_t       nBase2Exponent)
+{
+   QCBOREncode_Private_AddTExpIntMantissa(pMe,
+                                          uTagRequirement,
+                                          CBOR_TAG_BIGFLOAT,
+                                          nBase2Exponent,
+                                          nMantissa);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pMe,
+                                const char         *szLabel,
+                                const uint8_t       uTagRequirement,
+                                const int64_t       nMantissa,
+                                const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pMe,
+                               const int64_t       nLabel,
+                               const uint8_t       uTagRequirement,
+                               const int64_t       nMantissa,
+                               const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
+}
+
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissa(QCBOREncodeContext *pMe,
+                                    const uint8_t       uTagRequirement,
+                                    const UsefulBufC    Mantissa,
+                                    const bool          bIsNegative,
+                                    const int64_t       nBase2Exponent)
+{
+   QCBOREncode_Private_AddTExpBigMantissa(pMe,
+                                          uTagRequirement,
+                                          CBOR_TAG_BIGFLOAT,
+                                          nBase2Exponent,
+                                          Mantissa,
+                                          bIsNegative);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissaToMapSZ(QCBOREncodeContext *pMe,
+                                           const char         *szLabel,
+                                           const uint8_t       uTagRequirement,
+                                           const UsefulBufC    Mantissa,
+                                           const bool          bIsNegative,
+                                           const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigFloatBigMantissa(pMe,
+                                       uTagRequirement,
+                                       Mantissa,
+                                       bIsNegative,
+                                       nBase2Exponent);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissaToMapN(QCBOREncodeContext *pMe,
+                                          const int64_t       nLabel,
+                                          const uint8_t       uTagRequirement,
+                                          const UsefulBufC    Mantissa,
+                                          const bool          bIsNegative,
+                                          const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigFloatBigMantissa(pMe,
+                                       uTagRequirement,
+                                       Mantissa,
+                                       bIsNegative,
+                                       nBase2Exponent);
+}
+
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissaRaw(QCBOREncodeContext *pMe,
+                                       const uint8_t       uTagRequirement,
+                                       const UsefulBufC    Mantissa,
+                                       const bool          bIsNegative,
+                                       const int64_t       nBase2Exponent)
+{
+   QCBOREncode_Private_AddTExpBigMantissaRaw(pMe,
+                                             uTagRequirement,
+                                             CBOR_TAG_BIGFLOAT,
+                                             nBase2Exponent,
+                                             Mantissa,
+                                             bIsNegative);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(QCBOREncodeContext *pMe,
+                                              const char         *szLabel,
+                                              const uint8_t       uTagRequirement,
+                                              const UsefulBufC    Mantissa,
+                                              const bool          bIsNegative,
+                                              const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
+                                          uTagRequirement,
+                                          Mantissa,
+                                          bIsNegative,
+                                          nBase2Exponent);
+}
+
+static inline void
+QCBOREncode_AddTBigFloatBigMantissaRawToMapN(QCBOREncodeContext *pMe,
+                                             const int64_t       nLabel,
+                                             const uint8_t       uTagRequirement,
+                                             const UsefulBufC    Mantissa,
+                                             const bool          bIsNegative,
+                                             const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
+                                          uTagRequirement,
+                                          Mantissa,
+                                          bIsNegative,
+                                          nBase2Exponent);
+}
+
+#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
+
+
+
+/* ======================================================================== *
+ *    END OF PRIVATE INLINE IMPLEMENTATION                                  *
+ * ======================================================================== */
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF INLINES FOR DEPRECATED FUNCTIONS                          *
+ * ========================================================================= */
+
+
+static inline void /* Deprecated */
+QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pMe,
+                               const uint8_t       uTagRequirement,
+                               const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pMe,
+                                      const char         *szLabel,
+                                      const uint8_t       uTagRequirement,
+                                      const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, uTagRequirement, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pMe,
+                                     const int64_t       nLabel,
+                                     const uint8_t       uTagRequirement,
+                                     const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, uTagRequirement, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pMe, const UsefulBufC BigNumber)
+{
+   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pMe,
+                                   const char         *szLabel,
+                                   const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pMe,
+                                    const int64_t       nLabel,
+                                    const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, false, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pMe,
+                               const uint8_t       uTagRequirement,
+                               const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRaw(pMe, uTagRequirement, true, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pMe,
+                                      const char         *szLabel,
+                                      const uint8_t       uTagRequirement,
+                                      const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapSZ(pMe,
+                                       szLabel,
+                                       uTagRequirement,
+                                       true,
+                                       BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pMe,
+                                     const int64_t       nLabel,
+                                     const uint8_t       uTagRequirement,
+                                     const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapN(pMe,
+                                      nLabel,
+                                      uTagRequirement,
+                                      true,
+                                      BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pMe, const UsefulBufC BigNumber)
+{
+   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, true, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pMe,
+                                   const char         *szLabel,
+                                   const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, true, BigNumber);
+}
+
+static inline void  /* Deprecated */
+QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pMe,
+                                    const int64_t       nLabel,
+                                    const UsefulBufC    BigNumber)
+{
+   QCBOREncode_AddTBigNumberRawToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, true, BigNumber);
+
+}
+
+#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pMe,
+                               const int64_t       nMantissa,
+                               const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFraction(pMe,
+                                   QCBOR_ENCODE_AS_TAG,
+                                   nMantissa,
+                                   nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pMe,
+                                    const char         *szLabel,
+                                    const int64_t       nMantissa,
+                                    const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionToMapSZ(pMe,
+                                          szLabel,
+                                          QCBOR_ENCODE_AS_TAG,
+                                          nMantissa,
+                                          nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pMe,
+                                     const int64_t       nLabel,
+                                     const int64_t       nMantissa,
+                                     const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionToMapN(pMe,
+                                         nLabel,
+                                         QCBOR_ENCODE_AS_TAG,
+                                         nMantissa,
+                                         nBase10Exponent);
+}
+
+
+static inline void /* Deprecated */
+QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pMe,
+                                      const uint8_t       uTagRequirement,
+                                      const UsefulBufC    Mantissa,
+                                      const bool          bIsNegative,
+                                      const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
+                                                 uTagRequirement,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase10Exponent);
+}
+
+
+static inline void /* Deprecated */
+QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
+                                             const char         *szLabel,
+                                             const uint8_t       uTagRequirement,
+                                             const UsefulBufC    Mantissa,
+                                             const bool          bIsNegative,
+                                             const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(pMe,
+                                                        szLabel,
+                                                        uTagRequirement,
+                                                        Mantissa,
+                                                        bIsNegative,
+                                                        nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
+                                            const int64_t       nLabel,
+                                            const uint8_t       uTagRequirement,
+                                            const UsefulBufC    Mantissa,
+                                            const bool          bIsNegative,
+                                            const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(pMe,
+                                                       nLabel,
+                                                       uTagRequirement,
+                                                       Mantissa,
+                                                       bIsNegative,
+                                                       nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pMe,
+                                     const UsefulBufC    Mantissa,
+                                     const bool          bIsNegative,
+                                     const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRaw(pMe,
+                                                 QCBOR_ENCODE_AS_TAG,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
+                                            const char         *szLabel,
+                                            const UsefulBufC    Mantissa,
+                                            const bool          bIsNegative,
+                                            const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapSZ(pMe,
+                                                        szLabel,
+                                                        QCBOR_ENCODE_AS_TAG,
+                                                        Mantissa,
+                                                        bIsNegative,
+                                                        nBase10Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
+                                           const int64_t       nLabel,
+                                           const UsefulBufC    Mantissa,
+                                           const bool          bIsNegative,
+                                           const int64_t       nBase10Exponent)
+{
+   QCBOREncode_AddTDecimalFractionBigMantissaRawToMapN(pMe,
+                                                       nLabel,
+                                                       QCBOR_ENCODE_AS_TAG,
+                                                       Mantissa,
+                                                       bIsNegative,
+                                                       nBase10Exponent);
+}
+
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloat(QCBOREncodeContext *pMe,
+                        const int64_t       nMantissa,
+                        const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloat(pMe,
+                            QCBOR_ENCODE_AS_TAG,
+                            nMantissa,
+                            nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const int64_t       nMantissa,
+                             const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatToMapSZ(pMe,
+                                   szLabel,
+                                   QCBOR_ENCODE_AS_TAG,
+                                   nMantissa,
+                                   nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pMe,
+                              const int64_t       nLabel,
+                              const int64_t       nMantissa,
+                              const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatToMapN(pMe,
+                                  nLabel,
+                                  QCBOR_ENCODE_AS_TAG,
+                                  nMantissa,
+                                  nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pMe,
+                               const uint8_t       uTagRequirement,
+                               const UsefulBufC    Mantissa,
+                               const bool          bIsNegative,
+                               const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
+                                          uTagRequirement,
+                                          Mantissa,
+                                          bIsNegative,
+                                          nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pMe,
+                                      const char         *szLabel,
+                                      const uint8_t       uTagRequirement,
+                                      const UsefulBufC    Mantissa,
+                                      const bool          bIsNegative,
+                                      const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(pMe,
+                                                 szLabel,
+                                                 uTagRequirement,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
+                                     const int64_t       nLabel,
+                                     const uint8_t       uTagRequirement,
+                                     const UsefulBufC    Mantissa,
+                                     const bool          bIsNegative,
+                                     const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRawToMapN(pMe,
+                                                nLabel,
+                                                uTagRequirement,
+                                                Mantissa,
+                                                bIsNegative,
+                                                nBase2Exponent);
+}
+
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pMe,
+                              const UsefulBufC    Mantissa,
+                              const bool          bIsNegative,
+                              const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRaw(pMe,
+                                          QCBOR_ENCODE_AS_TAG,
+                                          Mantissa,
+                                          bIsNegative,
+                                          nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pMe,
+                                   const char         *szLabel,
+                                   const UsefulBufC    Mantissa,
+                                   const bool          bIsNegative,
+                                   const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRawToMapSZ(pMe,
+                                                 szLabel,
+                                                 QCBOR_ENCODE_AS_TAG,
+                                                 Mantissa,
+                                                 bIsNegative,
+                                                 nBase2Exponent);
+}
+
+static inline void /* Deprecated */
+QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
+                                    const int64_t       nLabel,
+                                    const UsefulBufC    Mantissa,
+                                    const bool          bIsNegative,
+                                    const int64_t       nBase2Exponent)
+{
+   QCBOREncode_AddTBigFloatBigMantissaRawToMapN(pMe,
+                                                nLabel,
+                                                QCBOR_ENCODE_AS_TAG,
+                                                Mantissa,
+                                                bIsNegative,
+                                                nBase2Exponent);
+}
+
+#endif /* ! QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
+
+/* ========================================================================= *
+ *    END OF INLINES FOR DEPRECATED FUNCTIONS                                *
+ * ========================================================================= */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* qcbor_number_encode_h */
diff --git a/inc/qcbor/qcbor_tag_encode.h b/inc/qcbor/qcbor_tag_encode.h
new file mode 100644
index 0000000..a862056
--- /dev/null
+++ b/inc/qcbor/qcbor_tag_encode.h
@@ -0,0 +1,1214 @@
+/* ===========================================================================
+ * qcbor_tag_encode.h
+ * Forked from qcbor_encode.h 12/17/2024
+ *
+ * Copyright (c) 2016-2018, The Linux Foundation.
+ * Copyright (c) 2018-2024, Laurence Lundblade.
+ * Copyright (c) 2021, Arm Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors, nor the name "Laurence Lundblade" may be used to
+ *       endorse or promote products derived from this software without
+ *       specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ========================================================================= */
+
+#ifndef qcbor_tag_encode_h
+#define qcbor_tag_encode_h
+
+
+#include "qcbor/qcbor_common.h"
+#include "qcbor/qcbor_private.h"
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} // Keep editor indention formatting happy
+#endif
+#endif
+
+
+/**
+ * @file qcbor_tag_encode.h
+ *
+ * @anchor Tags-Overview
+ *
+ * ## Tags Overview
+ *
+ * Any CBOR data item can be made into a tag to add semantics, define a
+ * new data type or such. Some tags are fully standardized and some are
+ * just registered. Others are not registered and used in a proprietary
+ * way.
+ *
+ * Encoding and decoding of many of the registered tags is fully
+ * implemented by QCBOR. It is also possible to encode and decode tags
+ * that are not directly supported.  For many use cases the built-in tag
+ * support should be adequate.
+ *
+ * For example, the registered epoch date tag is supported in encoding
+ * by QCBOREncode_AddTDateEpoch() and in decoding by @ref
+ * QCBOR_TYPE_DATE_EPOCH and the @c epochDate member of @ref
+ * QCBORItem. This is typical of the built-in tag support. There is an
+ * API to encode data for it and a @c QCBOR_TYPE_XXX when it is decoded.
+ *
+ * Tags are registered in the [IANA CBOR Tags Registry]
+ * (https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml). There
+ * are roughly three options to create a new tag. First, a public
+ * specification can be created and the new tag registered with IANA.
+ * This is the most formal. Second, the new tag can be registered with
+ * IANA with just a short description rather than a full specification.
+ * These tags must be greater than 256. Third, a tag can be used without
+ * any IANA registration, though the registry should be checked to see
+ * that the new value doesn't collide with one that is registered. The
+ * value of these tags must be 256 or larger.
+ *
+ * See also @ref CBORTags and @ref Tag-Usage
+ *
+ * The encoding side of tags not built-in is handled by
+ * QCBOREncode_AddTagNumber() and is relatively simple. Tag decoding is more
+ * complex and mainly handled by QCBORDecode_GetNext(). Decoding of the
+ * structure of tagged data not built-in (if there is any) has to be
+ * implemented by the caller.
+ */
+
+
+/**
+ * Output the full CBOR tag. See @ref CBORTags, @ref Tag-Usage and
+ * @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_TAG      0
+
+/**
+ * Output only the 'borrowed' content format for the relevant tag.
+ * See @ref CBORTags, @ref Tag-Usage and @ref Tags-Overview.
+ */
+#define QCBOR_ENCODE_AS_BORROWED 1
+
+
+
+/**
+ * @brief Add a tag number.
+ *
+ * @param[in] pCtx  The encoding context to add the tag to.
+ * @param[in] uTag  The tag to add
+ *
+ * This outputs a CBOR major type 6 item that tags the next data item
+ * that is output usually to indicate it is some new data type.
+ *
+ * For many of the common standard tags, a function to encode data
+ * using it is provided and this is not needed. For example,
+ * QCBOREncode_AddTDateEpoch() already exists to output integers
+ * representing dates with the right tag.
+ *
+ * The tag is applied to the next data item added to the encoded
+ * output. That data item that is to be tagged can be of any major
+ * CBOR type. Any number of tags can be added to a data item by
+ * calling this multiple times before the data item is added.
+ *
+ * See @ref Tags-Overview for discussion of creating new non-standard
+ * tags. See QCBORDecode_GetNext() for discussion of decoding custom
+ * tags.
+ */
+static void
+QCBOREncode_AddTagNumber(QCBOREncodeContext *pCtx, uint64_t uTag);
+
+
+/**
+ * @brief  Add an epoch-based date.
+ *
+ * @param[in] pCtx             The encoding context to add the date to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] nDate            Number of seconds since 1970-01-01T00:00Z
+ *                             in UTC time.
+ *
+ * As per RFC 8949 this is similar to UNIX/Linux/POSIX dates. This is
+ * the most compact way to specify a date and time in CBOR. Note that
+ * this is always UTC and does not include the time zone.  Use
+ * QCBOREncode_AddDateString() if you want to include the time zone.
+ *
+ * The preferred integer serialization rules apply here so the date will be
+ * encoded in a minimal number of bytes. Until about the year 2106
+ * these dates will encode in 6 bytes -- one byte for the tag, one
+ * byte for the type and 4 bytes for the integer. After that it will
+ * encode to 10 bytes.
+ *
+ * Negative values are supported for dates before 1970.
+ *
+ * If you care about leap-seconds and that level of accuracy, make sure
+ * the system you are running this code on does it correctly. This code
+ * just takes the value passed in.
+ *
+ * This implementation cannot encode fractional seconds using float or
+ * double even though that is allowed by CBOR, but you can encode them
+ * if you want to by calling QCBOREncode_AddTagNumber() and QCBOREncode_AddDouble().
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * See also QCBOREncode_AddTDaysEpoch().
+ */
+static void
+QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pCtx,
+                          uint8_t             uTagRequirement,
+                          int64_t             nDate);
+
+/** See QCBOREncode_AddTDateEpoch(). */
+static void
+QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pCtx,
+                                 const char         *szLabel,
+                                 uint8_t             uTagRequirement,
+                                 int64_t             nDate);
+
+/** See QCBOREncode_AddTDateEpoch(). */
+static void
+QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pCtx,
+                                int64_t             nLabel,
+                                uint8_t             uTagRequirement,
+                                int64_t             nDate);
+
+
+/**
+ *  @brief  Add an epoch-based day-count date.
+ *
+ *  @param[in] pCtx             The encoding context to add the date to.
+ *  @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                              @ref QCBOR_ENCODE_AS_BORROWED.
+ *  @param[in] nDays            Number of days before or after 1970-01-0.
+ *
+ * This date format is described in
+ * [RFC 8943] (https://www.rfc-editor.org/rfc/rfc8943.html).
+ *
+ * The preferred integer serialization rules apply here so the date
+ * will be encoded in a minimal number of bytes. Until about the year
+ * 2149 these dates will encode in 4 bytes -- one byte for the tag,
+ * one byte for the type and 2 bytes for the integer.
+ *
+ * See also QCBOREncode_AddTDateEpoch().
+ */
+static void
+QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pCtx,
+                          uint8_t             uTagRequirement,
+                          int64_t             nDays);
+
+/** See QCBOREncode_AddTDaysEpoch(). */
+static void
+QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pCtx,
+                                 const char         *szLabel,
+                                 uint8_t             uTagRequirement,
+                                 int64_t             nDays);
+
+/** See QCBOREncode_AddTDaysEpoch(). */
+static void
+QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pCtx,
+                                int64_t             nLabel,
+                                uint8_t             uTagRequirement,
+                                int64_t             nDays);
+
+
+/**
+ * @brief Add a binary UUID to the encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the UUID to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Bytes            Pointer and length of the binary UUID.
+ *
+ * A binary UUID as defined in [RFC 4122]
+ * (https://www.rfc-editor.org/rfc/rfc4122.html) is added to the
+ * output.
+ *
+ * It is output as CBOR major type 2, a binary string, with tag @ref
+ * CBOR_TAG_BIN_UUID indicating the binary string is a UUID.
+ */
+static void
+QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pCtx,
+                           uint8_t             uTagRequirement,
+                           UsefulBufC          Bytes);
+
+/** See QCBOREncode_AddTBinaryUUID(). */
+static void
+QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pCtx,
+                                  const char         *szLabel,
+                                  uint8_t             uTagRequirement,
+                                  UsefulBufC          Bytes);
+
+/** See QCBOREncode_AddTBinaryUUID(). */
+static void
+QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pCtx,
+                                 int64_t             nLabel,
+                                 uint8_t             uTagRequirement,
+                                 UsefulBufC          Bytes);
+
+
+/**
+ * @brief Add a text URI to the encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the URI to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] URI              Pointer and length of the URI.
+ *
+ * The format of URI must be per [RFC 3986]
+ * (https://www.rfc-editor.org/rfc/rfc3986.html).
+ *
+ * It is output as CBOR major type 3, a text string, with tag @ref
+ * CBOR_TAG_URI indicating the text string is a URI.
+ *
+ * A URI in a NULL-terminated string, @c szURI, can be easily added with
+ * this code:
+ *
+ *      QCBOREncode_AddTURI(pCtx, QCBOR_ENCODE_AS_TAG, UsefulBuf_FromSZ(szURI));
+ */
+static void
+QCBOREncode_AddTURI(QCBOREncodeContext *pCtx,
+                    uint8_t             uTagRequirement,
+                    UsefulBufC          URI);
+
+/** See QCBOREncode_AddTURI(). */
+static void
+QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pCtx,
+                           const char         *szLabel,
+                           uint8_t             uTagRequirement,
+                           UsefulBufC          URI);
+
+/** See QCBOREncode_AddTURI(). */
+static void
+QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pCtx,
+                          int64_t             nLabel,
+                          uint8_t             uTagRequirement,
+                          UsefulBufC          URI);
+
+
+/**
+ * @brief Add Base64-encoded text to encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the base-64 text to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] B64Text          Pointer and length of the base-64 encoded text.
+ *
+ * The text content is Base64 encoded data per [RFC 4648]
+ * (https://www.rfc-editor.org/rfc/rfc4648.html).
+ *
+ * It is output as CBOR major type 3, a text string, with tag @ref
+ * CBOR_TAG_B64 indicating the text string is Base64 encoded.
+ */
+static void
+QCBOREncode_AddTB64Text(QCBOREncodeContext *pCtx,
+                        uint8_t             uTagRequirement,
+                        UsefulBufC          B64Text);
+
+/** See QCBOREncode_AddTB64Text(). */
+static void
+QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pCtx,
+                               const char         *szLabel,
+                               uint8_t             uTagRequirement,
+                               UsefulBufC          B64Text);
+
+/** See QCBOREncode_AddTB64Text(). */
+static void
+QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pCtx,
+                              int64_t nLabel,
+                              uint8_t uTagRequirement,
+                              UsefulBufC B64Text);
+
+
+/**
+ * @brief Add base64url encoded data to encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the base64url to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] B64Text          Pointer and length of the base64url encoded text.
+ *
+ * The text content is base64URL encoded text as per
+ * [RFC 4648] (https://www.rfc-editor.org/rfc/rfc4648.html).
+ *
+ * It is output as CBOR major type 3, a text string, with tag
+ * @ref CBOR_TAG_B64URL indicating the text string is a Base64url
+ * encoded.
+ */
+static void
+QCBOREncode_AddTB64URLText(QCBOREncodeContext *pCtx,
+                           uint8_t             uTagRequirement,
+                           UsefulBufC          B64Text);
+
+/** See QCBOREncode_AddTB64URLText(). */
+static void
+QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pCtx,
+                                  const char         *szLabel,
+                                  uint8_t             uTagRequirement,
+                                  UsefulBufC          B64Text);
+
+/** See QCBOREncode_AddTB64URLText(). */
+static void
+QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pCtx,
+                                 int64_t             nLabel,
+                                 uint8_t             uTagRequirement,
+                                 UsefulBufC          B64Text);
+
+
+/**
+ * @brief Add Perl Compatible Regular Expression.
+ *
+ * @param[in] pCtx             Encoding context to add the regular expression to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] Regex            Pointer and length of the regular expression.
+ *
+ * The text content is Perl Compatible Regular
+ * Expressions (PCRE) / JavaScript syntax [ECMA262].
+ *
+ * It is output as CBOR major type 3, a text string, with tag @ref
+ * CBOR_TAG_REGEX indicating the text string is a regular expression.
+ */
+static void
+QCBOREncode_AddTRegex(QCBOREncodeContext *pCtx,
+                      uint8_t            uTagRequirement,
+                      UsefulBufC         Regex);
+
+/** See QCBOREncode_AddTRegex(). */
+static void
+QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             uint8_t             uTagRequirement,
+                             UsefulBufC          Regex);
+
+/** See QCBOREncode_AddTRegex(). */
+static void
+QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pCtx,
+                            int64_t             nLabel,
+                            uint8_t             uTagRequirement,
+                            UsefulBufC          Regex);
+
+
+/**
+ * @brief MIME encoded data to the encoded output.
+ *
+ * @param[in] pCtx             The encoding context to add the MIME data to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] MIMEData         Pointer and length of the MIME data.
+ *
+ * The text content is in MIME format per [RFC 2045]
+ * (https://www.rfc-editor.org/rfc/rfc2045.html) including the headers.
+ *
+ * It is output as CBOR major type 2, a binary string, with tag
+ * @ref CBOR_TAG_BINARY_MIME indicating the string is MIME data.  This
+ * outputs tag 257, not tag 36, as it can carry any type of MIME
+ * binary, 7-bit, 8-bit, quoted-printable and base64 where tag 36
+ * cannot.
+ *
+ * Previous versions of QCBOR, those before spiffy decode, output tag
+ * 36. Decoding supports both tag 36 and 257.  (if the old behavior
+ * with tag 36 is needed, copy the inline functions below and change
+ * the tag number).
+ *
+ * See also QCBORDecode_GetMIMEMessage() and
+ * @ref QCBOR_TYPE_BINARY_MIME.
+ *
+ * This does no translation of line endings. See QCBOREncode_AddText()
+ * for a discussion of line endings in CBOR.
+ */
+static void
+QCBOREncode_AddTMIMEData(QCBOREncodeContext *pCtx,
+                         uint8_t             uTagRequirement,
+                         UsefulBufC          MIMEData);
+
+/** See QCBOREncode_AddTMIMEData(). */
+static void
+QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pCtx,
+                                const char         *szLabel,
+                                uint8_t             uTagRequirement,
+                                UsefulBufC          MIMEData);
+
+/** See QCBOREncode_AddTMIMEData(). */
+static void
+QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pCtx,
+                               int64_t             nLabel,
+                               uint8_t             uTagRequirement,
+                               UsefulBufC          MIMEData);
+
+
+/**
+ * @brief  Add an RFC 3339 date string
+ *
+ * @param[in] pCtx             The encoding context to add the date to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] szDate           Null-terminated string with date to add.
+ *
+ * The string szDate should be in the form of
+ * [RFC 3339] (https://www.rfc-editor.org/rfc/rfc3339.html) as defined
+ * by section 3.3 in [RFC 4287] (https://www.rfc-editor.org/rfc/rfc4287.html).
+ * This is as described in section 3.4.1 in [RFC 8949]
+ * (https://www.rfc-editor.org/rfc/rfc8949.html#section3.1.4).
+ *
+ * Note that this function doesn't validate the format of the date
+ * string at all. If you add an incorrect format date string, the
+ * generated CBOR will be incorrect and the receiver may not be able
+ * to handle it.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * See also QCBOREncode_AddTDayString().
+ */
+static void
+QCBOREncode_AddTDateString(QCBOREncodeContext *pCtx,
+                           uint8_t             uTagRequirement,
+                           const char         *szDate);
+
+/** See QCBOREncode_AddTDateString(). */
+static void
+QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pCtx,
+                                  const char         *szLabel,
+                                  uint8_t             uTagRequirement,
+                                  const char         *szDate);
+
+/** See QCBOREncode_AddTDateString(). */
+static void
+QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pCtx,
+                                 int64_t             nLabel,
+                                 uint8_t             uTagRequirement,
+                                 const char         *szDate);
+
+
+/**
+ * @brief  Add a date-only string.
+ *
+ * @param[in] pCtx             The encoding context to add the date to.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] szDate           Null-terminated string with date to add.
+ *
+ * This date format is described in
+ * [RFC 8943] (https://www.rfc-editor.org/rfc/rfc8943.html), but that mainly
+ * references RFC 3339.  The string szDate must be in the forrm
+ * specified the ABNF for a full-date in
+ * [RFC 3339] (https://www.rfc-editor.org/rfc/rfc3339.html). Examples of this
+ * are "1985-04-12" and "1937-01-01".  The time and the time zone are
+ * never included.
+ *
+ * Note that this function doesn't validate the format of the date
+ * string at all. If you add an incorrect format date string, the
+ * generated CBOR will be incorrect and the receiver may not be able
+ * to handle it.
+ *
+ * Error handling is the same as QCBOREncode_AddInt64().
+ *
+ * See also QCBOREncode_AddTDateString().
+ */
+static void
+QCBOREncode_AddTDaysString(QCBOREncodeContext *pCtx,
+                           uint8_t             uTagRequirement,
+                           const char         *szDate);
+
+/** See QCBOREncode_AddTDaysString(). */
+static void
+QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pCtx,
+                                  const char         *szLabel,
+                                  uint8_t             uTagRequirement,
+                                  const char         *szDate);
+
+/** See QCBOREncode_AddTDaysString(). */
+static void
+QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pCtx,
+                                 int64_t             nLabel,
+                                 uint8_t             uTagRequirement,
+                                 const char         *szDate);
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF DEPRECATED FUNCTION DECLARATIONS                          *
+ *                                                                           *
+ *    There is no plan to remove these in future versions.                   *
+ *    They just have been replaced by something better.                      *
+ * ========================================================================= */
+
+/** @deprecated Use QCBOREncode_AddTDateEpoch() instead. */
+static void
+QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx, int64_t nDate);
+
+/** @deprecated Use QCBOREncode_AddTDateEpochToMapSZ() instead. */
+static void
+QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t nDate);
+
+/** @deprecated Use QCBOREncode_AddTDateEpochToMapN() instead. */
+static void
+QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t nDate);
+
+/** @deprecated Use QCBOREncode_AddTBinaryUUID() instead. */
+static void
+QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
+
+/** @deprecated Use QCBOREncode_AddTBinaryUUIDToMapSZ() instead. */
+static void
+QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
+
+/** @deprecated Use QCBOREncode_AddTBinaryUUIDToMapN() instead. */
+static void
+QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
+
+/** @deprecated Use QCBOREncode_AddTagNumber() instead. */
+static void
+QCBOREncode_AddTag(QCBOREncodeContext *pCtx, uint64_t uTag);
+
+/** @deprecated Use QCBOREncode_AddTURI() instead. */
+static void
+QCBOREncode_AddURI(QCBOREncodeContext *pCtx, UsefulBufC URI);
+
+/** @deprecated Use QCBOREncode_AddTURIToMapSZ() instead. */
+static void
+QCBOREncode_AddURIToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC URI);
+
+/** @deprecated Use QCBOREncode_AddTURIToMapN() instead. */
+static void
+QCBOREncode_AddURIToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC URI);
+
+/** @deprecated Use QCBOREncode_AddTB64Text() instead. */
+static void
+QCBOREncode_AddB64Text(QCBOREncodeContext *pCtx, UsefulBufC B64Text);
+
+/** @deprecated Use QCBOREncode_AddTB64TextToMapSZ() instead. */
+static void
+QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text);
+
+/** @deprecated Use QCBOREncode_AddTB64TextToMapN() instead. */
+static void
+QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text);
+
+/** @deprecated Use QCBOREncode_AddTB64URLText() instead. */
+static void
+QCBOREncode_AddB64URLText(QCBOREncodeContext *pCtx, UsefulBufC B64Text);
+
+/** @deprecated Use QCBOREncode_AddTB64URLTextToMapSZ() instead. */
+static void
+QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pCtx,
+                               const char         *szLabel,
+                               UsefulBufC          B64Text);
+
+/** @deprecated Use QCBOREncode_AddTB64URLTextToMapN() instead. */
+static void
+QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pCtx,
+                                int64_t             nLabel,
+                                UsefulBufC          B64Text);
+
+/** @deprecated Use QCBOREncode_AddTRegex() instead. */
+static void
+QCBOREncode_AddRegex(QCBOREncodeContext *pCtx, UsefulBufC Regex);
+
+/** @deprecated Use QCBOREncode_AddTRegexToMapSZ() instead. */
+static void
+QCBOREncode_AddRegexToMap(QCBOREncodeContext *pCtx,
+                          const char         *szLabel,
+                          UsefulBufC          Regex);
+
+/** @deprecated Use QCBOREncode_AddTRegexToMapN() instead. */
+static void
+QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pCtx,
+                           int64_t             nLabel,
+                           UsefulBufC          Regex);
+
+/** @deprecated Use QCBOREncode_AddTMIMEData() instead. */
+static void
+QCBOREncode_AddMIMEData(QCBOREncodeContext *pCtx, UsefulBufC MIMEData);
+
+/** @deprecated Use QCBOREncode_AddTMIMEDataToMapSZ() instead. */
+static void
+QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pCtx,
+                             const char         *szLabel,
+                             UsefulBufC          MIMEData);
+
+/** @deprecated Use QCBOREncode_AddTMIMEDataToMapN() instead. */
+static void
+QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pCtx,
+                              int64_t             nLabel,
+                              UsefulBufC          MIMEData);
+
+/** @deprecated Use QCBOREncode_AddTDateString() instead. */
+static void
+QCBOREncode_AddDateString(QCBOREncodeContext *pCtx, const char *szDate);
+
+/** @deprecated Use QCBOREncode_AddTDateStringToMapSZ() instead. */
+static void
+QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pCtx,
+                               const char         *szLabel,
+                               const char         *szDate);
+
+/** @deprecated Use QCBOREncode_AddTDateStringToMapN() instead. */
+static void
+QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pCtx,
+                                int64_t             nLabel,
+                                const char         *szDate);
+
+
+/* ========================================================================= *
+ *    END OF DEPRECATED FUNCTION DECLARATIONS                                *
+ * ========================================================================= */
+
+
+
+
+/* ========================================================================= *
+ *    BEGINNING OF PRIVATE INLINE IMPLEMENTATION                             *
+ * ========================================================================= */
+
+
+static inline void
+QCBOREncode_AddTagNumber(QCBOREncodeContext *pMe, const uint64_t uTag)
+{
+   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_TAG, uTag, 0);
+}
+
+
+static inline void
+QCBOREncode_AddTag(QCBOREncodeContext *pMe, const uint64_t uTag)
+{
+   QCBOREncode_AddTagNumber(pMe, uTag);
+}
+
+
+static inline void
+QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pMe,
+                          const uint8_t       uTag,
+                          const int64_t       nDate)
+{
+   if(uTag == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DATE_EPOCH);
+   }
+   QCBOREncode_AddInt64(pMe, nDate);
+}
+
+static inline void
+QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pMe,
+                                 const char         *szLabel,
+                                 const uint8_t       uTag,
+                                 const int64_t       nDate)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
+}
+
+static inline void
+QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pMe,
+                                const int64_t       nLabel,
+                                const uint8_t       uTag,
+                                const int64_t       nDate)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
+}
+
+static inline void
+QCBOREncode_AddDateEpoch(QCBOREncodeContext *pMe,
+                         const int64_t       nDate)
+{
+   QCBOREncode_AddTDateEpoch(pMe, QCBOR_ENCODE_AS_TAG, nDate);
+}
+
+static inline void
+QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pMe,
+                              const char         *szLabel,
+                              const int64_t       nDate)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddDateEpoch(pMe, nDate);
+}
+
+static inline void
+QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pMe,
+                               const int64_t       nLabel,
+                               const int64_t       nDate)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddDateEpoch(pMe, nDate);
+}
+
+
+static inline void
+QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pMe,
+                          const uint8_t       uTag,
+                          const int64_t       nDays)
+{
+   if(uTag == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DAYS_EPOCH);
+   }
+   QCBOREncode_AddInt64(pMe, nDays);
+}
+
+static inline void
+QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pMe,
+                                 const char         *szLabel,
+                                 const uint8_t       uTag,
+                                 const int64_t       nDays)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
+}
+
+static inline void
+QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pMe,
+                                const int64_t       nLabel,
+                                const uint8_t       uTag,
+                                const int64_t       nDays)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
+}
+
+
+
+static inline void
+QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pMe,
+                           const uint8_t       uTagRequirement,
+                           const UsefulBufC    Bytes)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_BIN_UUID);
+   }
+   QCBOREncode_AddBytes(pMe, Bytes);
+}
+
+static inline void
+QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pMe,
+                                  const char         *szLabel,
+                                  const uint8_t       uTagRequirement,
+                                  const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
+}
+
+static inline void
+QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pMe,
+                                 const int64_t       nLabel,
+                                 const uint8_t       uTagRequirement,
+                                 const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
+{
+   QCBOREncode_AddTBinaryUUID(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pMe,
+                               const char         *szLabel,
+                               const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddTBinaryUUIDToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
+}
+
+static inline void
+QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pMe,
+                                const int64_t       nLabel,
+                                const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddTBinaryUUIDToMapN(pMe,
+                                    nLabel,
+                                    QCBOR_ENCODE_AS_TAG,
+                                    Bytes);
+}
+
+
+static inline void
+QCBOREncode_AddTURI(QCBOREncodeContext *pMe,
+                    const uint8_t       uTagRequirement,
+                    const UsefulBufC    URI)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_URI);
+   }
+   QCBOREncode_AddText(pMe, URI);
+}
+
+static inline void
+QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pMe,
+                           const char         *szLabel,
+                           const uint8_t       uTagRequirement,
+                           const UsefulBufC    URI)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
+}
+
+static inline void
+QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pMe,
+                          const int64_t       nLabel,
+                          const uint8_t       uTagRequirement,
+                          const UsefulBufC    URI)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
+}
+
+static inline void
+QCBOREncode_AddURI(QCBOREncodeContext *pMe, const UsefulBufC URI)
+{
+   QCBOREncode_AddTURI(pMe, QCBOR_ENCODE_AS_TAG, URI);
+}
+
+static inline void
+QCBOREncode_AddURIToMap(QCBOREncodeContext *pMe,
+                        const char         *szLabel,
+                        const UsefulBufC    URI)
+{
+   QCBOREncode_AddTURIToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, URI);
+}
+
+static inline void
+QCBOREncode_AddURIToMapN(QCBOREncodeContext *pMe,
+                         const int64_t       nLabel,
+                         const UsefulBufC    URI)
+{
+   QCBOREncode_AddTURIToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, URI);
+}
+
+
+
+static inline void
+QCBOREncode_AddTB64Text(QCBOREncodeContext *pMe,
+                        const uint8_t       uTagRequirement,
+                        const UsefulBufC    B64Text)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_B64);
+   }
+   QCBOREncode_AddText(pMe, B64Text);
+}
+
+static inline void
+QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pMe,
+                               const char         *szLabel,
+                               const uint8_t       uTagRequirement,
+                               const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
+}
+
+static inline void
+QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pMe,
+                              const int64_t       nLabel,
+                              const uint8_t       uTagRequirement,
+                              const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64Text(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
+{
+   QCBOREncode_AddTB64Text(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pMe,
+                            const char         *szLabel,
+                            const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddTB64TextToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pMe,
+                             const int64_t       nLabel,
+                             const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddTB64TextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
+}
+
+
+
+static inline void
+QCBOREncode_AddTB64URLText(QCBOREncodeContext *pMe,
+                           const uint8_t       uTagRequirement,
+                           const UsefulBufC    B64Text)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_B64URL);
+   }
+   QCBOREncode_AddText(pMe, B64Text);
+}
+
+static inline void
+QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pMe,
+                                  const char         *szLabel,
+                                  const uint8_t       uTagRequirement,
+                                  const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
+}
+
+static inline void
+QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pMe,
+                                 const int64_t       nLabel,
+                                 const uint8_t       uTagRequirement,
+                                 const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64URLText(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
+{
+   QCBOREncode_AddTB64URLText(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pMe,
+                               const char         *szLabel,
+                               const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddTB64URLTextToMapSZ(pMe,
+                                     szLabel,
+                                     QCBOR_ENCODE_AS_TAG,
+                                     B64Text);
+}
+
+static inline void
+QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pMe,
+                                const int64_t       nLabel,
+                                const UsefulBufC    B64Text)
+{
+   QCBOREncode_AddTB64URLTextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
+}
+
+
+static inline void
+QCBOREncode_AddTRegex(QCBOREncodeContext *pMe,
+                      const uint8_t       uTagRequirement,
+                      const UsefulBufC    Bytes)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_REGEX);
+   }
+   QCBOREncode_AddText(pMe, Bytes);
+}
+
+static inline void
+QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const uint8_t       uTagRequirement,
+                             const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
+}
+
+static inline void
+QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pMe,
+                            const int64_t       nLabel,
+                            const uint8_t       uTagRequirement,
+                            const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
+}
+
+static inline void
+QCBOREncode_AddRegex(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
+{
+   QCBOREncode_AddTRegex(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
+}
+
+static inline void
+QCBOREncode_AddRegexToMap(QCBOREncodeContext *pMe,
+                          const char         *szLabel,
+                          const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddTRegexToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
+}
+
+static inline void
+QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pMe,
+                           const int64_t       nLabel,
+                           const UsefulBufC    Bytes)
+{
+   QCBOREncode_AddTRegexToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, Bytes);
+
+}
+
+
+static inline void
+QCBOREncode_AddTMIMEData(QCBOREncodeContext *pMe,
+                         const uint8_t       uTagRequirement,
+                         const UsefulBufC    MIMEData)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_BINARY_MIME);
+   }
+   QCBOREncode_AddBytes(pMe, MIMEData);
+}
+
+static inline void
+QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pMe,
+                                const char         *szLabel,
+                                const uint8_t       uTagRequirement,
+                                const UsefulBufC    MIMEData)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
+}
+
+static inline void
+QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pMe,
+                               const int64_t       nLabel,
+                               const uint8_t       uTagRequirement,
+                               const UsefulBufC    MIMEData)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
+}
+
+static inline void
+QCBOREncode_AddMIMEData(QCBOREncodeContext *pMe, UsefulBufC MIMEData)
+{
+   QCBOREncode_AddTMIMEData(pMe, QCBOR_ENCODE_AS_TAG, MIMEData);
+}
+
+static inline void
+QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pMe,
+                             const char         *szLabel,
+                             const UsefulBufC    MIMEData)
+{
+   QCBOREncode_AddTMIMEDataToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
+}
+
+static inline void
+QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pMe,
+                              const int64_t       nLabel,
+                              const UsefulBufC    MIMEData)
+{
+   QCBOREncode_AddTMIMEDataToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
+}
+
+
+static inline void
+QCBOREncode_AddTDateString(QCBOREncodeContext *pMe,
+                           const uint8_t       uTagRequirement,
+                           const char         *szDate)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DATE_STRING);
+   }
+   QCBOREncode_AddSZString(pMe, szDate);
+}
+
+static inline void
+QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pMe,
+                                  const char         *szLabel,
+                                  const uint8_t       uTagRequirement,
+                                  const char         *szDate)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
+}
+
+static inline void
+QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pMe,
+                                 const int64_t       nLabel,
+                                 const uint8_t       uTagRequirement,
+                                 const char         *szDate)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
+}
+
+static inline void
+QCBOREncode_AddDateString(QCBOREncodeContext *pMe, const char *szDate)
+{
+   QCBOREncode_AddTDateString(pMe, QCBOR_ENCODE_AS_TAG, szDate);
+}
+
+static inline void
+QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pMe,
+                               const char         *szLabel,
+                               const char         *szDate)
+{
+   QCBOREncode_AddTDateStringToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, szDate);
+}
+
+static inline void
+QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pMe,
+                                const int64_t       nLabel,
+                                const char         *szDate)
+{
+   QCBOREncode_AddTDateStringToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, szDate);
+}
+
+
+static inline void
+QCBOREncode_AddTDaysString(QCBOREncodeContext *pMe,
+                           const uint8_t       uTagRequirement,
+                           const char         *szDate)
+{
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, CBOR_TAG_DAYS_STRING);
+   }
+   QCBOREncode_AddSZString(pMe, szDate);
+}
+
+static inline void
+QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pMe,
+                                  const char         *szLabel,
+                                  const uint8_t       uTagRequirement,
+                                  const char         *szDate)
+{
+   QCBOREncode_AddSZString(pMe, szLabel);
+   QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
+}
+
+static inline void
+QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pMe,
+                                 const int64_t       nLabel,
+                                 const uint8_t       uTagRequirement,
+                                 const char         *szDate)
+{
+   QCBOREncode_AddInt64(pMe, nLabel);
+   QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
+}
+
+
+/* ======================================================================== *
+ *    END OF PRIVATE INLINE IMPLEMENTATION                                  *
+ * ======================================================================== */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* qcbor_tag_encode_h */
diff --git a/src/qcbor_encode.c b/src/qcbor_main_encode.c
similarity index 73%
rename from src/qcbor_encode.c
rename to src/qcbor_main_encode.c
index a6d4d22..8da4888 100644
--- a/src/qcbor_encode.c
+++ b/src/qcbor_main_encode.c
@@ -32,18 +32,12 @@
  * ========================================================================= */
 
 
-#include "qcbor/qcbor_encode.h"
-#include "ieee754.h"
-
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-#include <math.h> /* Only for NAN definition */
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+#include "qcbor/qcbor_main_encode.h"
 
 
 /**
- * @file qcbor_encode.c
+ * @file qcbor_main_encode.c
  *
- * The entire implementation of the QCBOR encoder.
  */
 
 
@@ -587,32 +581,6 @@
 }
 
 
-/*
- * Public function for adding signed integers. See qcbor/qcbor_encode.h
- */
-void
-QCBOREncode_AddInt64(QCBOREncodeContext *pMe, const int64_t nNum)
-{
-   uint8_t  uMajorType;
-   uint64_t uValue;
-
-   if(nNum < 0) {
-      /* In CBOR -1 encodes as 0x00 with major type negative int.
-       * First add one as a signed integer because that will not
-       * overflow. Then change the sign as needed for encoding (the
-       * opposite order, changing the sign and subtracting, can cause
-       * an overflow when encoding INT64_MIN). */
-      int64_t nTmp = nNum + 1;
-      uValue = (uint64_t)-nTmp;
-      uMajorType = CBOR_MAJOR_TYPE_NEGATIVE_INT;
-   } else {
-      uValue = (uint64_t)nNum;
-      uMajorType = CBOR_MAJOR_TYPE_POSITIVE_INT;
-   }
-   QCBOREncode_Private_AppendCBORHead(pMe, uMajorType, uValue, 0);
-}
-
-
 /**
  * @brief Semi-private method to add a buffer full of bytes to encoded output.
  *
@@ -648,466 +616,6 @@
 }
 
 
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-/**
- * @brief Semi-private method to add a double using preferred encoding.
- *
- * @param[in] pMe   The encode context.
- * @param[in] dNum  The double to add.
- *
- * This converts the double to a float or half-precision if it can be done
- * without a loss of precision. See QCBOREncode_AddDouble().
- */
-void
-QCBOREncode_Private_AddPreferredDouble(QCBOREncodeContext *pMe, double dNum)
-{
-   IEEE754_union        FloatResult;
-   bool                 bNoNaNPayload;
-   struct IEEE754_ToInt IntResult;
-   uint64_t             uNegValue;
-
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(IEEE754_DoubleHasNaNPayload(dNum) && !(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD)) {
-      pMe->uError = QCBOR_ERR_NOT_ALLOWED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION) {
-      IntResult = IEEE754_DoubleToInt(dNum);
-      switch(IntResult.type) {
-         case IEEE754_ToInt_IS_INT:
-            QCBOREncode_AddInt64(pMe, IntResult.integer.is_signed);
-            return;
-         case IEEE754_ToInt_IS_UINT:
-            QCBOREncode_AddUInt64(pMe, IntResult.integer.un_signed);
-            return;
-         case IEEE754_ToInt_IS_65BIT_NEG:
-            {
-               if(IntResult.integer.un_signed == 0) {
-                  uNegValue = UINT64_MAX;
-               } else {
-                  uNegValue = IntResult.integer.un_signed-1;
-               }
-               QCBOREncode_AddNegativeUInt64(pMe, uNegValue);
-            }
-            return;
-         case IEEE754_ToInt_NaN:
-            dNum = NAN;
-            bNoNaNPayload = true;
-            break;
-         case IEEE754_ToInt_NO_CONVERSION:
-            bNoNaNPayload = true;
-      }
-   } else  {
-      bNoNaNPayload = false;
-   }
-
-   FloatResult = IEEE754_DoubleToSmaller(dNum, true, bNoNaNPayload);
-
-   QCBOREncode_Private_AddType7(pMe, (uint8_t)FloatResult.uSize, FloatResult.uValue);
-}
-
-
-/**
- * @brief Semi-private method to add a float using preferred encoding.
- *
- * @param[in] pMe   The encode context.
- * @param[in] fNum  The float to add.
- *
- * This converts the float to a half-precision if it can be done
- * without a loss of precision. See QCBOREncode_AddFloat().
- */
-void
-QCBOREncode_Private_AddPreferredFloat(QCBOREncodeContext *pMe, float fNum)
-{
-   IEEE754_union        FloatResult;
-   bool                 bNoNaNPayload;
-   struct IEEE754_ToInt IntResult;
-   uint64_t             uNegValue;
-
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(IEEE754_SingleHasNaNPayload(fNum) && !(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD)) {
-      pMe->uError = QCBOR_ERR_NOT_ALLOWED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION) {
-      IntResult = IEEE754_SingleToInt(fNum);
-      switch(IntResult.type) {
-         case IEEE754_ToInt_IS_INT:
-            QCBOREncode_AddInt64(pMe, IntResult.integer.is_signed);
-            return;
-         case IEEE754_ToInt_IS_UINT:
-            QCBOREncode_AddUInt64(pMe, IntResult.integer.un_signed);
-            return;
-         case IEEE754_ToInt_IS_65BIT_NEG:
-            {
-               if(IntResult.integer.un_signed == 0) {
-                  uNegValue = UINT64_MAX;
-               } else {
-                  uNegValue = IntResult.integer.un_signed-1;
-               }
-               QCBOREncode_AddNegativeUInt64(pMe, uNegValue);
-            }
-            return;
-         case IEEE754_ToInt_NaN:
-            fNum = NAN;
-            bNoNaNPayload = true;
-            break;
-         case IEEE754_ToInt_NO_CONVERSION:
-            bNoNaNPayload = true;
-      }
-   } else  {
-      bNoNaNPayload = false;
-   }
-
-   FloatResult = IEEE754_SingleToHalf(fNum, bNoNaNPayload);
-
-   QCBOREncode_Private_AddType7(pMe, (uint8_t)FloatResult.uSize, FloatResult.uValue);
-}
-#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
-
-
-
-
-/**
- * @brief Convert a big number to unsigned integer.
- *
- * @param[in]  BigNumber  Big number to convert.
- *
- * @return Converted unsigned.
- *
- * The big number must be less than 8 bytes long.
- **/
-static uint64_t
-QCBOREncode_Private_BigNumberToUInt(const UsefulBufC BigNumber)
-{
-   uint64_t uInt;
-   size_t   uIndex;
-
-   uInt = 0;
-   for(uIndex = 0; uIndex < BigNumber.len; uIndex++) {
-      uInt = (uInt << 8) + UsefulBufC_NTH_BYTE(BigNumber, uIndex);
-   }
-
-   return uInt;
-}
-
-
-/**
- * @brief Is there a carry when you subtract 1 from the BigNumber.
- *
- * @param[in]  BigNumber  Big number to check for carry.
- *
- * @return If there is a carry, \c true.
- *
- * If this returns @c true, then @c BigNumber - 1 is one byte shorter
- * than @c BigNumber.
- **/
-static bool
-QCBOREncode_Private_BigNumberCarry(const UsefulBufC BigNumber)
-{
-   bool       bCarry;
-   UsefulBufC SubBigNum;
-
-   // Improvement: rework without recursion?
-
-   if(BigNumber.len == 0) {
-      return true; /* Subtracting one from zero-length string gives a carry */
-   } else {
-      SubBigNum = UsefulBuf_Tail(BigNumber, 1);
-      bCarry = QCBOREncode_Private_BigNumberCarry(SubBigNum);
-      if(UsefulBufC_NTH_BYTE(BigNumber, 0) == 0x00 && bCarry) {
-         /* Subtracting one from 0 gives a carry */
-         return true;
-      } else {
-         return false;
-      }
-   }
-}
-
-
-/**
- * @brief Output negative bignum bytes with subtraction of 1.
- *
- * @param[in] pMe              The decode context.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] BigNumber        The negative big number.
- */
-static void
-QCBOREncode_Private_AddTNegativeBigNumber(QCBOREncodeContext *pMe,
-                                          const uint8_t       uTagRequirement,
-                                          const UsefulBufC    BigNumber)
-{
-   size_t     uLen;
-   bool       bCarry;
-   bool       bCopiedSomething;
-   uint8_t    uByte;
-   UsefulBufC SubString;
-   UsefulBufC NextSubString;
-
-   QCBOREncode_Private_BigNumberTag(pMe, uTagRequirement, true);
-
-   /* This works on any length without the need of an additional buffer */
-
-   /* This subtracts one, possibly making the string shorter by one
-    * 0x01 -> 0x00
-    * 0x01 0x00 -> 0xff
-    * 0x00 0x01 0x00 -> 0x00 0xff
-    * 0x02 0x00 -> 0x01 0xff
-    * 0xff -> 0xfe
-    * 0xff 0x00 -> 0xfe 0xff
-    * 0x01 0x00 0x00 -> 0xff 0xff
-    *
-    * This outputs the big number a byte at a time to be able to operate on
-    * a big number of any length without memory allocation.
-    */
-
-   /* Compute the length up front because it goes in the encoded head */
-   bCarry = QCBOREncode_Private_BigNumberCarry(UsefulBuf_Tail(BigNumber, 1));
-   uLen = BigNumber.len;
-   if(bCarry && BigNumber.len > 1 && UsefulBufC_NTH_BYTE(BigNumber, 0) >= 1) {
-      uLen--;
-   }
-   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, uLen,0);
-
-   SubString = BigNumber;
-   bCopiedSomething = false;
-   while(SubString.len) {
-      uByte = UsefulBufC_NTH_BYTE(SubString, 0);
-      NextSubString = UsefulBuf_Tail(SubString, 1);
-      bCarry = QCBOREncode_Private_BigNumberCarry(NextSubString);
-      if(bCarry) {
-         uByte--;
-      }
-      /* This avoids all but the last leading zero. See
-       * QCBOREncode_Private_SkipLeadingZeros() */
-      if(bCopiedSomething || NextSubString.len == 0 || uByte != 0) {
-         UsefulOutBuf_AppendByte(&(pMe->OutBuf), uByte);
-         bCopiedSomething = true;
-      }
-      SubString = NextSubString;
-   }
-}
-
-
-/**
- * @brief Remove leading zeros.
- *
- * @param[in] BigNumber  The big number.
- *
- * @return Big number with no leading zeros.
- *
- * If the big number is all zeros, this returns a big number that is
- * one zero rather than the empty string.
- *
- * RFC 8949 3.4.3 does not explicitly decoders MUST handle the empty
- * string, but does say decoders MUST handle leading zeros. So
- * Postel's Law is applied here and 0 is not encoded as an empty
- * string.
- */
-static UsefulBufC
-QCBOREncode_Private_SkipLeadingZeros(const UsefulBufC BigNumber)
-{
-   UsefulBufC NLZ;
-   NLZ = UsefulBuf_SkipLeading(BigNumber, 0x00);
-
-   /* An all-zero string reduces to one 0, not an empty string. */
-   if(NLZ.len == 0 &&
-      BigNumber.len > 0 &&
-      UsefulBufC_NTH_BYTE(BigNumber, 0) == 0x00) {
-      NLZ.len = 1;
-   }
-
-   return NLZ;
-}
-
-
-/**
- * @brief Output a big number, preferred or not, with negative offset
- *
- * @param[in] pMe              The decode context.
- * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
- *                             @ref QCBOR_ENCODE_AS_BORROWED.
- * @param[in] bPreferred       Uses preferred serialization if true
- * @param[in] bNegative        Indicates big number is negative or postive.
- * @param[in] BigNumber        The big number.
- *
- * Regardless of whether preferred serialization is used, if the big
- * number is negative, one is subtracted before is output per CBOR
- * convetion for big numbers. This requires a little big number
- * arithmetic and adds some object code.
- *
- * If preferred serialization is used, then if the number is smaller
- * than UINT64_MAX and postive it is output as type 0 and if it is
- * equal to or smaller than UINT64_MAX it is output as a type 1
- * integer minus one.
- *
- * See QCBOREncode_AddTBigNumberRaw() for simple copy through.
- */
-void
-QCBOREncode_Private_AddTBigNumberMain(QCBOREncodeContext *pMe,
-                                      const uint8_t       uTagRequirement,
-                                      const bool          bPreferred,
-                                      const bool          bNegative,
-                                      const UsefulBufC    BigNumber)
-{
-   uint64_t   uInt;
-   bool       bIs2exp64;
-   uint8_t    uMajorType;
-   UsefulBufC BigNumberNLZ;
-
-#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
-   if(!bPreferred && pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS) {
-      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
-      return;
-   }
-#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
-
-   BigNumberNLZ = QCBOREncode_Private_SkipLeadingZeros(BigNumber);
-
-   static const uint8_t twoExp64[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-   bIs2exp64 = ! UsefulBuf_Compare(BigNumber, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(twoExp64));
-
-   if(bPreferred && (BigNumberNLZ.len <= 8 || (bNegative && bIs2exp64))) {
-      if(bIs2exp64) {
-         /* 2^64 is a 9 byte big number. Since negative numbers are offset
-          * by one in CBOR, it can be encoded as a type 1 negative. The
-          * conversion below won't work because the uInt will overflow
-          * before the subtraction of 1.
-          */
-         uInt = UINT64_MAX;
-      } else {
-         uInt = QCBOREncode_Private_BigNumberToUInt(BigNumberNLZ);
-         if(bNegative) {
-            uInt--;
-         }
-      }
-      uMajorType = bNegative ? CBOR_MAJOR_TYPE_NEGATIVE_INT :
-                               CBOR_MAJOR_TYPE_POSITIVE_INT;
-      QCBOREncode_Private_AppendCBORHead(pMe, uMajorType, uInt, 0);
-   } else {
-      if(bNegative) {
-         QCBOREncode_Private_AddTNegativeBigNumber(pMe, uTagRequirement, BigNumberNLZ);
-      } else {
-         QCBOREncode_AddTBigNumberRaw(pMe, false, uTagRequirement, BigNumberNLZ);
-      }
-   }
-}
-
-
-
-
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
-/**
- * @brief  Semi-private method to add bigfloats and decimal fractions.
- *
- * @param[in] pMe               The encoding context to add the value to.
- * @param[in] uTagNumber               The type 6 tag indicating what this is to be.
- * @param[in] nMantissa          The @c int64_t mantissa if it is not a big number.
- * @param[in] nExponent          The exponent.
- *
- * This outputs either the @ref CBOR_TAG_DECIMAL_FRACTION or
- * @ref CBOR_TAG_BIGFLOAT tag. if @c uTag is @ref CBOR_TAG_INVALID64,
- * then this outputs the "borrowed" content format.
- *
- * The tag content output by this is an array with two members, the
- * exponent and then the mantissa. The mantissa can be either a big
- * number or an @c int64_t.
- *
- * This implementation cannot output an exponent further from 0 than
- * @c INT64_MAX.
- *
- * To output a mantissa that is between INT64_MAX and UINT64_MAX from 0,
- * it must be as a big number.
- *
- * Typically, QCBOREncode_AddTDecimalFraction(), QCBOREncode_AddTBigFloat(),
- * QCBOREncode_AddTDecimalFractionBigNum() or QCBOREncode_AddTBigFloatBigNum()
- * is called instead of this.
- */
-void
-QCBOREncode_Private_AddTExpIntMantissa(QCBOREncodeContext *pMe,
-                                       const int           uTagRequirement,
-                                       const uint64_t      uTagNumber,
-                                       const int64_t       nExponent,
-                                       const int64_t       nMantissa)
-{
-   /* This is for encoding either a big float or a decimal fraction,
-    * both of which are an array of two items, an exponent and a
-    * mantissa.  The difference between the two is that the exponent
-    * is base-2 for big floats and base-10 for decimal fractions, but
-    * that has no effect on the code here.
-    */
-   /* Separate from QCBOREncode_Private_AddTExpBigMantissa() because
-    * linking QCBOREncode_AddTBigNumber() adds a lot because it
-    * does preferred serialization of big numbers and the offset of 1
-    * for CBOR negative numbers.
-    */
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, uTagNumber);
-   }
-   QCBOREncode_OpenArray(pMe);
-   QCBOREncode_AddInt64(pMe, nExponent);
-   QCBOREncode_AddInt64(pMe, nMantissa);
-   QCBOREncode_CloseArray(pMe);
-}
-
-void
-QCBOREncode_Private_AddTExpBigMantissa(QCBOREncodeContext *pMe,
-                                       const int           uTagRequirement,
-                                       const uint64_t      uTagNumber,
-                                       const int64_t       nExponent,
-                                       const UsefulBufC    BigNumMantissa,
-                                       const bool          bBigNumIsNegative)
-{
-   /* This is for encoding either a big float or a decimal fraction,
-    * both of which are an array of two items, an exponent and a
-    * mantissa.  The difference between the two is that the exponent
-    * is base-2 for big floats and base-10 for decimal fractions, but
-    * that has no effect on the code here.
-    */
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, uTagNumber);
-   }
-   QCBOREncode_OpenArray(pMe);
-   QCBOREncode_AddInt64(pMe, nExponent);
-   QCBOREncode_AddTBigNumber(pMe, QCBOR_ENCODE_AS_TAG, bBigNumIsNegative, BigNumMantissa);
-   QCBOREncode_CloseArray(pMe);
-}
-
-
-void
-QCBOREncode_Private_AddTExpBigMantissaRaw(QCBOREncodeContext *pMe,
-                                          const int           uTagRequirement,
-                                          const uint64_t      uTagNumber,
-                                          const int64_t       nExponent,
-                                          const UsefulBufC    BigNumMantissa,
-                                          const bool          bBigNumIsNegative)
-{
-   /* This is for encoding either a big float or a decimal fraction,
-    * both of which are an array of two items, an exponent and a
-    * mantissa.  The difference between the two is that the exponent
-    * is base-2 for big floats and base-10 for decimal fractions, but
-    * that has no effect on the code here.
-    */
-   /* Separate from QCBOREncode_Private_AddTExpBigMantissa() because
-    * linking QCBOREncode_AddTBigNumber() adds a lot because it
-    * does preferred serialization of big numbers and the offset of 1
-    * for CBOR negative numbers.
-    */
-   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
-      QCBOREncode_AddTagNumber(pMe, uTagNumber);
-   }
-   QCBOREncode_OpenArray(pMe);
-   QCBOREncode_AddInt64(pMe, nExponent);
-   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, bBigNumIsNegative, BigNumMantissa);
-   QCBOREncode_CloseArray(pMe);
-}
-
-#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
 
 
 /**
diff --git a/src/qcbor_number_encode.c b/src/qcbor_number_encode.c
new file mode 100644
index 0000000..91ff289
--- /dev/null
+++ b/src/qcbor_number_encode.c
@@ -0,0 +1,536 @@
+/* ===========================================================================
+ * Copyright (c) 2016-2018, The Linux Foundation.
+ * Copyright (c) 2018-2024, Laurence Lundblade.
+ * Copyright (c) 2021, Arm Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of The Linux Foundation nor the names of its
+ *       contributors, nor the name "Laurence Lundblade" may be used to
+ *       endorse or promote products derived from this software without
+ *       specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ========================================================================= */
+
+
+#include "qcbor/qcbor_number_encode.h"
+#include "ieee754.h"
+
+#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
+#include <math.h> /* Only for NAN definition */
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+
+/**
+ * @file qcbor_number_encode.c
+ *
+ */
+
+
+
+/*
+ * Public function for adding signed integers. See qcbor/qcbor_encode.h
+ */
+void
+QCBOREncode_AddInt64(QCBOREncodeContext *pMe, const int64_t nNum)
+{
+   uint8_t  uMajorType;
+   uint64_t uValue;
+
+   if(nNum < 0) {
+      /* In CBOR -1 encodes as 0x00 with major type negative int.
+       * First add one as a signed integer because that will not
+       * overflow. Then change the sign as needed for encoding (the
+       * opposite order, changing the sign and subtracting, can cause
+       * an overflow when encoding INT64_MIN). */
+      int64_t nTmp = nNum + 1;
+      uValue = (uint64_t)-nTmp;
+      uMajorType = CBOR_MAJOR_TYPE_NEGATIVE_INT;
+   } else {
+      uValue = (uint64_t)nNum;
+      uMajorType = CBOR_MAJOR_TYPE_POSITIVE_INT;
+   }
+   QCBOREncode_Private_AppendCBORHead(pMe, uMajorType, uValue, 0);
+}
+
+
+#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
+/**
+ * @brief Semi-private method to add a double using preferred encoding.
+ *
+ * @param[in] pMe   The encode context.
+ * @param[in] dNum  The double to add.
+ *
+ * This converts the double to a float or half-precision if it can be done
+ * without a loss of precision. See QCBOREncode_AddDouble().
+ */
+void
+QCBOREncode_Private_AddPreferredDouble(QCBOREncodeContext *pMe, double dNum)
+{
+   IEEE754_union        FloatResult;
+   bool                 bNoNaNPayload;
+   struct IEEE754_ToInt IntResult;
+   uint64_t             uNegValue;
+
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(IEEE754_DoubleHasNaNPayload(dNum) && !(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD)) {
+      pMe->uError = QCBOR_ERR_NOT_ALLOWED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION) {
+      IntResult = IEEE754_DoubleToInt(dNum);
+      switch(IntResult.type) {
+         case IEEE754_ToInt_IS_INT:
+            QCBOREncode_AddInt64(pMe, IntResult.integer.is_signed);
+            return;
+         case IEEE754_ToInt_IS_UINT:
+            QCBOREncode_AddUInt64(pMe, IntResult.integer.un_signed);
+            return;
+         case IEEE754_ToInt_IS_65BIT_NEG:
+            {
+               if(IntResult.integer.un_signed == 0) {
+                  uNegValue = UINT64_MAX;
+               } else {
+                  uNegValue = IntResult.integer.un_signed-1;
+               }
+               QCBOREncode_AddNegativeUInt64(pMe, uNegValue);
+            }
+            return;
+         case IEEE754_ToInt_NaN:
+            dNum = NAN;
+            bNoNaNPayload = true;
+            break;
+         case IEEE754_ToInt_NO_CONVERSION:
+            bNoNaNPayload = true;
+      }
+   } else  {
+      bNoNaNPayload = false;
+   }
+
+   FloatResult = IEEE754_DoubleToSmaller(dNum, true, bNoNaNPayload);
+
+   QCBOREncode_Private_AddType7(pMe, (uint8_t)FloatResult.uSize, FloatResult.uValue);
+}
+
+
+/**
+ * @brief Semi-private method to add a float using preferred encoding.
+ *
+ * @param[in] pMe   The encode context.
+ * @param[in] fNum  The float to add.
+ *
+ * This converts the float to a half-precision if it can be done
+ * without a loss of precision. See QCBOREncode_AddFloat().
+ */
+void
+QCBOREncode_Private_AddPreferredFloat(QCBOREncodeContext *pMe, float fNum)
+{
+   IEEE754_union        FloatResult;
+   bool                 bNoNaNPayload;
+   struct IEEE754_ToInt IntResult;
+   uint64_t             uNegValue;
+
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(IEEE754_SingleHasNaNPayload(fNum) && !(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ALLOW_NAN_PAYLOAD)) {
+      pMe->uError = QCBOR_ERR_NOT_ALLOWED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   if(pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_FLOAT_REDUCTION) {
+      IntResult = IEEE754_SingleToInt(fNum);
+      switch(IntResult.type) {
+         case IEEE754_ToInt_IS_INT:
+            QCBOREncode_AddInt64(pMe, IntResult.integer.is_signed);
+            return;
+         case IEEE754_ToInt_IS_UINT:
+            QCBOREncode_AddUInt64(pMe, IntResult.integer.un_signed);
+            return;
+         case IEEE754_ToInt_IS_65BIT_NEG:
+            {
+               if(IntResult.integer.un_signed == 0) {
+                  uNegValue = UINT64_MAX;
+               } else {
+                  uNegValue = IntResult.integer.un_signed-1;
+               }
+               QCBOREncode_AddNegativeUInt64(pMe, uNegValue);
+            }
+            return;
+         case IEEE754_ToInt_NaN:
+            fNum = NAN;
+            bNoNaNPayload = true;
+            break;
+         case IEEE754_ToInt_NO_CONVERSION:
+            bNoNaNPayload = true;
+      }
+   } else  {
+      bNoNaNPayload = false;
+   }
+
+   FloatResult = IEEE754_SingleToHalf(fNum, bNoNaNPayload);
+
+   QCBOREncode_Private_AddType7(pMe, (uint8_t)FloatResult.uSize, FloatResult.uValue);
+}
+#endif /* ! QCBOR_DISABLE_PREFERRED_FLOAT */
+
+
+
+
+/**
+ * @brief Convert a big number to unsigned integer.
+ *
+ * @param[in]  BigNumber  Big number to convert.
+ *
+ * @return Converted unsigned.
+ *
+ * The big number must be less than 8 bytes long.
+ **/
+static uint64_t
+QCBOREncode_Private_BigNumberToUInt(const UsefulBufC BigNumber)
+{
+   uint64_t uInt;
+   size_t   uIndex;
+
+   uInt = 0;
+   for(uIndex = 0; uIndex < BigNumber.len; uIndex++) {
+      uInt = (uInt << 8) + UsefulBufC_NTH_BYTE(BigNumber, uIndex);
+   }
+
+   return uInt;
+}
+
+
+/**
+ * @brief Is there a carry when you subtract 1 from the BigNumber.
+ *
+ * @param[in]  BigNumber  Big number to check for carry.
+ *
+ * @return If there is a carry, \c true.
+ *
+ * If this returns @c true, then @c BigNumber - 1 is one byte shorter
+ * than @c BigNumber.
+ **/
+static bool
+QCBOREncode_Private_BigNumberCarry(const UsefulBufC BigNumber)
+{
+   bool       bCarry;
+   UsefulBufC SubBigNum;
+
+   // Improvement: rework without recursion?
+
+   if(BigNumber.len == 0) {
+      return true; /* Subtracting one from zero-length string gives a carry */
+   } else {
+      SubBigNum = UsefulBuf_Tail(BigNumber, 1);
+      bCarry = QCBOREncode_Private_BigNumberCarry(SubBigNum);
+      if(UsefulBufC_NTH_BYTE(BigNumber, 0) == 0x00 && bCarry) {
+         /* Subtracting one from 0 gives a carry */
+         return true;
+      } else {
+         return false;
+      }
+   }
+}
+
+
+/**
+ * @brief Output negative bignum bytes with subtraction of 1.
+ *
+ * @param[in] pMe              The decode context.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] BigNumber        The negative big number.
+ */
+static void
+QCBOREncode_Private_AddTNegativeBigNumber(QCBOREncodeContext *pMe,
+                                          const uint8_t       uTagRequirement,
+                                          const UsefulBufC    BigNumber)
+{
+   size_t     uLen;
+   bool       bCarry;
+   bool       bCopiedSomething;
+   uint8_t    uByte;
+   UsefulBufC SubString;
+   UsefulBufC NextSubString;
+
+   QCBOREncode_Private_BigNumberTag(pMe, uTagRequirement, true);
+
+   /* This works on any length without the need of an additional buffer */
+
+   /* This subtracts one, possibly making the string shorter by one
+    * 0x01 -> 0x00
+    * 0x01 0x00 -> 0xff
+    * 0x00 0x01 0x00 -> 0x00 0xff
+    * 0x02 0x00 -> 0x01 0xff
+    * 0xff -> 0xfe
+    * 0xff 0x00 -> 0xfe 0xff
+    * 0x01 0x00 0x00 -> 0xff 0xff
+    *
+    * This outputs the big number a byte at a time to be able to operate on
+    * a big number of any length without memory allocation.
+    */
+
+   /* Compute the length up front because it goes in the encoded head */
+   bCarry = QCBOREncode_Private_BigNumberCarry(UsefulBuf_Tail(BigNumber, 1));
+   uLen = BigNumber.len;
+   if(bCarry && BigNumber.len > 1 && UsefulBufC_NTH_BYTE(BigNumber, 0) >= 1) {
+      uLen--;
+   }
+   QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, uLen,0);
+
+   SubString = BigNumber;
+   bCopiedSomething = false;
+   while(SubString.len) {
+      uByte = UsefulBufC_NTH_BYTE(SubString, 0);
+      NextSubString = UsefulBuf_Tail(SubString, 1);
+      bCarry = QCBOREncode_Private_BigNumberCarry(NextSubString);
+      if(bCarry) {
+         uByte--;
+      }
+      /* This avoids all but the last leading zero. See
+       * QCBOREncode_Private_SkipLeadingZeros() */
+      if(bCopiedSomething || NextSubString.len == 0 || uByte != 0) {
+         UsefulOutBuf_AppendByte(&(pMe->OutBuf), uByte);
+         bCopiedSomething = true;
+      }
+      SubString = NextSubString;
+   }
+}
+
+
+/**
+ * @brief Remove leading zeros.
+ *
+ * @param[in] BigNumber  The big number.
+ *
+ * @return Big number with no leading zeros.
+ *
+ * If the big number is all zeros, this returns a big number that is
+ * one zero rather than the empty string.
+ *
+ * RFC 8949 3.4.3 does not explicitly decoders MUST handle the empty
+ * string, but does say decoders MUST handle leading zeros. So
+ * Postel's Law is applied here and 0 is not encoded as an empty
+ * string.
+ */
+static UsefulBufC
+QCBOREncode_Private_SkipLeadingZeros(const UsefulBufC BigNumber)
+{
+   UsefulBufC NLZ;
+   NLZ = UsefulBuf_SkipLeading(BigNumber, 0x00);
+
+   /* An all-zero string reduces to one 0, not an empty string. */
+   if(NLZ.len == 0 &&
+      BigNumber.len > 0 &&
+      UsefulBufC_NTH_BYTE(BigNumber, 0) == 0x00) {
+      NLZ.len = 1;
+   }
+
+   return NLZ;
+}
+
+
+/**
+ * @brief Output a big number, preferred or not, with negative offset
+ *
+ * @param[in] pMe              The decode context.
+ * @param[in] uTagRequirement  Either @ref QCBOR_ENCODE_AS_TAG or
+ *                             @ref QCBOR_ENCODE_AS_BORROWED.
+ * @param[in] bPreferred       Uses preferred serialization if true
+ * @param[in] bNegative        Indicates big number is negative or postive.
+ * @param[in] BigNumber        The big number.
+ *
+ * Regardless of whether preferred serialization is used, if the big
+ * number is negative, one is subtracted before is output per CBOR
+ * convetion for big numbers. This requires a little big number
+ * arithmetic and adds some object code.
+ *
+ * If preferred serialization is used, then if the number is smaller
+ * than UINT64_MAX and postive it is output as type 0 and if it is
+ * equal to or smaller than UINT64_MAX it is output as a type 1
+ * integer minus one.
+ *
+ * See QCBOREncode_AddTBigNumberRaw() for simple copy through.
+ */
+void
+QCBOREncode_Private_AddTBigNumberMain(QCBOREncodeContext *pMe,
+                                      const uint8_t       uTagRequirement,
+                                      const bool          bPreferred,
+                                      const bool          bNegative,
+                                      const UsefulBufC    BigNumber)
+{
+   uint64_t   uInt;
+   bool       bIs2exp64;
+   uint8_t    uMajorType;
+   UsefulBufC BigNumberNLZ;
+
+#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
+   if(!bPreferred && pMe->uConfigFlags & QCBOR_ENCODE_CONFIG_ONLY_PREFERRED_BIG_NUMBERS) {
+      pMe->uError = QCBOR_ERR_NOT_PREFERRED;
+      return;
+   }
+#endif /* ! QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
+
+   BigNumberNLZ = QCBOREncode_Private_SkipLeadingZeros(BigNumber);
+
+   static const uint8_t twoExp64[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+   bIs2exp64 = ! UsefulBuf_Compare(BigNumber, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(twoExp64));
+
+   if(bPreferred && (BigNumberNLZ.len <= 8 || (bNegative && bIs2exp64))) {
+      if(bIs2exp64) {
+         /* 2^64 is a 9 byte big number. Since negative numbers are offset
+          * by one in CBOR, it can be encoded as a type 1 negative. The
+          * conversion below won't work because the uInt will overflow
+          * before the subtraction of 1.
+          */
+         uInt = UINT64_MAX;
+      } else {
+         uInt = QCBOREncode_Private_BigNumberToUInt(BigNumberNLZ);
+         if(bNegative) {
+            uInt--;
+         }
+      }
+      uMajorType = bNegative ? CBOR_MAJOR_TYPE_NEGATIVE_INT :
+                               CBOR_MAJOR_TYPE_POSITIVE_INT;
+      QCBOREncode_Private_AppendCBORHead(pMe, uMajorType, uInt, 0);
+   } else {
+      if(bNegative) {
+         QCBOREncode_Private_AddTNegativeBigNumber(pMe, uTagRequirement, BigNumberNLZ);
+      } else {
+         QCBOREncode_AddTBigNumberRaw(pMe, false, uTagRequirement, BigNumberNLZ);
+      }
+   }
+}
+
+
+
+
+#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
+/**
+ * @brief  Semi-private method to add bigfloats and decimal fractions.
+ *
+ * @param[in] pMe               The encoding context to add the value to.
+ * @param[in] uTagNumber               The type 6 tag indicating what this is to be.
+ * @param[in] nMantissa          The @c int64_t mantissa if it is not a big number.
+ * @param[in] nExponent          The exponent.
+ *
+ * This outputs either the @ref CBOR_TAG_DECIMAL_FRACTION or
+ * @ref CBOR_TAG_BIGFLOAT tag. if @c uTag is @ref CBOR_TAG_INVALID64,
+ * then this outputs the "borrowed" content format.
+ *
+ * The tag content output by this is an array with two members, the
+ * exponent and then the mantissa. The mantissa can be either a big
+ * number or an @c int64_t.
+ *
+ * This implementation cannot output an exponent further from 0 than
+ * @c INT64_MAX.
+ *
+ * To output a mantissa that is between INT64_MAX and UINT64_MAX from 0,
+ * it must be as a big number.
+ *
+ * Typically, QCBOREncode_AddTDecimalFraction(), QCBOREncode_AddTBigFloat(),
+ * QCBOREncode_AddTDecimalFractionBigNum() or QCBOREncode_AddTBigFloatBigNum()
+ * is called instead of this.
+ */
+void
+QCBOREncode_Private_AddTExpIntMantissa(QCBOREncodeContext *pMe,
+                                       const int           uTagRequirement,
+                                       const uint64_t      uTagNumber,
+                                       const int64_t       nExponent,
+                                       const int64_t       nMantissa)
+{
+   /* This is for encoding either a big float or a decimal fraction,
+    * both of which are an array of two items, an exponent and a
+    * mantissa.  The difference between the two is that the exponent
+    * is base-2 for big floats and base-10 for decimal fractions, but
+    * that has no effect on the code here.
+    */
+   /* Separate from QCBOREncode_Private_AddTExpBigMantissa() because
+    * linking QCBOREncode_AddTBigNumber() adds a lot because it
+    * does preferred serialization of big numbers and the offset of 1
+    * for CBOR negative numbers.
+    */
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, uTagNumber);
+   }
+   QCBOREncode_OpenArray(pMe);
+   QCBOREncode_AddInt64(pMe, nExponent);
+   QCBOREncode_AddInt64(pMe, nMantissa);
+   QCBOREncode_CloseArray(pMe);
+}
+
+void
+QCBOREncode_Private_AddTExpBigMantissa(QCBOREncodeContext *pMe,
+                                       const int           uTagRequirement,
+                                       const uint64_t      uTagNumber,
+                                       const int64_t       nExponent,
+                                       const UsefulBufC    BigNumMantissa,
+                                       const bool          bBigNumIsNegative)
+{
+   /* This is for encoding either a big float or a decimal fraction,
+    * both of which are an array of two items, an exponent and a
+    * mantissa.  The difference between the two is that the exponent
+    * is base-2 for big floats and base-10 for decimal fractions, but
+    * that has no effect on the code here.
+    */
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, uTagNumber);
+   }
+   QCBOREncode_OpenArray(pMe);
+   QCBOREncode_AddInt64(pMe, nExponent);
+   QCBOREncode_AddTBigNumber(pMe, QCBOR_ENCODE_AS_TAG, bBigNumIsNegative, BigNumMantissa);
+   QCBOREncode_CloseArray(pMe);
+}
+
+
+void
+QCBOREncode_Private_AddTExpBigMantissaRaw(QCBOREncodeContext *pMe,
+                                          const int           uTagRequirement,
+                                          const uint64_t      uTagNumber,
+                                          const int64_t       nExponent,
+                                          const UsefulBufC    BigNumMantissa,
+                                          const bool          bBigNumIsNegative)
+{
+   /* This is for encoding either a big float or a decimal fraction,
+    * both of which are an array of two items, an exponent and a
+    * mantissa.  The difference between the two is that the exponent
+    * is base-2 for big floats and base-10 for decimal fractions, but
+    * that has no effect on the code here.
+    */
+   /* Separate from QCBOREncode_Private_AddTExpBigMantissa() because
+    * linking QCBOREncode_AddTBigNumber() adds a lot because it
+    * does preferred serialization of big numbers and the offset of 1
+    * for CBOR negative numbers.
+    */
+   if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
+      QCBOREncode_AddTagNumber(pMe, uTagNumber);
+   }
+   QCBOREncode_OpenArray(pMe);
+   QCBOREncode_AddInt64(pMe, nExponent);
+   QCBOREncode_AddTBigNumberRaw(pMe, QCBOR_ENCODE_AS_TAG, bBigNumIsNegative, BigNumMantissa);
+   QCBOREncode_CloseArray(pMe);
+}
+
+#endif /* ! QCBOR_DISABLE_EXP_AND_MANTISSA */
+
diff --git a/test/float_tests.c b/test/float_tests.c
index 294be55..f32d181 100644
--- a/test/float_tests.c
+++ b/test/float_tests.c
@@ -13,7 +13,8 @@
 
 
 #include "float_tests.h"
-#include "qcbor/qcbor_encode.h"
+#include "qcbor/qcbor_main_encode.h"
+#include "qcbor/qcbor_number_encode.h"
 #include "qcbor/qcbor_decode.h"
 #include "qcbor/qcbor_spiffy_decode.h"
 #include "qcbor/qcbor_number_decode.h"