add json parsing of booleans and numbers
This commit is contained in:
parent
a13c6ecb3a
commit
e8897609b7
68
json.c
68
json.c
@ -6,9 +6,63 @@
|
|||||||
#include "sortedmap.h"
|
#include "sortedmap.h"
|
||||||
#include "arraylist.h"
|
#include "arraylist.h"
|
||||||
|
|
||||||
/* TODO */
|
Json * parse_true(FILE *stream) {
|
||||||
Json * parse_map(FILE *stream) { return NULL; /* TODO */ }
|
Json * json;
|
||||||
Json * parse_list(FILE *stream) { return NULL; /* TODO */ }
|
if (getc(stream) == 'r' && getc(stream) == 'u' && getc(stream) == 'e') {
|
||||||
|
json = malloc(sizeof(Json));
|
||||||
|
json->type = BOOLEAN;
|
||||||
|
json->value.boolean = 1;
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Json * parse_false(FILE *stream) {
|
||||||
|
Json * json;
|
||||||
|
if (getc(stream) == 'a' && getc(stream) == 'l' && getc(stream) == 's' && getc(stream) == 'e') {
|
||||||
|
json = malloc(sizeof(Json));
|
||||||
|
json->type = BOOLEAN;
|
||||||
|
json->value.boolean = 0;
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Json * parse_number(FILE *stream) {
|
||||||
|
Json * json;
|
||||||
|
long num = 0, den = 0;
|
||||||
|
char c;
|
||||||
|
while (1) {
|
||||||
|
c = getc(stream);
|
||||||
|
switch(c) {
|
||||||
|
case '0':
|
||||||
|
num = num * 10;
|
||||||
|
den *= 10;
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
num = num * 10 + (c - '1' + 1);
|
||||||
|
den *= 10;
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
den = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (c != EOF) ungetc(c, stream);
|
||||||
|
json = malloc(sizeof(Json));
|
||||||
|
json->type = NUMBER;
|
||||||
|
json->value.number = num * 1.0 / den;
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Json * parse_string(FILE *stream) {
|
Json * parse_string(FILE *stream) {
|
||||||
int i = 0, cap = 10;
|
int i = 0, cap = 10;
|
||||||
@ -42,9 +96,8 @@ Json * parse_string(FILE *stream) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json * parse_true(FILE *stream) { return NULL; /* TODO */ }
|
Json * parse_list(FILE *stream) { return NULL; /* TODO */ }
|
||||||
Json * parse_false(FILE *stream) { return NULL; /* TODO */ }
|
Json * parse_map(FILE *stream) { return NULL; /* TODO */ }
|
||||||
Json * parse_number(FILE *stream, char first) { return NULL; /* TODO */ }
|
|
||||||
|
|
||||||
Json * json_parse(FILE *stream) {
|
Json * json_parse(FILE *stream) {
|
||||||
char c;
|
char c;
|
||||||
@ -71,7 +124,8 @@ Json * json_parse(FILE *stream) {
|
|||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
return parse_number(stream, c);
|
ungetc(c, stream);
|
||||||
|
return parse_number(stream);
|
||||||
case ' ':
|
case ' ':
|
||||||
case '\n':
|
case '\n':
|
||||||
case '\t':
|
case '\t':
|
||||||
|
Loading…
Reference in New Issue
Block a user