bug fix in mantissa exponent decoding; big float and decimal fraction fixes
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index a0e39bb..e75449c 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -1691,6 +1691,7 @@
nReturn = QCBOR_ERR_BAD_EXP_AND_MANTISSA;
goto Done;
}
+ pDecodedItem->uNextNestLevel = mantissaItem.uNextNestLevel; // TODO: make sure this is right
Done:
@@ -4408,65 +4409,75 @@
#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-static void ProcessDecimalFraction(QCBORDecodeContext *pMe,
- uint8_t uTagRequirement,
+static QCBORError FooCheck(QCBORDecodeContext *pMe, TagSpecification TagSpec, QCBORItem *pItem)
+{
+ QCBORError uErr;
+ // Loops runs at most 1.5 times. Making it a loop saves object code.
+
+ while(1) {
+ uErr = CheckTagRequirement(TagSpec, pItem->uDataType);
+ if(uErr != QCBOR_SUCCESS) {
+ goto Done;
+ }
+
+ if(pItem->uDataType != QCBOR_TYPE_ARRAY) {
+ break; // Successful exit. Moving on to finish decoding.
+ }
+
+ // The item is an array, which means an undecoded
+ // mantissa and exponent, so decode it. It will then
+ // have a different type and exit the loop if.
+ uErr = QCBORDecode_MantissaAndExponent(pMe, pItem);
+ if(uErr != QCBOR_SUCCESS) {
+ goto Done;
+ }
+
+ // Second time around, the type must match.
+ TagSpec.uTagRequirement = QCBOR_TAG_REQUIREMENT_MATCH_TAG;
+ }
+Done:
+ return uErr;
+}
+
+static void ProcessMantissaAndExponent(QCBORDecodeContext *pMe,
+ TagSpecification TagSpec,
QCBORItem *pItem,
int64_t *pnMantissa,
int64_t *pnExponent)
{
QCBORError uErr;
-
- if(pItem->uDataType == QCBOR_TYPE_ARRAY) {
- if(uTagRequirement == QCBOR_TAG_REQUIREMENT_NO_TAG) {
- pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
- return;
- }
- /* The decimal fraction was untagged so it shows up as an
- array at this point. We are called to interpret it
- as a decimal fraction, so do protocol decoding. If
- it was tagged, iw would shouw up here with the
- QCBOR_TYPE_DECIMAL_FRACTION or such. */
- uErr = QCBORDecode_MantissaAndExponent(pMe, pItem);
- if(uErr != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)uErr;
- return;
- }
- }
-
- if(uTagRequirement == QCBOR_TAG_REQUIREMENT_NO_TAG) {
- pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
- return;
+ uErr = FooCheck(pMe, TagSpec, pItem);
+ if(uErr != QCBOR_SUCCESS) {
+ goto Done;
}
switch (pItem->uDataType) {
case QCBOR_TYPE_DECIMAL_FRACTION:
+ case QCBOR_TYPE_BIGFLOAT:
*pnMantissa = pItem->val.expAndMantissa.Mantissa.nInt;
*pnExponent = pItem->val.expAndMantissa.nExponent;
break;
case QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM:
+ case QCBOR_TYPE_BIGFLOAT_POS_BIGNUM:
*pnExponent = pItem->val.expAndMantissa.nExponent;
-
uErr = ConvertPositiveBigNumToSigned(pItem->val.expAndMantissa.Mantissa.bigNum, pnMantissa);
- if(uErr != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)uErr;
- }
break;
case QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM:
+ case QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM:
*pnExponent = pItem->val.expAndMantissa.nExponent;
-
uErr = ConvertNegativeBigNumToSigned(pItem->val.expAndMantissa.Mantissa.bigNum, pnMantissa);
- if(uErr != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)uErr;
- }
break;
default:
- pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
+ uErr = QCBOR_ERR_UNEXPECTED_TYPE;
}
+
+ Done:
+ pMe->uLastError = (uint8_t)uErr;
}
@@ -4486,7 +4497,12 @@
return;
}
- ProcessDecimalFraction(pMe, uTagRequirement, &Item, pnMantissa, pnExponent);
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponent(pMe, TagSpec, &Item, pnMantissa, pnExponent);
}
@@ -4499,7 +4515,13 @@
QCBORItem Item;
QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
- ProcessDecimalFraction(pMe, uTagRequirement, &Item, pnMantissa, pnExponent);
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponent(pMe, TagSpec, &Item, pnMantissa, pnExponent);
}
@@ -4512,15 +4534,46 @@
QCBORItem Item;
QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, &Item);
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
- ProcessDecimalFraction(pMe, uTagRequirement, &Item, pnMantissa, pnExponent);
+ ProcessMantissaAndExponent(pMe, TagSpec, &Item, pnMantissa, pnExponent);
}
+
+
+void QCBORDecode_GetBigFloat(QCBORDecodeContext *pMe,
+ uint8_t uTagRequirement,
+ int64_t *pnMantissa,
+ int64_t *pnExponent)
+{
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return;
+ }
+
+ QCBORItem Item;
+ QCBORError uError = QCBORDecode_GetNext(pMe, &Item);
+ if(uError) {
+ pMe->uLastError = (uint8_t)uError;
+ return;
+ }
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BIGFLOAT, QCBOR_TYPE_BIGFLOAT_POS_BIGNUM, QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponent(pMe, TagSpec, &Item, pnMantissa, pnExponent);
+}
+
#endif /* ndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
UsefulBufC ConvertIntToBigNum(uint64_t uInt, UsefulBuf Buffer)
{
- while(uInt & 0xff0000000000UL) {
+ while((uInt & 0xff00000000000000UL) == 0) {
uInt = uInt << 8;
};
@@ -4529,8 +4582,10 @@
UsefulOutBuf_Init(&UOB, Buffer);
while(uInt) {
- UsefulOutBuf_AppendByte(&UOB, (uint8_t)((uInt & 0xff0000000000UL) >> 56));
+ const uint64_t xx = uInt & 0xff00000000000000UL;
+ UsefulOutBuf_AppendByte(&UOB, (uint8_t)((uInt & 0xff00000000000000UL) >> 56));
uInt = uInt << 8;
+ (void)xx;
}
return UsefulOutBuf_OutUBuf(&UOB);
@@ -4539,32 +4594,19 @@
#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-static void ProcessDecimalFractionBig(QCBORDecodeContext *pMe,
- uint8_t uTagRequirement,
- QCBORItem *pItem,
- UsefulBuf BufferForMantissa,
- UsefulBufC *pMantissa,
- bool *pbIsNegative,
- int64_t *pnExponent)
+static void ProcessMantissaAndExponentBig(QCBORDecodeContext *pMe,
+ TagSpecification TagSpec,
+ QCBORItem *pItem,
+ UsefulBuf BufferForMantissa,
+ UsefulBufC *pMantissa,
+ bool *pbIsNegative,
+ int64_t *pnExponent)
{
+ QCBORError uErr;
- const TagSpecification TagSpec = {uTagRequirement,
- {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
- {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
- };
-
- QCBORError uErr = CheckTagRequirement(TagSpec, pItem->uDataType);
+ uErr = FooCheck(pMe, TagSpec, pItem);
if(uErr != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)uErr;
- return;
- }
-
- if(pItem->uDataType == QCBOR_TYPE_ARRAY) {
- uErr = QCBORDecode_MantissaAndExponent(pMe, pItem);
- if(uErr != QCBOR_SUCCESS) {
- pMe->uLastError = (uint8_t)uErr;
- return;
- }
+ goto Done;
}
uint64_t uMantissa;
@@ -4572,6 +4614,7 @@
switch (pItem->uDataType) {
case QCBOR_TYPE_DECIMAL_FRACTION:
+ case QCBOR_TYPE_BIGFLOAT:
if(pItem->val.expAndMantissa.Mantissa.nInt >= 0) {
uMantissa = (uint64_t)pItem->val.expAndMantissa.Mantissa.nInt;
*pbIsNegative = false;
@@ -4584,20 +4627,25 @@
break;
case QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM:
+ case QCBOR_TYPE_BIGFLOAT_POS_BIGNUM:
*pnExponent = pItem->val.expAndMantissa.nExponent;
*pMantissa = pItem->val.expAndMantissa.Mantissa.bigNum;
*pbIsNegative = false;
break;
case QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM:
+ case QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM:
*pnExponent = pItem->val.expAndMantissa.nExponent;
*pMantissa = pItem->val.expAndMantissa.Mantissa.bigNum;
*pbIsNegative = true;
break;
default:
- pMe->uLastError = QCBOR_ERR_UNEXPECTED_TYPE;
+ uErr = QCBOR_ERR_UNEXPECTED_TYPE;
}
+
+Done:
+ pMe->uLastError = (uint8_t)uErr;
}
@@ -4620,7 +4668,12 @@
return;
}
- ProcessDecimalFractionBig(pMe, uTagRequirement, &Item, MantissaBuffer, pMantissa, pbMantissaIsNegative, pnExponent);
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, MantissaBuffer, pMantissa, pbMantissaIsNegative, pnExponent);
}
@@ -4639,11 +4692,92 @@
return;
}
- ProcessDecimalFractionBig(pMe, uTagRequirement, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
}
void QCBORDecode_GetDecimalFractionBigInMapSZ(QCBORDecodeContext *pMe,
+ uint8_t uTagRequirement,
+ const char *szLabel,
+ UsefulBuf BufferForMantissa,
+ UsefulBufC *pMantissa,
+ bool *pbIsNegative,
+ int64_t *pnExponent)
+{
+ QCBORItem Item;
+
+ QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, &Item);
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return;
+ }
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
+}
+
+
+void QCBORDecode_GetBigFloatBig(QCBORDecodeContext *pMe,
+ uint8_t uTagRequirement,
+ UsefulBuf MantissaBuffer,
+ UsefulBufC *pMantissa,
+ bool *pbMantissaIsNegative,
+ int64_t *pnExponent)
+{
+
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return;
+ }
+
+ QCBORItem Item;
+ QCBORError uError = QCBORDecode_GetNext(pMe, &Item);
+ if(uError) {
+ pMe->uLastError = (uint8_t)uError;
+ return;
+ }
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BIGFLOAT, QCBOR_TYPE_BIGFLOAT_POS_BIGNUM , QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, MantissaBuffer, pMantissa, pbMantissaIsNegative, pnExponent);
+
+}
+
+void QCBORDecode_GetBigFloatBigInMapN(QCBORDecodeContext *pMe,
+ uint8_t uTagRequirement,
+ int64_t nLabel,
+ UsefulBuf BufferForMantissa,
+ UsefulBufC *pMantissa,
+ bool *pbIsNegative,
+ int64_t *pnExponent)
+{
+ QCBORItem Item;
+
+ QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return;
+ }
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BIGFLOAT, QCBOR_TYPE_BIGFLOAT_POS_BIGNUM , QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
+}
+
+
+void QCBORDecode_GetBigFloatBigInMapSZ(QCBORDecodeContext *pMe,
uint8_t uTagRequirement,
const char *szLabel,
UsefulBuf BufferForMantissa,
@@ -4658,7 +4792,12 @@
return;
}
- ProcessDecimalFractionBig(pMe, uTagRequirement, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BIGFLOAT, QCBOR_TYPE_BIGFLOAT_POS_BIGNUM , QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ ProcessMantissaAndExponentBig(pMe, TagSpec, &Item, BufferForMantissa, pMantissa, pbIsNegative, pnExponent);
}
#endif /* ndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
diff --git a/test/qcbor_decode_tests.c b/test/qcbor_decode_tests.c
index 569b0bf..2620184 100644
--- a/test/qcbor_decode_tests.c
+++ b/test/qcbor_decode_tests.c
@@ -3652,7 +3652,7 @@
*/
static const uint8_t spExpectedExponentsAndMantissas[] = {
- 0x87,
+ 0x88,
0xC4, 0x82, 0x20,
0x03,
0xC4, 0x82, 0x33,
@@ -3674,7 +3674,7 @@
int32_t ExponentAndMantissaDecodeTests(void)
{
QCBORDecodeContext DC;
- QCBORError nCBORError;
+ QCBORError uErr;
QCBORItem item;
static const uint8_t spBigNumMantissa[] = {0x01, 0x02, 0x03, 0x04, 0x05,
@@ -3682,10 +3682,12 @@
UsefulBufC BN = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumMantissa);
- QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), QCBOR_DECODE_MODE_NORMAL);
+ QCBORDecode_Init(&DC,
+ UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas),
+ QCBOR_DECODE_MODE_NORMAL);
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 1;
}
@@ -3693,8 +3695,8 @@
return 2;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 3;
}
@@ -3704,8 +3706,8 @@
return 4;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 5;
}
@@ -3715,8 +3717,8 @@
return 6;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 7;
}
@@ -3726,8 +3728,8 @@
return 8;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 9;
}
@@ -3738,8 +3740,8 @@
}
// 5([-20, 4759477275222530853136]),
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 11;
}
if(item.uDataType != QCBOR_TYPE_BIGFLOAT_POS_BIGNUM ||
@@ -3749,8 +3751,8 @@
}
// 5([-9223372036854775807, -4759477275222530853137])
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
return 13;
}
if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
@@ -3760,26 +3762,30 @@
}
// 5([ 9223372036854775806, -4759477275222530853137])
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 13;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 15;
}
if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
item.val.expAndMantissa.nExponent != 9223372036854775806 ||
UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
- return 14;
+ return 16;
}
-
// 5([ 9223372036854775806, 9223372036854775806])]
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 15;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 17;
}
if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
item.val.expAndMantissa.nExponent != 9223372036854775806 ||
item.val.expAndMantissa.Mantissa.nInt!= 9223372036854775806 ) {
- return 16;
+ return 18;
+ }
+
+ uErr = QCBORDecode_Finish(&DC);
+ if(uErr != QCBOR_SUCCESS) {
+ return 18;
}
/* Now encode some stuff and then decode it */
@@ -3797,42 +3803,84 @@
QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 13;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 100;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 13;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 101;
}
if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
item.val.expAndMantissa.nExponent != 1000 ||
item.val.expAndMantissa.Mantissa.nInt != 999) {
- return 15;
+ return 102;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 13;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 103;
}
if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
item.val.expAndMantissa.nExponent != INT32_MIN ||
item.val.expAndMantissa.Mantissa.nInt != 100) {
- return 15;
+ return 104;
}
- nCBORError = QCBORDecode_GetNext(&DC, &item);
- if(nCBORError != QCBOR_SUCCESS) {
- return 13;
+ uErr = QCBORDecode_GetNext(&DC, &item);
+ if(uErr != QCBOR_SUCCESS) {
+ return 105;
}
if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
item.val.expAndMantissa.nExponent != INT32_MAX ||
UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
- return 12;
+ return 106;
+ }
+
+
+ int64_t nExp, nMant;
+ UsefulBuf_MAKE_STACK_UB( MantBuf, 20);
+ UsefulBufC Mant;
+ bool bIsNeg;
+
+ QCBORDecode_Init(&DC,
+ UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas),
+ QCBOR_DECODE_MODE_NORMAL);
+ QCBORDecode_EnterArray(&DC);
+
+ // 4([-1, 3]),
+ QCBORDecode_GetDecimalFraction(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &nExp, &nMant);
+
+ // 4([-20, 4759477275222530853136]),
+ QCBORDecode_GetDecimalFractionBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ // 4([9223372036854775807, -4759477275222530853137]),
+ QCBORDecode_GetDecimalFractionBig(&DC, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ // 5([300, 100]),
+ QCBORDecode_GetBigFloat(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &nExp, &nMant);
+
+ // 5([-20, 4759477275222530853136]),
+ QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ // 5([-9223372036854775807, -4759477275222530853137])
+ QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ // 5([ 9223372036854775806, -4759477275222530853137])
+ QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ // 5([ 9223372036854775806, 9223372036854775806])]
+ QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
+
+ QCBORDecode_ExitArray(&DC);
+
+ uErr = QCBORDecode_Finish(&DC);
+ if(uErr != QCBOR_SUCCESS) {
+ return 200;
}
return 0;