︙ | | |
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
-
-
+
+
-
+
-
-
+
-
|
#import "OFNumber.h"
#import "OFNull.h"
#import "OFInvalidJSONException.h"
int _OFString_JSONValue_reference;
static id nextObject(const char *restrict *, const char*,
size_t *restrict line, size_t depth, size_t depthLimit);
static id nextObject(const char **pointer, const char *stop, size_t *line,
size_t depth, size_t depthLimit);
static void
skipWhitespaces(const char *restrict *pointer, const char *stop,
skipWhitespaces(const char **pointer, const char *stop, size_t *line)
size_t *restrict line)
{
while (*pointer < stop && (**pointer == ' ' || **pointer == '\t' ||
**pointer == '\r' || **pointer == '\n')) {
if (**pointer == '\n')
(*line)++;
(*pointer)++;
}
}
static void
skipComment(const char *restrict *pointer, const char *stop,
skipComment(const char **pointer, const char *stop, size_t *line)
size_t *restrict line)
{
if (**pointer != '/')
return;
if (*pointer + 1 >= stop)
return;
|
︙ | | |
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
-
+
-
|
(*pointer)++;
}
} else
(*pointer)--;
}
static void
skipWhitespacesAndComments(const char *restrict *pointer, const char *stop,
skipWhitespacesAndComments(const char **pointer, const char *stop, size_t *line)
size_t *restrict line)
{
const char *old = NULL;
while (old != *pointer) {
old = *pointer;
skipWhitespaces(pointer, stop, line);
|
︙ | | |
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
-
+
-
|
if (ret == 0)
return 0xFFFF;
return ret;
}
static inline OFString*
parseString(const char *restrict *pointer, const char *stop,
parseString(const char **pointer, const char *stop, size_t *line)
size_t *restrict line)
{
char *buffer;
size_t i = 0;
char delimiter = **pointer;
if (++(*pointer) + 1 >= stop)
return nil;
|
︙ | | |
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
|
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
-
+
|
}
free(buffer);
return nil;
}
static inline OFString*
parseIdentifier(const char *restrict *pointer, const char *stop)
parseIdentifier(const char **pointer, const char *stop)
{
char *buffer;
size_t i = 0;
if ((buffer = malloc(stop - *pointer)) == NULL)
return nil;
|
︙ | | |
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
|
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
-
-
+
+
|
* It is never possible to end with an identifier, thus we should never
* reach stop.
*/
return nil;
}
static inline OFMutableArray*
parseArray(const char *restrict *pointer, const char *stop,
size_t *restrict line, size_t depth, size_t depthLimit)
parseArray(const char **pointer, const char *stop, size_t *line,
size_t depth, size_t depthLimit)
{
OFMutableArray *array = [OFMutableArray array];
if (++(*pointer) >= stop)
return nil;
if (++depth > depthLimit)
|
︙ | | |
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
|
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
-
-
+
+
|
(*pointer)++;
return array;
}
static inline OFMutableDictionary*
parseDictionary(const char *restrict *pointer, const char *stop,
size_t *restrict line, size_t depth, size_t depthLimit)
parseDictionary(const char **pointer, const char *stop, size_t *line,
size_t depth, size_t depthLimit)
{
OFMutableDictionary *dictionary = [OFMutableDictionary dictionary];
if (++(*pointer) >= stop)
return nil;
if (++depth > depthLimit)
|
︙ | | |
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
|
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
|
-
+
-
|
(*pointer)++;
return dictionary;
}
static inline OFNumber*
parseNumber(const char *restrict *pointer, const char *stop,
parseNumber(const char **pointer, const char *stop, size_t *line)
size_t *restrict line)
{
bool isHex = (*pointer + 1 < stop && (*pointer)[1] == 'x');
bool hasDecimal = false;
size_t i;
OFString *string;
OFNumber *number;
|
︙ | | |
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
|
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
|
-
-
+
+
|
[string release];
}
return number;
}
static id
nextObject(const char *restrict *pointer, const char *stop,
size_t *restrict line, size_t depth, size_t depthLimit)
nextObject(const char **pointer, const char *stop, size_t *line,
size_t depth, size_t depthLimit)
{
skipWhitespacesAndComments(pointer, stop, line);
if (*pointer >= stop)
return nil;
switch (**pointer) {
|
︙ | | |