CJsonNode CJsonNode::GuessType(const CTempString& value) { const char* ch = value.begin(); const char* end = value.end(); switch (*ch) { case '"': case '\'': return NewStringNode(NStr::ParseQuoted(value)); case '-': if (++ch >= end || !isdigit(*ch)) return NewStringNode(value); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': do if (++ch >= end) return NewIntegerNode(NStr::StringToInt8(value)); while (isdigit(*ch)); switch (*ch) { case '.': if (++ch == end || !isdigit(*ch)) return NewStringNode(value); for (;;) { if (++ch == end) return NewDoubleNode(NStr::StringToDouble(value)); if (!isdigit(*ch)) { if (*ch == 'E' || *ch == 'e') break; return NewStringNode(value); } } /* FALL THROUGH */ case 'E': case 'e': if (++ch < end && (*ch == '-' || *ch == '+' ? ++ch < end && isdigit(*ch) : isdigit(*ch))) do if (++ch == end) return NewDoubleNode(NStr::StringToDouble(value)); while (isdigit(*ch)); /* FALL THROUGH */ default: return NewStringNode(value); } } return NStr::CompareNocase(value, "false") == 0 ? NewBooleanNode(false) : NStr::CompareNocase(value, "true") == 0 ? NewBooleanNode(true) : NStr::CompareNocase(value, "none") == 0 ? NewNullNode() : NewStringNode(value); }
static bool IsInteger(const CTempString& value) { if (value.empty()) return false; const char* digit = value.end(); while (--digit > value.begin()) if (!isdigit(*digit)) return false; return isdigit(*digit) || (*digit == '-' && value.length() > 1); }