Added support for NaN and infinity in JsonBuilder in double and ascii number interfaces.
This commit is contained in:
parent
9febc01106
commit
4753172991
|
@ -29,6 +29,16 @@ int JsonBuilder::coerceAsciiNumberToJSON(const char *s, int len, char *dst) {
|
|||
}
|
||||
}
|
||||
|
||||
// 'inf' becomes 1e99
|
||||
if(*s == 'i') {
|
||||
if(len >= 3 && (strncmp(s, "inf", 3) == 0)) {
|
||||
strcpy(wptr, "1e99");
|
||||
return 4 + wptr - dst;
|
||||
}
|
||||
// Anything else starting with 'i' is a failure
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Skip leading zeroes
|
||||
while(*s == '0') {
|
||||
++s;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
#include "flow/flow.h"
|
||||
#include "flow/Trace.h"
|
||||
#include "fdbrpc/JSONDoc.h"
|
||||
|
@ -125,7 +126,15 @@ protected:
|
|||
}
|
||||
|
||||
void writeValue(const double& val) {
|
||||
writeFormat("%g", val);
|
||||
if(std::isfinite(val)) {
|
||||
writeFormat("%g", val);
|
||||
}
|
||||
else if(std::isnan(val)) {
|
||||
write("-999");
|
||||
}
|
||||
else {
|
||||
write("1e99");
|
||||
}
|
||||
}
|
||||
|
||||
bool shouldEscape(char c) {
|
||||
|
|
|
@ -2041,6 +2041,17 @@ TEST_CASE("status/json/builder") {
|
|||
array2.addContents(JsonBuilderArray());
|
||||
ASSERT(checkJson(array2, "[null,1,2,\"test\"]"));
|
||||
|
||||
JsonBuilderObject object3;
|
||||
object3["infinity"] = std::numeric_limits<double>::infinity();
|
||||
object3["nan"] = std::numeric_limits<double>::quiet_NaN();
|
||||
ASSERT(checkJson(object3, "{\"infinity\":1e99,\"nan\":-999}"));
|
||||
|
||||
ASSERT(checkAsciiNumber("inf"));
|
||||
ASSERT(checkAsciiNumber("infA"));
|
||||
ASSERT(checkAsciiNumber("in"));
|
||||
ASSERT(checkAsciiNumber("-inf"));
|
||||
ASSERT(checkAsciiNumber("-infA"));
|
||||
ASSERT(checkAsciiNumber("-in"));
|
||||
ASSERT(checkAsciiNumber("a"));
|
||||
ASSERT(checkAsciiNumber("-1a.0"));
|
||||
ASSERT(checkAsciiNumber("-01a.0"));
|
||||
|
|
Loading…
Reference in New Issue