static int json_parse_number(const unsigned char **ucp, const unsigned char *ue) { const unsigned char *uc = *ucp; int got = 0; DPRINTF("Parse number: ", uc, *ucp); if (uc == ue) return 0; if (*uc == '-') uc++; for (; uc < ue; uc++) { if (!json_isdigit(*uc)) break; got = 1; } if (uc == ue) goto out; if (*uc == '.') uc++; for (; uc < ue; uc++) { if (!json_isdigit(*uc)) break; got = 1; } if (uc == ue) goto out; if (got && (*uc == 'e' || *uc == 'E')) { uc++; got = 0; if (uc == ue) goto out; if (*uc == '+' || *uc == '-') uc++; for (; uc < ue; uc++) { if (!json_isdigit(*uc)) break; got = 1; } } out: if (!got) DPRINTF("Bad number: ", uc, *ucp); else DPRINTF("Good number: ", uc, *ucp); *ucp = uc; return got; }
static json_t *parse_value(stream_t *stream, size_t flags, json_error_t *error) { json_t *result = NULL; char *string; int c = stream_peek(stream); switch (c) { case 'd': result = parse_dict(stream, flags, error); break; case 'l': result = parse_list(stream, flags, error); break; case 'i': stream_getc(stream); result = parse_integer(stream, flags, error); break; case EOF: error_set(error, stream, "unexpected EOF"); break; default: if (json_isdigit(c)) { string = parse_string(stream, flags, error); if (string) { result = json_string_nocheck(string); jsonp_free(string); } } else { error_set(error, stream, "invalid character: %c", c); } } return result; }
static int validate_number(stream_t *stream, json_error_t *error) { /* strtol functions allow extra spaces before the number */ int c = stream_peek(stream); if (c != '-' && !json_isdigit(c)) { error_set(error, stream, "invalid number: %c", c); return -1; } return 0; }
static int json_isxdigit(unsigned char uc) { if (json_isdigit(uc)) return 1; switch (uc) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': return 1; default: return 0; } }