From e8897609b736af440de101fa851b798c8092f19a Mon Sep 17 00:00:00 2001 From: Felix Van der Jeugt Date: Thu, 3 Nov 2022 08:23:02 +0100 Subject: [PATCH] add json parsing of booleans and numbers --- json.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/json.c b/json.c index 92ad903..7feb50b 100644 --- a/json.c +++ b/json.c @@ -6,9 +6,63 @@ #include "sortedmap.h" #include "arraylist.h" -/* TODO */ -Json * parse_map(FILE *stream) { return NULL; /* TODO */ } -Json * parse_list(FILE *stream) { return NULL; /* TODO */ } +Json * parse_true(FILE *stream) { + Json * json; + 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) { int i = 0, cap = 10; @@ -42,9 +96,8 @@ Json * parse_string(FILE *stream) { return NULL; } -Json * parse_true(FILE *stream) { return NULL; /* TODO */ } -Json * parse_false(FILE *stream) { return NULL; /* TODO */ } -Json * parse_number(FILE *stream, char first) { return NULL; /* TODO */ } +Json * parse_list(FILE *stream) { return NULL; /* TODO */ } +Json * parse_map(FILE *stream) { return NULL; /* TODO */ } Json * json_parse(FILE *stream) { char c; @@ -71,7 +124,8 @@ Json * json_parse(FILE *stream) { case '7': case '8': case '9': - return parse_number(stream, c); + ungetc(c, stream); + return parse_number(stream); case ' ': case '\n': case '\t':