integer conversion tests mostly working
diff --git a/inc/qcbor/qcbor_decode.h b/inc/qcbor/qcbor_decode.h
index af1354e..acd12fb 100644
--- a/inc/qcbor/qcbor_decode.h
+++ b/inc/qcbor/qcbor_decode.h
@@ -956,6 +956,8 @@
*/
void QCBORDecode_GetInt64ConvertAll(QCBORDecodeContext *pMe, uint32_t uOptions, int64_t *pValue);
+void QCBORDecode_GetUInt64ConvertAll(QCBORDecodeContext *pMe, uint32_t uOptions, uint64_t *pValue);
+
void QCBORDecode_GetBytes(QCBORDecodeContext *pCtx, UsefulBufC *pValue);
@@ -966,6 +968,7 @@
void QCBORDecode_GetNegBignum(QCBORDecodeContext *pCtx, UsefulBufC *pValue);
+void QCBORDecode_GetDoubleConvertAll(QCBORDecodeContext *pMe, uint32_t uOptions, double *pValue);
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 7cb7453..9950ef4 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -137,10 +137,10 @@
inline static bool
DecodeNesting_AtEnd(const QCBORDecodeNesting *pNesting)
{
- if(DecodeNesting_IsAtTop(pNesting)){
+ //if(DecodeNesting_IsAtTop(pNesting)){
// Always at end if at the top level of nesting
- return true;
- }
+ // return true;
+ //}
if(pNesting->pCurrent->uMapMode) {
if(pNesting->pCurrent->uCount == 0) {
@@ -2731,25 +2731,25 @@
}
-#if 0
-static inline QCBORError ConvertBigNumToDouble(const UsefulBufC BigNum, uint64_t uMax, double *pResult)
-{
- double nResult;
- nResult = 0;
+static double ConvertBigNumToDouble(const UsefulBufC BigNum)
+{
+ double dResult;
+
+ dResult = 0.0;
const uint8_t *pByte = BigNum.ptr;
size_t uLen = BigNum.len;
/* This will overflow and become the float value INFINITY if the number
is too large to fit. No error will be logged.
TODO: should an error be logged? */
while(uLen--) {
- nResult = (nResult * 256) + *pByte;
+ dResult = (dResult * 256.0) + *pByte;
}
- *pResult = nResult;
- return 0;
+ return dResult;
}
-#endif
+
+
static inline QCBORError ConvertPositiveBigNumToUnSigned(const UsefulBufC BigNum, uint64_t *pResult)
{
@@ -2807,7 +2807,7 @@
a big float, a decimal fraction or a big num. Conversion will be dones as
expected. Some cases will error out with under or over flow.
*/
-void QCBORDecode_GetInt64ConvertInternal(QCBORDecodeContext *pMe, uint32_t uOptions, int64_t *pValue, QCBORItem *pItem)
+static void QCBORDecode_GetInt64ConvertInternal(QCBORDecodeContext *pMe, uint32_t uOptions, int64_t *pValue, QCBORItem *pItem)
{
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
@@ -2831,7 +2831,7 @@
if(uOptions & QCBOR_CONVERT_TYPE_FLOAT) {
// TODO: what about under/overflow here?
// Invokes the floating-point HW and/or compiler-added libraries
- *pValue = (int64_t)Item.val.dfnum;
+ *pValue = llround(Item.val.dfnum);
} else {
pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
@@ -2862,7 +2862,7 @@
}
}
-/* This works for signed, unsigned and float */
+/* This works for signed, unsigned and float data items */
void QCBORDecode_GetInt64Convert(QCBORDecodeContext *pMe, uint32_t uOptions, int64_t *pValue)
{
QCBORItem Item;
@@ -3024,12 +3024,17 @@
return;
}
+ if(pItem) {
+ *pItem = Item;
+ }
+
switch(Item.uDataType) {
case QCBOR_TYPE_FLOAT:
if(uOptions & QCBOR_CONVERT_TYPE_FLOAT) {
if(Item.val.dfnum >= 0) {
// TODO: over/underflow
- *pValue = (uint64_t)Item.val.dfnum;
+ // TODO: find a rounding function
+ *pValue = (uint64_t)round(Item.val.dfnum);
} else {
pMe->uLastError = QCBOR_ERR_NUMBER_SIGN_CONVERSION;
}
@@ -3202,149 +3207,124 @@
-#if 0
/*
Convert from bignums,
+ https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
+
*/
void QCBORDecode_GetDoubleConvertAll(QCBORDecodeContext *pMe, uint32_t uOptions, double *pValue)
{
/* the same range of conversions */
- /* Conversion from bignums, decimal fractions and such will be interesting */
-
QCBORItem Item;
QCBORError nError;
nError = QCBORDecode_GetNext(pMe, &Item);
if(nError) {
- pMe->uLastError = nError;
+ pMe->uLastError = (uint8_t)nError;
return;
}
switch(Item.uDataType) {
case QCBOR_TYPE_FLOAT:
- if(uOptions & QCBOR_DECODE_TYPE_FLOAT) {
+ if(uOptions & QCBOR_CONVERT_TYPE_FLOAT) {
*pValue = Item.val.dfnum;
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_INT64:
- if(uOptions & QCBOR_DECODE_TYPE_INT64) {
+ if(uOptions & QCBOR_CONVERT_TYPE_INT64) {
// TODO: how does this work?
*pValue = (double)Item.val.int64;
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_UINT64:
- if(uOptions & QCBOR_DECODE_TYPE_UINT64) {
+ if(uOptions & QCBOR_CONVERT_TYPE_UINT64) {
+ // TODO: check more carefully how this cast works.
*pValue = (double)Item.val.uint64;
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
- break;
+
case QCBOR_TYPE_DECIMAL_FRACTION:
- if(uOptions & QCBOR_DECODE_TYPE_DECIMAL_FRACTION) {
- pMe->uLastError = Exponentitate10(Item.val.expAndMantissa.Mantissa.nInt,
- Item.val.expAndMantissa.nExponent,
- pValue);
+ if(uOptions & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
+ // TODO: rounding and overflow errors
+ *pValue = (double)Item.val.expAndMantissa.Mantissa.nInt *
+ pow(10.0, (double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_BIGFLOAT:
- if(uOptions & QCBOR_DECODE_TYPE_BIGFLOAT) {
- pMe->uLastError = Exponentitate2(Item.val.expAndMantissa.Mantissa.nInt,
- Item.val.expAndMantissa.nExponent,
- pValue);
+ if(uOptions & QCBOR_CONVERT_TYPE_BIGFLOAT ) {
+ *pValue = (double)Item.val.expAndMantissa.Mantissa.nInt *
+ exp2((double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_POSBIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_BIG_NUM) {
- pMe->uLastError = ConvertPositiveBigNumToSigned(Item.val.bigNum, pValue);
+ if(uOptions & QCBOR_CONVERT_TYPE_BIG_NUM) {
+ *pValue = ConvertBigNumToDouble(Item.val.bigNum);
} else {
- pMe->uLastError = 99;
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_NEGBIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_BIG_NUM) {
- pMe->uLastError = ConvertNegativeBigNumToSigned(Item.val.bigNum, pValue);
+ if(uOptions & QCBOR_CONVERT_TYPE_BIG_NUM) {
+ *pValue = -ConvertBigNumToDouble(Item.val.bigNum);
} else {
- pMe->uLastError = 99;
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_DECIMAL_FRACTION) {
- int64_t nMantissa;
- pMe->uLastError = ConvertPositiveBigNumToSigned(Item.val.expAndMantissa.Mantissa.bigNum, &nMantissa);
- if(!pMe->uLastError) {
- pMe->uLastError = Exponentitate10(nMantissa,
- Item.val.expAndMantissa.nExponent,
- pValue);
- }
+ if(uOptions & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
+ double dMantissa = ConvertBigNumToDouble(Item.val.expAndMantissa.Mantissa.bigNum);
+ *pValue = dMantissa * pow(10, (double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_DECIMAL_FRACTION) {
- int64_t nMantissa;
- pMe->uLastError = ConvertNegativeBigNumToSigned(Item.val.expAndMantissa.Mantissa.bigNum, &nMantissa);
- if(!pMe->uLastError) {
- pMe->uLastError = Exponentitate10(nMantissa,
- Item.val.expAndMantissa.nExponent,
- pValue);
- }
+ if(uOptions & QCBOR_CONVERT_TYPE_DECIMAL_FRACTION) {
+ double dMantissa = -ConvertBigNumToDouble(Item.val.expAndMantissa.Mantissa.bigNum);
+ *pValue = dMantissa * pow(10, (double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_BIGFLOAT_POS_BIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_DECIMAL_FRACTION) {
- int64_t nMantissa;
- pMe->uLastError = ConvertPositiveBigNumToSigned(Item.val.expAndMantissa.Mantissa.bigNum, &nMantissa);
- if(!pMe->uLastError) {
- pMe->uLastError = Exponentitate2(nMantissa,
- Item.val.expAndMantissa.nExponent,
- pValue);
- }
+ if(uOptions & QCBOR_CONVERT_TYPE_BIGFLOAT) {
+ double dMantissa = ConvertBigNumToDouble(Item.val.expAndMantissa.Mantissa.bigNum);
+ *pValue = dMantissa * exp2((double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
case QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM:
- if(uOptions & QCBOR_DECODE_TYPE_DECIMAL_FRACTION) {
- int64_t nMantissa;
- pMe->uLastError = ConvertNegativeBigNumToSigned(Item.val.expAndMantissa.Mantissa.bigNum, &nMantissa);
- if(!pMe->uLastError) {
- pMe->uLastError = Exponentitate2(nMantissa,
- Item.val.expAndMantissa.nExponent,
- pValue);
- }
+ if(uOptions & QCBOR_CONVERT_TYPE_BIGFLOAT) {
+ double dMantissa = -ConvertBigNumToDouble(Item.val.expAndMantissa.Mantissa.bigNum);
+ *pValue = dMantissa * exp2((double)Item.val.expAndMantissa.nExponent);
} else {
- pMe->uLastError = 99; // TODO: error code
+ pMe->uLastError = QCBOR_ERR_CONVERSION_NOT_REQUESTED;
}
break;
}
-
-
-
}
-#endif
diff --git a/test/qcbor_decode_tests.c b/test/qcbor_decode_tests.c
index bd35fde..2030e23 100644
--- a/test/qcbor_decode_tests.c
+++ b/test/qcbor_decode_tests.c
@@ -3557,16 +3557,16 @@
#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
-/*
+/* exponent, mantissa
[
4([-1, 3]),
- 4([-20, 4759477275222530853136]),
- 4([9223372036854775807, -4759477275222530853137]),
+ 4([-20, 4759477275222530853136]),
+ 4([9223372036854775807, -4759477275222530853137]),
5([300, 100]),
- 5([-20, 4759477275222530853136]),
+ 5([-20, 4759477275222530853136]),
5([-9223372036854775807, -4759477275222530853137])
- 5([9223372036854775806, -4759477275222530853137])
- 5([9223372036854775806, 9223372036854775806])]
+ 5([ 9223372036854775806, -4759477275222530853137])
+ 5([ 9223372036854775806, 9223372036854775806])]
]
*/
@@ -3584,6 +3584,8 @@
0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
+ 0xC5, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
+ 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE
};
@@ -3654,33 +3656,45 @@
return 10;
}
+ // 5([-20, 4759477275222530853136]),
nCBORError = QCBORDecode_GetNext(&DC, &item);
if(nCBORError != QCBOR_SUCCESS) {
return 11;
}
-
if(item.uDataType != QCBOR_TYPE_BIGFLOAT_POS_BIGNUM ||
item.val.expAndMantissa.nExponent != -20 ||
UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
return 12;
}
+ // 5([-9223372036854775807, -4759477275222530853137])
nCBORError = QCBORDecode_GetNext(&DC, &item);
if(nCBORError != QCBOR_SUCCESS) {
return 13;
}
-
if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
item.val.expAndMantissa.nExponent != -9223372036854775807 ||
UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
return 14;
}
+ // 5([ 9223372036854775806, -4759477275222530853137])
+ nCBORError = QCBORDecode_GetNext(&DC, &item);
+ if(nCBORError != QCBOR_SUCCESS) {
+ return 13;
+ }
+ if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
+ item.val.expAndMantissa.nExponent != 9223372036854775806 ||
+ UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
+ return 14;
+ }
+
+
+ // 5([ 9223372036854775806, 9223372036854775806])]
nCBORError = QCBORDecode_GetNext(&DC, &item);
if(nCBORError != QCBOR_SUCCESS) {
return 15;
}
-
if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
item.val.expAndMantissa.nExponent != 9223372036854775806 ||
item.val.expAndMantissa.Mantissa.nInt!= 9223372036854775806 ) {
@@ -3937,7 +3951,7 @@
QCBORDecodeContext DCtx;
QCBORError nCBORError;
- /*
+ /* exponent, mantissa
[
4([-1, 3]),
4([-20, 4759477275222530853136]),
@@ -3945,8 +3959,8 @@
5([300, 100]),
5([-20, 4759477275222530853136]),
5([-9223372036854775807, -4759477275222530853137])
- 5([9223372036854775806, -4759477275222530853137])
- 5([9223372036854775806, 9223372036854775806])]
+ 5([ 9223372036854775806, -4759477275222530853137])
+ 5([ 9223372036854775806, 9223372036854775806])]
]
*/
@@ -3959,37 +3973,186 @@
}
int64_t integer;
- QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
- if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
- return -2;
- }
-
- DCtx.uLastError = 0; // TODO: a method for this
-
+ // 4([-1, 3]),
QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
return -2;
}
DCtx.uLastError = 0; // TODO: a method for this
+ // 4([-20, 4759477275222530853136]),
QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
return -2;
}
DCtx.uLastError = 0; // TODO: a method for this
+ // 4([9223372036854775807, -4759477275222530853137]),
+ QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([300, 100]),
QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
return -2;
}
DCtx.uLastError = 0; // TODO: a method for this
+ // 5([-20, 4759477275222530853136]),
QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
return -2;
}
DCtx.uLastError = 0; // TODO: a method for this
+ // 5([-9223372036854775807, -4759477275222530853137])
+ QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([ 9223372036854775806, -4759477275222530853137])
+ QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([ 9223372036854775806, 9223372036854775806])]
+ QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+
+
+ QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), 0);
+
+ nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(nCBORError) {
+ return -1;
+ }
+
+ uint64_t uinteger;
+ // 4([-1, 3]),
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 4([-20, 4759477275222530853136]),
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 4([9223372036854775807, -4759477275222530853137]),
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([300, 100]),
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([-20, 4759477275222530853136]),
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([-9223372036854775807, -4759477275222530853137])
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([ 9223372036854775806, -4759477275222530853137])
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+ // 5([ 9223372036854775806, 9223372036854775806])]
+ QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
+ return -2;
+ }
+ DCtx.uLastError = 0; // TODO: a method for this
+
+
+
+ QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), 0);
+ nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(nCBORError) {
+ return -1;
+ }
+
+ double dResult;
+ // 4([-1, 3]),
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != 0.3) {
+ return -2;
+ }
+
+ // 4([-20, 4759477275222530853136]),
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != 47.408855671161923) {
+ return -2;
+ }
+
+ // 4([9223372036854775807, -4759477275222530853137]),
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != -INFINITY) {
+ return -2;
+ }
+
+ // 5([300, 100]),
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != -INFINITY) {
+ return -2;
+ }
+
+ // 5([-20, 4759477275222530853136]),
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != 4521260802379792.0) {
+ return -2;
+ }
+
+ // 5([-9223372036854775807, -4759477275222530853137])
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != -0.0) {
+ return -2;
+ }
+
+ // 5([9223372036854775806, 9223372036854775806])]
+ QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
+ if(QCBORDecode_GetLastError(&DCtx) != QCBOR_SUCCESS &&
+ dResult != INFINITY) {
+ return -2;
+ }
+
return 0;
}