#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;
}
}
else
- snprintf(error->text, JSON_ERROR_TEXT_LENGTH, "%s", msg);
+ {
+ error->line = -1;
+ snprintf(error->text, JSON_ERROR_TEXT_LENGTH, "%s", text);
+ }
}
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:
return NULL;
json_lex_scan(lex);
- if(lex->token != ']') {
- while(1) {
- json_t *elem = json_parse(lex, error);
- if(!elem)
- goto error;
-
- if(json_array_append(array, elem)) {
- json_decref(elem);
- goto error;
- }
- json_decref(elem);
+ if(lex->token == ']')
+ return array;
- if(lex->token != ',')
- break;
+ while(lex->token) {
+ json_t *elem = json_parse(lex, error);
+ if(!elem)
+ goto error;
- json_lex_scan(lex);
+ if(json_array_append(array, elem)) {
+ json_decref(elem);
+ goto error;
}
+ json_decref(elem);
+
+ if(lex->token != ',')
+ break;
+
+ json_lex_scan(lex);
}
+
if(lex->token != ']') {
json_set_error(error, lex, "']' expected");
goto error;
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)
{