/*==============================================================================
 Copyright (c) 2016-2018, The Linux Foundation.
 Copyright (c) 2018, Laurence Lundblade.
 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.
 ==============================================================================*/


/*===================================================================================
 FILE:  qcbor.h
 
 DESCRIPTION:  This is the full public API and data structures for QCBOR
 
 EDIT HISTORY FOR FILE:
 
 This section contains comments describing changes made to the module.
 Notice that changes are listed in reverse chronological order.
 
 when               who             what, where, why
 --------           ----            ---------------------------------------------------
 12/13/18           llundblade      Documentatation improvements
 11/29/18           llundblade      Rework to simpler handling of tags and labels.
 11/9/18            llundblade      Error codes are now enums.
 11/1/18            llundblade      Floating support.
 10/31/18           llundblade      Switch to one license that is almost BSD-3.
 10/15/18           llundblade      Indefinite length maps and arrays supported
 10/8/18            llundblade      Indefinite length strings supported
 09/28/18           llundblade      Added bstr wrapping feature for COSE implementation.
 07/05/17           llundbla        Add bstr wrapping of maps/arrays for COSE.
 03/01/17           llundbla        More data types; decoding improvements and fixes.
 11/13/16           llundbla        Integrate most TZ changes back into github version.
 09/30/16           gkanike         Porting to TZ.
 03/15/16           llundbla        Initial Version.
 
 =====================================================================================*/

#ifndef __QCBOR__qcbor__
#define __QCBOR__qcbor__

/*...... This is a ruler that is 80 characters long...........................*/

/* ===========================================================================
   BEGINNING OF PRIVATE PART OF THIS FILE

   Caller of QCBOR should not reference any of the details below up until
   the start of the public part.
   =========================================================================== */

/*
 Standard integer types are used in the interface to be precise about
 sizes to be better at preventing underflow/overflow errors.
 */
#include <stdint.h>
#include <stdbool.h>
#include "UsefulBuf.h"


/*
 The maxium nesting of arrays and maps when encoding or decoding. 
 (Further down in the file there is a definition that refers to this 
 that is public. This is done this way so there can be a nice
 separation of public and private parts in this file.
*/
#define QCBOR_MAX_ARRAY_NESTING1 15 // Do not increase this over 255


/*  
 PRIVATE DATA STRUCTURE 
 
 Holds the data for tracking array and map nesting during encoding. Pairs up with
 the Nesting_xxx functions to make an "object" to handle nesting encoding.
 
 uStart is a uint32_t instead of a size_t to keep the size of this
 struct down so it can be on the stack without any concern.  It would be about
 double if size_t was used instead.
 
 Size approximation (varies with CPU/compiler):
    64-bit machine: (15 + 1) * (4 + 2 + 1 + 1 pad) + 8 = 136 bytes
    32-bit machine: (15 + 1) * (4 + 2 + 1 + 1 pad) + 4 = 132 bytes
*/
typedef struct __QCBORTrackNesting {
   // PRIVATE DATA STRUCTURE
   struct {
      // See function OpenArrayInternal() for detailed comments on how this works
      uint32_t  uStart;     // uStart is the byte position where the array starts
      uint16_t  uCount;     // Number of items in the arrary or map; counts items in a map, not pairs of items 
      uint8_t   uMajorType; // Indicates if item is a map or an array
   } pArrays[QCBOR_MAX_ARRAY_NESTING1+1], // stored state for the nesting levels
   *pCurrentNesting; // the current nesting level
} QCBORTrackNesting;


/*  
 PRIVATE DATA STRUCTURE 
 
 Context / data object for encoding some CBOR. Used by all encode functions to 
 form a public "object" that does the job of encdoing.
 
 Size approximation (varies with CPU/compiler):
   64-bit machine: 27 + 1 (+ 4 padding) + 136 = 32 + 136 = 168 bytes
   32-bit machine: 15 + 1 + 132 = 148 bytes
*/
struct _QCBOREncodeContext {
   // PRIVATE DATA STRUCTURE
   UsefulOutBuf      OutBuf;  // Pointer to output buffer, its length and position in it
   uint8_t           uError;  // Error state
   QCBORTrackNesting nesting; // Keep track of array and map nesting
};


/*
 PRIVATE DATA STRUCTURE
 
 Holds the data for array and map nesting for decoding work. This structure
 and the DecodeNesting_xxx functions form an "object" that does the work
 for arrays and maps.
 
 Size approximation (varies with CPU/compiler):
   64-bit machine: 4 * 16 + 8 = 72
   32-bit machine: 4 * 16 + 4 = 68
 */
typedef struct __QCBORDecodeNesting  {
  // PRIVATE DATA STRUCTURE
   struct {
      uint16_t uCount;  
      uint8_t  uMajorType;
   } pMapsAndArrays[QCBOR_MAX_ARRAY_NESTING1+1],
   *pCurrent;
} QCBORDecodeNesting;


/* 
 PRIVATE DATA STRUCTURE

 The decode context. This data structure plus the public QCBORDecode_xxx
 functions form an "object" that does CBOR decoding.

 Size approximation (varies with CPU/compiler):
   64-bit machine: 32 + 1 + 1 + 6 bytes padding + 72 + 16 = 128 bytes
   32-bit machine: 16 + 1 + 1 + 2 bytes padding + 68 + 8  = 68 bytes
 */
struct _QCBORDecodeContext {
   // PRIVATE DATA STRUCTURE   
   UsefulInputBuf InBuf;
   
   uint8_t        uDecodeMode;
   uint8_t        bStringAllocateAll;
   
   QCBORDecodeNesting nesting;
   
   // This is NULL or points to a QCBORStringAllocator. It is void
   // here because _QCBORDecodeContext is defined early in the
   // private part of this file and QCBORStringAllocat is defined
   // later in the public part of this file.
   void *pStringAllocator;
   
   // This is NULL or points to QCBORTagList.
   // It is type void for the same reason as above.
   const void *pCallerConfiguredTagList;
};

// Used internally in the impementation here
// Must not conflict with any of the official CBOR types
#define CBOR_MAJOR_NONE_TYPE_RAW  9
#define CBOR_MAJOR_NONE_TAG_LABEL_REORDER 10


/* ===========================================================================
   END OF PRIVATE PART OF THIS FILE

   BEGINNING OF PUBLIC PART OF THIS FILE
   =========================================================================== */



/* ===========================================================================
   BEGINNING OF CONSTANTS THAT COME FROM THE CBOR STANDARD, RFC 7049
 
   It is not necessary to use these directly when encoding or decoding
   CBOR with this implementation.
   =========================================================================== */

/* Standard CBOR Major type for positive integers of various lengths */
#define CBOR_MAJOR_TYPE_POSITIVE_INT 0

/* Standard CBOR Major type for negative integer of various lengths */
#define CBOR_MAJOR_TYPE_NEGATIVE_INT 1

/* Standard CBOR Major type for an array of arbitrary 8-bit bytes. */
#define CBOR_MAJOR_TYPE_BYTE_STRING  2

/* Standard CBOR Major type for a UTF-8 string. Note this is true 8-bit UTF8
 with no encoding and no NULL termination */
#define CBOR_MAJOR_TYPE_TEXT_STRING  3

/* Standard CBOR Major type for an ordered array of other CBOR data items */
#define CBOR_MAJOR_TYPE_ARRAY        4

/* Standard CBOR Major type for CBOR MAP. Maps an array of pairs. The
 first item in the pair is the "label" (key, name or identfier) and the second
 item is the value.  */
#define CBOR_MAJOR_TYPE_MAP          5

/* Standard CBOR optional tagging. This tags things like dates and URLs */
#define CBOR_MAJOR_TYPE_OPTIONAL     6

/* Standard CBOR extra simple types like floats and the values true and false */
#define CBOR_MAJOR_TYPE_SIMPLE       7


/*
 These are special values for the AdditionalInfo bits that are part of the first byte.
 Mostly they encode the length of the data item.
 */
#define LEN_IS_ONE_BYTE    24
#define LEN_IS_TWO_BYTES   25
#define LEN_IS_FOUR_BYTES  26
#define LEN_IS_EIGHT_BYTES 27
#define ADDINFO_RESERVED1  28
#define ADDINFO_RESERVED2  29
#define ADDINFO_RESERVED3  30
#define LEN_IS_INDEFINITE  31


/*
 24 is a special number for CBOR. Integers and lengths
 less than it are encoded in the same byte as the major type
 */
#define CBOR_TWENTY_FOUR   24


/*
 Tags that are used with CBOR_MAJOR_TYPE_OPTIONAL. These are
 the ones defined in the CBOR spec.
 */
/** See QCBOREncode_AddDateString() below */
#define CBOR_TAG_DATE_STRING    0
/** See QCBOREncode_AddDateEpoch_2() */
#define CBOR_TAG_DATE_EPOCH     1
#define CBOR_TAG_POS_BIGNUM     2
#define CBOR_TAG_NEG_BIGNUM     3
#define CBOR_TAG_FRACTION       4
#define CBOR_TAG_BIGFLOAT       5

#define CBOR_TAG_COSE_ENCRYPTO 16
#define CBOR_TAG_COSE_MAC0     17
#define CBOR_TAG_COSE_SIGN1    18

/* The data in byte string should be converted in base 64 URL when encoding in JSON or similar text-based representations */
#define CBOR_TAG_ENC_AS_B64URL 21
/* The data in byte string should be encoded in base 64 when encoding in JSON */
#define CBOR_TAG_ENC_AS_B64    22
/* The data in byte string should be encoded in base 16 when encoding in JSON */
#define CBOR_TAG_ENC_AS_B16    23
#define CBOR_TAG_CBOR          24
/** The data in the string is a URIs, as defined in RFC3986 */
#define CBOR_TAG_URI           32
/** The data in the string is a base 64'd URL */
#define CBOR_TAG_B64URL        33
/** The data in the string is base 64'd */
#define CBOR_TAG_B64           34
/** regular expressions in Perl Compatible Regular Expressions (PCRE) / JavaScript syntax ECMA262. */
#define CBOR_TAG_REGEX         35
/** MIME messages (including all headers), as defined in RFC2045 */
#define CBOR_TAG_MIME          36
/** Binary UUID */
#define CBOR_TAG_BIN_UUID      37

#define CBOR_TAG_CWT           61

#define CBOR_TAG_ENCRYPT       96
#define CBOR_TAG_MAC           97
#define CBOR_TAG_SIGN          98

#define CBOR_TAG_GEO_COORD    103


/** The data is CBOR data */
#define CBOR_TAG_CBOR_MAGIC 55799
#define CBOR_TAG_NONE  UINT64_MAX


/*
 Values for the 5 bits for items of major type 7
 */
#define CBOR_SIMPLEV_FALSE   20
#define CBOR_SIMPLEV_TRUE    21
#define CBOR_SIMPLEV_NULL    22
#define CBOR_SIMPLEV_UNDEF   23
#define CBOR_SIMPLEV_ONEBYTE 24
#define HALF_PREC_FLOAT      25
#define SINGLE_PREC_FLOAT    26
#define DOUBLE_PREC_FLOAT    27
#define CBOR_SIMPLE_BREAK    31



/* ===========================================================================
 
 END OF CONSTANTS THAT COME FROM THE CBOR STANDARD, RFC 7049
 
 BEGINNING OF PUBLIC INTERFACE FOR QCBOR ENCODER / DECODER
 
 =========================================================================== */

/**
 
 @file qcbor.h
 
 Q C B O R   E n c o d e / D e c o d e
 
 This implements CBOR -- Concise Binary Object Representation as defined
 in RFC 7049. More info is at http://cbor.io.  This is a near-complete
 implementation of the specification. Limitations are listed further down.
 
 CBOR is intentionally designed to be translatable to JSON, but not
 all CBOR can convert to JSON. See RFC 7049 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": Optional info that can be added before each data item. This is always
 CBOR major type 6.
 
 - "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, the primitive positive
 integer.
 - Next it has a "tag" 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 int as epoch date
        1a                 # Indicates 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 creation of news 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 -23 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.
 
 A common encoding usage mode is to invoke the encoding twice. First
 with no output buffer to compute the length of the needed output
 buffer. Then the correct sized output buffer is allocated. Last the
 encoder is invoked again, this time with the output buffer.
 
 The double invocation is not required if the max output buffer size
 can be predicted. This is usually possible for simple CBOR structures.
 If the double invocation is implemented, it can be
 in a loop or function as in the example code so that the code doesn't
 have to actually be written twice, saving code size.
 
 If a buffer too small to hold the encoded output is given, the error
 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 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.
 Only the final call, QCBOREncode_Finish(), returns an error code.
 Once an error happens, the encoder goes into an error state and calls
 to it will do nothing so the encoding can just go on. An error
 check is not needed after every data item is added.
 
 Encoding generally proceeds by calling QCBOREncode_Init(), calling
 lots of "Add" functions and calling QCBOREncode_Finish(). There
 are many "Add" functions for various data types. The input
 buffers need only to be valid during the "Add" calls. The 
 data is copied into the output buf during the "Add" call.
 
 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 "Add" to
 put items in the array and then QCBOREncode_CloseArray(). Nesting
 to a limit 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 time 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.

 Usually it is not necessary to add tags explicitly as most
 tagged types have functions here, but they can be added by
 calling QCBOREncode_AddTag().  There is an IANA registry for new tags that are
 for broad use and standardization as per RFC 7049. It is also 
 allowed for protocols to make up new tags in the range above 256.
 Note that even arrays and maps can be tagged.
 
 Summary Limits of this implementation:
 - The entire encoded CBOR must fit into contiguous memory.
 - Max size of encoded / decoded CBOR data is UINT32_MAX (4GB).
 - Max array / map nesting level when encoding / decoding is
   QCBOR_MAX_ARRAY_NESTING (this is typically 15).
 - Max items in an array or map when encoding / decoding is
   QCBOR_MAX_ITEMS_IN_ARRAY (typically 65,536).
 - Does not support encoding indefinite lengths (decoding is supported).
 - Does not directly support some tagged types: decimal fractions, big floats
 - Does not directly support labels in maps other than text strings and ints.
 - Does not directly support int labels greater than INT64_MAX
 - Epoch dates limited to INT64_MAX (+/- 292 billion years)
 - Tags on labels are ignored during decoding
 
 This implementation is intended to run on 32 and 64-bit CPUs. It
 will probably work on 16-bit CPUs but less efficiently.
 
 The public interface uses 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 UINT32_MAX (4GB) which should be
 enough.
 
 This implementation assumes two's compliment integer
 machines. Stdint.h also requires this. It of course would be easy to
 fix this implementation for another integer representation, but all
 modern machines seem to be two's compliment.
 
 */


/**
 The maximum number of items in a single array or map when encoding of decoding.
*/
#define QCBOR_MAX_ITEMS_IN_ARRAY (UINT16_MAX) // This value is 65,535 a lot of items for an array

/** 
 The maximum nesting of arrays and maps when encoding or decoding. The
 error QCBOR_ERR_ARRAY_NESTING_TOO_DEEP will be returned on encoding
 of decoding if it is exceeded
*/
#define QCBOR_MAX_ARRAY_NESTING  QCBOR_MAX_ARRAY_NESTING1

/**
 The maximum number of tags that can be in QCBORTagListIn and passed to
 QCBORDecode_SetCallerConfiguredTagList()
 */
#define QCBOR_MAX_CUSTOM_TAGS    16


typedef enum {
   /** The encode or decode completely correctly. */
   QCBOR_SUCCESS = 0,

   /** The buffer provided for the encoded output when doing encoding was
       too small and the encoded output will not fit. Also, when the buffer
       given to QCBORDecode_SetMemPool() is too small. */
   QCBOR_ERR_BUFFER_TOO_SMALL,

   /** During encoding or decoding, the array or map nesting was deeper than
    this implementation can handle. Note that in the interest of code size
    and memory use, this implementation has a hard limit on array nesting. The
    limit is defined as the constant QCBOR_MAX_ARRAY_NESTING. */
   QCBOR_ERR_ARRAY_NESTING_TOO_DEEP,

   /** During decoding or encoding, the array or map had too many items in it.
       This limit QCBOR_MAX_ITEMS_IN_ARRAY, typically 65,535. */
   QCBOR_ERR_ARRAY_TOO_LONG,

   /** During encoding, more arrays or maps were closed than opened. This is a
       coding error on the part of the caller of the encoder. */
   QCBOR_ERR_TOO_MANY_CLOSES,

   /** During decoding, some CBOR construct was encountered that this decoder
        doesn't support, primarily this is the reserved additional info values,
        28 through 30. */
   QCBOR_ERR_UNSUPPORTED,

   /** During decoding, hit the end of the given data to decode. For example,
       a byte string of 100 bytes was expected, but the end of the input was
       hit before finding those 100 bytes.  Corrupted CBOR input will often
       result in this error. */
   QCBOR_ERR_HIT_END,

   /** During encoding, the length of the input buffer was too large. This might
       happen on a 64-bit machine when a buffer larger than UINT32_MAX is passed.
     */
   QCBOR_ERR_BUFFER_TOO_LARGE,

   /** During decoding, an integer smaller than INT64_MIN was received (CBOR
       can represent integers smaller than INT64_MIN, but C cannot). */
   QCBOR_ERR_INT_OVERFLOW,

   /** During decoding, the label for a map entry is bad. What causes this
       error depends on the decoding mode. */
   QCBOR_ERR_MAP_LABEL_TYPE,

   /** During encoding or decoding, the number of array or map opens was not
       matched by the number of closes. */
   QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN,

   /** During encoding, the simple value is not between CBOR_SIMPLEV_FALSE
       and CBOR_SIMPLEV_UNDEF. */
   QCBOR_ERR_BAD_SIMPLE,

   /** During decoding, a date greater than +- 292 billion years from Jan 1
       1970 encountered during parsing. */
   QCBOR_ERR_DATE_OVERFLOW,

   /** During decoding, the CBOR is not valid, primarily a simple type is encoded in
      a prohibited way. */
   QCBOR_ERR_INVALID_CBOR,

   /** Optional tagging that doesn't make sense (an int is tagged as a
       date string) or can't be handled. */
   QCBOR_ERR_BAD_OPT_TAG,

   /** Returned by QCBORDecode_Finish() if all the inputs bytes have not
       been consumed. */
   QCBOR_ERR_EXTRA_BYTES,

   /** During encoding, QCBOREncode_Close() call with a different type than
       is currently open. */
   QCBOR_ERR_CLOSE_MISMATCH,

   /** Unable to decode an indefinite length string because no string
       allocator was configured. */
   QCBOR_ERR_NO_STRING_ALLOCATOR,

   /** One of the chunks in an indefinite length string is not of the type of
       the string. */
   QCBOR_ERR_INDEFINITE_STRING_CHUNK,

   /** Error allocating space for a string, usually for an indefinite length
       string. */
   QCBOR_ERR_STRING_ALLOCATE,

   /** During decoding, a break occurred outside an indefinite length item. */
   QCBOR_ERR_BAD_BREAK,

   /** During decoding, too many tags in the caller-configured tag list, or not
       enough space in QCBORTagListOut. */
   QCBOR_ERR_TOO_MANY_TAGS
   
} QCBORError;


typedef enum {
   /** See QCBORDecode_Init() */
   QCBOR_DECODE_MODE_NORMAL = 0,
   /** See QCBORDecode_Init() */
   QCBOR_DECODE_MODE_MAP_STRINGS_ONLY = 1,
   /** See QCBORDecode_Init() */
   QCBOR_DECODE_MODE_MAP_AS_ARRAY = 2
} QCBORDecodeMode;





/* Do not renumber these. Code depends on some of these values. */
/** The type is unknown, unset or invalid */
#define QCBOR_TYPE_NONE           0
/** Type for an integer that decoded either between INT64_MIN and INT32_MIN or INT32_MAX and INT64_MAX; val.int64 */
#define QCBOR_TYPE_INT64          2
/** Type for an integer that decoded to a more than INT64_MAX and UINT64_MAX; val.uint64 */
#define QCBOR_TYPE_UINT64         3
/** Type for an array. The number of items in the array is in val.uCount. */
#define QCBOR_TYPE_ARRAY          4
/** Type for a map; number of items in map is in val.uCount */
#define QCBOR_TYPE_MAP            5
/** Type for a buffer full of bytes. Data is in val.string. */
#define QCBOR_TYPE_BYTE_STRING    6
/** Type for a UTF-8 string. It is not NULL terminated. Data is in val.string.  */
#define QCBOR_TYPE_TEXT_STRING    7
/** Type for a positive big number. Data is in val.bignum, a pointer and a length. */
#define QCBOR_TYPE_POSBIGNUM     9
/** Type for a negative big number. Data is in val.bignum, a pointer and a length. */
#define QCBOR_TYPE_NEGBIGNUM     10
/** Type for RFC 3339 date string, possibly with time zone. Data is in val.dateString */
#define QCBOR_TYPE_DATE_STRING   11
/** Type for integer seconds since Jan 1970 + floating point fraction. Data is in val.epochDate */
#define QCBOR_TYPE_DATE_EPOCH    12
/** A simple type that this CBOR implementation doesn't know about; Type is in val.uSimple. */
#define QCBOR_TYPE_UKNOWN_SIMPLE 13
/** Type for the simple value false; nothing more; nothing in val union. */
#define QCBOR_TYPE_FALSE         20
/** Type for the simple value true; nothing more; nothing in val union. */
#define QCBOR_TYPE_TRUE          21
/** Type for the simple value null; nothing more; nothing in val union. */
#define QCBOR_TYPE_NULL          22
/** Type for the simple value undef; nothing more; nothing in val union. */
#define QCBOR_TYPE_UNDEF         23
/** Type for a floating point number. Data is in val.float. */
#define QCBOR_TYPE_FLOAT         26
/** Type for a double floating point number. Data is in val.double. */
#define QCBOR_TYPE_DOUBLE        27
/** For QCBOR_DECODE_MODE_MAP_AS_ARRAY decode mode, a map that is being traversed as an array. See QCBORDecode_Init() */
#define QCBOR_TYPE_MAP_AS_ARRAY  32

#define QCBOR_TYPE_BREAK         31 // Used internally; never returned

#define QCBOR_TYPE_OPTTAG       254 // Used internally; never returned



/*
 Approx Size of this:
   8 + 8 + 1 + 1 + 1 + (1 padding) + (4 padding on 64-bit machine) = 24 for first part (20 on a 32-bit machine)
   16 bytes for the val union
   16 bytes for label union
   total = 56 bytes (52 bytes on 32-bit machine)
 */

/**
 QCBORItem holds the type, value and other info for a decoded item returned by GetNextItem().
 */
typedef struct _QCBORItem {
   uint8_t  uDataType;     /** Tells what element of the val union to use. One of QCBOR_TYPE_XXXX */
   uint8_t  uNestingLevel; /** How deep the nesting from arrays and maps are. 0 is the top level with no arrays or maps entered */
   uint8_t  uLabelType;    /** Tells what element of the label union to use */
   uint8_t  uDataAlloc;    /** 1 if allocated with string allocator, 0 if not. See QCBORDecode_MakeMallocStringAllocator() */
   uint8_t  uLabelAlloc;   /** Like uDataAlloc, but for label */
   uint8_t  uNextNestLevel; /** If not equal to uNestingLevel, this item closed out at least one map/array */
   
   union {
      int64_t     int64;      /** The value for uDataType QCBOR_TYPE_INT64 */
      uint64_t    uint64;     /** The value for uDataType QCBOR_TYPE_UINT64 */

      UsefulBufC  string;     /** The value for uDataType QCBOR_TYPE_BYTE_STRING and QCBOR_TYPE_TEXT_STRING */
      uint16_t    uCount;     /** The "value" for uDataType QCBOR_TYPE_ARRAY or QCBOR_TYPE_MAP -- the number of items in the array or map
                                  UINT16_MAX when decoding indefinite lengths maps and arrays. */
      double      dfnum;      /** The value for uDataType QCBOR_TYPE_DOUBLE */
      struct {
         int64_t  nSeconds;
         double   fSecondsFraction;
      } epochDate;            /** The value for uDataType QCBOR_TYPE_DATE_EPOCH */
      UsefulBufC  dateString; /** The value for uDataType QCBOR_TYPE_DATE_STRING */
      UsefulBufC  bigNum;     /** The value for uDataType QCBOR_TYPE_BIGNUM */
      uint8_t     uSimple;    /** The integer value for unknown simple types */
      uint64_t    uTagV;
      
   } val;  /** The union holding the item's value. Select union member based on uDataType */
   
   union {
      UsefulBufC  string;  /** The label for uLabelType QCBOR_TYPE_BYTE_STRING and QCBOR_TYPE_TEXT_STRING */
      int64_t     int64;   /** The label for uLabelType for QCBOR_TYPE_INT64 */
      uint64_t    uint64;  /** The label for uLabelType for QCBOR_TYPE_UINT64 */
   } label; /** Union holding the different label types selected based on uLabelType */
   
   uint64_t uTagBits; /** Bit indicating which tags (major type 6) on this item.  */
   
} QCBORItem;


/**
 This is a set of functions and pointer context (in object-oriented parlance,
 an "object") used to allocate memory for coalescing the segments of an indefinite
 length string into one.
 
 The fAllocate function works as an initial allocator and a reallocator to
 expand the string for each new segment. When it is an initial allocator
 pOldMem is NULL.
 
 The fFree function is called to clean up an individual allocation when an error occurs.
 
 The fDesctructor function is called when QCBORDecode_Finish is called.
 
 Any memory allocated with this will be marked by setting uDataAlloc
 or uLabelAlloc in the QCBORItem structure so the caller knows they
 have to free it.
 
 fAllocate is only ever called to increase the single most recent
 allocation made, making implementation of a memory pool very simple.
 
 fFree is also only called on the single most recent allocation.
 */
typedef struct {
   void       *pAllocaterContext;
   UsefulBuf (*fAllocate)(void *pAllocaterContext, void *pOldMem, size_t uNewSize);
   void      (*fFree)(void *pAllocaterContext, void *pMem);
   void      (*fDestructor)(void *pAllocaterContext);
} QCBORStringAllocator;



/**
 This is used to tell the decoder about tags that it should
 record in uTagBits in QCBORItem beyond the built-in
 tags. puTags points to an
 array of uint64_t integers that are the tags. uNumTags
 is the number of integers in the array. The maximum
 size is QCBOR_MAX_CUSTOM_TAGS.  See QCBORDecode_IsTagged()
 and QCBORDecode_SetCallerAddedTagMap().
 */
typedef struct {
   uint8_t uNumTags;
   const uint64_t *puTags;
} QCBORTagListIn;


/**
 This is for QCBORDecode_GetNextWithTags() to be able to return the
 full list of tags on an item. It not needed for most CBOR protocol
 implementations. Its primary use is for pretty-printing CBOR or
 protocol conversion to another format.
 
 On input, puTags points to a buffer to be filled in
 and uNumAllocated is the number of uint64_t values
 in the buffer.
 
 On output the buffer contains the tags for the item.
 uNumUsed tells how many there are.
 */
typedef struct {
   uint8_t uNumUsed;
   uint8_t uNumAllocated;
   uint64_t *puTags;
} QCBORTagListOut;


/**
 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
 any internal items.  A context may be re used serially as long as
 it is re initialized.
 */
typedef struct _QCBOREncodeContext QCBOREncodeContext;


/**
 Initialize the the encoder to prepare to encode some CBOR.
 
 @param[in,out]  pCtx    The encoder context to initialize.
 @param[in]      Storage The buffer into which this encoded result will be placed.
 
 Call this once at the start of an encoding of a CBOR structure. Then
 call the various QCBOREncode_AddXXX() functions to add the data
 items. Then call QCBOREncode_Finish().
 
 The maximum output buffer is UINT32_MAX (4GB). This is not a practical
 limit in any way and reduces the memory needed by the implementation.
 The error QCBOR_ERR_BUFFER_TOO_LARGE will be returned by QCBOR_Finish()
 if a larger buffer length is passed in.
  
 If this is called with pBuf as NULL and uBufLen a large value like
 UINT32_MAX, all the QCBOREncode_AddXXXX() functions and
 QCBORE_Encode_Finish() can still be called. No data will be encoded,
 but the length of what would be encoded will be calculated. The
 length of the encoded structure will be handed back in the call to
 QCBOREncode_Finish(). You can then allocate a buffer of that size
 and call all the encoding again, this time to fill in the buffer.
 
 A QCBORContext can be reused over and over as long as
 QCBOREncode_Init() is called.
 */
void QCBOREncode_Init(QCBOREncodeContext *pCtx, UsefulBuf Storage);


/**
 @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 in the
 correct minimal CBOR. 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 like
 tags can be kept between -23 and 23 they will be encoded in one byte
 including the major type.
 
 If you pass a smaller int, say an int16_t or a small value, say 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 7049
 Appendix A for more examples of CBOR encoding. This compact encoding
 is also canonical CBOR as per section 3.9 in RFC 7049.
 
 There are no functions to add int16_t or int32_t because they are
 not necessary because this always encodes to the smallest number
 of bytes based on the value (If this code is running on a 32-bit
 machine having a way to add 32-bit integers would reduce code size some).
 
 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_AddInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t uNum);

static void QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t uNum);


/**
 @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 will be encoded and added to the CBOR output.
 
 The only reason so use this function is for integers larger than
 INT64_MAX and smaller than UINT64_MAX. Otherwise QCBOREncode_AddInt64()
 will work fine.
 
 Error handling is the same as for QCBOREncode_AddInt64().
 */
void QCBOREncode_AddUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);

static void QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);

static void QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);


/**
 
 @brief  Add a UTF-8 text string to the encoded output
 
 @param[in] pCtx     The context to initialize.
 @param[in] Text    Pointer and length of text to add.
 
 The text passed in must be unencoded UTF-8 according to RFC
 3629. There is no NULL termination. The text is added as CBOR
 major type 3.
 
 If called with nBytesLen equal to 0, an empty string will be
 added. When nBytesLen is 0, pBytes may be NULL.
 
 Note that the restriction of the buffer length to an 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.
 
 Error handling is the same as QCBOREncode_AddInt64().
 */
static void QCBOREncode_AddText(QCBOREncodeContext *pCtx, UsefulBufC Text);

static void QCBOREncode_AddTextToMap(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 context to initialize.
 @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_AddSZStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);

static void QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szString);


/**
 @brief  Add a floating-point number to the encoded output
 
 @param[in] pCtx      The encoding context to add the float to.
 @param[in] dNum      The double precision number to add.
 
 This outputs a floating-point number with CBOR major type 7.
 
 This will selectively encode the double-precision floating point number as either
 double-precision, single-precision or half-precision. It will always encode infinity, NaN and 0
 has half precision. If no precision will be lost in the conversion to half-precision
 then it will be converted and encoded. If not and no precision will be lost in
 conversion to single-precision, then it will be converted and encoded. If not, then
 no conversion is performed, and it encoded as a double.
 
 Half-precision floating point numbers take up 2 bytes, half that of single-precision,
 one quarter of double-precision
 
 This automatically reduces the size of encoded messages a lot, maybe even by four if most of values are
 0, infinity or NaN.
 
 On decode, these will always be returned as a double.
 
 Error handling is the same as QCBOREncode_AddInt64().
 */
void QCBOREncode_AddDouble(QCBOREncodeContext *pCtx, double dNum);

static void QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);

static void QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);


/**
 @brief[in] Add an optional tag
 
 @param[in] pCtx  The encoding context to add the integer to.
 @param[in] uTag  The tag to add
 
 This outputs a CBOR major type 6 optional 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.
 
 For many of the common standard tags a function to encode
 data using it already exists and this is not needed. For example,
 QCBOREncode_AddDateEpoch() already exists to output
 integers representing dates with the right tag.
*/
void QCBOREncode_AddTag(QCBOREncodeContext *pCtx,uint64_t uTag);


/**
 @brief  Add an epoch-based date
 
 @param[in] pCtx     The encoding context to add the simple value to.
 @param[in] date     Number of seconds since 1970-01-01T00:00Z in UTC time.
 
 As per RFC 7049 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 integer encoding rules apply here so the date will be encoded in a
 minimal number of 1, 2 4 or 8 bytes. Until about the year 2106 these
 dates should encode in 6 bytes -- one byte for the tag, one byte for the type
 and 4 bytes for the integer.
 
 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_AddDouble()
 with the right parameters.
 
 Error handling is the same as QCBOREncode_AddInt64().
 */
static void QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx, int64_t date);

static void QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t date);

static  void QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t date);


/**
 @brief Add a byte string to the encoded output.
 
 @param[in] pCtx      The context to initialize.
 @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 Bytes.len equal to 0, an empty string will be
 added. When Bytes.len is 0, Bytes.ptr may be NULL.
 
 Error handling is the same as QCBOREncode_AddInt64().
 */
static void QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes);

static void QCBOREncode_AddBytesToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);

static void QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);



/**
 @brief Add a binary UUID to the encoded output.
 
 @param[in] pCtx      The context to initialize.
 @param[in] Bytes     Pointer and length of the binary UUID.
 
 A binary UUID as defined in RFC 4122 is added to the ouput.
 
 It is output as CBOR major type 2, a binary string, with
 optional tag 36 indicating the binary string is a UUID.
 */
static void QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pCtx, UsefulBufC Bytes);

static void QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);

static void QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);


/**
 @brief Add a positive big number to the encoded output.
 
 @param[in] pCtx      The context to initialize.
 @param[in] Bytes     Pointer and length of the big number.
 
 Big numbers are integers larger than 64-bits. Their format
 is described in RFC 7049.
 
 It is output as CBOR major type 2, a binary string, with
 optional tag 2 indicating the binary string is a positive big
 number.
 
 Often big numbers are used to represent cryptographic keys,
 however, COSE which defines representations for keys chose not
 to use this particular type.
 */
static void QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pCtx, UsefulBufC Bytes);

static void QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);

static void QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);


/**
 @brief Add a negative big number to the encoded output.
 
 @param[in] pCtx      The context to initialize.
 @param[in] Bytes     Pointer and length of the big number.
 
 Big numbers are integers larger than 64-bits. Their format
 is described in RFC 7049.
 
 It is output as CBOR major type 2, a binary string, with
 optional tag 2 indicating the binary string is a negative big
 number.
 
 Often big numbers are used to represent cryptographic keys,
 however, COSE which defines representations for keys chose not
 to use this particular type.
 */
static void QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pCtx, UsefulBufC Bytes);

static void QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);

static void QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);


/**
 @brief Add a text URI to the encoded output.
 
 @param[in] pCtx    The context to initialize.
 @param[in] URI     Pointer and length of the URI.
 
 The format of URI is RFC 3986.
 
 It is output as CBOR major type 3, a text string, with
 optional tag 32 indicating the text string is a URI.
 */
static void QCBOREncode_AddURI(QCBOREncodeContext *pCtx, UsefulBufC URI);

static void QCBOREncode_AddURIToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC URI);

static void QCBOREncode_AddURIToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC URI);


/**
 @brief Add base 64-encoded text to encoded output.
 
 @param[in] pCtx     The context to initialize.
 @param[in] B64Text  Pointer and length of the base-64 encoded text.
 
 The text content is base 64 encoded data per RFC 4648.
 
 It is output as CBOR major type 3, a text string, with
 optional tag 34 indicating the text string is a URI.
 */
static void QCBOREncode_AddB64Text(QCBOREncodeContext *pCtx, UsefulBufC B64Text);

static void QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text);

static void QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text);


/**
 @brief Add base 64URL -encoded URL to encoded output.
 
 @param[in] pCtx    The context to initialize.
 @param[in] B64Text  Pointer and length of the base-64 encoded text.
 
 The text content is base 64 URL format encoded text as per RFC 4648.
 
 It is output as CBOR major type 3, a text string, with
 optional tag 33 indicating the text string is a URI.
 */
static void QCBOREncode_AddB64URLText(QCBOREncodeContext *pCtx, UsefulBufC B64Text);

static void QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text);

static void QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text);


/**
 @brief Add Perl Compatible Regular Expression
 
 @param[in] pCtx    The context to initialize.
 @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
 optional tag 35 indicating the text string is a regular expression.
 */
static void QCBOREncode_AddRegex(QCBOREncodeContext *pCtx, UsefulBufC Regex);

static void QCBOREncode_AddRegexToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Regex);

static void QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Regex);


/**
 @brief MIME encoded text to the encoded output.
 
 @param[in] pCtx      The context to initialize.
 @param[in] MIMEData  Pointer and length of the regular expression.
 
 The text content is in MIME format per RFC 2045 including the headers.
 
 It is output as CBOR major type 3, a text string, with
 optional tag 36 indicating the text string is MIME data.
 */
static void QCBOREncode_AddMIMEData(QCBOREncodeContext *pCtx, UsefulBufC MIMEData);

static void QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC MIMEData);

static void QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC MIMEData);


/**
 @brief  Add an RFC 3339 date string
 
 @param[in] pCtx      The encoding context to add the simple value to.
 @param[in] szDate    Null-terminated string with date to add

 The string szDate should be in the form of RFC 3339 as defined by section
 3.3 in RFC 4287. This is as described in section 2.4.1 in RFC 7049.
 
 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().
 */
static void QCBOREncode_AddDateString(QCBOREncodeContext *pCtx, const char *szDate);

static void QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szDate);

static void QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szDate);


/**
 @brief  Add a standard boolean.
 
 @param[in] pCtx   The encoding context to add the simple value to.
 @param[in] b      true or false from stdbool. Anything will result in an error.
 
 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_AddBoolToMap(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 simple value 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_AddNULLToMap(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 simple value to.
 
 Adds the undef value as CBOR major type 7.
 
 Note that this value will not translate to JSON.
 
 This 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_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel);

static void QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);


/**
 @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 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
 OpenArray again before calling CloseArray.  While CBOR has no limit
 on nesting, this implementation does in order to keep it smaller and
 simpler.  The limit is QCBOR_MAX_ARRAY_NESTING. This is the max
 number of times this can be called without calling
 QCBOREncode_CloseArray(). QCBOREncode_Finish() will return
 QCBOR_ERR_ARRAY_TOO_LONG 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 32,767 items to an array or map, incorrect CBOR will
 be produced by this encoder.
 
 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.
 */
static void QCBOREncode_OpenArray(QCBOREncodeContext *pCtx);

static void QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pCtx, const char *szLabel);

static void QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pCtx,  int64_t nLabel);


/**
 @brief Close an open array.
 
 @param[in] pCtx The context to add to.
 
 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 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, 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 context to add to.
 
 See QCBOREncode_OpenArray() for more information.
 
 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 QCBOREncode_AddXXX() call has once version that is "InMap" for
 adding items to maps with string labels and on that is "InMapN" that
 is for adding with integer labels.
 
 RFC 7049 uses the term "key" instead of "label".
 
 If you wish to use map labels that are neither integer labels or
 text strings, then just call the QCBOREncode_AddXXX() function
 explicitly to add the label. Then call it again to add the value.
 
 See the RFC7049 for a lot more information on creating maps.
 */
static void QCBOREncode_OpenMap(QCBOREncodeContext *pCtx);

static void QCBOREncode_OpenMapInMap(QCBOREncodeContext *pCtx, const char *szLabel);

static void QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);



/**
 @brief Close an open map.
 
 @param[in] pCtx The context to add to.
 
 The 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 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, QCBOR_ERR_CLOSE_MISMATCH will be returned when QCBOREncode_Finish()
 is called.
 */
static void QCBOREncode_CloseMap(QCBOREncodeContext *pCtx);


/**
 @brief Indicate start of encoded CBOR to be wrapped in a bstr.
 
 @param[in] pCtx The context to add to.
 
 All added encoded items between this call and a call to
 QCBOREncode_CloseBstrWrap() will be wrapped in a bstr. They will
 appear in the final output as a byte string.  That byte string will
 contain encoded CBOR.
 
 The typical use case is for encoded CBOR that is to be
 cryptographically hashed, as part of a COSE (RFC 8152)
 implementation. This 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
 Sig_structure) potentially saving a lot of memory.
 
 When constructing cryptographically signed CBOR objects, maps or arrays, they
 typically are encoded
 normally and then wrapped as a byte string. The COSE standard for example
 does this. The wrapping is simply treating the encoded CBOR map
 as a byte string.
 
 The stated purpose of this wrapping is to prevent code relaying the signed data
 but not verifying it from tampering with the signed data thus making
 the signature unverifiable. It is also quite beneficial for the
 signature verification code. Standard CBOR parsers usually do not give
 access to partially parsed CBOR as would be need to check the signature
 of some CBOR. With this wrapping, standard CBOR parsers can be used
 to get to all the data needed for a signature verification.
 */
static void QCBOREncode_BstrWrap(QCBOREncodeContext *pCtx);

static void QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pCtx, const char *szLabel);

static void QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);


/**
 @brief Close a wrapping bstr.
 
 @param[in] pCtx The context to add to.
 @param[out] pWrappedCBOR 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
 *pWrappedCBOR if it is not NULL. The main purpose of this is so this
 data can be hashed (e.g., with SHA-256) as part of a COSE (RFC 8152)
 implementation. **WARNING**, this pointer and length should be used
 right away before any other calls to QCBOREncode_xxxx() 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 then QCBOREncode_BstrWrap(),
 then 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, QCBOR_ERR_CLOSE_MISMATCH will be returned when QCBOREncode_Finish()
 is called.
 */
static void QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pCtx, UsefulBufC *pWrappedCBOR);


/**
 Add some already-encoded CBOR bytes.
 
 @param[in] pCtx The context to add 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. While this
 encoder doesn't ever produce indefinite lengths, 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.
 */
static void QCBOREncode_AddEncoded(QCBOREncodeContext *pCtx, UsefulBufC Encoded);

static void QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);

static void QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Encoded);


/**
 Get the encoded result.
 
 @param[in] pCtx  The context to finish encoding with.
 @param[out] pEncodedCBOR  Pointer and length of encoded CBOR.
 
 @return
 One of the CBOR error codes.
 
 If this returns success QCBOR_SUCCESS the encoding was a success and
 the return length is correct and complete.
 
 If no buffer was passed to QCBOR_Init(), then only the length and
 number of items was computed. The length is in
 pEncodedCBOR->Bytes.len. pEncodedCBOR->Bytes.ptr is NULL.
 
 If a buffer was passed, then pEncodedCBOR->Bytes.ptr is the same as
 the buffer passed to QCBOR_Init() and contains the encoded CBOR
 and the length is filled in.
 
 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
 QCBOR_AddXXX calls long before QCBOREncode_Finish() was called. This
 error handling approach reduces the CBOR implementation size, but makes
 debugging a problem a little more difficult.
 */
QCBORError QCBOREncode_Finish(QCBOREncodeContext *pCtx, UsefulBufC *pEncodedCBOR);


/**
 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
 One of the CBOR error codes.
 
 If this returns success QCBOR_SUCCESS the encoding was a success and
 the return length is correct and complete.
 
 If no buffer was passed to QCBOR_Init(), then only the length was
 computed. If a buffer was passed, then the encoded CBOR is in the
 buffer.
 
 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
 QCBOR_AddXXX calls long before QCBOREncode_Finish() was called. This
 error handling reduces the CBOR implementation size, but makes
 debugging harder.
 */
QCBORError QCBOREncode_FinishGetSize(QCBOREncodeContext *pCtx, size_t *uEncodedLen);






/**
 QCBORDecodeContext is the data type that holds context decoding the
 data items for some received CBOR.  It is about 100 bytes, so it can go
 on the stack.  The contents are opaque, and the caller should not
 access any internal items.  A context may be re used serially as long
 as it is re initialized.
 */
typedef struct _QCBORDecodeContext QCBORDecodeContext;


/**
 Initialize the CBOR decoder context.
 
 @param[in] pCtx The context to initialize.
 @param[in] EncodedCBOR The buffer with CBOR encoded bytes to be decoded.
 @param[in] nMode One of QCBOR_DECODE_MODE_xxx
 
 Initialize context for a pre-order travesal of the encoded CBOR tree.
 
 Most CBOR decoding can be completed by calling this function to start
 and QCBORDecode_GetNext() in a loop.
 
 If indefinite length strings are to be decoded, then
 QCBORDecode_SetMemPool() or QCBORDecode_SetUpAllocator() must be
 called to set up a string allocator.
 
 If tags other than built-in tags are to be recognized, then
 QCBORDecode_SetCallerAddedTagMap() must be called. The built-in tags
 are those for which a macro of the form  CBOR_TAG_XXX is defined.
 
 Three decoding modes are supported.  In normal mode,
 QCBOR_DECODE_MODE_NORMAL, maps are decoded and strings and ints are
 accepted as map labels. If a label is other than these, the error
 QCBOR_ERR_MAP_LABEL_TYPE is returned by QCBORDecode_GetNext().
 
 In strings-only mode, QCBOR_DECODE_MODE_MAP_STRINGS_ONLY, only text
 strings are accepted for map labels.  This lines up with CBOR that
 converts to JSON. The error QCBOR_ERR_MAP_LABEL_TYPE is returned by
 QCBORDecode_GetNext() if anything but a text string label is
 encountered.
 
 In QCBOR_DECODE_MODE_MAP_AS_ARRAY maps are treated as special arrays.
 They will be return with special uDataType QCBOR_TYPE_MAP_AS_ARRAY
 and uCount, the number of items, will be double what it would be
 for a normal map because the labels are also counted. This mode
 is useful for decoding CBOR that has labels that are not
 integers or text strings, but the caller must manage much of
 the map decoding.
 */
void QCBORDecode_Init(QCBORDecodeContext *pCtx, UsefulBufC EncodedCBOR, QCBORDecodeMode nMode);


/**
 Set up the MemPool string allocator for indefinite length strings.
 
 @param[in] pCtx The decode context.
 @param[in] MemPool The pointer and length of the memory pool.
 @param[in] bAllStrings true means to put even definite length strings in the pool.
 
 @return 0 if the MemPool was at least minimum size, 1 if too small.
 
 Indefinite length strings (text and byte) cannot be decoded unless there is
 a string allocator configured. MemPool is a simple built-in string allocator
 that allocates bytes from a memory pool handed to it by calling
 this function.  The memory pool is just a pointer and length for some
 block of memory that is to be used for string allocation. It can
 come from the stack, heap or other.
 
 The memory pool must be large enough to hold some fixed overhead plus the
 space for all the strings allocated. The fixed overhead does vary
 by CPU and compiler, but can roughly be computed as the space for
 seven pointers, 56 bytes for a 64-bit CPU.  There is no overhead
 per string allocated
 
 This memory pool is used for all indefinite length strings that are text
 strings or byte strings, including strings used as labels.
 
 The pointers to strings in QCBORItem will point into the memory pool set
 here. They do not need to be individually freed. Just discard the buffer
 when they are no longer needed.
 
 If bAllStrings is set, then the size will be the overhead plus the space to
 hold **all** strings, definite and indefinite length, value or label. The
 advantage of this is that after the decode is complete, the original memory
 holding the encoded CBOR does not need to remain valid.
 
 If this function is not called because there is no need to support indefinite
 length strings, the MemPool implementation should be dead-stripped by the loader
 and not add to code size.
 */
QCBORError QCBORDecode_SetMemPool(QCBORDecodeContext *pCtx, UsefulBuf MemPool, bool bAllStrings);


/**
 @brief Sets up a custom string allocator for indefinite length strings
 
 @param[in] pCtx The decoder context to set up an allocator for
 @param[in] pAllocator The string allocator "object"
 
 See QCBORStringAllocator for the requirements of the string allocator.
 
 Typically, this is used if the simple MemPool allocator isn't desired.
 
 A malloc based string allocator can be obtained by calling
 QCBORDecode_MakeMallocStringAllocator(). Pass its result to
 this function.
 
 You can also write your own allocator. Create the allocate, free,
 and destroy functions and put pointers to them in a QCBORStringAllocator.
 */
void QCBORDecode_SetUpAllocator(QCBORDecodeContext *pCtx, const QCBORStringAllocator *pAllocator, bool bAllStrings);


/**
 @brief Configure list of caller selected tags to be recognized
 
 @param[in] pCtx The decode context.
 @param[out] pTagList Structure holding the list of tags to configure
 
 This is used to tell the decoder about tags beyond those that are
 built-in that should be recognized. The built-in tags are those
 with macros of the form CBOR_TAG_XXX.
 
 See description of QCBORTagListIn.
 */
void QCBORDecode_SetCallerConfiguredTagList(QCBORDecodeContext *pCtx, const QCBORTagListIn *pTagList);


/**
 @brief This returns a string allocator that uses malloc
 
 @return pointer to string allocator or NULL
 
 Call this to get the string allocator and then configure it into
 the decoder by calling QCBORDecode_SetUpAllocator().  If you
 don't call this, there will be no dependency on malloc
 in QCBOR. Some deployments of QCBOR might even exclude
 the implementation of this function if they don't have
 malloc() at all.
 
 If you do set up this malloc-based string allocator, then
 every string marked as allocated in a QCBORItem must
 freed. They are marked by uDataAlloc and uLabelAlloc
 in QCBORItem.
 */
QCBORStringAllocator *QCBORDecode_MakeMallocStringAllocator(void);


/**
 @brief Gets the next item (integer, byte string, array...) in pre order traversal of CBOR tree
 
 @param[in]  pCtx          The decoder context.
 @param[out] pDecodedItem  Holds the CBOR item just decoded.
 
 @return 0 or error. All errors except QCBOR_ERR_TOO_MANY_TAGS
 and QCBOR_ERR_STRING_ALLOCATE indicate that the CBOR input
 could not be decoded. In most cases
 this is because the CBOR is invalid. In a few cases
 (QCBOR_ERR_ARRAY_NESTING_TOO_DEEP, QCBOR_ERR_INT_OVERFLOW,
 QCBOR_ERR_DATE_OVERFLOW) it is because the CBOR is beyond
 the limits of what this implementation can handle.
 QCBOR_ERR_NO_STRING_ALLOCATOR indicates CBOR that cannot
 be handled unless a string allocator is configured.
 QCBOR_ERR_MAP_LABEL_TYPE is in a way a limitation of
 this implementation, but can be avoided by decoding
 in QCBOR_DECODE_MODE_MAP_AS_ARRAY mode.
 
 pDecodedItem is filled in with the value parsed. Generally, the
 following data is returned in the structure.
 
 - The data type in uDataType which indicates which member of the val
   union the data is in. This decoder figures out the type based on the
   CBOR major type, the CBOR "additionalInfo", the CBOR optional tags
   and the value of the integer.
 
 - The value of the item, which might be an integer, a pointer and a
   length, the count of items in an array, a floating-point number or
   other.
 
 - The nesting level for maps and arrays.
 
 - The label for an item in a map, which may be a text or byte string or an integer.
 
 - The CBOR optional tag or tags.
 
 See documentation on in the data type QCBORItem for all the details
 on what is returned.
 
 This function also handles arrays and maps. When first encountered a
 QCBORItem will be returned with major type CBOR_MAJOR_TYPE_ARRAY or
 CBOR_MAJOR_TYPE_ARRAY_MAP. QCBORItem.val.uCount will indicate the number
 of Items in the array or map.  Typically, an implementation will call
 QCBORDecode_GetNext() in a for loop to fetch them all. When decoding
 indefinite length maps and arrays, QCBORItem.val.uCount is UINT16_MAX
 and uNextNestLevel must be used to know when the end of a map
 or array is reached.
 
 Nesting level 0 is the outside top-most nesting level. For example, in
 a CBOR structure with two items, an integer and a byte string only,
 both would be at nesting level 0.  A CBOR structure with an array
 open, an integer and a byte string, would have the integer and byte
 string as nesting level 1.
 
 Here is an example of how the nesting level is reported with no arrays
 or maps at all
 
 @verbatim
 CBOR Structure           Nesting Level
 Integer                    0
 Byte String                0
 @endverbatim
 
 Here is an example of how the nesting level is reported with an a simple
 array and some top-level items.
 
 @verbatim
 Integer                    0
 Array (with 2 items)       0
 Byte String                1
 Byte string                1
 Integer                    0
 @endverbatim
 
 
 Here's a more complex example
 @verbatim
 
 Map with 2 items           0
 Text string                1
 Array with 3 integers      1
 integer                    2
 integer                    2
 integer                    2
 text string                1
 byte string                1
 @endverbatim
 
 In QCBORItem, uNextNestLevel is the nesting level for the next call
 to QCBORDecode_GetNext(). It indicates if any maps or arrays were closed
 out during the processing of the just-fecthed QCBORItem. This processing
 includes a look-ahead for any breaks that close out indefinite length
 arrays or maps. This value is needed to be able to understand the
 hierarchical structure. If uNextNestLevel is not equal to uNestLevel
 the end of the current map or array has been encountered. This
 works the same for both definite and indefinite length arrays.
 
 Most uses of this decoder will not need to do anything extra for
 tag handling. The built-in tags, those with a macro of the form
 CBOR_TAG_XXXX, will be enough.

 If tags beyond built-in tags are to be recognized, they must be
 configured by calling QCBORDecode_SetCallerConfiguredTags(). If
 a tag is not recognized it is silently ignored.
 
 Several tagged types are automatically recognized and decoded and
 returned in their decoded form.
 
 To find out if a QCBORItem was tagged with a particular tag
 call QCBORDecode_IsTagged(). This works only for built-in
 tags and caller-configured tags.
 
 To get the full list of tags on an Item without having to
 pre-configure any predetermined list of tags use
 QCBORDecode_GetNextWithTags().
 */
QCBORError QCBORDecode_GetNext(QCBORDecodeContext *pCtx, QCBORItem *pDecodedItem);


/**
 @brief Gets the next item including full list of tags for item
 
 @param[in]  pCtx          The decoder context.
 @param[out] pDecodedItem  Holds the CBOR item just decoded.
 @param[in,out] pTagList   On input array to put tags in; on output the tags on this item.
 
 @return 0 or error.
 
 This works the same as QCBORDecode_GetNext() except that it also returns
 the full list of tags for the data item. This function should only
 be needed when parsing CBOR to print it out or convert it to some other
 format. It should not be needed in an actual CBOR protocol implementation.
 
 Tags will be returned here whether or not they are in the built-in or
 caller-configured tag lists.
 
 CBOR has no upper bound of limit on the number of tags that can be
 associated with a data item. In practice the number of tags on an item
 will usually be small, perhaps less than five. This will return an error
 if the array in pTagList is too small to hold all the tags for an item.
 
 (This function is separate from  QCBORDecode_GetNext() so as to not have to
 make QCBORItem large enough to be able to hold a full list of tags. Even a list of
 five tags would nearly double its size because tags can be a uint64_t).
 */
QCBORError QCBORDecode_GetNextWithTags(QCBORDecodeContext *pCtx, QCBORItem *pDecodedItem, QCBORTagListOut *pTagList);


/**
 @brief Determine if a CBOR item was tagged with a particular tag
 
 @param[in] pCtx    The decoder context.
 @param[in] pItem   The CBOR item to check
 @param[in] uTag    The tag to check

 @return 1 if it was tagged, 0 if not
 
 QCBORDecode_GetNext() processes tags by looking them up
 in two lists and setting a bit corresponding to the tag
 in uTagBits in the QCBORItem. To find out if a
 QCBORItem was tagged with a particular tag, call
 this function. It handles the mapping between
 the two lists of tags and the bits set for it.
 
 The first tag list is the built-in tags, those
 with a macro of the form CBOR_TAG_XXX in this
 header file. There are up to 48 of these,
 corresponding to the lower 48 tag bits.
 
 The other optional tag list is the ones
 the caller configured using QCBORDecode_SetCallerConfiguredTagList()
 There are QCBOR_MAX_CUSTOM_TAGS (16) of these corresponding to the
 upper 16 tag bits.
 
 See also QCBORDecode_GetTags() and QCBORDecode_GetNextWithTags().
 */
int QCBORDecode_IsTagged(QCBORDecodeContext *pCtx, const QCBORItem *pItem, uint64_t uTag);


/**
 Check whether all the bytes have been decoded and maps and arrays closed.
 
 @param[in]  pCtx          The context to check
 
 @return QCBOR_SUCCESS or error
 
 This tells you if all the bytes given to QCBORDecode_Init() have
 been consumed and whether all maps and arrays were closed.
 The decode is considered to be incorrect or incomplete if not
 and an error will be returned.
 */
QCBORError QCBORDecode_Finish(QCBORDecodeContext *pCtx);




/**
  Convert int64_t to smaller int's safely
 
 @param [in]  src    An int64_t
 @param [out] dest   A smaller sized int to convert to
  
 @return 0 on success -1 if not
 
 When decoding an integer, the CBOR decoder will return the value as an
 int64_t unless the integer is in the range of INT64_MAX and
 UINT64_MAX. That is, unless the value is so large that it can only be
 represented as a uint64_t, it will be an int64_t.
 
 CBOR itself doesn't size the individual integers it carries at
 all. The only limits it puts on the major integer types is that they
 are 8 bytes or less in length. Then encoders like this one use the
 smallest number of 1, 2, 4 or 8 bytes to represent the integer based
 on its value. There is thus no notion that one data item in CBOR is
 an 1 byte integer and another is a 4 byte integer.
 
 The interface to this CBOR encoder only uses 64-bit integers. Some
 CBOR protocols or implementations of CBOR protocols may not want to
 work with something smaller than a 64-bit integer.  Perhaps an array
 of 1000 integers needs to be sent and none has a value larger than
 50,000 and are represented as uint16_t.
 
 The sending / encoding side is easy. Integers are temporarily widened
 to 64-bits as a parameter passing through QCBOREncode_AddInt64() and
 encoded in the smallest way possible for their value, possibly in
 less than an uint16_t.
 
 On the decoding side the integers will be returned at int64_t even if
 they are small and were represented by only 1 or 2 bytes in the
 encoded CBOR. The functions here will convert integers to a small
 representation with an overflow check.
 
 (The decoder could have support 8 different integer types and
 represented the integer with the smallest type automatically, but
 this would have made the decoder more complex and code calling the
 decoder more complex in most use cases.  In most use cases on 64-bit
 machines it is no burden to carry around even small integers as
 64-bit values).
 */
static inline int QCBOR_Int64ToInt32(int64_t src, int32_t *dest)
{
   if(src > INT32_MAX || src < INT32_MIN) {
      return -1;
   } else {
      *dest = (int32_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64ToInt16(int64_t src, int16_t *dest)
{
   if(src > INT16_MAX || src < INT16_MIN) {
      return -1;
   } else {
      *dest = (int16_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64ToInt8(int64_t src, int8_t *dest)
{
   if(src > INT8_MAX || src < INT8_MIN) {
      return -1;
   } else {
      *dest = (int8_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64ToUInt32(int64_t src, uint32_t *dest)
{
   if(src > UINT32_MAX || src < 0) {
      return -1;
   } else {
      *dest = (uint32_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64UToInt16(int64_t src, uint16_t *dest)
{
   if(src > UINT16_MAX || src < 0) {
      return -1;
   } else {
      *dest = (uint16_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64ToUInt8(int64_t src, uint8_t *dest)
{
   if(src > UINT8_MAX || src < 0) {
      return -1;
   } else {
      *dest = (uint8_t) src;
   }
   return 0;
}

static inline int QCBOR_Int64ToUInt64(int64_t src, uint64_t *dest)
{
   if(src > 0) {
      return -1;
   } else {
      *dest = (uint64_t) src;
   }
   return 0;
}





/* ===========================================================================
 BEGINNING OF PRIVATE INLINE IMPLEMENTATION
 
 =========================================================================== */

/**
 @brief Semi-private method to add a buffer full of bytes to encoded output
 
 @param[in] pCtx       The encoding context to add the integer to.
 @param[in] uMajorType The CBOR major type of the bytes.
 @param[in] Bytes      The bytes to add.
 
 Use QCBOREncode_AddText() or QCBOREncode_AddBytes() or
 QCBOREncode_AddEncoded() instead. They are inline functions
 that call this and supply the correct major type. This function
 is public to make the inline functions work to keep the overall
 code size down and because the C language has no way to make
 it private.
 
 If this is called the major type should be CBOR_MAJOR_TYPE_TEXT_STRING,
 CBOR_MAJOR_TYPE_BYTE_STRING or CBOR_MAJOR_NONE_TYPE_RAW. The last
 one is special for adding already-encoded CBOR.
 */
void QCBOREncode_AddBuffer(QCBOREncodeContext *pCtx, uint8_t uMajorType, UsefulBufC Bytes);


/**
 @brief Semi-private method to open a map, array or bstr wrapped CBOR
 
 @param[in] pCtx The context to add to.
 @param[in] uMajorType The major CBOR type to close
 
 Call QCBOREncode_OpenArray(), QCBOREncode_OpenMap() or
 QCBOREncode_BstrWrap() instead of this.
 */
void QCBOREncode_OpenMapOrArray(QCBOREncodeContext *pCtx, uint8_t uMajorType);


/**
 @brief Semi-private method to close a map, array or bstr wrapped CBOR
 
 @param[in] pCtx The context to add to.
 @param[in] uMajorType The major CBOR type to close
 @param[out] pWrappedCBOR UsefulBufC containing wrapped bytes
 
 Call QCBOREncode_CloseArray(), QCBOREncode_CloseMap() or
 QCBOREncode_CloseBstrWrap() instead of this.
 */
void QCBOREncode_CloseMapOrArray(QCBOREncodeContext *pCtx, uint8_t uMajorType, UsefulBufC *pWrappedCBOR);


/**
 @brief  Semi-private method to add simple types.
 
 @param[in] pCtx      The encoding context to add the simple value to.
 @param[in] uSize     Minimum encoding size for uNum. Usually 0.
 @param[in] uNum      One of CBOR_SIMPLEV_FALSE through _UNDEF or other.
 
 This is used to add simple types like true and false.
 
 Call QCBOREncode_AddBool(), QCBOREncode_AddNULL(), QCBOREncode_AddUndef()
 instead of this.
 
 This function can add simple values that are not defined by CBOR yet. This expansion
 point in CBOR should not be used unless they are standardized.
 
 Error handling is the same as QCBOREncode_AddInt64().
 */
void  QCBOREncode_AddType7(QCBOREncodeContext *pCtx, size_t uSize, uint64_t uNum);


static void inline QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t uNum)
{
   QCBOREncode_AddBuffer(pCtx, CBOR_MAJOR_TYPE_TEXT_STRING, UsefulBuf_FromSZ(szLabel)); // AddSZString not defined yet
   QCBOREncode_AddInt64(pCtx, uNum);
}

static void inline QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t uNum)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddInt64(pCtx, uNum);
}


static void inline QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum)
{
   QCBOREncode_AddBuffer(pCtx, CBOR_MAJOR_TYPE_TEXT_STRING, UsefulBuf_FromSZ(szLabel)); // AddSZString not defined yet
   QCBOREncode_AddUInt64(pCtx, uNum);
}

static void inline QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddUInt64(pCtx, uNum);
}


static inline void QCBOREncode_AddText(QCBOREncodeContext *pCtx, UsefulBufC Text)
{
   QCBOREncode_AddBuffer(pCtx, CBOR_MAJOR_TYPE_TEXT_STRING, Text);
}

static inline void QCBOREncode_AddTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text)
{
   QCBOREncode_AddText(pCtx, UsefulBuf_FromSZ(szLabel)); // AddSZString not defined yet
   QCBOREncode_AddText(pCtx, Text);
}

static inline void QCBOREncode_AddTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Text)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddText(pCtx, Text);
}


inline static void QCBOREncode_AddSZString(QCBOREncodeContext *pCtx, const char *szString)
{
   QCBOREncode_AddText(pCtx, UsefulBuf_FromSZ(szString));
}

static inline void QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddSZString(pCtx, szString);
}

static inline void QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szString)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddSZString(pCtx, szString);
}


static void inline QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddDouble(pCtx, dNum);
}

static void inline QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddDouble(pCtx, dNum);
}


static inline void QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx, int64_t date)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_EPOCH);
   QCBOREncode_AddInt64(pCtx, date);
}

static inline void QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t date)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_EPOCH);
   QCBOREncode_AddInt64(pCtx, date);
}

static inline void QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t date)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_EPOCH);
   QCBOREncode_AddInt64(pCtx, date);
}


static inline void QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes)
{
   QCBOREncode_AddBuffer(pCtx, CBOR_MAJOR_TYPE_BYTE_STRING, Bytes);
}

static inline void QCBOREncode_AddBytesToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddBytes(pCtx, Bytes);
}


static inline void QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pCtx, UsefulBufC Bytes)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_BIN_UUID);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_BIN_UUID);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_BIN_UUID);
   QCBOREncode_AddBytes(pCtx, Bytes);
}


static inline void QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pCtx, UsefulBufC Bytes)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_POS_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_POS_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_POS_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}


static inline void QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pCtx, UsefulBufC Bytes)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_NEG_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_NEG_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}

static inline void QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_NEG_BIGNUM);
   QCBOREncode_AddBytes(pCtx, Bytes);
}


static inline void QCBOREncode_AddURI(QCBOREncodeContext *pCtx, UsefulBufC URI)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_URI);
   QCBOREncode_AddText(pCtx, URI);
}

static inline void QCBOREncode_AddURIToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC URI)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_URI);
   QCBOREncode_AddText(pCtx, URI);
}

static inline void QCBOREncode_AddURIToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC URI)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_URI);
   QCBOREncode_AddText(pCtx, URI);
}



static inline void QCBOREncode_AddB64Text(QCBOREncodeContext *pCtx, UsefulBufC B64Text)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64);
   QCBOREncode_AddText(pCtx, B64Text);
}

static inline void QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64);
   QCBOREncode_AddText(pCtx, B64Text);
}

static inline void QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64);
   QCBOREncode_AddText(pCtx, B64Text);
}


static inline void QCBOREncode_AddB64URLText(QCBOREncodeContext *pCtx, UsefulBufC B64Text)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64URL);
   QCBOREncode_AddText(pCtx, B64Text);
}

static inline void QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC B64Text)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64URL);
   QCBOREncode_AddText(pCtx, B64Text);
}

static inline void QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC B64Text)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_B64URL);
   QCBOREncode_AddText(pCtx, B64Text);
}


static inline void QCBOREncode_AddRegex(QCBOREncodeContext *pCtx, UsefulBufC Bytes)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_REGEX);
   QCBOREncode_AddText(pCtx, Bytes);
}

static inline void QCBOREncode_AddRegexToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_REGEX);
   QCBOREncode_AddText(pCtx, Bytes);
}

static inline void QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_REGEX);
   QCBOREncode_AddText(pCtx, Bytes);
}


static inline void QCBOREncode_AddMIMEData(QCBOREncodeContext *pCtx, UsefulBufC MIMEData)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_MIME);
   QCBOREncode_AddText(pCtx, MIMEData);
}

static inline void QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC MIMEData)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_MIME);
   QCBOREncode_AddText(pCtx, MIMEData);
}

static inline void QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC MIMEData)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_MIME);
   QCBOREncode_AddText(pCtx, MIMEData);
}


static inline void QCBOREncode_AddDateString(QCBOREncodeContext *pCtx, const char *szDate)
{
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_STRING);
   QCBOREncode_AddSZString(pCtx, szDate);
}

static inline void QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szDate)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_STRING);
   QCBOREncode_AddSZString(pCtx, szDate);
}

static inline void QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szDate)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddTag(pCtx, CBOR_TAG_DATE_STRING);
   QCBOREncode_AddSZString(pCtx, szDate);
}


static inline void QCBOREncode_AddSimple(QCBOREncodeContext *pCtx, uint64_t uNum)
{
   QCBOREncode_AddType7(pCtx, 0, uNum);
}

static inline void QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint8_t uSimple)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddSimple(pCtx, uSimple);
}

static inline void QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pCtx, int nLabel, uint8_t uSimple)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddSimple(pCtx, uSimple);
}


static inline void QCBOREncode_AddBool(QCBOREncodeContext *pCtx, bool b)
{
   uint8_t uSimple = CBOR_SIMPLEV_FALSE;
   if(b) {
      uSimple = CBOR_SIMPLEV_TRUE;
   }
   QCBOREncode_AddSimple(pCtx, uSimple);
}

static inline void QCBOREncode_AddBoolToMap(QCBOREncodeContext *pCtx, const char *szLabel, bool b)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddBool(pCtx, b);
}

static inline void QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, bool b)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddBool(pCtx, b);
}


static inline void QCBOREncode_AddNULL(QCBOREncodeContext *pCtx)
{
   QCBOREncode_AddSimple(pCtx, CBOR_SIMPLEV_NULL);
}

static inline void QCBOREncode_AddNULLToMap(QCBOREncodeContext *pCtx, const char *szLabel)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddNULL(pCtx);
}

static inline void QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pCtx, int64_t nLabel)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddNULL(pCtx);
}


static inline void QCBOREncode_AddUndef(QCBOREncodeContext *pCtx)
{
   QCBOREncode_AddSimple(pCtx, CBOR_SIMPLEV_UNDEF);
}

static inline void QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddUndef(pCtx);
}

static inline void QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pCtx, int64_t nLabel)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddUndef(pCtx);
}


static inline void QCBOREncode_OpenArray(QCBOREncodeContext *pCtx)
{
   QCBOREncode_OpenMapOrArray(pCtx, CBOR_MAJOR_TYPE_ARRAY);
}

static inline void QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pCtx, const char *szLabel)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_OpenArray(pCtx);
}

static inline void QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pCtx,  int64_t nLabel)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_OpenArray(pCtx);
}

static inline void QCBOREncode_CloseArray(QCBOREncodeContext *pCtx)
{
   QCBOREncode_CloseMapOrArray(pCtx, CBOR_MAJOR_TYPE_ARRAY, NULL);
}


static inline void QCBOREncode_OpenMap(QCBOREncodeContext *pCtx)
{
   QCBOREncode_OpenMapOrArray(pCtx, CBOR_MAJOR_TYPE_MAP);
}

static inline void QCBOREncode_OpenMapInMap(QCBOREncodeContext *pCtx, const char *szLabel)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_OpenMap(pCtx);
}

static inline void QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_OpenMap(pCtx);
}

static inline void QCBOREncode_CloseMap(QCBOREncodeContext *pCtx)
{
   QCBOREncode_CloseMapOrArray(pCtx, CBOR_MAJOR_TYPE_MAP, NULL);
}


static inline void QCBOREncode_BstrWrap(QCBOREncodeContext *pCtx)
{
   QCBOREncode_OpenMapOrArray(pCtx, CBOR_MAJOR_TYPE_BYTE_STRING);
}

static inline void QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pCtx, const char *szLabel)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_BstrWrap(pCtx);
}

static inline void QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_BstrWrap(pCtx);
}

static inline void QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pCtx, UsefulBufC *pWrappedCBOR)
{
   QCBOREncode_CloseMapOrArray(pCtx, CBOR_MAJOR_TYPE_BYTE_STRING, pWrappedCBOR);
}


static inline void QCBOREncode_AddEncoded(QCBOREncodeContext *pCtx, UsefulBufC Encoded)
{
   QCBOREncode_AddBuffer(pCtx, CBOR_MAJOR_NONE_TYPE_RAW, Encoded);
}

static inline void QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded)
{
   QCBOREncode_AddSZString(pCtx, szLabel);
   QCBOREncode_AddEncoded(pCtx, Encoded);
}

static inline void QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Encoded)
{
   QCBOREncode_AddInt64(pCtx, nLabel);
   QCBOREncode_AddEncoded(pCtx, Encoded);
}


/* ===========================================================================
 END OF PRIVATE INLINE IMPLEMENTATION
 
 =========================================================================== */

#endif /* defined(__QCBOR__qcbor__) */

