enter / exit code working and somewhat orderly
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)