Add spec file
[jansson.git] / src / load.c
1 /*
2  * Copyright (c) 2009-2011 Petri Lehtinen <petri@digip.org>
3  *
4  * Jansson is free software; you can redistribute it and/or modify
5  * it under the terms of the MIT license. See LICENSE for details.
6  */
7
8 #define _GNU_SOURCE
9 #include <ctype.h>
10 #include <errno.h>
11 #include <limits.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <assert.h>
16
17 #include <jansson.h>
18 #include "jansson_private.h"
19 #include "strbuffer.h"
20 #include "utf.h"
21
22 #define STREAM_STATE_OK        0
23 #define STREAM_STATE_EOF      -1
24 #define STREAM_STATE_ERROR    -2
25
26 #define TOKEN_INVALID         -1
27 #define TOKEN_EOF              0
28 #define TOKEN_STRING         256
29 #define TOKEN_INTEGER        257
30 #define TOKEN_REAL           258
31 #define TOKEN_TRUE           259
32 #define TOKEN_FALSE          260
33 #define TOKEN_NULL           261
34
35 /* Read one byte from stream, convert to unsigned char, then int, and
36    return. return EOF on end of file. This corresponds to the
37    behaviour of fgetc(). */
38 typedef int (*get_func)(void *data);
39
40 typedef struct {
41     get_func get;
42     void *data;
43     char buffer[5];
44     int buffer_pos;
45     int state;
46     int line;
47     int column, last_column;
48     size_t position;
49 } stream_t;
50
51 typedef struct {
52     stream_t stream;
53     strbuffer_t saved_text;
54     int token;
55     union {
56         char *string;
57         json_int_t integer;
58         double real;
59     } value;
60 } lex_t;
61
62 #define stream_to_lex(stream) container_of(stream, lex_t, stream)
63
64
65 /*** error reporting ***/
66
67 static void error_set(json_error_t *error, const lex_t *lex,
68                       const char *msg, ...)
69 {
70     va_list ap;
71     char msg_text[JSON_ERROR_TEXT_LENGTH];
72
73     int line = -1, col = -1;
74     size_t pos = 0;
75     const char *result = msg_text;
76
77     if(!error)
78         return;
79
80     va_start(ap, msg);
81     vsnprintf(msg_text, JSON_ERROR_TEXT_LENGTH, msg, ap);
82     va_end(ap);
83
84     if(lex)
85     {
86         const char *saved_text = strbuffer_value(&lex->saved_text);
87         char msg_with_context[JSON_ERROR_TEXT_LENGTH];
88
89         line = lex->stream.line;
90         col = lex->stream.column;
91         pos = lex->stream.position;
92
93         if(saved_text && saved_text[0])
94         {
95             if(lex->saved_text.length <= 20) {
96                 snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH,
97                          "%s near '%s'", msg_text, saved_text);
98                 result = msg_with_context;
99             }
100         }
101         else
102         {
103             if(lex->stream.state == STREAM_STATE_ERROR) {
104                 /* No context for UTF-8 decoding errors */
105                 result = msg_text;
106             }
107             else {
108                 snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH,
109                          "%s near end of file", msg_text);
110                 result = msg_with_context;
111             }
112         }
113     }
114
115     jsonp_error_set(error, line, col, pos, "%s", result);
116 }
117
118
119 /*** lexical analyzer ***/
120
121 static void
122 stream_init(stream_t *stream, get_func get, void *data)
123 {
124     stream->get = get;
125     stream->data = data;
126     stream->buffer[0] = '\0';
127     stream->buffer_pos = 0;
128
129     stream->state = STREAM_STATE_OK;
130     stream->line = 1;
131     stream->column = 0;
132     stream->position = 0;
133 }
134
135 static int stream_get(stream_t *stream, json_error_t *error)
136 {
137     int c;
138
139     if(stream->state != STREAM_STATE_OK)
140         return stream->state;
141
142     if(!stream->buffer[stream->buffer_pos])
143     {
144         c = stream->get(stream->data);
145         if(c == EOF) {
146             stream->state = STREAM_STATE_EOF;
147             return STREAM_STATE_EOF;
148         }
149
150         stream->buffer[0] = c;
151         stream->buffer_pos = 0;
152
153         if(0x80 <= c && c <= 0xFF)
154         {
155             /* multi-byte UTF-8 sequence */
156             int i, count;
157
158             count = utf8_check_first(c);
159             if(!count)
160                 goto out;
161
162             assert(count >= 2);
163
164             for(i = 1; i < count; i++)
165                 stream->buffer[i] = stream->get(stream->data);
166
167             if(!utf8_check_full(stream->buffer, count, NULL))
168                 goto out;
169
170             stream->buffer[count] = '\0';
171         }
172         else
173             stream->buffer[1] = '\0';
174     }
175
176     c = stream->buffer[stream->buffer_pos++];
177
178     stream->position++;
179     if(c == '\n') {
180         stream->line++;
181         stream->last_column = stream->column;
182         stream->column = 0;
183     }
184     else if(utf8_check_first(c)) {
185         /* track the Unicode character column, so increment only if
186            this is the first character of a UTF-8 sequence */
187         stream->column++;
188     }
189
190     return c;
191
192 out:
193     stream->state = STREAM_STATE_ERROR;
194     error_set(error, stream_to_lex(stream), "unable to decode byte 0x%x", c);
195     return STREAM_STATE_ERROR;
196 }
197
198 static void stream_unget(stream_t *stream, int c)
199 {
200     if(c == STREAM_STATE_EOF || c == STREAM_STATE_ERROR)
201         return;
202
203     stream->position--;
204     if(c == '\n') {
205         stream->line--;
206         stream->column = stream->last_column;
207     }
208     else if(utf8_check_first(c))
209         stream->column--;
210
211     assert(stream->buffer_pos > 0);
212     stream->buffer_pos--;
213     assert(stream->buffer[stream->buffer_pos] == c);
214 }
215
216
217 static int lex_get(lex_t *lex, json_error_t *error)
218 {
219     return stream_get(&lex->stream, error);
220 }
221
222 static void lex_save(lex_t *lex, int c)
223 {
224     strbuffer_append_byte(&lex->saved_text, c);
225 }
226
227 static int lex_get_save(lex_t *lex, json_error_t *error)
228 {
229     int c = stream_get(&lex->stream, error);
230     if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR)
231         lex_save(lex, c);
232     return c;
233 }
234
235 static void lex_unget(lex_t *lex, int c)
236 {
237     stream_unget(&lex->stream, c);
238 }
239
240 static void lex_unget_unsave(lex_t *lex, int c)
241 {
242     if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR) {
243         char d;
244         stream_unget(&lex->stream, c);
245         d = strbuffer_pop(&lex->saved_text);
246         assert(c == d);
247     }
248 }
249
250 static void lex_save_cached(lex_t *lex)
251 {
252     while(lex->stream.buffer[lex->stream.buffer_pos] != '\0')
253     {
254         lex_save(lex, lex->stream.buffer[lex->stream.buffer_pos]);
255         lex->stream.buffer_pos++;
256         lex->stream.position++;
257     }
258 }
259
260 /* assumes that str points to 'u' plus at least 4 valid hex digits */
261 static int32_t decode_unicode_escape(const char *str)
262 {
263     int i;
264     int32_t value = 0;
265
266     assert(str[0] == 'u');
267
268     for(i = 1; i <= 4; i++) {
269         char c = str[i];
270         value <<= 4;
271         if(isdigit(c))
272             value += c - '0';
273         else if(islower(c))
274             value += c - 'a' + 10;
275         else if(isupper(c))
276             value += c - 'A' + 10;
277         else
278             assert(0);
279     }
280
281     return value;
282 }
283
284 static void lex_scan_string(lex_t *lex, json_error_t *error)
285 {
286     int c;
287     const char *p;
288     char *t;
289     int i;
290
291     lex->value.string = NULL;
292     lex->token = TOKEN_INVALID;
293
294     c = lex_get_save(lex, error);
295
296     while(c != '"') {
297         if(c == STREAM_STATE_ERROR)
298             goto out;
299
300         else if(c == STREAM_STATE_EOF) {
301             error_set(error, lex, "premature end of input");
302             goto out;
303         }
304
305         else if(0 <= c && c <= 0x1F) {
306             /* control character */
307             lex_unget_unsave(lex, c);
308             if(c == '\n')
309                 error_set(error, lex, "unexpected newline", c);
310             else
311                 error_set(error, lex, "control character 0x%x", c);
312             goto out;
313         }
314
315         else if(c == '\\') {
316             c = lex_get_save(lex, error);
317             if(c == 'u') {
318                 c = lex_get_save(lex, error);
319                 for(i = 0; i < 4; i++) {
320                     if(!isxdigit(c)) {
321                         error_set(error, lex, "invalid escape");
322                         goto out;
323                     }
324                     c = lex_get_save(lex, error);
325                 }
326             }
327             else if(c == '"' || c == '\\' || c == '/' || c == 'b' ||
328                     c == 'f' || c == 'n' || c == 'r' || c == 't')
329                 c = lex_get_save(lex, error);
330             else {
331                 error_set(error, lex, "invalid escape");
332                 goto out;
333             }
334         }
335         else
336             c = lex_get_save(lex, error);
337     }
338
339     /* the actual value is at most of the same length as the source
340        string, because:
341          - shortcut escapes (e.g. "\t") (length 2) are converted to 1 byte
342          - a single \uXXXX escape (length 6) is converted to at most 3 bytes
343          - two \uXXXX escapes (length 12) forming an UTF-16 surrogate pair
344            are converted to 4 bytes
345     */
346     lex->value.string = jsonp_malloc(lex->saved_text.length + 1);
347     if(!lex->value.string) {
348         /* this is not very nice, since TOKEN_INVALID is returned */
349         goto out;
350     }
351
352     /* the target */
353     t = lex->value.string;
354
355     /* + 1 to skip the " */
356     p = strbuffer_value(&lex->saved_text) + 1;
357
358     while(*p != '"') {
359         if(*p == '\\') {
360             p++;
361             if(*p == 'u') {
362                 char buffer[4];
363                 int length;
364                 int32_t value;
365
366                 value = decode_unicode_escape(p);
367                 p += 5;
368
369                 if(0xD800 <= value && value <= 0xDBFF) {
370                     /* surrogate pair */
371                     if(*p == '\\' && *(p + 1) == 'u') {
372                         int32_t value2 = decode_unicode_escape(++p);
373                         p += 5;
374
375                         if(0xDC00 <= value2 && value2 <= 0xDFFF) {
376                             /* valid second surrogate */
377                             value =
378                                 ((value - 0xD800) << 10) +
379                                 (value2 - 0xDC00) +
380                                 0x10000;
381                         }
382                         else {
383                             /* invalid second surrogate */
384                             error_set(error, lex,
385                                       "invalid Unicode '\\u%04X\\u%04X'",
386                                       value, value2);
387                             goto out;
388                         }
389                     }
390                     else {
391                         /* no second surrogate */
392                         error_set(error, lex, "invalid Unicode '\\u%04X'",
393                                   value);
394                         goto out;
395                     }
396                 }
397                 else if(0xDC00 <= value && value <= 0xDFFF) {
398                     error_set(error, lex, "invalid Unicode '\\u%04X'", value);
399                     goto out;
400                 }
401                 else if(value == 0)
402                 {
403                     error_set(error, lex, "\\u0000 is not allowed");
404                     goto out;
405                 }
406
407                 if(utf8_encode(value, buffer, &length))
408                     assert(0);
409
410                 memcpy(t, buffer, length);
411                 t += length;
412             }
413             else {
414                 switch(*p) {
415                     case '"': case '\\': case '/':
416                         *t = *p; break;
417                     case 'b': *t = '\b'; break;
418                     case 'f': *t = '\f'; break;
419                     case 'n': *t = '\n'; break;
420                     case 'r': *t = '\r'; break;
421                     case 't': *t = '\t'; break;
422                     default: assert(0);
423                 }
424                 t++;
425                 p++;
426             }
427         }
428         else
429             *(t++) = *(p++);
430     }
431     *t = '\0';
432     lex->token = TOKEN_STRING;
433     return;
434
435 out:
436     jsonp_free(lex->value.string);
437 }
438
439 #if JSON_INTEGER_IS_LONG_LONG
440 #define json_strtoint     strtoll
441 #else
442 #define json_strtoint     strtol
443 #endif
444
445 static int lex_scan_number(lex_t *lex, int c, json_error_t *error)
446 {
447     const char *saved_text;
448     char *end;
449     double value;
450
451     lex->token = TOKEN_INVALID;
452
453     if(c == '-')
454         c = lex_get_save(lex, error);
455
456     if(c == '0') {
457         c = lex_get_save(lex, error);
458         if(isdigit(c)) {
459             lex_unget_unsave(lex, c);
460             goto out;
461         }
462     }
463     else if(isdigit(c)) {
464         c = lex_get_save(lex, error);
465         while(isdigit(c))
466             c = lex_get_save(lex, error);
467     }
468     else {
469         lex_unget_unsave(lex, c);
470         goto out;
471     }
472
473     if(c != '.' && c != 'E' && c != 'e') {
474         json_int_t value;
475
476         lex_unget_unsave(lex, c);
477
478         saved_text = strbuffer_value(&lex->saved_text);
479
480         errno = 0;
481         value = json_strtoint(saved_text, &end, 10);
482         if(errno == ERANGE) {
483             if(value < 0)
484                 error_set(error, lex, "too big negative integer");
485             else
486                 error_set(error, lex, "too big integer");
487             goto out;
488         }
489
490         assert(end == saved_text + lex->saved_text.length);
491
492         lex->token = TOKEN_INTEGER;
493         lex->value.integer = value;
494         return 0;
495     }
496
497     if(c == '.') {
498         c = lex_get(lex, error);
499         if(!isdigit(c)) {
500             lex_unget(lex, c);
501             goto out;
502         }
503         lex_save(lex, c);
504
505         c = lex_get_save(lex, error);
506         while(isdigit(c))
507             c = lex_get_save(lex, error);
508     }
509
510     if(c == 'E' || c == 'e') {
511         c = lex_get_save(lex, error);
512         if(c == '+' || c == '-')
513             c = lex_get_save(lex, error);
514
515         if(!isdigit(c)) {
516             lex_unget_unsave(lex, c);
517             goto out;
518         }
519
520         c = lex_get_save(lex, error);
521         while(isdigit(c))
522             c = lex_get_save(lex, error);
523     }
524
525     lex_unget_unsave(lex, c);
526
527     saved_text = strbuffer_value(&lex->saved_text);
528     value = strtod(saved_text, &end);
529     assert(end == saved_text + lex->saved_text.length);
530
531     if(errno == ERANGE && value != 0) {
532         error_set(error, lex, "real number overflow");
533         goto out;
534     }
535
536     lex->token = TOKEN_REAL;
537     lex->value.real = value;
538     return 0;
539
540 out:
541     return -1;
542 }
543
544 static int lex_scan(lex_t *lex, json_error_t *error)
545 {
546     int c;
547
548     strbuffer_clear(&lex->saved_text);
549
550     if(lex->token == TOKEN_STRING) {
551         jsonp_free(lex->value.string);
552         lex->value.string = NULL;
553     }
554
555     c = lex_get(lex, error);
556     while(c == ' ' || c == '\t' || c == '\n' || c == '\r')
557         c = lex_get(lex, error);
558
559     if(c == STREAM_STATE_EOF) {
560         lex->token = TOKEN_EOF;
561         goto out;
562     }
563
564     if(c == STREAM_STATE_ERROR) {
565         lex->token = TOKEN_INVALID;
566         goto out;
567     }
568
569     lex_save(lex, c);
570
571     if(c == '{' || c == '}' || c == '[' || c == ']' || c == ':' || c == ',')
572         lex->token = c;
573
574     else if(c == '"')
575         lex_scan_string(lex, error);
576
577     else if(isdigit(c) || c == '-') {
578         if(lex_scan_number(lex, c, error))
579             goto out;
580     }
581
582     else if(isupper(c) || islower(c)) {
583         /* eat up the whole identifier for clearer error messages */
584         const char *saved_text;
585
586         c = lex_get_save(lex, error);
587         while(isupper(c) || islower(c))
588             c = lex_get_save(lex, error);
589         lex_unget_unsave(lex, c);
590
591         saved_text = strbuffer_value(&lex->saved_text);
592
593         if(strcmp(saved_text, "true") == 0)
594             lex->token = TOKEN_TRUE;
595         else if(strcmp(saved_text, "false") == 0)
596             lex->token = TOKEN_FALSE;
597         else if(strcmp(saved_text, "null") == 0)
598             lex->token = TOKEN_NULL;
599         else
600             lex->token = TOKEN_INVALID;
601     }
602
603     else {
604         /* save the rest of the input UTF-8 sequence to get an error
605            message of valid UTF-8 */
606         lex_save_cached(lex);
607         lex->token = TOKEN_INVALID;
608     }
609
610 out:
611     return lex->token;
612 }
613
614 static char *lex_steal_string(lex_t *lex)
615 {
616     char *result = NULL;
617     if(lex->token == TOKEN_STRING)
618     {
619         result = lex->value.string;
620         lex->value.string = NULL;
621     }
622     return result;
623 }
624
625 static int lex_init(lex_t *lex, get_func get, void *data)
626 {
627     stream_init(&lex->stream, get, data);
628     if(strbuffer_init(&lex->saved_text))
629         return -1;
630
631     lex->token = TOKEN_INVALID;
632     return 0;
633 }
634
635 static void lex_close(lex_t *lex)
636 {
637     if(lex->token == TOKEN_STRING)
638         jsonp_free(lex->value.string);
639     strbuffer_close(&lex->saved_text);
640 }
641
642
643 /*** parser ***/
644
645 static json_t *parse_value(lex_t *lex, json_error_t *error);
646
647 static json_t *parse_object(lex_t *lex, json_error_t *error)
648 {
649     json_t *object = json_object();
650     if(!object)
651         return NULL;
652
653     lex_scan(lex, error);
654     if(lex->token == '}')
655         return object;
656
657     while(1) {
658         char *key;
659         json_t *value;
660
661         if(lex->token != TOKEN_STRING) {
662             error_set(error, lex, "string or '}' expected");
663             goto error;
664         }
665
666         key = lex_steal_string(lex);
667         if(!key)
668             return NULL;
669
670         lex_scan(lex, error);
671         if(lex->token != ':') {
672             jsonp_free(key);
673             error_set(error, lex, "':' expected");
674             goto error;
675         }
676
677         lex_scan(lex, error);
678         value = parse_value(lex, error);
679         if(!value) {
680             jsonp_free(key);
681             goto error;
682         }
683
684         if(json_object_set_nocheck(object, key, value)) {
685             jsonp_free(key);
686             json_decref(value);
687             goto error;
688         }
689
690         json_decref(value);
691         jsonp_free(key);
692
693         lex_scan(lex, error);
694         if(lex->token != ',')
695             break;
696
697         lex_scan(lex, error);
698     }
699
700     if(lex->token != '}') {
701         error_set(error, lex, "'}' expected");
702         goto error;
703     }
704
705     return object;
706
707 error:
708     json_decref(object);
709     return NULL;
710 }
711
712 static json_t *parse_array(lex_t *lex, json_error_t *error)
713 {
714     json_t *array = json_array();
715     if(!array)
716         return NULL;
717
718     lex_scan(lex, error);
719     if(lex->token == ']')
720         return array;
721
722     while(lex->token) {
723         json_t *elem = parse_value(lex, error);
724         if(!elem)
725             goto error;
726
727         if(json_array_append(array, elem)) {
728             json_decref(elem);
729             goto error;
730         }
731         json_decref(elem);
732
733         lex_scan(lex, error);
734         if(lex->token != ',')
735             break;
736
737         lex_scan(lex, error);
738     }
739
740     if(lex->token != ']') {
741         error_set(error, lex, "']' expected");
742         goto error;
743     }
744
745     return array;
746
747 error:
748     json_decref(array);
749     return NULL;
750 }
751
752 static json_t *parse_value(lex_t *lex, json_error_t *error)
753 {
754     json_t *json;
755
756     switch(lex->token) {
757         case TOKEN_STRING: {
758             json = json_string_nocheck(lex->value.string);
759             break;
760         }
761
762         case TOKEN_INTEGER: {
763             json = json_integer(lex->value.integer);
764             break;
765         }
766
767         case TOKEN_REAL: {
768             json = json_real(lex->value.real);
769             break;
770         }
771
772         case TOKEN_TRUE:
773             json = json_true();
774             break;
775
776         case TOKEN_FALSE:
777             json = json_false();
778             break;
779
780         case TOKEN_NULL:
781             json = json_null();
782             break;
783
784         case '{':
785             json = parse_object(lex, error);
786             break;
787
788         case '[':
789             json = parse_array(lex, error);
790             break;
791
792         case TOKEN_INVALID:
793             error_set(error, lex, "invalid token");
794             return NULL;
795
796         default:
797             error_set(error, lex, "unexpected token");
798             return NULL;
799     }
800
801     if(!json)
802         return NULL;
803
804     return json;
805 }
806
807 static json_t *parse_json(lex_t *lex, json_error_t *error)
808 {
809     lex_scan(lex, error);
810     if(lex->token != '[' && lex->token != '{') {
811         error_set(error, lex, "'[' or '{' expected");
812         return NULL;
813     }
814
815     return parse_value(lex, error);
816 }
817
818 typedef struct
819 {
820     const char *data;
821     int pos;
822 } string_data_t;
823
824 static int string_get(void *data)
825 {
826     char c;
827     string_data_t *stream = (string_data_t *)data;
828     c = stream->data[stream->pos];
829     if(c == '\0')
830         return EOF;
831     else
832     {
833         stream->pos++;
834         return (unsigned char)c;
835     }
836 }
837
838 json_t *json_loads(const char *string, size_t flags, json_error_t *error)
839 {
840     lex_t lex;
841     json_t *result;
842     string_data_t stream_data;
843
844     (void)flags; /* unused */
845
846     stream_data.data = string;
847     stream_data.pos = 0;
848
849     if(lex_init(&lex, string_get, (void *)&stream_data))
850         return NULL;
851
852     jsonp_error_init(error, "<string>");
853
854     result = parse_json(&lex, error);
855     if(!result)
856         goto out;
857
858     lex_scan(&lex, error);
859     if(lex.token != TOKEN_EOF) {
860         error_set(error, &lex, "end of file expected");
861         json_decref(result);
862         result = NULL;
863     }
864
865 out:
866     lex_close(&lex);
867     return result;
868 }
869
870 json_t *json_loadf(FILE *input, size_t flags, json_error_t *error)
871 {
872     lex_t lex;
873     const char *source;
874     json_t *result;
875     (void)flags; /* unused */
876
877     if(lex_init(&lex, (get_func)fgetc, input))
878         return NULL;
879
880     if(input == stdin)
881         source = "<stdin>";
882     else
883         source = "<stream>";
884
885     jsonp_error_init(error, source);
886
887     result = parse_json(&lex, error);
888     if(!result)
889         goto out;
890
891     lex_scan(&lex, error);
892     if(lex.token != TOKEN_EOF) {
893         error_set(error, &lex, "end of file expected");
894         json_decref(result);
895         result = NULL;
896     }
897
898 out:
899     lex_close(&lex);
900     return result;
901 }
902
903 json_t *json_load_file(const char *path, size_t flags, json_error_t *error)
904 {
905     json_t *result;
906     FILE *fp;
907
908     jsonp_error_init(error, path);
909
910     fp = fopen(path, "r");
911     if(!fp)
912     {
913         error_set(error, NULL, "unable to open %s: %s",
914                   path, strerror(errno));
915         return NULL;
916     }
917
918     result = json_loadf(fp, flags, error);
919
920     fclose(fp);
921     return result;
922 }