a few more fixes and improvements
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 84db9e0..c832816 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -2192,46 +2192,56 @@
uint8_t uQcborType,
QCBORItem *pItem)
{
- QCBORItem One[2];
+ QCBORItem OneItemSeach[2];
- One[0].uLabelType = QCBOR_TYPE_TEXT_STRING;
- One[0].label.string = UsefulBuf_FromSZ(szLabel);
- One[0].uDataType = uQcborType;
- One[1].uLabelType = QCBOR_TYPE_NONE; // Indicates end of array
+ OneItemSeach[0].uLabelType = QCBOR_TYPE_TEXT_STRING;
+ OneItemSeach[0].label.string = UsefulBuf_FromSZ(szLabel);
+ OneItemSeach[0].uDataType = uQcborType;
+ OneItemSeach[1].uLabelType = QCBOR_TYPE_NONE; // Indicates end of array
- QCBORError nReturn = MapSearch(pMe, One, NULL, NULL);
+ QCBORError nReturn = MapSearch(pMe, OneItemSeach, NULL, NULL);
if(nReturn) {
return nReturn;
}
- if(One[0].uDataType == QCBOR_TYPE_NONE) {
+ if(OneItemSeach[0].uDataType == QCBOR_TYPE_NONE) {
return QCBOR_ERR_NOT_FOUND;
}
- *pItem = One[0];
+ *pItem = OneItemSeach[0];
return QCBOR_SUCCESS;
}
-static QCBORError CheckTagRequirement(TagSpecification TagSpec, uint8_t uDataType)
+static QCBORError CheckTagRequirement(const TagSpecification TagSpec, uint8_t uDataType)
{
- // This gets called a lot, so it needs to be fast, especially for simple cases.
- // TODO: this isn't working right yet
- if((TagSpec.uTagRequirement == 1 || TagSpec.uTagRequirement == 2) && uDataType == TagSpec.uTaggedType) {
- return QCBOR_SUCCESS;
+ if(TagSpec.uTagRequirement == QCBOR_TAGSPEC_MATCH_TAG) {
+ /* Must match the tag */
+ if(uDataType == TagSpec.uTaggedType) {
+ return QCBOR_SUCCESS;
+ }
} else {
- for(int i = 0; i < 6; i++) {
+ /* QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE or QCBOR_TAGSPEC_MATCH_EITHER */
+ /* Must check all the possible types for the tag content */
+ for(size_t i = 0; i < sizeof(TagSpec.uAllowedContentTypes); i++) {
if(uDataType == TagSpec.uAllowedContentTypes[i]) {
return QCBOR_SUCCESS;
}
}
+ /* Didn't match any of the tag content types */
+ /* Check the tag for the either case */
+ if(TagSpec.uTagRequirement == QCBOR_TAGSPEC_MATCH_EITHER) {
+ if(uDataType == TagSpec.uTaggedType) {
+ return QCBOR_SUCCESS;
+ }
+ }
}
return QCBOR_ERR_UNEXPECTED_TYPE;
-
}
+
void QCBORDecode_GetTaggedItemInMapN(QCBORDecodeContext *pMe,
int64_t nLabel,
TagSpecification TagSpec,
@@ -2323,50 +2333,50 @@
void QCBORDecode_EnterMapInMapN(QCBORDecodeContext *pMe, int64_t nLabel)
{
- 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;
+ QCBORItem OneItemSeach[2];
+ OneItemSeach[0].uLabelType = QCBOR_TYPE_INT64;
+ OneItemSeach[0].label.int64 = nLabel;
+ OneItemSeach[0].uDataType = QCBOR_TYPE_MAP;
+ OneItemSeach[1].uLabelType = QCBOR_TYPE_NONE;
/* The map to enter was found, now finish of entering it. */
- SearchAndEnter(pMe, One);
+ SearchAndEnter(pMe, OneItemSeach);
}
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;
+ QCBORItem OneItemSeach[2];
+ OneItemSeach[0].uLabelType = QCBOR_TYPE_TEXT_STRING;
+ OneItemSeach[0].label.string = UsefulBuf_FromSZ(szLabel);
+ OneItemSeach[0].uDataType = QCBOR_TYPE_MAP;
+ OneItemSeach[1].uLabelType = QCBOR_TYPE_NONE;
- SearchAndEnter(pMe, One);
+ SearchAndEnter(pMe, OneItemSeach);
}
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;
+ QCBORItem OneItemSeach[2];
+ OneItemSeach[0].uLabelType = QCBOR_TYPE_INT64;
+ OneItemSeach[0].label.int64 = nLabel;
+ OneItemSeach[0].uDataType = QCBOR_TYPE_ARRAY;
+ OneItemSeach[1].uLabelType = QCBOR_TYPE_NONE;
- SearchAndEnter(pMe, One);
+ SearchAndEnter(pMe, OneItemSeach);
}
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;
+ QCBORItem OneItemSeach[2];
+ OneItemSeach[0].uLabelType = QCBOR_TYPE_TEXT_STRING;
+ OneItemSeach[0].label.string = UsefulBuf_FromSZ(szLabel);
+ OneItemSeach[0].uDataType = QCBOR_TYPE_ARRAY;
+ OneItemSeach[1].uLabelType = QCBOR_TYPE_NONE;
- SearchAndEnter(pMe, One);
+ SearchAndEnter(pMe, OneItemSeach);
}