#define JSON_TOKEN_INVALID -1
#define JSON_TOKEN_EOF 0
#define JSON_TOKEN_STRING 256
-#define JSON_TOKEN_NUMBER 257
-#define JSON_TOKEN_TRUE 258
-#define JSON_TOKEN_FALSE 259
-#define JSON_TOKEN_NULL 260
+#define JSON_TOKEN_INTEGER 257
+#define JSON_TOKEN_REAL 258
+#define JSON_TOKEN_TRUE 259
+#define JSON_TOKEN_FALSE 260
+#define JSON_TOKEN_NULL 261
typedef struct {
const char *input;
int line, column;
union {
char *string;
- double number;
+ int integer;
+ double real;
} value;
} json_lex;
p++;
}
- if(*p == '.') {
+ if(*p != '.') {
+ lex->token = JSON_TOKEN_INTEGER;
+
+ lex->value.integer = strtol(lex->start, &end, 10);
+ assert(end == p);
+
+ lex->input = p;
+ return;
+ }
+ else /* *p == '.' */ {
p++;
if(!isdigit(*(p++)))
goto out;
p++;
}
- lex->token = JSON_TOKEN_NUMBER;
+ lex->token = JSON_TOKEN_REAL;
- lex->value.number = strtod(lex->start, &end);
+ lex->value.real = strtod(lex->start, &end);
assert(end == p);
out:
break;
}
- case JSON_TOKEN_NUMBER: {
- json = json_number(lex->value.number);
+ case JSON_TOKEN_INTEGER: {
+ json = json_integer(lex->value.integer);
+ break;
+ }
+
+ case JSON_TOKEN_REAL: {
+ json = json_real(lex->value.real);
break;
}
size_t length;
json_t *result = NULL;
- strbuffer_init(&strbuff);
+ if(strbuffer_init(&strbuff))
+ return NULL;
while(1)
{
ssize_t length;
json_t *result = NULL;
- strbuffer_init(&strbuff);
+ if(strbuffer_init(&strbuff))
+ return NULL;
while(1)
{