enter / exit code working and somewhat orderly
diff --git a/QCBOR.xcodeproj/project.pbxproj b/QCBOR.xcodeproj/project.pbxproj
index a193355..a720857 100644
--- a/QCBOR.xcodeproj/project.pbxproj
+++ b/QCBOR.xcodeproj/project.pbxproj
@@ -78,7 +78,7 @@
 		E776E096214AE0C700E67947 /* cmd_line_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cmd_line_main.c; sourceTree = "<group>"; };
 		E776E161214EE19C00E67947 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		E788315B243BFDF0001893CD /* qcbor_decode_map.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = qcbor_decode_map.h; path = inc/qcbor/qcbor_decode_map.h; sourceTree = "<group>"; };
-		E78C91DE240C90C100F4CECE /* qcbor_decode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qcbor_decode.h; path = inc/qcbor/qcbor_decode.h; sourceTree = "<group>"; };
+		E78C91DE240C90C100F4CECE /* qcbor_decode.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_decode.h; path = inc/qcbor/qcbor_decode.h; sourceTree = "<group>"; tabWidth = 3; };
 		E78C91DF240C90C100F4CECE /* qcbor_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qcbor_common.h; path = inc/qcbor/qcbor_common.h; sourceTree = "<group>"; };
 		E78C91E0240C90C100F4CECE /* qcbor_private.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 3; lastKnownFileType = sourcecode.c.h; name = qcbor_private.h; path = inc/qcbor/qcbor_private.h; sourceTree = "<group>"; tabWidth = 3; };
 		E78C91E1240C90C100F4CECE /* qcbor_encode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = qcbor_encode.h; path = inc/qcbor/qcbor_encode.h; sourceTree = "<group>"; };
diff --git a/inc/qcbor/qcbor_decode.h b/inc/qcbor/qcbor_decode.h
index 3688a59..ac6df25 100644
--- a/inc/qcbor/qcbor_decode.h
+++ b/inc/qcbor/qcbor_decode.h
@@ -1084,10 +1084,25 @@
  Entering and Exiting map mode consumes the whole
  map and its contents as a GetNext after exiting
  will return the item after the map. */
-static QCBORError QCBORDecode_EnterMap(QCBORDecodeContext *pCtx);
+static void QCBORDecode_EnterMap(QCBORDecodeContext *pCtx);
 
 
-void QCBORDecode_ExitMap(QCBORDecodeContext *pCtx);
+/*
+ Find a map in a map by integer label and enter it.
+
+ This will do duplicate detection on the particular label.
+
+ Call QCBORDecode_ExitMap() to return to the mode / level
+ from before this was called.
+
+ Seek to to the beginning of the map.
+ Consume items looking for nLabel
+ */
+void QCBORDecode_EnterMapFromMap(QCBORDecodeContext *pCtx, int64_t nLabel);
+
+void QCBORDecode_EnterMapFromMapSZ(QCBORDecodeContext *pCtx, const char  *szLabel);
+
+static void QCBORDecode_ExitMap(QCBORDecodeContext *pCtx);
 
 /*
  Indicate if decoding is in map mode more not.
@@ -1103,18 +1118,15 @@
 void QCBORDecode_RewindMap(QCBORDecodeContext *pCtxt);
 
 
-QCBORError QCBORDecode_EnterArray(QCBORDecodeContext *pCtx);
+static void QCBORDecode_EnterArray(QCBORDecodeContext *pCtx);
+
+void QCBORDecode_EnterArrayFromMapN(QCBORDecodeContext *pMe, int64_t uLabel);
+
+void QCBORDecode_EnterArrayFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel);
+
+static void QCBORDecode_ExitArray(QCBORDecodeContext *pCtx);
 
 
-void QCBORDecode_ExitArray(QCBORDecodeContext *pCtx);
-
-QCBORError QCBORDecode_EnterArrayFromMapN(QCBORDecodeContext *pMe, int64_t uLabel);
-
-
-QCBORError QCBORDecode_EnterArrayFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel);
-
-
-//QCBORError QCBORDecode_EnterMapX(QCBORDecodeContext *pCtx,  MapDecode *pMap);
 
                      
 
@@ -1183,20 +1195,7 @@
 void QCBORDecode_GetTextInMapSZ(QCBORDecodeContext *pCtx, const char *szLabel, UsefulBufC *pBstr);
 
 
-/*
-  Find a map in a map by integer label and enter it.
- 
- This will do duplicate detection on the particular label.
- 
- Call QCBORDecode_ExitMap() to return to the mode / level
- from before this was called.
- 
- Seek to to the beginning of the map.
- Consume items looking for nLabel
- */
-QCBORError QCBORDecode_EnterMapFromMap(QCBORDecodeContext *pCtx, int64_t nLabel);
 
-QCBORError QCBORDecode_EnterMapFromMapSZ(QCBORDecodeContext *pCtx, const char  *szLabel);
 
 
 
@@ -1374,15 +1373,33 @@
 }
 
 
-
-QCBORError QCBORDecode_EnterMapMode(QCBORDecodeContext *pMe, uint8_t uType);
+// Semi-private
+void QCBORDecode_EnterMapMode(QCBORDecodeContext *pMe, uint8_t uType);
 
 
-inline static QCBORError QCBORDecode_EnterMap(QCBORDecodeContext *pMe) {
-    return QCBORDecode_EnterMapMode(pMe, QCBOR_TYPE_MAP);
+inline static void QCBORDecode_EnterMap(QCBORDecodeContext *pMe) {
+   QCBORDecode_EnterMapMode(pMe, QCBOR_TYPE_MAP);
 }
 
 
+inline static void QCBORDecode_EnterArray(QCBORDecodeContext *pMe) {
+   QCBORDecode_EnterMapMode(pMe, QCBOR_TYPE_ARRAY);
+}
+
+// Semi-private
+void QCBORDecode_ExitMapMode(QCBORDecodeContext *pMe, uint8_t uType);
+
+
+static inline void QCBORDecode_ExitArray(QCBORDecodeContext *pMe)
+{
+   QCBORDecode_ExitMapMode(pMe, QCBOR_TYPE_ARRAY);
+}
+
+static inline void QCBORDecode_ExitMap(QCBORDecodeContext *pMe)
+{
+   QCBORDecode_ExitMapMode(pMe, QCBOR_TYPE_MAP);
+}
+
 
 // Semi-private
 void QCBORDecode_GetInt64ConvertInternal(QCBORDecodeContext *pMe, uint32_t uOptions, int64_t *pValue, QCBORItem *pItem);
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index f5995fe..0fdb242 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -2129,10 +2129,12 @@
 }
 
 
-void QCBORDecode_ExitMap(QCBORDecodeContext *pMe)
+void QCBORDecode_ExitMapMode(QCBORDecodeContext *pMe, uint8_t uType)
 {
    size_t uEndOffset;
 
+   (void)uType; // TODO: error check
+
 /*
    if(pMe->uMapEndOffset) {
       uEndOffset = pMe->uMapEndOffset;
@@ -2213,8 +2215,19 @@
 
 
 
-static int FinishEnter(QCBORDecodeContext *pMe, size_t uOffset)
+static void SearchAndEnter(QCBORDecodeContext *pMe, QCBORItem pSearch[])
 {
+   if(pMe->uLastError != QCBOR_SUCCESS) {
+      // Already in error state; do nothing.
+      return;
+   }
+
+   size_t uOffset;
+   pMe->uLastError = MapSearch(pMe, pSearch, &uOffset, NULL);
+   if(pMe->uLastError != QCBOR_SUCCESS) {
+      return;
+   }
+
    /* Need to get the current pre-order nesting level and cursor to be
       at the first item in the map/array just entered.
 
@@ -2234,104 +2247,58 @@
    pMe->nesting.pCurrent = pMe->nesting.pCurrentMap; // TODO: part of DecodeNesting
 
    // TODO: check error?
-   QCBORDecode_EnterMapMode(pMe, QCBOR_TYPE_MAP);
+   QCBORDecode_EnterMapMode(pMe, pSearch->uDataType);
 
-   printdecode(pMe, "Entered Map in Map");
-
-   return 0;
+   printdecode(pMe, "FinishEnter");
 }
 
 
-QCBORError QCBORDecode_EnterMapInMapN(QCBORDecodeContext *pMe, int64_t nLabel)
+void QCBORDecode_EnterMapInMapN(QCBORDecodeContext *pMe, int64_t nLabel)
 {
-   /* Use GetItemsInMap to find the map by label, including the
-      byte offset of it. */
    QCBORItem One[2];
    One[0].uLabelType  = QCBOR_TYPE_INT64;
    One[0].label.int64 = nLabel;
    One[0].uDataType   = QCBOR_TYPE_MAP;
    One[1].uLabelType  = QCBOR_TYPE_NONE;
 
-   size_t uOffset;
-   QCBORError nReturn = MapSearch(pMe, One, &uOffset, NULL);
-   if(nReturn) {
-      return nReturn;
-   }
-
    /* The map to enter was found, now finish of entering it. */
-   FinishEnter(pMe, uOffset);
-
-   // TODO: error code?
-   return 0;
+   SearchAndEnter(pMe, One);
 }
 
 
-QCBORError QCBORDecode_EnterMapFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel)
+void QCBORDecode_EnterMapFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel)
 {
    QCBORItem One[2];
-
    One[0].uLabelType   = QCBOR_TYPE_TEXT_STRING;
    One[0].label.string = UsefulBuf_FromSZ(szLabel);
    One[0].uDataType    = QCBOR_TYPE_MAP;
    One[1].uLabelType   = QCBOR_TYPE_NONE;
-
-   size_t uOffset;
-
-   QCBORError nReturn = MapSearch(pMe, One, &uOffset, NULL);
-
-   if(nReturn) {
-      return nReturn;
-   }
    
-   FinishEnter(pMe, uOffset);
-
-   return 0;
+   SearchAndEnter(pMe, One);
 }
 
 
-QCBORError QCBORDecode_EnterArrayFromMapN(QCBORDecodeContext *pMe, int64_t nLabel)
-{
-    QCBORItem One[2];
-
-    One[0].uLabelType  = QCBOR_TYPE_INT64;
-    One[0].label.int64 = nLabel;
-    One[0].uDataType   = QCBOR_TYPE_ARRAY;
-    One[1].uLabelType  = QCBOR_TYPE_NONE;
-
-    size_t uOffset;
-
-    QCBORError nReturn = MapSearch(pMe, One, &uOffset, NULL);
-
-    if(nReturn != QCBOR_SUCCESS) {
-       return nReturn;
-    }
-    
-    FinishEnter(pMe, uOffset);
-
-    return 0;
-}
-
-
-QCBORError QCBORDecode_EnterArrayFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel)
+void QCBORDecode_EnterArrayFromMapN(QCBORDecodeContext *pMe, int64_t nLabel)
 {
    QCBORItem One[2];
+   One[0].uLabelType  = QCBOR_TYPE_INT64;
+   One[0].label.int64 = nLabel;
+   One[0].uDataType   = QCBOR_TYPE_ARRAY;
+   One[1].uLabelType  = QCBOR_TYPE_NONE;
 
+   SearchAndEnter(pMe, One);
+}
+
+
+void QCBORDecode_EnterArrayFromMapSZ(QCBORDecodeContext *pMe, const char  *szLabel)
+{
+   QCBORItem One[2];
    One[0].uLabelType   = QCBOR_TYPE_TEXT_STRING;
    One[0].label.string = UsefulBuf_FromSZ(szLabel);
    One[0].uDataType    = QCBOR_TYPE_ARRAY;
    One[1].uLabelType   = QCBOR_TYPE_NONE;
 
-   size_t uOffset;
-
-   QCBORError nReturn = MapSearch(pMe, One, &uOffset, NULL);
-
-   if(nReturn != QCBOR_SUCCESS) {
-      return nReturn;
-   }
-   
-   FinishEnter(pMe, uOffset);
-
-   return 0;
+   SearchAndEnter(pMe, One);
 }
 
 
@@ -2339,25 +2306,27 @@
 
 
 /* Next item must be map or this generates an error */
-QCBORError QCBORDecode_EnterMapMode(QCBORDecodeContext *pMe, uint8_t uType)
+void QCBORDecode_EnterMapMode(QCBORDecodeContext *pMe, uint8_t uType)
 {
-   QCBORItem  Item;
-   QCBORError nReturn;
+   if(pMe->uLastError != QCBOR_SUCCESS) {
+      // Already in error state; do nothing.
+      return;
+   }
 
    /* Get the data item that is the map that is being searched */
-   nReturn = QCBORDecode_GetNext(pMe, &Item);
-   if(nReturn != QCBOR_SUCCESS) {
-      return nReturn;
+   QCBORItem  Item;
+   pMe->uLastError = QCBORDecode_GetNext(pMe, &Item);
+   if(pMe->uLastError != QCBOR_SUCCESS) {
+      return;
    }
    if(Item.uDataType != uType) {
-      return QCBOR_ERR_UNEXPECTED_TYPE;
+      pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
+      return;
    }
 
    DecodeNesting_EnterMapMode(&(pMe->nesting), UsefulInputBuf_Tell(&(pMe->InBuf)));
 
-   printdecode(pMe, "EnterMapDone");
-
-   return QCBOR_SUCCESS;
+   printdecode(pMe, "EnterMapModeDone");
 }
 
 
@@ -2379,54 +2348,7 @@
 }
 
 
-QCBORError QCBORDecode_EnterArray(QCBORDecodeContext *pMe)
-{
-   QCBORItem  Item;
-   QCBORError nReturn;
 
-   /* Get the data item that is the map that is being searched */
-   nReturn = QCBORDecode_GetNext(pMe, &Item);
-   if(nReturn != QCBOR_SUCCESS) {
-      return nReturn;
-   }
-   if(Item.uDataType != QCBOR_TYPE_ARRAY) {
-      return QCBOR_ERR_UNEXPECTED_TYPE;
-   }
-
-   printdecode(pMe, "EnterArray");
-   
-   DecodeNesting_EnterMapMode(&(pMe->nesting), UsefulInputBuf_Tell(&(pMe->InBuf)));
-
-   return QCBOR_SUCCESS;
-}
-
-
-void QCBORDecode_ExitArray(QCBORDecodeContext *pMe)
-{
-   // TODO: make sure we have entered an array
-   // TODO: combine with code for map? It is the same so far.
-   size_t uEndOffset;
-
- /*  if(pMe->uMapEndOffset) {
-      uEndOffset = pMe->uMapEndOffset;
-      // It is only valid once.
-      pMe->uMapEndOffset = 0;
-   } else {*/
-      QCBORItem Dummy;
-
-      Dummy.uLabelType = QCBOR_TYPE_NONE;
-
-      QCBORError nReturn = MapSearch(pMe, &Dummy, NULL, &uEndOffset);
-
-      (void)nReturn; // TODO:
-   //}
-   
-   printdecode(pMe, "start exit");
-   UsefulInputBuf_Seek(&(pMe->InBuf), uEndOffset);
-
-   DecodeNesting_Exit(&(pMe->nesting));
-   printdecode(pMe, "end exit");
-}
 
 
 void QCBORDecode_GetIntInMapSZ(QCBORDecodeContext *pMe, const char *szLabel, int64_t *pInt)