diff --git a/inc/qcbor/qcbor_common.h b/inc/qcbor/qcbor_common.h
index 81707f8..9ae2123 100644
--- a/inc/qcbor/qcbor_common.h
+++ b/inc/qcbor/qcbor_common.h
@@ -392,9 +392,9 @@
     *  decoding possible.*/
    QCBOR_ERR_NO_STRING_ALLOCATOR = 45,
 
-   /** Error allocating space for a string, usually for an
-    *  indefinite-length string. This error makes no further decoding
-    *  possible. */
+   /** Error allocating memory for a string, usually out of memory.
+    * This primarily occurs decoding indefinite-length strings. This
+    * error makes no further decoding possible. */
    QCBOR_ERR_STRING_ALLOCATE = 46,
 
    /** During decoding, the type of the label for a map entry is not
diff --git a/inc/qcbor/qcbor_spiffy_decode.h b/inc/qcbor/qcbor_spiffy_decode.h
index d8fc5e3..84fb516 100644
--- a/inc/qcbor/qcbor_spiffy_decode.h
+++ b/inc/qcbor/qcbor_spiffy_decode.h
@@ -1929,7 +1929,7 @@
 /* Semi-private data structure (which might change).
  *
  * See QCBOR_Private_CheckTagRequirement() which uses this to check the
- * type of a item to be decoded as a tag or tag content.
+ * type of an item to be decoded as a tag or tag content.
  *
  * Improvement: Carefully understand what compilers do with this,
  * particularly initialization and see if it can be optimized so there
@@ -2146,7 +2146,7 @@
                              const uint32_t      uConvertTypes,
                              double             *pdValue)
 {
-    QCBORItem Item;
+   QCBORItem Item;
     QCBORDecode_Private_GetDoubleConvert(pMe, uConvertTypes, pdValue, &Item);
 }
 
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 332314b..a0bec4e 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -765,8 +765,8 @@
  * @param[out] puArgument        The decoded argument.
  * @param[out] pnAdditionalInfo  The decoded Lower 5 bits of initial byte.
  *
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
+ * @retval QCBOR_ERR_UNSUPPORTED Encountered unsupported/reserved features
+ * @retval QCBOR_ERR_HIT_END Unexpected end of input
  *
  * This decodes the CBOR "head" that every CBOR data item has. See
  * longer explaination of the head in documentation for
@@ -843,7 +843,7 @@
  * @param[in] uArgument      The argument from the head.
  * @param[out] pDecodedItem  The filled in decoded item.
  *
- * @retval QCBOR_ERR_INT_OVERFLOW
+ * @retval QCBOR_ERR_INT_OVERFLOW Too-large negative encountered
  *
  * Must only be called when major type is 0 or 1.
  *
@@ -930,11 +930,13 @@
  * @param[in] uArgument         The argument from the head.
  * @param[out] pDecodedItem     The filled in decoded item.
  *
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all float
+ *                                           decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of simple
+ *                                           type in input.
  */
-
 static QCBORError
 QCBOR_Private_DecodeType7(const int      nAdditionalInfo,
                           const uint64_t uArgument,
@@ -1047,9 +1049,9 @@
  * @param[in] pUInBuf        The surce from which to read the string's bytes.
  * @param[out] pDecodedItem  The filled in decoded item.
  *
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
+ * @retval QCBOR_ERR_HIT_END          Unexpected end of input.
+ * @retval QCBOR_ERR_STRING_ALLOCATE  Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG  String longer than SIZE_MAX - 4.
  *
  * The reads @c uStrlen bytes from @c pUInBuf and fills in @c
  * pDecodedItem. If @c pAllocator is not NULL then memory for the
@@ -1164,15 +1166,21 @@
  * @param[out] pDecodedItem  The filled-in decoded item.
  * @param[in] pAllocator    The allocator to use for strings or NULL.
  *
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_INT_OVERFLOW
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
- * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED
+ * @retval QCBOR_ERR_UNSUPPORTED             Encountered unsupported/reserved
+ *                                           features
+ * @retval QCBOR_ERR_HIT_END                 Unexpected end of input
+ * @retval QCBOR_ERR_INT_OVERFLOW            Too-large negative encountered
+ * @retval QCBOR_ERR_STRING_ALLOCATE         Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG         String longer than SIZE_MAX - 4.
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all
+ *                                           float decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of
+ *                                           simple type in input.
+ * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED  Indefinite length map/array
+ *                                              in input, but indefinite
+ *                                              lengths disabled.
  *
  * This decodes the most primitive / atomic data item. It does
  * no combing of data items.
@@ -1280,18 +1288,27 @@
  * @param[in] pMe   Decoder context
  * @param[out] pDecodedItem  The decoded item that work is done on.
  *
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_INT_OVERFLOW
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
- * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED
- * @retval QCBOR_ERR_NO_STRING_ALLOCATOR
- * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK
- * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED
+ * @retval QCBOR_ERR_UNSUPPORTED             Encountered unsupported/reserved
+ *                                           features
+ * @retval QCBOR_ERR_HIT_END                 Unexpected end of input
+ * @retval QCBOR_ERR_INT_OVERFLOW            Too-large negative encountered
+ * @retval QCBOR_ERR_STRING_ALLOCATE         Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG         String longer than SIZE_MAX - 4.
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all
+ *                                           float decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of
+ *                                           simple type in input.
+ * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED  Indefinite length map/array
+ *                                              in input, but indefinite
+ *                                              lengths disabled.
+ * @retval QCBOR_ERR_NO_STRING_ALLOCATOR     Indefinite-length string in input,
+ *                                           but no string allocator.
+ * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK  Error in indefinite-length string.
+ * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED  Indefinite-length string in
+ *                                               input, but indefinite-length
+ *                                               strings are disabled.
  *
  * If @c pDecodedItem is not an indefinite-length string, this does nothing.
  *
@@ -1521,20 +1538,29 @@
  *
  * @param[in] pMe            Decoder context
  * @param[out] pDecodedItem  The decoded item that work is done on.
-
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_INT_OVERFLOW
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
- * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED
- * @retval QCBOR_ERR_NO_STRING_ALLOCATOR
- * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK
- * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED
- * @retval QCBOR_ERR_TOO_MANY_TAGS
+ *
+ * @retval QCBOR_ERR_UNSUPPORTED             Encountered unsupported/reserved
+ *                                           features
+ * @retval QCBOR_ERR_HIT_END                 Unexpected end of input
+ * @retval QCBOR_ERR_INT_OVERFLOW            Too-large negative encountered
+ * @retval QCBOR_ERR_STRING_ALLOCATE         Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG         String longer than SIZE_MAX - 4.
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all
+ *                                           float decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of
+ *                                           simple type in input.
+ * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED  Indefinite length map/array
+ *                                              in input, but indefinite
+ *                                              lengths disabled.
+ * @retval QCBOR_ERR_NO_STRING_ALLOCATOR     Indefinite-length string in input,
+ *                                           but no string allocator.
+ * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK  Error in indefinite-length string.
+ * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED  Indefinite-length string in
+ *                                               input, but indefinite-length
+ *                                               strings are disabled.
+ * @retval QCBOR_ERR_TOO_MANY_TAGS           Too many tag numbers on item.
  *
  * This loops getting atomic data items until one is not a tag
  * number.  Usually this is largely pass-through because most
@@ -1611,27 +1637,37 @@
 #endif /* QCBOR_DISABLE_TAGS */
 }
 
+
 /**
  * @brief Combine a map entry label and value into one item (decode layer 3).
  *
  * @param[in] pMe            Decoder context
  * @param[out] pDecodedItem  The decoded item that work is done on.
  *
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_INT_OVERFLOW
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
- * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED
- * @retval QCBOR_ERR_NO_STRING_ALLOCATOR
- * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK
- * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED
- * @retval QCBOR_ERR_TOO_MANY_TAGS
- * @retval QCBOR_ERR_ARRAY_DECODE_TOO_LONG
- * @retval QCBOR_ERR_MAP_LABEL_TYPE
+ * @retval QCBOR_ERR_UNSUPPORTED             Encountered unsupported/reserved
+ *                                           features
+ * @retval QCBOR_ERR_HIT_END                 Unexpected end of input
+ * @retval QCBOR_ERR_INT_OVERFLOW            Too-large negative encountered
+ * @retval QCBOR_ERR_STRING_ALLOCATE         Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG         String longer than SIZE_MAX - 4.
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all
+ *                                           float decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of
+ *                                           simple type in input.
+ * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED  Indefinite length map/array
+ *                                              in input, but indefinite
+ *                                              lengths disabled.
+ * @retval QCBOR_ERR_NO_STRING_ALLOCATOR     Indefinite-length string in input,
+ *                                           but no string allocator.
+ * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK  Error in indefinite-length string.
+ * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED  Indefinite-length string in
+ *                                               input, but indefinite-length
+ *                                               strings are disabled.
+ * @retval QCBOR_ERR_TOO_MANY_TAGS           Too many tag numbers on item.
+ * @retval QCBOR_ERR_ARRAY_DECODE_TOO_LONG   Too many items in array.
+ * @retval QCBOR_ERR_MAP_LABEL_TYPE          Map label not string or integer.
  *
  * If a the current nesting level is a map, then this
  * combines pairs of items into one data item with a label
@@ -1857,25 +1893,36 @@
  *
  * @param[in] pMe            Decoder context
  * @param[out] pDecodedItem  The decoded item that work is done on.
- *
- * @retval QCBOR_ERR_UNSUPPORTED
- * @retval QCBOR_ERR_HIT_END
- * @retval QCBOR_ERR_INT_OVERFLOW
- * @retval QCBOR_ERR_STRING_ALLOCATE
- * @retval QCBOR_ERR_STRING_TOO_LONG
- * @retval QCBOR_ERR_HALF_PRECISION_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_BAD_TYPE_7
- * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED
- * @retval QCBOR_ERR_NO_STRING_ALLOCATOR
- * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK
- * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED
- * @retval QCBOR_ERR_TOO_MANY_TAGS
- * @retval QCBOR_ERR_ARRAY_DECODE_TOO_LONG
- * @retval QCBOR_ERR_MAP_LABEL_TYPE
- * @retval QCBOR_ERR_NO_MORE_ITEMS
- * @retval QCBOR_ERR_BAD_BREAK
- * @retval QCBOR_ERR_ARRAY_DECODE_NESTING_TOO_DEEP
+
+ * @retval QCBOR_ERR_UNSUPPORTED             Encountered unsupported/reserved
+ *                                           features
+ * @retval QCBOR_ERR_HIT_END                 Unexpected end of input
+ * @retval QCBOR_ERR_INT_OVERFLOW            Too-large negative encountered
+ * @retval QCBOR_ERR_STRING_ALLOCATE         Out of memory.
+ * @retval QCBOR_ERR_STRING_TOO_LONG         String longer than SIZE_MAX - 4.
+ * @retval QCBOR_ERR_HALF_PRECISION_DISABLED Half-precision in input, but decode
+ *                                           of half-precision disabled
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED      Float-point in input, but all
+ *                                           float decode is disabled.
+ * @retval QCBOR_ERR_BAD_TYPE_7              Not-allowed representation of
+ *                                           simple type in input.
+ * @retval QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED  Indefinite length map/array
+ *                                              in input, but indefinite
+ *                                              lengths disabled.
+ * @retval QCBOR_ERR_NO_STRING_ALLOCATOR     Indefinite-length string in input,
+ *                                           but no string allocator.
+ * @retval QCBOR_ERR_INDEFINITE_STRING_CHUNK  Error in indefinite-length string.
+ * @retval QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED  Indefinite-length string in
+ *                                               input, but indefinite-length
+ *                                               strings are disabled.
+ * @retval QCBOR_ERR_TOO_MANY_TAGS           Too many tag numbers on item.
+ * @retval QCBOR_ERR_ARRAY_DECODE_TOO_LONG   Too many items in array.
+ * @retval QCBOR_ERR_MAP_LABEL_TYPE          Map label not string or integer.
+ * @retval QCBOR_ERR_NO_MORE_ITEMS           Need more items for map or array.
+ * @retval QCBOR_ERR_BAD_BREAK               Indefinite-length break in wrong
+ *                                           place.
+ * @retval QCBOR_ERR_ARRAY_DECODE_NESTING_TOO_DEEP  Nesting deeper than QCBOR
+ *                                                  can handle.
  *
  * This handles the traversal descending into and asecnding out of
  * maps, arrays and bstr-wrapped CBOR. It figures out the ends of
@@ -2019,18 +2066,21 @@
    }
    pDecodedItem->uTags[QCBOR_MAX_TAGS_PER_ITEM-1] = CBOR_TAG_INVALID16;
 }
-
 #endif /* QCBOR_DISABLE_TAGS */
 
+
 /**
  * @brief Convert different epoch date formats in to the QCBOR epoch date format
  *
  * pDecodedItem[in,out]  The data item to convert.
  *
- * @retval QCBOR_ERR_DATE_OVERFLOW
- * @retval QCBOR_ERR_FLOAT_DATE_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT
+ * @retval QCBOR_ERR_DATE_OVERFLOW              65-bit negative integer.
+ * @retval QCBOR_ERR_FLOAT_DATE_DISABLED        Float-point date in input,
+ *                                              floating-point date disabled.
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED         Float-point date in input,
+ *                                              all floating-point disabled.
+ * @retval QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT  Unexpected and unrecoverable
+ *                                              error decoding date.
  *
  * The epoch date tag defined in QCBOR allows for floating-point
  * dates. It even allows a protocol to flop between date formats when
@@ -2136,10 +2186,13 @@
  *
  * pDecodedItem[in,out]  The data item to convert.
  *
- * @retval QCBOR_ERR_DATE_OVERFLOW
- * @retval QCBOR_ERR_FLOAT_DATE_DISABLED
- * @retval QCBOR_ERR_ALL_FLOAT_DISABLED
- * @retval QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT
+ * @retval QCBOR_ERR_DATE_OVERFLOW              65-bit negative integer.
+ * @retval QCBOR_ERR_FLOAT_DATE_DISABLED        Float-point date in input,
+ *                                              floating-point date disabled.
+ * @retval QCBOR_ERR_ALL_FLOAT_DISABLED         Float-point date in input,
+ *                                              all floating-point disabled.
+ * @retval QCBOR_ERR_UNRECOVERABLE_TAG_CONTENT  Unexpected and unrecoverable
+ *                                              error decoding date.
  *
  * This is much simpler than the other epoch date format because
  * floating-porint is not allowed. This is mostly a simple type check.
@@ -2437,18 +2490,25 @@
 
 
 #ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-/*
- * This returns the QCBOR_TYPE for a mantissa and exponent.
-
-Called in one context where there is always a tag
-
- Called in another context where there might be a tag or the caller might say what they are expecting.
-
- 6 possible outputs
+/**
+ * @brief Figures out data type for exponent mantissa tags.
+ *
+ * @param[in] uTagToProcess  Either @ref CBOR_TAG_DECIMAL_FRACTION or
+ *                           @ref CBOR_TAG_BIG_FLOAT.
+ * @param[in] pDecodedItem   Item being decoded.
+ *
+ * @returns One of the 6 values between \ref QCBOR_TYPE_DECIMAL_FRACTION
+ *          and @ref QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM.
+ *
+ * Does mapping between a CBOR tag number and a QCBOR type.  with a
+ * little bit of logic and arithmatic.
+ *
+ * Used in serveral contexts. Does the work where sometimes the data
+ * item is explicitly tagged and sometimes not.
  */
 static uint8_t
 QCBOR_Private_ExpMantissaDataType(const uint16_t   uTagToProcess,
-                                       const QCBORItem *pDecodedItem)
+                                  const QCBORItem *pDecodedItem)
 {
    uint8_t uBase = uTagToProcess == CBOR_TAG_DECIMAL_FRACTION ?
                                        QCBOR_TYPE_DECIMAL_FRACTION :
@@ -2942,7 +3002,7 @@
 
 
 /*
- Public function, see header qcbor/qcbor_decode.h file
+ * Public function, see header qcbor/qcbor_decode.h file
  */
 QCBORError
 QCBORDecode_SetMemPool(QCBORDecodeContext *pMe,
@@ -3066,9 +3126,12 @@
 }
 
 
-
-/* Call only on maps and arrays. Rewinds the cursor
- * to the start as if it was just entered.
+/**
+ * @brief Rewind cursor to start as if map or array were just entered.
+ *
+ * @param[in]  pMe   The decoding context
+ *
+ * This affects the nesting tracking and the UsefulInputBuf.
  */
 static void
 QCBORDecode_Private_RewindMapOrArray(QCBORDecodeContext *pMe)
@@ -3124,36 +3187,36 @@
 
 
 /**
- @brief Search a map for a set of items.
-
- @param[in]  pMe           The decode context to search.
- @param[in,out] pItemArray The items to search for and the items found.
- @param[out] puOffset      Byte offset of last item matched.
- @param[in] pCBContext     Context for the not-found item call back.
- @param[in] pfCallback     Function to call on items not matched in pItemArray.
-
- @retval QCBOR_ERR_NOT_ENTERED Trying to search without having entered a map
-
- @retval QCBOR_ERR_DUPLICATE_LABEL Duplicate items (items with the same label)
-                                   were found for one of the labels being
-                                   search for. This duplicate detection is
-                                   only performed for items in pItemArray,
-                                   not every item in the map.
-
- @retval QCBOR_ERR_UNEXPECTED_TYPE A label was matched, but the type was
-                                   wrong for the matchd label.
-
- @retval Also errors returned by QCBORDecode_GetNext().
-
- On input pItemArray contains a list of labels and data types
- of items to be found.
-
- On output the fully retrieved items are filled in with
- values and such. The label was matched, so it never changes.
-
- If an item was not found, its data type is set to QCBOR_TYPE_NONE.
-
- This also finds the ends of maps and arrays when they are exited.
+ * @brief Search a map for a set of items.
+ *
+ * @param[in]  pMe           The decode context to search.
+ * @param[in,out] pItemArray The items to search for and the items found.
+ * @param[out] puOffset      Byte offset of last item matched.
+ * @param[in] pCBContext     Context for the not-found item call back.
+ * @param[in] pfCallback     Function to call on items not matched in pItemArray.
+ *
+ * @retval QCBOR_ERR_NOT_ENTERED     Trying to search without entering a map.
+ *
+ * @retval QCBOR_ERR_DUPLICATE_LABEL Duplicate items (items with the same label)
+ *                                   were found for one of the labels being
+ *                                   search for. This duplicate detection is
+ *                                   only performed for items in pItemArray,
+ *                                   not every item in the map.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE A label was matched, but the type was
+ *                                   wrong for the matchd label.
+ *
+ * @retval Also errors returned by QCBORDecode_GetNext().
+ *
+ * On input, \c pItemArray contains a list of labels and data types of
+ * items to be found.
+ *
+ * On output, the fully retrieved items are filled in with values and
+ * such. The label was matched, so it never changes.
+ *
+ * If an item was not found, its data type is set to @ref QCBOR_TYPE_NONE.
+ *
+ * This also finds the ends of maps and arrays when they are exited.
  */
 static QCBORError
 QCBORDecode_Private_MapSearch(QCBORDecodeContext *pMe,
@@ -3393,6 +3456,15 @@
 }
 
 
+/**
+ * @brief Is a QCBOR_TYPE in the type list?
+ *
+ * @param[in] uDataType  Type to check for.
+ * @param[in] puTypeList  List to check.
+ *
+ * @retval  QCBOR_SUCCESS             If in the list.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Not in the list.
+ */
 static QCBORError
 QCBOR_Private_CheckTypeList(const int     uDataType,
                             const uint8_t puTypeList[QCBOR_TAGSPEC_NUM_TYPES])
@@ -3482,9 +3554,21 @@
 #endif /* QCBOR_DISABLE_TAGS */
 }
 
-
 // This could be semi-private if need be
 // TODO: decide what to do
+
+/**
+ * @brief Get an item by label to match a tag specification.
+ *
+ * @param[in] pMe      The decode context.
+ * @param[in] nLabel   The label to search map for.
+ * @param[in] TagSpec  The tag number specification to match.
+ * @param[out] pItem   The item found.
+ *
+ * This finds the item with the given label in currently open
+ * map. Then checks that its tag number and types matches the tag
+ * specification. If not, an error is set in the decode context.
+ */
 static void
 QCBORDecode_GetTaggedItemInMapN(QCBORDecodeContext         *pMe,
                                 const int64_t               nLabel,
@@ -3501,6 +3585,18 @@
 
 
 // This could be semi-private if need be
+/**
+ * @brief Get an item by label to match a tag specification.
+ *
+ * @param[in] pMe      The decode context.
+ * @param[in] szLabel   The label to search map for.
+ * @param[in] TagSpec  The tag number specification to match.
+ * @param[out] pItem   The item found.
+ *
+ * This finds the item with the given label in currently open
+ * map. Then checks that its tag number and types matches the tag
+ * specification. If not, an error is set in the decode context.
+ */
 static void
 QCBORDecode_GetTaggedItemInMapSZ(QCBORDecodeContext          *pMe,
                                  const char                  *szLabel,
@@ -3515,7 +3611,19 @@
    pMe->uLastError = (uint8_t)QCBOR_Private_CheckTagRequirement(TagSpec, pItem);
 }
 
-// Semi-private
+
+/**
+ * @brief Semi-private to get an string by label to match a tag specification.
+ *
+ * @param[in] pMe      The decode context.
+ * @param[in] nLabel   The label to search map for.
+ * @param[in] TagSpec  The tag number specification to match.
+ * @param[out] pString   The string found.
+ *
+ * This finds the string  with the given label in currently open
+ * map. Then checks that its tag number and types matches the tag
+ * specification. If not, an error is set in the decode context.
+ */
 void
 QCBORDecode_Private_GetTaggedStringInMapN(QCBORDecodeContext         *pMe,
                                           const int64_t               nLabel,
@@ -3529,8 +3637,19 @@
    }
 }
 
-// Semi-private
-void
+
+/**
+ * @brief Semi-private to get an string by label to match a tag specification.
+ *
+ * @param[in] pMe      The decode context.
+ * @param[in] szLabel   The label to search map for.
+ * @param[in] TagSpec  The tag number specification to match.
+ * @param[out] pString   The string found.
+ *
+ * This finds the string  with the given label in currently open
+ * map. Then checks that its tag number and types matches the tag
+ * specification. If not, an error is set in the decode context.
+ */void
 QCBORDecode_Private_GetTaggedStringInMapSZ(QCBORDecodeContext         *pMe,
                                            const char *                szLabel,
                                            const QCBOR_Private_TagSpec TagSpec,
@@ -3543,6 +3662,7 @@
    }
 }
 
+
 /*
  * Public function, see header qcbor/qcbor_decode.h file
  */
@@ -3694,7 +3814,17 @@
 }
 
 
-// Semi-private function
+/**
+ * @brief Semi-private to do the the work for EnterMap() and EnterArray().
+ *
+ * @param[in] pMe     The decode context
+ * @param[in] uType   QCBOR_TYPE_MAP or QCBOR_TYPE_ARRAY.
+ * @param[out] pItem  The data item for the map or array entered.
+ *
+ * The next item in the traversal must be a map or array.  This
+ * consumes that item and does the book keeping to enter the map or
+ * array.
+ */
 void
 QCBORDecode_Private_EnterBoundedMapOrArray(QCBORDecodeContext *pMe,
                                            const uint8_t       uType,
@@ -3748,16 +3878,23 @@
 }
 
 
-/*
- This is the common work for exiting a level that is a bounded map,
- array or bstr wrapped CBOR.
-
- One chunk of work is to set up the pre-order traversal so it is at
- the item just after the bounded map, array or bstr that is being
- exited. This is somewhat complex.
-
- The other work is to level-up the bounded mode to next higest bounded
- mode or the top level if there isn't one.
+/**
+ * @brief Exit a bounded map, array or bstr (semi-private).
+ *
+ * @param[in] pMe         Decode context.
+ * @param[in] uEndOffset  The input buffer offset of the end of item exited.
+ *
+ * @returns  QCBOR_SUCCESS or an error code.
+ *
+ * This is the common work for exiting a level that is a bounded map,
+ * array or bstr wrapped CBOR.
+ *
+ * One chunk of work is to set up the pre-order traversal so it is at
+ * the item just after the bounded map, array or bstr that is being
+ * exited. This is somewhat complex.
+ *
+ * The other work is to level-up the bounded mode to next higest
+ * bounded mode or the top level if there isn't one.
  */
 static QCBORError
 QCBORDecode_Private_ExitBoundedLevel(QCBORDecodeContext *pMe,
@@ -3766,25 +3903,25 @@
    QCBORError uErr;
 
    /*
-    First the pre-order-traversal byte offset is positioned to the
-    item just after the bounded mode item that was just consumed.
+    * First the pre-order-traversal byte offset is positioned to the
+    * item just after the bounded mode item that was just consumed.
     */
    UsefulInputBuf_Seek(&(pMe->InBuf), uEndOffset);
 
    /*
-    Next, set the current nesting level to one above the bounded level
-    that was just exited.
-
-    DecodeNesting_CheckBoundedType() is always called before this and
-    makes sure pCurrentBounded is valid.
+    * Next, set the current nesting level to one above the bounded
+    * level that was just exited.
+    *
+    * DecodeNesting_CheckBoundedType() is always called before this
+    * and makes sure pCurrentBounded is valid.
     */
    DecodeNesting_LevelUpCurrent(&(pMe->nesting));
 
    /*
-    This does the complex work of leveling up the pre-order traversal
-    when the end of a map or array or another bounded level is
-    reached.  It may do nothing, or ascend all the way to the top
-    level.
+    * This does the complex work of leveling up the pre-order
+    * traversal when the end of a map or array or another bounded
+    * level is reached.  It may do nothing, or ascend all the way to
+    * the top level.
     */
    uErr = QCBORDecode_Private_NestLevelAscender(pMe, false);
    if(uErr != QCBOR_SUCCESS) {
@@ -3792,9 +3929,9 @@
    }
 
    /*
-    This makes the next highest bounded level the current bounded
-    level. If there is no next highest level, then no bounded mode is
-    in effect.
+    * This makes the next highest bounded level the current bounded
+    * level. If there is no next highest level, then no bounded mode
+    * is in effect.
     */
    DecodeNesting_LevelUpBounded(&(pMe->nesting));
 
@@ -3805,7 +3942,16 @@
 }
 
 
-// Semi-private function
+/**
+ * @brief Get started exiting a map or array (semi-private)
+ *
+ * @param[in] pMe  The decode context
+ * @param[in] uType  QCBOR_TYPE_ARRAY or QCBOR_TYPE_MAP
+ *
+ * This does some work for map and array exiting (but not
+ * bstr exiting). Then QCBORDecode_Private_ExitBoundedLevel()
+ * is called to do the rest.
+ */
 void
 QCBORDecode_Private_ExitBoundedMapOrArray(QCBORDecodeContext *pMe,
                                           const uint8_t       uType)
@@ -3843,7 +3989,20 @@
 }
 
 
-
+/**
+ * @brief The main work of entering some byte-string wrapped CBOR.
+ *
+ * @param[in] pMe             The decode context.
+ * @param[in] pItem           The byte string item.
+ * @param[in] uTagRequirement One of @c QCBOR_TAG_REQUIREMENT_XXX
+ * @param[out] pBstr          Pointer and length of byte string entered.
+ *
+ * This is called once the byte string item has been decoded to do all
+ * the book keeping work for descending a nesting level into the
+ * nested CBOR.
+ *
+ * See QCBORDecode_EnterBstrWrapped() for details on uTagRequirement.
+ */
 static QCBORError
 QCBORDecode_Private_EnterBstrWrapped(QCBORDecodeContext *pMe,
                                      const QCBORItem    *pItem,
@@ -4021,7 +4180,16 @@
 
 
 
-
+/**
+ * @brief Process simple type true and false, a boolean
+ *
+ * @param[in] pMe     The decode context.
+ * @param[in] pItem   The item with either true or false.
+ * @param[out] pBool  The boolean value output.
+ *
+ * Sets the internal error if the item isn't a true or a false. Also
+ * records any tag numbers as the tag numbers of the last item.
+ */
 static void
 QCBORDecode_Private_ProcessBool(QCBORDecodeContext *pMe,
                                 const QCBORItem    *pItem,
@@ -4100,6 +4268,17 @@
 
 
 
+/**
+ * @brief Common processing for an epoch date.
+ *
+ * @param[in] pMe              The decode context.
+ * @param[in] pItem            The item with the date.
+ * @param[in] uTagRequirement  One of @c QCBOR_TAG_REQUIREMENT_XXX.
+ * @param[out] pnTime          The returned date.
+ *
+ * Common processing for the date tag. Mostly make sure the tag
+ * content is correct and copy forward any further other tag numbers.
+ */
 static void
 QCBORDecode_Private_ProcessEpochDate(QCBORDecodeContext *pMe,
                                      QCBORItem          *pItem,
@@ -4143,6 +4322,10 @@
 }
 
 
+
+/*
+ * Public function, see header qcbor/qcbor_spiffy_decode.h file
+ */
 void
 QCBORDecode_GetEpochDate(QCBORDecodeContext *pMe,
                          uint8_t             uTagRequirement,
@@ -4160,6 +4343,9 @@
 }
 
 
+/*
+ * Public function, see header qcbor/qcbor_spiffy_decode.h file
+ */
 void
 QCBORDecode_GetEpochDateInMapN(QCBORDecodeContext *pMe,
                                int64_t             nLabel,
@@ -4172,6 +4358,9 @@
 }
 
 
+/*
+ * Public function, see header qcbor/qcbor_spiffy_decode.h file
+ */
 void
 QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext *pMe,
                                 const char         *szLabel,
@@ -4185,10 +4374,17 @@
 
 
 
-/*
- * Common processing for the RFC 8943 day-count tag. Mostly
- * make sure the tag content is correct and copy forward any
- * further other tag numbers.
+/**
+ * @brief Common processing for an epoch date.
+ *
+ * @param[in] pMe              The decode context.
+ * @param[in] pItem            The item with the date.
+ * @param[in] uTagRequirement  One of @c QCBOR_TAG_REQUIREMENT_XXX.
+ * @param[out] pnDays          The returned day count.
+ *
+ * Common processing for the RFC 8943 day-count tag. Mostly make sure
+ * the tag content is correct and copy forward any further other tag
+ * numbers.
  */
 static void
 QCBORDecode_Private_ProcessEpochDays(QCBORDecodeContext *pMe,
@@ -4319,6 +4515,18 @@
 
 
 
+/**
+ * @brief Common processing for a big number tag.
+ *
+ * @param[in] uTagRequirement  One of @c QCBOR_TAG_REQUIREMENT_XXX.
+ * @param[in] pItem            The item with the date.
+ * @param[out] pValue          The returned big number
+ * @param[out] pbIsNegative  The returned sign of the big number.
+ *
+ * Common processing for the big number tag. Mostly make sure
+ * the tag content is correct and copy forward any further other tag
+ * numbers.
+ */
 static QCBORError
 QCBOR_Private_ProcessBigNum(const uint8_t   uTagRequirement,
                             const QCBORItem *pItem,
@@ -4350,7 +4558,7 @@
 
 
 /*
- Public function, see header qcbor/qcbor_decode.h
+ * Public function, see header qcbor/qcbor_spiffy_decode.h
  */
 void
 QCBORDecode_GetBignum(QCBORDecodeContext *pMe,
@@ -4378,8 +4586,8 @@
 
 
 /*
- Public function, see header qcbor/qcbor_decode.h
-*/
+ * Public function, see header qcbor/qcbor_spiffy_decode.h
+ */
 void
 QCBORDecode_GetBignumInMapN(QCBORDecodeContext *pMe,
                             const int64_t       nLabel,
@@ -4401,7 +4609,7 @@
 
 
 /*
- * Public function, see header qcbor/qcbor_decode.h
+ * Public function, see header qcbor/qcbor_spiffy_decode.h
  */
 void
 QCBORDecode_GetBignumInMapSZ(QCBORDecodeContext *pMe,
@@ -4424,8 +4632,18 @@
 
 
 
-
-// Semi private
+/**
+ * @brief Common processing for MIME tag (semi-private).
+ *
+ * @param[in] uTagRequirement  One of @c QCBOR_TAG_REQUIREMENT_XXX.
+ * @param[in] pItem            The item with the date.
+ * @param[out] pMessage        The returned MIME message.
+ * @param[out] pbIsTag257      If true, binary MIME, if not, text MIME.
+ *
+ * Common processing for the MIME tag. Mostly make sure the tag
+ * content is correct and copy forward any further other tag
+ * numbers. See QCBORDecode_GetMIMEMessage().
+ */
 QCBORError
 QCBORDecode_Private_GetMIME(const uint8_t     uTagRequirement,
                             const QCBORItem  *pItem,
@@ -4475,6 +4693,16 @@
 
 #ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
 
+/**
+ * @brief Prototype for conversion of exponent and mantissa to unsigned integer.
+ *
+ * @param[in] uMantissa    The mantissa.
+ * @param[in] nExponent    The exponent.
+ * @param[out] puResult  The resulting integer.
+ *
+ * Concrete implementations of this are for exponent base 10 and 2 supporting
+ * decimal fractions and big floats.
+ */
 typedef QCBORError (*fExponentiator)(uint64_t uMantissa, int64_t nExponent, uint64_t *puResult);
 
 
@@ -4850,20 +5078,19 @@
 
 
 
-
-/*
-Convert integers and floats to an int64_t.
-
-\param[in] uConvertTypes  Bit mask list of conversion options.
-
-\retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
-                                   in uConvertTypes.
-
-\retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
-
-\retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
-                                              or too small.
-*/
+/**
+ * @brief Convert integers and floats to an int64_t.
+ *
+ * @param[in] pItem   The item to convert.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pnValue  The resulting converted value.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
+ *                                    in uConvertTypes.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
+ * @retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
+ *                                               or too small.
+ */
 static QCBORError
 QCBOR_Private_ConvertInt64(const QCBORItem *pItem,
                            const uint32_t   uConvertTypes,
@@ -4932,6 +5159,16 @@
 }
 
 
+/**
+ * @brief Almost-public method to decode a number and convert to int64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pnValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetInt64Convert().
+ */
 void
 QCBORDecode_Private_GetInt64Convert(QCBORDecodeContext *pMe,
                                     uint32_t            uConvertTypes,
@@ -4942,23 +5179,28 @@
       return;
    }
 
-   QCBORItem Item;
-   QCBORError uError = QCBORDecode_GetNext(pMe, &Item);
+   QCBORError uError = QCBORDecode_GetNext(pMe, pItem);
    if(uError) {
       pMe->uLastError = (uint8_t)uError;
       return;
    }
 
-   if(pItem) {
-      *pItem = Item;
-   }
-
-   pMe->uLastError = (uint8_t)QCBOR_Private_ConvertInt64(&Item,
+   pMe->uLastError = (uint8_t)QCBOR_Private_ConvertInt64(pItem,
                                                          uConvertTypes,
                                                          pnValue);
 }
 
-
+/**
+ * @brief Almost-public method to decode a number and convert to int64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] nLabel         Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pnValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetInt64ConvertInMapN().
+ */
 void
 QCBORDecode_Private_GetInt64ConvertInMapN(QCBORDecodeContext *pMe,
                                           int64_t             nLabel,
@@ -4976,7 +5218,17 @@
                                                          pnValue);
 }
 
-
+/**
+ * @brief Almost-public method to decode a number and convert to int64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] szLabel        Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pnValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetInt64ConvertInMapSZ().
+ */
 void
 QCBORDecode_Private_GetInt64ConvertInMapSZ(QCBORDecodeContext *pMe,
                                            const char *         szLabel,
@@ -4995,18 +5247,18 @@
 }
 
 
-/*
- Convert a large variety of integer types to an int64_t.
-
- \param[in] uConvertTypes  Bit mask list of conversion options.
-
- \retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
-                                    in uConvertTypes.
-
- \retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
-
- \retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
-                                               or too small.
+/**
+ * @brief Convert many number types to an int64_t.
+ *
+ * @param[in] pItem   The item to convert.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pnValue  The resulting converted value.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
+ *                                    in uConvertTypes.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
+ * @retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
+ *                                               or too small.
  */
 static QCBORError
 QCBOR_Private_Int64ConvertAll(const QCBORItem *pItem,
@@ -5222,6 +5474,19 @@
 }
 
 
+/**
+ * @brief Convert many number types to an uint64_t.
+ *
+ * @param[in] pItem   The item to convert.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] puValue  The resulting converted value.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
+ *                                    in uConvertTypes.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
+ * @retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
+ *                                               or too small.
+ */
 static QCBORError
 QCBOR_Private_ConvertUInt64(const QCBORItem *pItem,
                             const uint32_t   uConvertTypes,
@@ -5312,6 +5577,16 @@
 }
 
 
+/**
+ * @brief Almost-public method to decode a number and convert to uint64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] puValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetUInt64Convert().
+ */
 void
 QCBORDecode_Private_GetUInt64Convert(QCBORDecodeContext *pMe,
                                      const uint32_t      uConvertTypes,
@@ -5340,6 +5615,17 @@
 }
 
 
+/**
+ * @brief Almost-public method to decode a number and convert to uint64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] nLabel         Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] puValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetUInt64ConvertInMapN().
+ */
 void
 QCBORDecode_Private_GetUInt64ConvertInMapN(QCBORDecodeContext *pMe,
                                            const int64_t       nLabel,
@@ -5358,6 +5644,17 @@
 }
 
 
+/**
+ * @brief Almost-public method to decode a number and convert to uint64_t (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] szLabel         Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] puValue       Result of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetUInt64ConvertInMapSZ().
+ */
 void
 QCBORDecode_Private_GetUInt64ConvertInMapSZ(QCBORDecodeContext *pMe,
                                             const char         *szLabel,
@@ -5380,7 +5677,19 @@
 }
 
 
-
+/**
+ * @brief Convert many number types to an unt64_t.
+ *
+ * @param[in] pItem   The item to convert.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] puValue  The resulting converted value.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
+ *                                    in uConvertTypes.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
+ * @retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
+ *                                               or too small.
+ */
 static QCBORError
 QCBOR_Private_UInt64ConvertAll(const QCBORItem *pItem,
                                const uint32_t   uConvertTypes,
@@ -5581,6 +5890,19 @@
 
 
 #ifndef USEFULBUF_DISABLE_ALL_FLOAT
+/**
+ * @brief Basic conversions to a double.
+ *
+ * @param[in] pItem          The item to convert
+ * @param[in] uConvertTypes  Bit flags indicating source types for conversion
+ * @param[out] pdValue       The value converted to a double
+ *
+ * This does the conversions that don't need much object code,
+ * the conversions from int, uint and float to double.
+ *
+ * See QCBOR_Private_DoubleConvertAll() for the full set
+ * of conversions.
+ */
 static QCBORError
 QCBOR_Private_ConvertDouble(const QCBORItem *pItem,
                             const uint32_t   uConvertTypes,
@@ -5653,6 +5975,16 @@
 }
 
 
+/**
+ * @brief  Almost-public method to decode a number and convert to double (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] uConvertTypes  Bit mask list of conversion options
+ * @param[out] pdValue       The output of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetDoubleConvert().
+ */
 void
 QCBORDecode_Private_GetDoubleConvert(QCBORDecodeContext *pMe,
                                      const uint32_t      uConvertTypes,
@@ -5663,24 +5995,29 @@
       return;
    }
 
-   QCBORItem Item;
-
-   QCBORError uError = QCBORDecode_GetNext(pMe, &Item);
+   QCBORError uError = QCBORDecode_GetNext(pMe, pItem);
    if(uError) {
       pMe->uLastError = (uint8_t)uError;
       return;
    }
 
-   if(pItem) {
-      *pItem = Item;
-   }
-
-   pMe->uLastError = (uint8_t)QCBOR_Private_ConvertDouble(&Item,
+   pMe->uLastError = (uint8_t)QCBOR_Private_ConvertDouble(pItem,
                                                           uConvertTypes,
                                                           pdValue);
 }
 
 
+/**
+ * @brief  Almost-public method to decode a number and convert to double (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] nLabel         Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options
+ * @param[out] pdValue       The output of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetDoubleConvertInMapN().
+ */
 void
 QCBORDecode_Private_GetDoubleConvertInMapN(QCBORDecodeContext *pMe,
                                            const int64_t       nLabel,
@@ -5699,6 +6036,17 @@
 }
 
 
+/**
+ * @brief  Almost-public method to decode a number and convert to double (semi-private).
+ *
+ * @param[in] pMe            The decode context.
+ * @param[in] szLabel        Label to find in map.
+ * @param[in] uConvertTypes  Bit mask list of conversion options
+ * @param[out] pdValue       The output of the conversion.
+ * @param[in,out] pItem      Temporary space to store Item, returned item.
+ *
+ * See QCBORDecode_GetDoubleConvertInMapSZ().
+ */
 void
 QCBORDecode_Private_GetDoubleConvertInMapSZ(QCBORDecodeContext *pMe,
                                             const char         *szLabel,
@@ -5722,6 +6070,18 @@
 
 
 #ifndef QCBOR_DISABLE_FLOAT_HW_USE
+/**
+ * @brief Convert a big number to double-precision float.
+ *
+ * @param[in] BigNum   The big number to convert
+ *
+ * @returns  The double value.
+ *
+ * This will always succeed. It will lose precision for larger
+ * numbers. If the big number is too large to fit (more than
+ * 1.7976931348623157E+308) infinity will be returned. NaN is never
+ * returned.
+ */
 static double
 QCBOR_Private_ConvertBigNumToDouble(const UsefulBufC BigNum)
 {
@@ -5731,7 +6091,7 @@
    const uint8_t *pByte = BigNum.ptr;
    size_t uLen = BigNum.len;
    /* This will overflow and become the float value INFINITY if the number
-    is too large to fit. */
+    * is too large to fit. */
    while(uLen--) {
       dResult = (dResult * 256.0) + (double)*pByte++;
    }
@@ -5741,6 +6101,21 @@
 #endif /* QCBOR_DISABLE_FLOAT_HW_USE */
 
 
+
+
+/**
+ * @brief Convert many number types to a double.
+ *
+ * @param[in] pItem   The item to convert.
+ * @param[in] uConvertTypes  Bit mask list of conversion options.
+ * @param[out] pdValue  The resulting converted value.
+ *
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Conversion, possible, but not requested
+ *                                    in uConvertTypes.
+ * @retval QCBOR_ERR_UNEXPECTED_TYPE  Of a type that can't be converted
+ * @retval QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW  Conversion result is too large
+ *                                               or too small.
+ */
 static QCBORError
 QCBOR_Private_DoubleConvertAll(const QCBORItem *pItem,
                                const uint32_t   uConvertTypes,
@@ -5846,7 +6221,7 @@
 
 
 /*
- *Public function, see header qcbor/qcbor_decode.h file
+ * Public function, see header qcbor/qcbor_decode.h file
  */
 void
 QCBORDecode_GetDoubleConvertAll(QCBORDecodeContext *pMe,
@@ -5943,6 +6318,16 @@
 
 
 #ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
+/**
+ * @brief Convert an integer to a big number
+ *
+ * @param[in] uInt  The integer to convert.
+ * @param[in] Buffer  The buffer to output the big number to.
+ *
+ * @returns The big number or NULLUsefulBufC is the buffer is to small.
+ *
+ * This always succeeds unless the buffer is too small.
+ */
 static UsefulBufC
 QCBOR_Private_ConvertIntToBigNum(uint64_t uInt, const UsefulBuf Buffer)
 {
@@ -5955,10 +6340,8 @@
    UsefulOutBuf_Init(&UOB, Buffer);
 
    while(uInt) {
-      const uint64_t xx = uInt & 0xff00000000000000UL;
       UsefulOutBuf_AppendByte(&UOB, (uint8_t)((uInt & 0xff00000000000000UL) >> 56));
       uInt = uInt << 8;
-      (void)xx;
    }
 
    return UsefulOutBuf_OutUBuf(&UOB);
@@ -6064,6 +6447,20 @@
  * first tier part of the public API. Some functions only
  * vary by a TagSpec.
  */
+
+/**
+ * @brief Common processor for exponent and mantissa.
+ *
+ * @param[in] pMe          The decode context.
+ * @param[in] TagSpec      The expected/allowed tags.
+ * @param[in] pItem        The data item to process.
+ * @param[out] pnMantissa  The returned mantissa as an int64_t.
+ * @param[out] pnExponent  The returned exponent as an int64_t.
+ *
+ * This handles exponent and mantissa for base 2 and 10. This
+ * is limited to a mantissa that is an int64_t. See also
+ * QCBORDecode_Private_ProcessExpMantissaBig().
+ */
 static void
 QCBOR_Private_ProcessExpMantissa(QCBORDecodeContext         *pMe,
                                  const QCBOR_Private_TagSpec TagSpec,
@@ -6110,14 +6507,29 @@
 }
 
 
+/**
+ * @brief Decode exponent and mantissa into a big number.
+ *
+ * @param[in] pMe                The decode context.
+ * @param[in] TagSpec            The expected/allowed tags.
+ * @param[in] pItem              Item to decode and convert.
+ * @param[in] BufferForMantissa  Buffer to output mantissa into.
+ * @param[out] pMantissa         The output mantissa.
+ * @param[out] pbIsNegative      The sign of the output.
+ * @param[out] pnExponent        The mantissa of the output.
+ *
+ * This is the common processing of a decimal fraction or a big float
+ * into a big number. This will decode and consume all the CBOR items
+ * that make up the decimal fraction or big float.
+ */
 static void
-QCBOR_Private_ProcessExpMantissaBig(QCBORDecodeContext          *pMe,
-                                    const QCBOR_Private_TagSpec  TagSpec,
-                                    QCBORItem                   *pItem,
-                                    const UsefulBuf              BufferForMantissa,
-                                    UsefulBufC                  *pMantissa,
-                                    bool                        *pbIsNegative,
-                                    int64_t                     *pnExponent)
+QCBORDecode_Private_ProcessExpMantissaBig(QCBORDecodeContext          *pMe,
+                                          const QCBOR_Private_TagSpec  TagSpec,
+                                          QCBORItem                   *pItem,
+                                          const UsefulBuf              BufferForMantissa,
+                                          UsefulBufC                  *pMantissa,
+                                          bool                        *pbIsNegative,
+                                          int64_t                     *pnExponent)
 {
    QCBORError uErr;
 
@@ -6306,13 +6718,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       MantissaBuffer,
-                                       pMantissa,
-                                       pbMantissaIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             MantissaBuffer,
+                                             pMantissa,
+                                             pbMantissaIsNegative,
+                                             pnExponent);
 }
 
 
@@ -6346,13 +6758,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       BufferForMantissa,
-                                       pMantissa,
-                                       pbIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             BufferForMantissa,
+                                             pMantissa,
+                                             pbIsNegative,
+                                             pnExponent);
 }
 
 
@@ -6386,13 +6798,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       BufferForMantissa,
-                                       pMantissa,
-                                       pbIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             BufferForMantissa,
+                                             pMantissa,
+                                             pbIsNegative,
+                                             pnExponent);
 }
 
 
@@ -6533,13 +6945,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       MantissaBuffer,
-                                       pMantissa,
-                                       pbMantissaIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             MantissaBuffer,
+                                             pMantissa,
+                                             pbMantissaIsNegative,
+                                             pnExponent);
 }
 
 
@@ -6573,13 +6985,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       BufferForMantissa,
-                                       pMantissa,
-                                       pbIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             BufferForMantissa,
+                                             pMantissa,
+                                             pbIsNegative,
+                                             pnExponent);
 }
 
 
@@ -6613,13 +7025,13 @@
       {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
    };
 
-   QCBOR_Private_ProcessExpMantissaBig(pMe,
-                                       TagSpec,
-                                      &Item,
-                                       BufferForMantissa,
-                                       pMantissa,
-                                       pbIsNegative,
-                                       pnExponent);
+   QCBORDecode_Private_ProcessExpMantissaBig(pMe,
+                                             TagSpec,
+                                            &Item,
+                                             BufferForMantissa,
+                                             pMantissa,
+                                             pbIsNegative,
+                                             pnExponent);
 }
 
 #endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
