Change the underlying type of JSON integer from long to json_int_t
json_int_t is typedef'd to long long if it's supported, or long otherwise. There's also some supporting things, like the JSON_INTEGER_FORMAT macro that expands to the printf() conversion specifier that corresponds to json_int_t's actual type. This is a backwards incompatible change.
This commit is contained in:
27
src/load.c
27
src/load.c
@@ -52,7 +52,7 @@ typedef struct {
|
||||
int line, column;
|
||||
union {
|
||||
char *string;
|
||||
long integer;
|
||||
json_int_t integer;
|
||||
double real;
|
||||
} value;
|
||||
} lex_t;
|
||||
@@ -401,6 +401,12 @@ out:
|
||||
free(lex->value.string);
|
||||
}
|
||||
|
||||
#ifdef JSON_INTEGER_IS_LONG_LONG
|
||||
#define json_strtoint strtoll
|
||||
#else
|
||||
#define json_strtoint strtol
|
||||
#endif
|
||||
|
||||
static int lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
{
|
||||
const char *saved_text;
|
||||
@@ -430,23 +436,24 @@ static int lex_scan_number(lex_t *lex, char c, json_error_t *error)
|
||||
}
|
||||
|
||||
if(c != '.' && c != 'E' && c != 'e') {
|
||||
long value;
|
||||
json_int_t value;
|
||||
|
||||
lex_unget_unsave(lex, c);
|
||||
|
||||
saved_text = strbuffer_value(&lex->saved_text);
|
||||
value = strtol(saved_text, &end, 10);
|
||||
assert(end == saved_text + lex->saved_text.length);
|
||||
|
||||
if(value == LONG_MAX && errno == ERANGE) {
|
||||
error_set(error, lex, "too big integer");
|
||||
goto out;
|
||||
}
|
||||
else if(value == LONG_MIN && errno == ERANGE) {
|
||||
error_set(error, lex, "too big negative integer");
|
||||
errno = 0;
|
||||
value = json_strtoint(saved_text, &end, 10);
|
||||
if(errno == ERANGE) {
|
||||
if(value < 0)
|
||||
error_set(error, lex, "too big negative integer");
|
||||
else
|
||||
error_set(error, lex, "too big integer");
|
||||
goto out;
|
||||
}
|
||||
|
||||
assert(end == saved_text + lex->saved_text.length);
|
||||
|
||||
lex->token = TOKEN_INTEGER;
|
||||
lex->value.integer = value;
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user