Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3349468e07 | ||
|
|
339c3af4f4 | ||
|
|
25c3c018f6 | ||
|
|
f367993ad4 |
@@ -4,8 +4,8 @@ include(GNUInstallDirs)
|
||||
cmake_minimum_required(VERSION 3.0.2)
|
||||
project(rjp)
|
||||
set(rjp_VERSION_MAJOR 0)
|
||||
set(rjp_VERSION_MINOR 6)
|
||||
set(rjp_VERSION_REVISION 2)
|
||||
set(rjp_VERSION_MINOR 7)
|
||||
set(rjp_VERSION_REVISION 0)
|
||||
set(INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include)
|
||||
configure_file(
|
||||
"${INCLUDE_PATH}/config.h.in"
|
||||
@@ -19,12 +19,12 @@ option(ENABLE_SHARED "Build shared library" OFF)
|
||||
set(SOURCE_LIST "src/input.c" "src/output.c" "src/strings.c" "src/memory.c" "src/rjp.c")
|
||||
if(ENABLE_SHARED)
|
||||
add_library(rjp SHARED ${SOURCE_LIST})
|
||||
set_target_properties(rjp PROPERTIES SOVERSION "${rjp_VERSION_MAJOR}.${rjp_VERSION_MINOR}.${rjp_VERSION_REVISION}")
|
||||
else()
|
||||
add_library(rjp STATIC ${SOURCE_LIST})
|
||||
endif()
|
||||
|
||||
set_target_properties(rjp PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.h)
|
||||
set_target_properties(rjp PROPERTIES SOVERSION "${rjp_VERSION_MAJOR}.${rjp_VERSION_MINOR}.${rjp_VERSION_REVISION}")
|
||||
target_compile_options(rjp PRIVATE -Wall -Wextra -pedantic)
|
||||
if(ENABLE_DIAGNOSTICS)
|
||||
target_compile_definitions(rjp PRIVATE RJP_DIAGNOSTICS)
|
||||
|
||||
@@ -93,7 +93,7 @@ typedef struct RJP_search_res{
|
||||
|
||||
//Convert C string consisting of json data into RJP's format
|
||||
RJP_value* rjp_parse(const char* str);
|
||||
RJP_value* rjp_parse_chunked(const char* str, RJP_value* prev_chunk);
|
||||
//RJP_value* rjp_parse_chunked(const char* str, RJP_value* prev_chunk);
|
||||
|
||||
//Initialize a root RJP_value to NULL
|
||||
RJP_value* rjp_init_json(void);
|
||||
@@ -121,6 +121,11 @@ RJP_value* rjp_add_member_no_alloc(RJP_value* dest, char* key, size_t keylen, RJ
|
||||
//add an element to a json array
|
||||
RJP_value* rjp_add_element(RJP_value* dest, RJP_value value);
|
||||
|
||||
//set existing object member's key
|
||||
void rjp_set_key(RJP_value* dest, const char* key, size_t keylen);
|
||||
//set existing object member's key without allocation. key must be allocated using rjp_alloc/rjp_calloc
|
||||
void rjp_set_key_no_alloc(RJP_value* dest, char* key, size_t keylen);
|
||||
|
||||
//set existing value
|
||||
void rjp_set_value(RJP_value* dest, RJP_value value);
|
||||
|
||||
@@ -143,7 +148,7 @@ size_t rjp_num_members(const RJP_value* object);
|
||||
//Return the object member's key name
|
||||
char* rjp_member_name(const RJP_value* member);
|
||||
//Return the object member's key name length excluding null terminator
|
||||
size_t rjp_member_name_length(RJP_value* member);
|
||||
size_t rjp_member_name_length(const RJP_value* member);
|
||||
//Search for an object member with given key
|
||||
RJP_search_res rjp_search_member(const RJP_value* object, const char* search, size_t skip);
|
||||
//Search for first occurance of multiple keys. Returns first occurance of each.
|
||||
@@ -161,16 +166,17 @@ size_t rjp_num_elements(const RJP_value* array);
|
||||
|
||||
|
||||
//Return handle to parent of given value
|
||||
RJP_value* rjp_value_parent(RJP_value* element);
|
||||
RJP_value* rjp_value_parent(const RJP_value* element);
|
||||
//Return type of value
|
||||
RJP_type rjp_value_type(RJP_value* value);
|
||||
RJP_type rjp_value_type(const RJP_value* value);
|
||||
|
||||
//value accessors
|
||||
RJP_float rjp_value_dfloat(RJP_value* value);
|
||||
RJP_int rjp_value_integer(RJP_value* value);
|
||||
char rjp_value_boolean(RJP_value* value);
|
||||
RJP_float rjp_value_dfloat(const RJP_value* value);
|
||||
RJP_int rjp_value_integer(const RJP_value* value);
|
||||
char rjp_value_boolean(const RJP_value* value);
|
||||
char* rjp_value_string(RJP_value* value);
|
||||
size_t rjp_value_string_length(RJP_value* value);
|
||||
const char* rjp_value_cstring(const RJP_value* value);
|
||||
size_t rjp_value_string_length(const RJP_value* value);
|
||||
|
||||
|
||||
//copy input string and add json escape sequences
|
||||
@@ -180,11 +186,11 @@ size_t rjp_escape_strcpy(char* dest, const char* src);
|
||||
size_t rjp_escape_strlen(const char* str);
|
||||
|
||||
//Convert RJP_object to json string
|
||||
size_t rjp_dump_object(RJP_value* root, char* dest);
|
||||
size_t rjp_dump_object(const RJP_value* root, char* dest);
|
||||
//Convert RJP_array to json string
|
||||
size_t rjp_dump_array(RJP_value* arr, char* dest);
|
||||
size_t rjp_dump_array(const RJP_value* arr, char* dest);
|
||||
//Convert root rjp value into json string
|
||||
char* rjp_to_json(RJP_value* root);
|
||||
char* rjp_to_json(const RJP_value* root);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
|
||||
int _rjp__is_whitespace(char c);
|
||||
char* _rjp__parse_string(RJP_value* root, const char* str, int* inclen, int* len, int* row, int* column);
|
||||
size_t _rjp__array_strlen(RJP_value* arr);
|
||||
size_t _rjp__object_strlen(RJP_value* root);
|
||||
size_t _rjp__value_strlen(RJP_value* root);
|
||||
size_t _rjp__array_strlen(const RJP_value* arr);
|
||||
size_t _rjp__object_strlen(const RJP_value* root);
|
||||
size_t _rjp__value_strlen(const RJP_value* root);
|
||||
void _rjp__strcpy(RJP_string* dest, const RJP_string* src);
|
||||
|
||||
#endif
|
||||
|
||||
21
src/output.c
21
src/output.c
@@ -16,6 +16,9 @@
|
||||
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"
|
||||
@@ -33,11 +36,11 @@ RJP_value* rjp_init_json_as(RJP_value value){
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t _rjp__write_value(char* dest, RJP_value* val){
|
||||
static size_t _rjp__write_value(char* dest, const RJP_value* val){
|
||||
size_t ret;
|
||||
switch(val->type){
|
||||
case json_integer:
|
||||
ret = sprintf(dest, "%lli", val->integer);
|
||||
ret = sprintf(dest, "%" PRId64, val->integer);
|
||||
break;
|
||||
case json_dfloat:
|
||||
ret = sprintf(dest, "%lf", val->dfloat);
|
||||
@@ -64,9 +67,9 @@ static size_t _rjp__write_value(char* dest, RJP_value* val){
|
||||
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 rjp_dump_array(const RJP_value* arr, char* dest){
|
||||
const RJP_array* array = &arr->array;
|
||||
const RJP_array_element* element_list = array->elements;
|
||||
size_t pos = 1;
|
||||
sprintf(dest, "[");
|
||||
for(;element_list;element_list = element_list->next){
|
||||
@@ -81,9 +84,9 @@ size_t rjp_dump_array(RJP_value* arr, char* dest){
|
||||
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 rjp_dump_object(const RJP_value* root, char* dest){
|
||||
const RJP_object* root_obj = &root->object;
|
||||
const RJP_object_member* member_list = root_obj->members;
|
||||
size_t pos = 1;
|
||||
sprintf(dest, "{");
|
||||
|
||||
@@ -100,7 +103,7 @@ size_t rjp_dump_object(RJP_value* root, char* dest){
|
||||
return pos;
|
||||
}
|
||||
|
||||
char* rjp_to_json(RJP_value* root){
|
||||
char* rjp_to_json(const RJP_value* root){
|
||||
if(!root)
|
||||
return NULL;
|
||||
size_t len = _rjp__value_strlen(root);
|
||||
|
||||
43
src/rjp.c
43
src/rjp.c
@@ -80,6 +80,32 @@ RJP_value* rjp_add_element(RJP_value* dest, RJP_value value){
|
||||
dest->array.last->value.parent = dest;
|
||||
return &dest->array.last->value;
|
||||
}
|
||||
void rjp_set_key(RJP_value* dest, const char* key, size_t keylen){
|
||||
RJP_object_member* mem = (RJP_object_member*)dest;
|
||||
if(key){
|
||||
if(!keylen){
|
||||
keylen = strlen(key);
|
||||
}
|
||||
}else{
|
||||
keylen = 0;
|
||||
}
|
||||
mem->name.value = rjp_alloc(keylen + 1);
|
||||
strncpy(mem->name.value, key, keylen);
|
||||
mem->name.value[keylen] = 0;
|
||||
mem->name.length = keylen;
|
||||
}
|
||||
void rjp_set_key_no_alloc(RJP_value* dest, char* key, size_t keylen){
|
||||
RJP_object_member* mem = (RJP_object_member*)dest;
|
||||
if(key){
|
||||
if(!keylen){
|
||||
keylen = strlen(key);
|
||||
}
|
||||
}else{
|
||||
keylen = 0;
|
||||
}
|
||||
mem->name.value = key;
|
||||
mem->name.length = keylen;
|
||||
}
|
||||
void rjp_set_value(RJP_value* dest, RJP_value value){
|
||||
struct RJP_value* p = dest->parent;
|
||||
*dest = value;
|
||||
@@ -127,7 +153,7 @@ size_t rjp_num_members(const RJP_value* object){
|
||||
char* rjp_member_name(const RJP_value* member){
|
||||
return ((RJP_object_member*)member)->name.value;
|
||||
}
|
||||
size_t rjp_member_name_length(RJP_value* member){
|
||||
size_t rjp_member_name_length(const RJP_value* member){
|
||||
return ((RJP_object_member*)member)->name.length;
|
||||
}
|
||||
|
||||
@@ -211,25 +237,28 @@ size_t rjp_num_elements(const RJP_value* array){
|
||||
return array->array.num_elements;
|
||||
}
|
||||
|
||||
RJP_value* rjp_value_parent(RJP_value* value){
|
||||
RJP_value* rjp_value_parent(const RJP_value* value){
|
||||
return value->parent;
|
||||
}
|
||||
RJP_type rjp_value_type(RJP_value* value){
|
||||
RJP_type rjp_value_type(const RJP_value* value){
|
||||
return value->type;
|
||||
}
|
||||
RJP_float rjp_value_dfloat(RJP_value* value){
|
||||
RJP_float rjp_value_dfloat(const RJP_value* value){
|
||||
return value->dfloat;
|
||||
}
|
||||
RJP_int rjp_value_integer(RJP_value* value){
|
||||
RJP_int rjp_value_integer(const RJP_value* value){
|
||||
return value->integer;
|
||||
}
|
||||
char rjp_value_boolean(RJP_value* value){
|
||||
char rjp_value_boolean(const RJP_value* value){
|
||||
return value->boolean;
|
||||
}
|
||||
char* rjp_value_string(RJP_value* value){
|
||||
return value->string.value;
|
||||
}
|
||||
size_t rjp_value_string_length(RJP_value* value){
|
||||
const char* rjp_value_cstring(const RJP_value* value){
|
||||
return value->string.value;
|
||||
}
|
||||
size_t rjp_value_string_length(const RJP_value* value){
|
||||
return value->string.length;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "strings.h"
|
||||
#include "rjp_internal.h"
|
||||
|
||||
@@ -294,14 +297,14 @@ size_t rjp_escape_strlen(const char* str){
|
||||
}
|
||||
return count;
|
||||
}
|
||||
size_t _rjp__array_strlen(RJP_value* arr){
|
||||
size_t _rjp__array_strlen(const RJP_value* arr){
|
||||
size_t count = 2; //[]
|
||||
RJP_array* array = &arr->array;
|
||||
RJP_array_element* element_list = array->elements;
|
||||
const RJP_array* array = &arr->array;
|
||||
const RJP_array_element* element_list = array->elements;
|
||||
for(;element_list;element_list = element_list->next){
|
||||
switch(element_list->value.type){
|
||||
case json_integer:
|
||||
count += snprintf(NULL, 0, "%lli", element_list->value.integer);
|
||||
count += snprintf(NULL, 0, "%" PRId64, element_list->value.integer);
|
||||
break;
|
||||
case json_dfloat:
|
||||
count += snprintf(NULL, 0, "%lf", element_list->value.dfloat);
|
||||
@@ -330,10 +333,10 @@ size_t _rjp__array_strlen(RJP_value* arr){
|
||||
return count;
|
||||
}
|
||||
|
||||
size_t _rjp__object_strlen(RJP_value* root){
|
||||
size_t _rjp__object_strlen(const RJP_value* root){
|
||||
size_t count = 2; //{}
|
||||
RJP_object* root_obj = &root->object;
|
||||
RJP_object_member* member_list = root_obj->members;
|
||||
const RJP_object* root_obj = &root->object;
|
||||
const RJP_object_member* member_list = root_obj->members;
|
||||
for(;member_list;member_list = member_list->next){
|
||||
if(member_list->name.length == 0 || member_list->name.value[0] == 0)
|
||||
return 0;
|
||||
@@ -347,10 +350,10 @@ size_t _rjp__object_strlen(RJP_value* root){
|
||||
return count;
|
||||
}
|
||||
|
||||
size_t _rjp__value_strlen(RJP_value* root){
|
||||
size_t _rjp__value_strlen(const RJP_value* root){
|
||||
switch(root->type){
|
||||
case json_integer:
|
||||
return snprintf(NULL, 0, "%lli", root->integer);
|
||||
return snprintf(NULL, 0, "%" PRId64, root->integer);
|
||||
case json_dfloat:
|
||||
return snprintf(NULL, 0, "%lf", root->dfloat);
|
||||
case json_boolean:
|
||||
|
||||
Reference in New Issue
Block a user