Fix support for other simple types and floating point
Again a silly mistake in sign-extension of (char)0xff to -1.
Signed-off-by: Thiago Macieira <thiago.macieira@intel.com>
diff --git a/src/cborparser.c b/src/cborparser.c
index 6825698..a3883ba 100644
--- a/src/cborparser.c
+++ b/src/cborparser.c
@@ -169,7 +169,9 @@
switch (descriptor) {
case FalseValue:
it->extra = false;
- // fall through
+ type = CborBooleanType;
+ break;
+
case TrueValue:
case NullValue:
case UndefinedValue:
@@ -180,11 +182,12 @@
break;
case SimpleTypeInNextByte:
- it->extra = it->ptr[1];
#ifndef CBOR_PARSER_NO_STRICT_CHECKS
- if (it->extra < 32)
+ if ((unsigned char)it->ptr[1] < 32)
return CborErrorIllegalSimpleType;
#endif
+ break;
+
case 28:
case 29:
case 30:
diff --git a/tests/parser/tst_parser.cpp b/tests/parser/tst_parser.cpp
index e648dbe..a632c7b 100644
--- a/tests/parser/tst_parser.cpp
+++ b/tests/parser/tst_parser.cpp
@@ -207,15 +207,20 @@
} else {
cbor_value_get_double(it, &val);
}
- *parsed += QString::number(val);
- if (type == CborFloatType)
- *parsed += 'f';
+ QString number = QString::number(val, 'g', 10);
+ *parsed += number;
+ if (number != "inf" && number != "-inf" && number != "nan") {
+ if (!number.contains('.'))
+ *parsed += '.';
+ if (type == CborFloatType)
+ *parsed += 'f';
+ }
break;
}
case CborHalfFloatType: {
uint16_t val;
cbor_value_get_half_float(it, &val);
- *parsed += QString("__f16(%0)").arg(val, 4, 16, QLatin1Char('0'));
+ *parsed += QString("__f16(0x%0)").arg(val, 4, 16, QLatin1Char('0'));
break;
}
@@ -299,6 +304,36 @@
QTest::newRow("-1*2") << raw("\x39\x00\x00") << "-1";
QTest::newRow("-1*4") << raw("\x3a\0\0\0\0") << "-1";
QTest::newRow("-1*8") << raw("\x3b\0\0\0\0\0\0\0\0") << "-1";
+
+ QTest::newRow("simple0") << raw("\xe0") << "simple(0)";
+ QTest::newRow("simple19") << raw("\xf3") << "simple(19)";
+ QTest::newRow("false") << raw("\xf4") << "false";
+ QTest::newRow("true") << raw("\xf5") << "true";
+ QTest::newRow("null") << raw("\xf6") << "null";
+ QTest::newRow("undefined") << raw("\xf7") << "undefined";
+ QTest::newRow("simple32") << raw("\xf8\x20") << "simple(32)";
+ QTest::newRow("simple255") << raw("\xf8\xff") << "simple(255)";
+
+ // floating point
+ QTest::newRow("0f16") << raw("\xf9\0\0") << "__f16(0x0000)";
+
+ QTest::newRow("0.f") << raw("\xfa\0\0\0\0") << "0.f";
+ QTest::newRow("0.") << raw("\xfb\0\0\0\0\0\0\0\0") << "0.";
+ QTest::newRow("-1.f") << raw("\xfa\xbf\x80\0\0") << "-1.f";
+ QTest::newRow("-1.") << raw("\xfb\xbf\xf0\0\0\0\0\0\0") << "-1.";
+ QTest::newRow("16777215.f") << raw("\xfa\x4b\x7f\xff\xff") << "16777215.f";
+ QTest::newRow("16777215.") << raw("\xfb\x41\x6f\xff\xff\xe0\0\0\0") << "16777215.";
+ QTest::newRow("-16777215.f") << raw("\xfa\xcb\x7f\xff\xff") << "-16777215.f";
+ QTest::newRow("-16777215.") << raw("\xfb\xc1\x6f\xff\xff\xe0\0\0\0") << "-16777215.";
+
+ QTest::newRow("qnan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
+ QTest::newRow("qnan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
+ QTest::newRow("qnan_f") << raw("\xfa\x7f\xc0\0\0") << "nan";
+ QTest::newRow("snan") << raw("\xfb\x7f\xf8\0\0\0\0\0\0") << "nan";
+ QTest::newRow("-inf_f") << raw("\xfa\xff\x80\0\0") << "-inf";
+ QTest::newRow("-inf") << raw("\xfb\xff\xf0\0\0\0\0\0\0") << "-inf";
+ QTest::newRow("+inf_f") << raw("\xfa\x7f\x80\0\0") << "inf";
+ QTest::newRow("+inf") << raw("\xfb\x7f\xf0\0\0\0\0\0\0") << "inf";
}
void tst_Parser::fixed()