119 lines
2.8 KiB
C
119 lines
2.8 KiB
C
/**
|
|
rjp
|
|
Copyright (C) 2018-2019 rexy712
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#define __STDC_FORMAT_MACROS
|
|
#include <inttypes.h>
|
|
|
|
#include "rjp.h"
|
|
#include "rjp_internal.h"
|
|
#include "memory.h"
|
|
|
|
#include <string.h> //strlen
|
|
#include <stdio.h> //sprintf
|
|
|
|
RJP_value* rjp_init_json(void){
|
|
RJP_value* ret = rjp_calloc(1, sizeof(RJP_value));
|
|
return ret;
|
|
}
|
|
RJP_value* rjp_init_json_as(RJP_value value){
|
|
RJP_value* ret = rjp_alloc(sizeof(RJP_value));
|
|
*ret = value;
|
|
return ret;
|
|
}
|
|
|
|
static size_t _rjp__write_value(char* dest, RJP_value* val){
|
|
size_t ret;
|
|
switch(val->type){
|
|
case json_integer:
|
|
ret = sprintf(dest, "%" PRId64, val->integer);
|
|
break;
|
|
case json_dfloat:
|
|
ret = sprintf(dest, "%lf", val->dfloat);
|
|
break;
|
|
case json_boolean:
|
|
ret = sprintf(dest, val->boolean ? "true" : "false");
|
|
break;
|
|
case json_null:
|
|
ret = sprintf(dest, "null");
|
|
break;
|
|
case json_string:;
|
|
ret = sprintf(dest, "\"%s\"", val->string.value);
|
|
break;
|
|
case json_array:
|
|
ret = rjp_dump_array(val, dest);
|
|
break;
|
|
case json_object:
|
|
ret = rjp_dump_object(val, dest);
|
|
break;
|
|
default:
|
|
ret = 0;
|
|
break;
|
|
};
|
|
return ret;
|
|
}
|
|
|
|
size_t rjp_dump_array(RJP_value* arr, char* dest){
|
|
RJP_array* array = &arr->array;
|
|
RJP_array_element* element_list = array->elements;
|
|
size_t pos = 1;
|
|
sprintf(dest, "[");
|
|
for(;element_list;element_list = element_list->next){
|
|
pos += _rjp__write_value(dest+pos, &element_list->value);
|
|
|
|
if(element_list->next)
|
|
pos += sprintf(dest+pos, ",");
|
|
else
|
|
break;
|
|
}
|
|
pos += sprintf(dest+pos, "]");
|
|
return pos;
|
|
}
|
|
|
|
size_t rjp_dump_object(RJP_value* root, char* dest){
|
|
RJP_object* root_obj = &root->object;
|
|
RJP_object_member* member_list = root_obj->members;
|
|
size_t pos = 1;
|
|
sprintf(dest, "{");
|
|
|
|
for(;member_list;member_list = member_list->next){
|
|
pos += sprintf(dest+pos, "\"%s\":", member_list->name.value);
|
|
pos += _rjp__write_value(dest+pos, &member_list->value);
|
|
|
|
if(member_list->next)
|
|
pos += sprintf(dest+pos, ",");
|
|
else
|
|
break;
|
|
}
|
|
pos += sprintf(dest+pos, "}");
|
|
return pos;
|
|
}
|
|
|
|
char* rjp_to_json(RJP_value* root){
|
|
if(!root)
|
|
return NULL;
|
|
size_t len = _rjp__value_strlen(root);
|
|
if(!len)
|
|
return NULL;
|
|
char* tmp = rjp_alloc(len + 1);
|
|
tmp[len] = 0;
|
|
|
|
_rjp__write_value(tmp, root);
|
|
return tmp;
|
|
}
|
|
|