Separate integers and real numbers
[jansson.git] / src / load.c
index 14022ca..9317521 100644 (file)
 #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;
@@ -27,7 +28,8 @@ typedef struct {
     int line, column;
     union {
         char *string;
-        double number;
+        int integer;
+        double real;
     } value;
 } json_lex;
 
@@ -63,7 +65,10 @@ static void json_set_error(json_error_t *error, const json_lex *lex,
         }
     }
     else
-        snprintf(error->text, JSON_ERROR_TEXT_LENGTH, "%s", msg);
+    {
+        error->line = -1;
+        snprintf(error->text, JSON_ERROR_TEXT_LENGTH, "%s", text);
+    }
 }
 
 
@@ -173,7 +178,16 @@ static void json_scan_number(json_lex *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;
@@ -194,9 +208,9 @@ static void json_scan_number(json_lex *lex)
             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:
@@ -356,25 +370,27 @@ static json_t *json_parse_array(json_lex *lex, json_error_t *error)
         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;
@@ -397,8 +413,13 @@ static json_t *json_parse(json_lex *lex, json_error_t *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;
         }
 
@@ -494,7 +515,8 @@ json_t *json_loadf(FILE *input, json_error_t *error)
     size_t length;
     json_t *result = NULL;
 
-    strbuffer_init(&strbuff);
+    if(strbuffer_init(&strbuff))
+      return NULL;
 
     while(1)
     {
@@ -526,7 +548,8 @@ json_t *json_loadfd(int fd, json_error_t *error)
     ssize_t length;
     json_t *result = NULL;
 
-    strbuffer_init(&strbuff);
+    if(strbuffer_init(&strbuff))
+      return NULL;
 
     while(1)
     {