Select Git revision
json_tree.c
json_tree.c 3.21 KiB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"json_tree.h"
json_struct *json_new_struct(int type)
{
json_struct *c = (json_struct *)malloc(sizeof(json_struct));
if(c == NULL){
fprintf(stderr, "memory allocation problem !\n");
exit(1);
}
c->type = type;
c->next = NULL;
return c;
}
json_struct *json_new_string(char *string)
{
json_struct *c = json_new_struct(JSON_STRING);
c->u.string = string;
return c;
}
json_struct *json_new_number(float number)
{
json_struct *c = json_new_struct(JSON_NUMBER);
c->u.number = number;
return c;
}
json_struct *json_new_constant(int constant)
{
json_struct *c = json_new_struct(JSON_CONSTANT);
c->u.constant = constant;
return c;
}
json_attr_val *json_new_attr_val(char *attr, json_struct *s, json_attr_val *next)
{
json_attr_val *av = (json_attr_val *)malloc(sizeof(json_attr_val));
if(av == NULL){
fprintf(stderr, "memory allocation problem !\n");
exit(1);
}
av->attr = strdup(attr);
av->val = s;
av->next = next;
return av;
}
json_struct *json_new_object(json_attr_val *avl)
{
json_struct *c = json_new_struct(JSON_OBJECT);
c->u.attr_val_list = avl;
return c;
}
void json_print_struct(FILE *f, json_struct *s)
{
if(s == NULL) return;
if(s->type == JSON_OBJECT) json_print_object(f, s);
if(s->type == JSON_LIST) json_print_list(f, s);
if(s->type == JSON_STRING) json_print_string(f, s);
if(s->type == JSON_NUMBER) json_print_number(f, s);
if(s->type == JSON_CONSTANT) json_print_constant(f, s);
}
void json_print_object(FILE *f, json_struct *s)
{
json_attr_val *avl;
int first = 1;
fprintf(f, "{");
for(avl = s->u.attr_val_list; avl; avl = avl->next){
if(first) first = 0;
else fprintf(f, ", ");
fprintf(f, "%s : ", avl->attr);
json_print_struct(f, avl->val);
}
fprintf(f, "}\n");
}
void json_print_list(FILE *f, json_struct *s)
{
int first = 1;
fprintf(f, "[");
s = s->u.first;
while(s){
if(first) first = 0;
else fprintf(f, ", ");
json_print_struct(f, s);
s = s->next;
}
fprintf(f, "]\n");
}
void json_print_string(FILE *f, json_struct *s)
{
fprintf(f, "%s", s->u.string);
}
void json_print_number(FILE *f, json_struct *s)
{
fprintf(f, "%f", s->u.number);
}
void json_print_constant(FILE *f, json_struct *s)
{
if(s->u.constant == JSON_CONST_TRUE){
fprintf(f, " true");
return;
}
if(s->u.constant == JSON_CONST_FALSE){
fprintf(f, " false");
return;
}
if(s->u.constant == JSON_CONST_NULL){
fprintf(f, " null");
return;
}
}
void json_free_struct(json_struct *s);
json_struct *json_new_list(json_struct *s)
{
json_struct *c = json_new_struct(JSON_LIST);
c->u.first = s;
return c;
}
void json_free_list(json_struct *s)
{
if(s){
json_free_list(s->next);
json_free_struct(s);
}
}
void json_free_attr_val_list(json_attr_val *avl)
{
if(avl){
json_free_attr_val_list(avl->next);
free(avl->attr);
json_free_struct(avl->val);
free(avl);
}
}
void json_free_struct(json_struct *s)
{
if(s == NULL) return;
if(s->type == JSON_OBJECT) json_free_attr_val_list(s->u.attr_val_list);
if(s->type == JSON_LIST) json_free_list(s->u.first);
if(s->type == JSON_STRING) free(s->u.string);
free(s);
}