add null (NIL) and negative numbers
This commit is contained in:
parent
e8897609b7
commit
7471093f67
33
json.c
33
json.c
@ -6,6 +6,16 @@
|
|||||||
#include "sortedmap.h"
|
#include "sortedmap.h"
|
||||||
#include "arraylist.h"
|
#include "arraylist.h"
|
||||||
|
|
||||||
|
Json * parse_null(FILE *stream) {
|
||||||
|
Json * json;
|
||||||
|
if (getc(stream) == 'u' && getc(stream) == 'l' && getc(stream) == 'l') {
|
||||||
|
json = malloc(sizeof(Json));
|
||||||
|
json->type = NIL;
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Json * parse_true(FILE *stream) {
|
Json * parse_true(FILE *stream) {
|
||||||
Json * json;
|
Json * json;
|
||||||
if (getc(stream) == 'r' && getc(stream) == 'u' && getc(stream) == 'e') {
|
if (getc(stream) == 'r' && getc(stream) == 'u' && getc(stream) == 'e') {
|
||||||
@ -28,7 +38,8 @@ Json * parse_false(FILE *stream) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json * parse_number(FILE *stream) {
|
/* TODO: scientific notation */
|
||||||
|
Json * parse_number(FILE *stream, int sign) {
|
||||||
Json * json;
|
Json * json;
|
||||||
long num = 0, den = 0;
|
long num = 0, den = 0;
|
||||||
char c;
|
char c;
|
||||||
@ -58,12 +69,13 @@ Json * parse_number(FILE *stream) {
|
|||||||
if (c != EOF) ungetc(c, stream);
|
if (c != EOF) ungetc(c, stream);
|
||||||
json = malloc(sizeof(Json));
|
json = malloc(sizeof(Json));
|
||||||
json->type = NUMBER;
|
json->type = NUMBER;
|
||||||
json->value.number = num * 1.0 / den;
|
json->value.number = sign * num * 1.0 / den;
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: more escaped characters, unicode? */
|
||||||
Json * parse_string(FILE *stream) {
|
Json * parse_string(FILE *stream) {
|
||||||
int i = 0, cap = 10;
|
int i = 0, cap = 10;
|
||||||
char * buffer = calloc(cap, sizeof(char));
|
char * buffer = calloc(cap, sizeof(char));
|
||||||
@ -71,7 +83,6 @@ Json * parse_string(FILE *stream) {
|
|||||||
int escaped = 0;
|
int escaped = 0;
|
||||||
Json * json;
|
Json * json;
|
||||||
while ((c = getc(stream)) != EOF) {
|
while ((c = getc(stream)) != EOF) {
|
||||||
printf("char: %c, buffer: %s, i: %d\n", c, buffer, i);
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\\':
|
case '\\':
|
||||||
escaped = 1;
|
escaped = 1;
|
||||||
@ -114,6 +125,10 @@ Json * json_parse(FILE *stream) {
|
|||||||
return parse_true(stream);
|
return parse_true(stream);
|
||||||
case 'f':
|
case 'f':
|
||||||
return parse_false(stream);
|
return parse_false(stream);
|
||||||
|
case 'n':
|
||||||
|
return parse_null(stream);
|
||||||
|
case '-':
|
||||||
|
return parse_number(stream, -1);
|
||||||
case '0':
|
case '0':
|
||||||
case '1':
|
case '1':
|
||||||
case '2':
|
case '2':
|
||||||
@ -125,7 +140,7 @@ Json * json_parse(FILE *stream) {
|
|||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
ungetc(c, stream);
|
ungetc(c, stream);
|
||||||
return parse_number(stream);
|
return parse_number(stream, 1);
|
||||||
case ' ':
|
case ' ':
|
||||||
case '\n':
|
case '\n':
|
||||||
case '\t':
|
case '\t':
|
||||||
@ -152,6 +167,9 @@ void json_print(Json *this, FILE *stream) {
|
|||||||
int i;
|
int i;
|
||||||
struct printacc acc = { NULL, 0 };
|
struct printacc acc = { NULL, 0 };
|
||||||
switch (this->type) {
|
switch (this->type) {
|
||||||
|
case NIL:
|
||||||
|
fprintf(stream, "null");
|
||||||
|
break;
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
fprintf(stream, this->value.boolean == 0 ? "false" : "true");
|
fprintf(stream, this->value.boolean == 0 ? "false" : "true");
|
||||||
break;
|
break;
|
||||||
@ -183,16 +201,13 @@ void json_print(Json *this, FILE *stream) {
|
|||||||
|
|
||||||
void json_free(Json *this) {
|
void json_free(Json *this) {
|
||||||
switch (this->type) {
|
switch (this->type) {
|
||||||
|
case NIL:
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
/* TODO */
|
case NUMBER:
|
||||||
break;
|
break;
|
||||||
case STRING:
|
case STRING:
|
||||||
/* TODO */
|
|
||||||
free(this->value.string);
|
free(this->value.string);
|
||||||
break;
|
break;
|
||||||
case NUMBER:
|
|
||||||
/* TODO */
|
|
||||||
break;
|
|
||||||
case LIST:
|
case LIST:
|
||||||
/* TODO */
|
/* TODO */
|
||||||
break;
|
break;
|
||||||
|
2
json.h
2
json.h
@ -2,7 +2,7 @@
|
|||||||
#define JSON_HEADER
|
#define JSON_HEADER
|
||||||
#include "sortedmap.h"
|
#include "sortedmap.h"
|
||||||
#include "arraylist.h"
|
#include "arraylist.h"
|
||||||
enum jsontype { BOOLEAN, STRING, NUMBER, LIST, MAP };
|
enum jsontype { NIL, BOOLEAN, STRING, NUMBER, LIST, MAP };
|
||||||
|
|
||||||
typedef struct json {
|
typedef struct json {
|
||||||
enum jsontype type;
|
enum jsontype type;
|
||||||
|
Loading…
Reference in New Issue
Block a user