Conflicts: tests/test_util_file.ctags/json-c-0.13-20171207
@@ -295,20 +295,35 @@ void json_object_set_serializer(json_object *jso, | |||||
/* extended conversion to string */ | /* extended conversion to string */ | ||||
const char* json_object_to_json_string_ext(struct json_object *jso, int flags) | |||||
const char* json_object_to_json_string_length(struct json_object *jso, int flags, size_t *length) | |||||
{ | { | ||||
if (!jso) | |||||
return "null"; | |||||
const char *r = NULL; | |||||
size_t s = 0; | |||||
if ((!jso->_pb) && !(jso->_pb = printbuf_new())) | |||||
return NULL; | |||||
if (!jso) | |||||
{ | |||||
s = 4; | |||||
r = "null"; | |||||
} | |||||
else if ((jso->_pb) || (jso->_pb = printbuf_new())) | |||||
{ | |||||
printbuf_reset(jso->_pb); | |||||
printbuf_reset(jso->_pb); | |||||
if(jso->_to_json_string(jso, jso->_pb, 0, flags) >= 0) | |||||
{ | |||||
s = (size_t)jso->_pb->bpos; | |||||
r = jso->_pb->buf; | |||||
} | |||||
} | |||||
if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0) | |||||
return NULL; | |||||
if (length) | |||||
*length = s; | |||||
return r; | |||||
} | |||||
return jso->_pb->buf; | |||||
const char* json_object_to_json_string_ext(struct json_object *jso, int flags) | |||||
{ | |||||
return json_object_to_json_string_length(jso, flags, NULL); | |||||
} | } | ||||
/* backwards-compatible conversion to string */ | /* backwards-compatible conversion to string */ | ||||
@@ -223,6 +223,16 @@ extern const char* json_object_to_json_string(struct json_object *obj); | |||||
extern const char* json_object_to_json_string_ext(struct json_object *obj, int | extern const char* json_object_to_json_string_ext(struct json_object *obj, int | ||||
flags); | flags); | ||||
/** Stringify object to json format | |||||
* @see json_object_to_json_string() for details on how to free string. | |||||
* @param obj the json_object instance | |||||
* @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants | |||||
* @param length a pointer where, if not NULL, the length (without null) is stored | |||||
* @returns a string in JSON format and the length if not NULL | |||||
*/ | |||||
extern const char* json_object_to_json_string_length(struct json_object *obj, int | |||||
flags, size_t *length); | |||||
/** | /** | ||||
* Returns the userdata set by json_object_set_userdata() or | * Returns the userdata set by json_object_set_userdata() or | ||||
* json_object_set_serializer() | * json_object_set_serializer() | ||||
@@ -28,7 +28,27 @@ static int sort_fn (const void *j1, const void *j2) | |||||
} | } | ||||
#ifdef TEST_FORMATTED | #ifdef TEST_FORMATTED | ||||
#define json_object_to_json_string(obj) json_object_to_json_string_ext(obj,sflags) | |||||
static const char *to_json_string(json_object *obj, int flags) | |||||
{ | |||||
size_t length; | |||||
char *copy; | |||||
const char *result; | |||||
result = json_object_to_json_string_length(obj, flags, &length); | |||||
copy = strndup(result, length); | |||||
if (copy == NULL) | |||||
printf("to_json_string: Allocation failed!\n"); | |||||
else { | |||||
result = json_object_to_json_string_ext(obj, flags); | |||||
if (length != strlen(result)) | |||||
printf("to_json_string: Length mismatch!\n"); | |||||
if (strcmp(copy, result) != 0) | |||||
printf("to_json_string: Comparison Failed!\n"); | |||||
free(copy); | |||||
} | |||||
return result; | |||||
} | |||||
#define json_object_to_json_string(obj) to_json_string(obj,sflags) | |||||
#else | #else | ||||
/* no special define */ | /* no special define */ | ||||
#endif | #endif | ||||