Added support for NaN and infinity in JsonBuilder in double and ascii number interfaces.

This commit is contained in:
Stephen Atherton 2018-09-10 13:28:31 -07:00
parent 9febc01106
commit 4753172991
3 changed files with 31 additions and 1 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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"));