Fixes for maps-as-arrays mode and unusual map labels (#228)

bug fix: QCBOR_DECODE_MODE_MAP_AS_ARRAY didn't work with indefinite-length maps

bug fix: QCBOR_DECODE_MODE_MAP_AS_ARRAY didn't work with QCBORDecode_EnterArray() and QCBORDecode_GetArray().

Add lots of testing for QCBOR_DECODE_MODE_MAP_AS_ARRAY including testing with unusual map labels like NaN floating point, maps, tag data items.

* Fixes for maps-as-arrays mode and unusual map labels

* Tidyness

* Test #ifdef fan out

* tidyness

---------

Co-authored-by: Laurence Lundblade <lgl@securitytheory.com>
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 74465d0..fc34304 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -372,7 +372,12 @@
       return false;
    }
 
-   if(pNesting->pCurrentBounded->uLevelType != uType) {
+   uint8_t uItemDataType = pNesting->pCurrentBounded->uLevelType;
+   if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY) {
+      uItemDataType = QCBOR_TYPE_ARRAY;
+   }
+
+   if(uItemDataType != uType) {
       return false;
    }
 
@@ -1745,15 +1750,18 @@
        * strings.
        */
       if(pDecodedItem->uDataType == QCBOR_TYPE_MAP) {
-         if(pDecodedItem->val.uCount > QCBOR_MAX_ITEMS_IN_ARRAY/2) {
-            uReturn = QCBOR_ERR_ARRAY_DECODE_TOO_LONG;
-            goto Done;
-         }
          pDecodedItem->uDataType = QCBOR_TYPE_MAP_AS_ARRAY;
-         /* Cast is safe because of check against QCBOR_MAX_ITEMS_IN_ARRAY/2.
-          * Cast is needed because of integer promotion.
-          */
-         pDecodedItem->val.uCount = (uint16_t)(pDecodedItem->val.uCount * 2);
+         if(pDecodedItem->val.uCount != UINT16_MAX) {
+            /* Adjust definite-length map item count */
+            if(pDecodedItem->val.uCount > QCBOR_MAX_ITEMS_IN_ARRAY/2) {
+               uReturn = QCBOR_ERR_ARRAY_DECODE_TOO_LONG;
+               goto Done;
+            }
+            /* Cast is safe because of check against QCBOR_MAX_ITEMS_IN_ARRAY/2.
+             * Cast is needed because of integer promotion.
+             */
+            pDecodedItem->val.uCount = (uint16_t)(pDecodedItem->val.uCount * 2);
+         }
       }
    }
 
@@ -3571,7 +3579,12 @@
       return;
    }
 
-   if(pItem->uDataType != uType) {
+   uint8_t uItemDataType = pItem->uDataType;
+   if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY) {
+      uItemDataType = QCBOR_TYPE_ARRAY;
+   }
+
+   if(uItemDataType != uType) {
       pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
       return;
    }
@@ -4056,7 +4069,12 @@
    if(uErr != QCBOR_SUCCESS) {
       goto Done;
    }
-   if(Item.uDataType != uType) {
+
+   uint8_t uItemDataType = Item.uDataType;
+   if(uItemDataType == QCBOR_TYPE_MAP_AS_ARRAY ) {
+      uItemDataType = QCBOR_TYPE_ARRAY;
+   }
+   if(uItemDataType != uType) {
       uErr = QCBOR_ERR_UNEXPECTED_TYPE;
       goto Done;
    }