progress on map / array decoding
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 92e430c..0bd481b 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -125,9 +125,10 @@
 inline static uint8_t
 DecodeNesting_GetLevel(const QCBORDecodeNesting *pNesting)
 {
+   const ptrdiff_t nLevel = pNesting->pCurrent - &(pNesting->pMapsAndArrays[0]);
    // Check in DecodeNesting_Descend and never having
    // QCBOR_MAX_ARRAY_NESTING > 255 gaurantees cast is safe
-   return (uint8_t)(pNesting->pCurrent - &(pNesting->pMapsAndArrays[0]));
+   return (uint8_t)nLevel;
 }
 
 
@@ -228,6 +229,10 @@
       return QCBOR_ERR_BAD_BREAK;
    }
 
+   if(InBoundMode(pNesting)) {
+      return QCBOR_SUCCESS;
+   }
+
    // if all OK, the break reduces the level of nesting
    pNesting->pCurrent--;
 
@@ -238,18 +243,24 @@
 /* Decrements the map/array counter if possible. If decrement
  closed out a map or array, then level up in nesting and decrement
  again, until, the top is reached or the end of a map mode is reached
+
+ return 1 if leveld up, 0 if not
  */
-inline static void
+inline static int
 DecodeNesting_DecrementCount(QCBORDecodeNesting *pNesting)
 {
+   int nReturn = 0;
+
    while(!DecodeNesting_IsAtTop(pNesting)) {
       // Not at the top level, so there is decrementing to be done.
 
-      if(!DecodeNesting_IsIndefiniteLength(pNesting)) {
-         // Decrement the current nesting level if it is not indefinite.
-         pNesting->pCurrent->uCount--;
+      if(DecodeNesting_IsIndefiniteLength(pNesting)) {
+         // Indefinite lengths not handled here
+         break;
       }
 
+      pNesting->pCurrent->uCount--;
+
       if(pNesting->pCurrent->uCount != 0) {
          // Did not close out an array or map, so nothing further
          break;
@@ -269,7 +280,9 @@
       } */
 
       // Continue with loop to see if closing out this doesn't close out more
+      nReturn = 1;
    }
+   return nReturn;
 }
 
 inline static void
@@ -302,7 +315,7 @@
 }
 
 // Called on every map/array
-inline static QCBORError
+QCBORError
 DecodeNesting_Descend(QCBORDecodeNesting *pNesting, QCBORItem *pItem)
 {
    QCBORError nReturn = QCBOR_SUCCESS;
@@ -401,7 +414,7 @@
    *pNesting = *pSave;
 }
 
-inline static QCBORError DecodeNesting_EnterBstr(QCBORDecodeNesting *pNesting, uint32_t uEndOffset)
+QCBORError DecodeNesting_EnterBstr(QCBORDecodeNesting *pNesting, uint32_t uEndOffset)
 {
    QCBORError uReturn ;
 
@@ -1260,46 +1273,77 @@
       // them so a decrement needs to be done for them too, but that is done
       // only when all the items in them have been processed, not when they
       // are opened with the exception of an empty map or array.
-   } else {
+   }
+
+   if(!IsMapOrArray(pDecodedItem->uDataType) || pDecodedItem->val.uCount == 0) {
+      // Decrement happns for non-aggregate and empty aggregate
+
+      // TODO: what about empty indefinite?
+
+
       /* === Figure out if item got closed out maps or arrays === */
 
+      /*
+       This needs to decrement, check for end and ascend
+       the tree until an an ascend is not possible or the bounded
+       limit is reached or the end of the encoded CBOR input
+       is reached. For
+       definite length maps and arrays the end is by count. For
+       indefinite it is by a break.
+
+       Also state needs to be set that can tell the code at the
+       beginning of this function that the end was reached.
+
+       This is complicated...
+
+
+       This will handle an indefinite length array
+       inside a definte length array inside an indefinite
+       length array...
+
+       */
+
       // Decrement the count of items in the enclosing map/array
       // If the count in the enclosing map/array goes to zero, that
       // triggers a decrement in the map/array above that and
       // an ascend in nesting level.
       while(1) {
-      DecodeNesting_DecrementCount(&(me->nesting));
-      if(nReturn) {
-         goto Done;
-      }
-
-      // For indefinite length maps/arrays, looking at any and
-      // all breaks that might terminate them. The equivalent
-      // for definite length maps/arrays happens in
-      // DecodeNesting_DecrementCount().
-      if(!DecodeNesting_IsAtTop(&(me->nesting)) && DecodeNesting_IsIndefiniteLength(&(me->nesting))) {
-         while(UsefulInputBuf_BytesUnconsumed(&(me->InBuf))) {
-            // Peek forward one item to see if it is a break.
-            QCBORItem Peek;
-            size_t uPeek = UsefulInputBuf_Tell(&(me->InBuf));
-            nReturn = GetNext_Item(&(me->InBuf), &Peek, NULL);
-            if(nReturn) {
-               goto Done;
+         if(DecodeNesting_IsIndefiniteLength(&(me->nesting))) {
+            while(UsefulInputBuf_BytesUnconsumed(&(me->InBuf))) {
+                // Peek forward one item to see if it is a break.
+                QCBORItem Peek;
+                size_t uPeek = UsefulInputBuf_Tell(&(me->InBuf));
+                nReturn = GetNext_Item(&(me->InBuf), &Peek, NULL);
+                if(nReturn != QCBOR_SUCCESS) {
+                   goto Done;
+                }
+                if(Peek.uDataType != QCBOR_TYPE_BREAK) {
+                   // It is not a break, rewind so it can be processed normally.
+                   UsefulInputBuf_Seek(&(me->InBuf), uPeek);
+                   goto Done2;
+                }
+                // It is a break. Ascend one nesting level.
+                // The break is consumed.
+                nReturn = DecodeNesting_BreakAscend(&(me->nesting));
+                if(nReturn != QCBOR_SUCCESS) {
+                   // break occured outside of an indefinite length array/map
+                   goto Done;
+                }
             }
-            if(Peek.uDataType != QCBOR_TYPE_BREAK) {
-               // It is not a break, rewind so it can be processed normally.
-               UsefulInputBuf_Seek(&(me->InBuf), uPeek);
-               break;
-            }
-            // It is a break. Ascend one nesting level.
-            // The break is consumed.
-            nReturn = DecodeNesting_BreakAscend(&(me->nesting));
-            if(nReturn) {
-               // break occured outside of an indefinite length array/map
-               goto Done;
+            goto Done2; // Out of bytes to decode
+         } else {
+            if(DecodeNesting_DecrementCount(&(me->nesting)) == 0) {
+               /* There was no level up. Did not consume to the
+                end of an array or map so done with the work. */
+               goto Done2;
             }
          }
       }
+
+   Done2:
+      if(nReturn) {
+         goto Done;
+      }
    }
 
 
@@ -1309,7 +1353,7 @@
    // were closed out and makes it possible for them to reconstruct
    // the tree with just the information returned by GetNext
    // TODO: pull this into DecodeNesting_GetLevel
-   if(me->nesting.pCurrent->uMapMode && me->nesting.pCurrent->uCount == 0) {
+   if(InBoundMode(&(me->nesting)) && me->nesting.pCurrent->uCount == 0) {
       // At end of a map / array in map mode, so next nest is 0 to
       // indicate this end.
       pDecodedItem->uNextNestLevel = 0;
@@ -2251,7 +2295,7 @@
 }
 
 
-void QCBORDecode_EnterBstrWrapped(QCBORDecodeContext *pMe, UsefulBufC *pBstr)
+void QCBORDecode_EnterBstrWrapped(QCBORDecodeContext *pMe, uint8_t uTagRequirement, UsefulBufC *pBstr)
 {
    QCBORItem Item;
    QCBORDecode_GetNext(pMe, &Item);