Skip to content

Commit

Permalink
Merge pull request #141 from CopernicaMarketingSoftware/master
Browse files Browse the repository at this point in the history
Removed userdata and custom-serialization functions
  • Loading branch information
rgerhards committed Oct 16, 2017
2 parents 835d734 + 49e83f7 commit f51993c
Show file tree
Hide file tree
Showing 6 changed files with 423 additions and 343 deletions.
132 changes: 37 additions & 95 deletions json_object.c
Expand Up @@ -196,8 +196,6 @@ int fjson_object_put(struct fjson_object *jso)
const int cnt = ATOMIC_DEC_AND_FETCH(&jso->_ref_count, &jso->_mut_ref_count);
if(cnt > 0) return 0;

if (jso->_user_delete)
jso->_user_delete(jso, jso->_userdata);
jso->_delete(jso);
return 1;
}
Expand Down Expand Up @@ -243,61 +241,6 @@ enum fjson_type fjson_object_get_type(struct fjson_object *jso)
return jso->o_type;
}

/* set a custom conversion to string */

void fjson_object_set_serializer(fjson_object *jso,
fjson_object_to_json_string_fn to_string_func,
void *userdata,
fjson_object_delete_fn *user_delete)
{
// First, clean up any previously existing user info
if (jso->_user_delete)
{
jso->_user_delete(jso, jso->_userdata);
}
jso->_userdata = NULL;
jso->_user_delete = NULL;

if (to_string_func == NULL)
{
// Reset to the standard serialization function
switch(jso->o_type)
{
case fjson_type_null:
jso->_to_json_string = NULL;
break;
case fjson_type_boolean:
jso->_to_json_string = &fjson_object_boolean_to_json_string;
break;
case fjson_type_double:
jso->_to_json_string = &fjson_object_double_to_json_string;
break;
case fjson_type_int:
jso->_to_json_string = &fjson_object_int_to_json_string;
break;
case fjson_type_object:
jso->_to_json_string = &fjson_object_object_to_json_string;
break;
case fjson_type_array:
jso->_to_json_string = &fjson_object_array_to_json_string;
break;
case fjson_type_string:
jso->_to_json_string = &fjson_object_string_to_json_string;
break;
default:
/* this should NOT HAPPEN! */
jso->_to_json_string = NULL;
break;
}
return;
}

jso->_to_json_string = to_string_func;
jso->_userdata = userdata;
jso->_user_delete = user_delete;
}


/* extended conversion to string */

const char* fjson_object_to_json_string_ext(struct fjson_object *jso, int flags)
Expand Down Expand Up @@ -341,8 +284,8 @@ static void indent(struct printbuf *pb, int level, int flags)
/* fjson_object_object */

static int fjson_object_object_to_json_string(struct fjson_object* jso,
struct printbuf *pb,
int level,
struct printbuf *pb,
int level,
int flags)
{
struct fjson_object *val;
Expand Down Expand Up @@ -581,8 +524,8 @@ void fjson_object_object_del(struct fjson_object* jso, const char *key)
/* fjson_object_boolean */

static int fjson_object_boolean_to_json_string(struct fjson_object* jso,
struct printbuf *pb,
int __attribute__((unused)) level,
struct printbuf *pb,
int __attribute__((unused)) level,
int __attribute__((unused)) flags)
{
if (jso->o.c_boolean)
Expand Down Expand Up @@ -613,7 +556,7 @@ fjson_bool fjson_object_get_boolean(struct fjson_object *jso)
case fjson_type_int:
return (jso->o.c_int64 != 0);
case fjson_type_double:
return (jso->o.c_double != 0);
return (jso->o.c_double.value != 0);
case fjson_type_string:
return (jso->o.c_string.len != 0);
case fjson_type_null:
Expand Down Expand Up @@ -676,7 +619,7 @@ int32_t fjson_object_get_int(struct fjson_object *jso)
else
return (int32_t)cint64;
case fjson_type_double:
return (int32_t)jso->o.c_double;
return (int32_t)jso->o.c_double.value;
case fjson_type_boolean:
return jso->o.c_boolean;
case fjson_type_null:
Expand Down Expand Up @@ -709,7 +652,7 @@ int64_t fjson_object_get_int64(struct fjson_object *jso)
case fjson_type_int:
return jso->o.c_int64;
case fjson_type_double:
return (int64_t)jso->o.c_double;
return (int64_t)jso->o.c_double.value;
case fjson_type_boolean:
return jso->o.c_boolean;
case fjson_type_string:
Expand All @@ -727,29 +670,35 @@ int64_t fjson_object_get_int64(struct fjson_object *jso)
/* fjson_object_double */

static int fjson_object_double_to_json_string(struct fjson_object* jso,
struct printbuf *pb,
int __attribute__((unused)) level,
struct printbuf *pb,
int __attribute__((unused)) level,
int __attribute__((unused)) flags)
{
char buf[128], *p, *q;
int size;
double dummy; /* needed for modf() */

if (jso->o.c_double.source) {
printbuf_memappend_no_nul(pb, jso->o.c_double.source, strlen(jso->o.c_double.source));
return 0; /* we need to keep compatible with the API */
}

/* Although JSON RFC does not support
* NaN or Infinity as numeric values
* ECMA 262 section 9.8.1 defines
* how to handle these cases as strings
*/
if(isnan(jso->o.c_double))
if(isnan(jso->o.c_double.value))
size = snprintf(buf, sizeof(buf), "NaN");
else if(isinf(jso->o.c_double))
if(jso->o.c_double > 0)
else if(isinf(jso->o.c_double.value))
if(jso->o.c_double.value > 0)
size = snprintf(buf, sizeof(buf), "Infinity");
else
size = snprintf(buf, sizeof(buf), "-Infinity");
else
size = snprintf(buf, sizeof(buf),
(modf(jso->o.c_double, &dummy)==0)?"%.17g.0":"%.17g",
jso->o.c_double);
(modf(jso->o.c_double.value, &dummy)==0)?"%.17g.0":"%.17g",
jso->o.c_double.value);

p = strchr(buf, ',');
if (p) {
Expand All @@ -771,13 +720,20 @@ static int fjson_object_double_to_json_string(struct fjson_object* jso,
return 0; /* we need to keep compatible with the API */
}

static void fjson_object_double_delete(struct fjson_object *jso)
{
free(jso->o.c_double.source);
fjson_object_generic_delete(jso);
}

struct fjson_object* fjson_object_new_double(double d)
{
struct fjson_object *jso = fjson_object_new(fjson_type_double);
if (!jso)
return NULL;
jso->_to_json_string = &fjson_object_double_to_json_string;
jso->o.c_double = d;
jso->o.c_double.value = d;
jso->o.c_double.source = NULL;
return jso;
}

Expand All @@ -787,31 +743,17 @@ struct fjson_object* fjson_object_new_double_s(double d, const char *ds)
if (!jso)
return NULL;

char *new_ds = strdup(ds);
if (!new_ds)
jso->o.c_double.source = strdup(ds);
if (!jso->o.c_double.source)
{
fjson_object_generic_delete(jso);
errno = ENOMEM;
return NULL;
}
fjson_object_set_serializer(jso, fjson_object_userdata_to_json_string,
new_ds, fjson_object_free_userdata);
jso->_delete = &fjson_object_double_delete;
return jso;
}

int fjson_object_userdata_to_json_string(struct fjson_object *jso,
struct printbuf *pb, int __attribute__((unused)) level, int __attribute__((unused)) flags)
{
int userdata_len = strlen((const char *)jso->_userdata);
printbuf_memappend_no_nul(pb, (const char *)jso->_userdata, userdata_len);
return 0; /* we need to keep compatible with the API */
}

void fjson_object_free_userdata(struct fjson_object __attribute__((unused)) *jso, void *userdata)
{
free(userdata);
}

double fjson_object_get_double(struct fjson_object *jso)
{
double cdouble;
Expand All @@ -820,7 +762,7 @@ double fjson_object_get_double(struct fjson_object *jso)
if(!jso) return 0.0;
switch(jso->o_type) {
case fjson_type_double:
return jso->o.c_double;
return jso->o.c_double.value;
case fjson_type_int:
return jso->o.c_int64;
case fjson_type_boolean:
Expand Down Expand Up @@ -868,9 +810,9 @@ double fjson_object_get_double(struct fjson_object *jso)
/* fjson_object_string */

static int fjson_object_string_to_json_string(struct fjson_object* jso,
struct printbuf *pb,
int __attribute__((unused)) level,
int __attribute__((unused)) flags)
struct printbuf *pb,
int __attribute__((unused)) level,
int __attribute__((unused)) flags)
{
printbuf_memappend_char(pb, '\"');
fjson_escape_str(pb, get_string_component(jso));
Expand Down Expand Up @@ -1062,13 +1004,13 @@ int fjson_object_array_add(struct fjson_object *jso,struct fjson_object *val)
}

int fjson_object_array_put_idx(struct fjson_object *jso, int idx,
struct fjson_object *val)
struct fjson_object *val)
{
return array_list_put_idx(jso->o.c_array, idx, val);
}

struct fjson_object* fjson_object_array_get_idx(struct fjson_object *jso,
int idx)
int idx)
{
return (struct fjson_object*)array_list_get_idx(jso->o.c_array, idx);
}
Expand Down

0 comments on commit f51993c

Please sign in to comment.