enter exit map mostly working
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 13be1f7..dc5e626 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -135,8 +135,8 @@
 inline static bool
 DecodeNesting_AtEnd(const QCBORDecodeNesting *pNesting)
 {
-   if(pNesting->pCurrent->uMapMode) {
-      if(pNesting->pCurrent->uCount == 0) {
+   if(pNesting->pCurrentMap && pNesting->pCurrentMap->uMapMode) {
+      if(pNesting->pCurrentMap->uCount == 0) {
          // TODO: won't work for indefinite length
          // In map mode and consumed all items, so it is the end
          return true;
@@ -160,7 +160,7 @@
 inline static int
 DecodeNesting_InMapMode(const QCBORDecodeNesting *pNesting)
 {
-   return (bool)pNesting->pCurrent->uMapMode;
+   return (bool)pNesting->pCurrentMap->uMapMode;
 }
 
 inline static uint8_t
@@ -171,6 +171,14 @@
    return (uint8_t)(pNesting->pCurrent - &(pNesting->pMapsAndArrays[0]));
 }
 
+inline static uint8_t
+DecodeNesting_GetMapModeLevel(QCBORDecodeNesting *pNesting)
+{
+   // Check in DecodeNesting_Descend and never having
+   // QCBOR_MAX_ARRAY_NESTING > 255 gaurantees cast is safe
+   return (uint8_t)(pNesting->pCurrentMap - &(pNesting->pMapsAndArrays[0]));
+}
+
 inline static int
 DecodeNesting_TypeIsMap(const QCBORDecodeNesting *pNesting)
 {
@@ -229,6 +237,11 @@
 
       // Closed out an array or map so level up
       pNesting->pCurrent--;
+      /*if(pNesting->pCurrent->uMapMode) {
+         // Bring the current map level along if new level is a map
+         // TODO: must search up until a mapmode level is found.
+         pNesting->pCurrentMap = pNesting->pCurrent;
+      } */
 
       // Continue with loop to see if closing out this doesn't close out more
    }
@@ -237,18 +250,29 @@
 inline static void
 DecodeNesting_EnterMapMode(QCBORDecodeNesting *pNesting, size_t uOffset)
 {
-   pNesting->pCurrent->uMapMode = 1;
+   pNesting->pCurrentMap = pNesting->pCurrent;
+   pNesting->pCurrentMap->uMapMode = 1;
    // Cast to uint32_t is safe because QCBOR onl works on data < UINT32_MAX
-   pNesting->pCurrent->uOffset  = (uint32_t)uOffset;
+   pNesting->pCurrentMap->uOffset  = (uint32_t)uOffset;
 }
 
 inline static void
 DecodeNesting_Exit(QCBORDecodeNesting *pNesting)
 {
-   pNesting->pCurrent->uMapMode = 0;
-   pNesting->pCurrent--;
+   pNesting->pCurrentMap->uMapMode = 0;
+   pNesting->pCurrent = pNesting->pCurrentMap - 1; // TODO error check
    
    DecodeNesting_DecrementCount(pNesting);
+
+   while(1) {
+      pNesting->pCurrentMap--;
+      if(pNesting->pCurrentMap->uMapMode) {
+         break;
+      }
+      if(pNesting->pCurrentMap == &(pNesting->pMapsAndArrays[0])) {
+         break;
+      }
+   }
 }
 
 // Called on every map/array
@@ -1178,7 +1202,7 @@
       goto Done;
    }
 
-   /* It is also and end of the input when in map mode and the cursor
+   /* It is also an end of the input when in map mode and the cursor
     is at the end of the map */
 
 
@@ -1194,7 +1218,7 @@
       goto Done;
    }
 
-   // Break ending arrays/maps are always processed at the end of this function.
+   // Breaks ending arrays/maps are always processed at the end of this function.
    // They should never show up here.
    if(pDecodedItem->uDataType == QCBOR_TYPE_BREAK) {
       nReturn = QCBOR_ERR_BAD_BREAK;
@@ -1206,7 +1230,7 @@
    pDecodedItem->uNestingLevel = DecodeNesting_GetLevel(&(me->nesting));
 
    // Process the item just received for descent or decrement, and
-   // ascent if decrements are enough to close out a definite length array/map
+   // ascend if decrements are enough to close out a definite length array/map
    if(IsMapOrArray(pDecodedItem->uDataType)) {
       // If the new item is array or map, the nesting level descends
       nReturn = DecodeNesting_Descend(&(me->nesting), pDecodedItem);
@@ -1870,11 +1894,12 @@
           szName,
           (uint32_t)pMe->InBuf.cursor,
           (uint32_t)pMe->InBuf.UB.len);
-/*   for(int i = 0; i < QCBOR_MAX_ARRAY_NESTING; i++) {
+   for(int i = 0; i < QCBOR_MAX_ARRAY_NESTING; i++) {
       if(&(pMe->nesting.pMapsAndArrays[i]) > pMe->nesting.pCurrent) {
          break;
       }
-      printf("   %2d   %5d %s   %6u         %2d      %d\n",
+      printf("%2s %2d   %5d %s   %6u         %2d      %d\n",
+             pMe->nesting.pCurrentMap == &(pMe->nesting.pMapsAndArrays[i]) ? "->": "  ",
              i,
              pMe->nesting.pMapsAndArrays[i].uCount,
              pMe->nesting.pMapsAndArrays[i].uMajorType == QCBOR_TYPE_MAP ? "  map" :
@@ -1886,7 +1911,7 @@
              );
 
    }
-   printf("\n"); */
+   printf("\n");
 }
 
 
@@ -1998,6 +2023,7 @@
    }
 
    QCBORDecodeNesting N = pMe->nesting;
+   pMe->nesting.pCurrent = pMe->nesting.pCurrentMap;
    
    if(pMe->nesting.pCurrent->uCount != UINT16_MAX) {
       pMe->nesting.pCurrent->uCount = pMe->nesting.pCurrent->uSaveCount;
@@ -2009,7 +2035,7 @@
    * deeply nested and this should handle both definite
    * and indefinite length maps and arrays, so this
    * adds some complexity. */
-   const uint8_t uMapNestLevel = DecodeNesting_GetLevel(&(pMe->nesting));
+   const uint8_t uMapNestLevel = DecodeNesting_GetMapModeLevel(&(pMe->nesting));
 
    uint_fast8_t uNextNestLevel;
    
@@ -2178,6 +2204,7 @@
 {
    /* Seek to the data item that is the map or array */
    UsefulInputBuf_Seek(&(pMe->InBuf), uOffset);
+   pMe->nesting.pCurrent = pMe->nesting.pCurrentMap;
 
    /* Skip the data item that is the map or array */
    QCBORItem MapToEnter;