This function helps to reduce code duplication, as it can be easily extended for different ways how a new json string-object will be created from a given string buffer.pull/620/head
| @@ -1138,60 +1138,63 @@ static void json_object_string_delete(struct json_object *jso) | |||||
| json_object_generic_delete(jso); | json_object_generic_delete(jso); | ||||
| } | } | ||||
| struct json_object *json_object_new_string(const char *s) | |||||
| struct json_object *json_object_new_string_ext(const char *s, const int len, | |||||
| int flags) | |||||
| { | { | ||||
| struct json_object *jso = json_object_new(json_type_string); | |||||
| if (!jso) | |||||
| if (len <= 0 || flags == 0) | |||||
| return NULL; | return NULL; | ||||
| jso->_delete = &json_object_string_delete; | |||||
| jso->_to_json_string = &json_object_string_to_json_string; | |||||
| jso->o.c_string.len = strlen(s); | |||||
| if (jso->o.c_string.len < LEN_DIRECT_STRING_DATA) | |||||
| { | |||||
| memcpy(jso->o.c_string.str.data, s, jso->o.c_string.len); | |||||
| } | |||||
| else | |||||
| { | |||||
| jso->o.c_string.str.ptr = strdup(s); | |||||
| if (!jso->o.c_string.str.ptr) | |||||
| { | |||||
| json_object_generic_delete(jso); | |||||
| errno = ENOMEM; | |||||
| return NULL; | |||||
| } | |||||
| } | |||||
| return jso; | |||||
| } | |||||
| struct json_object *json_object_new_string_len(const char *s, const int len) | |||||
| { | |||||
| char *dstbuf; | |||||
| struct json_object *jso = json_object_new(json_type_string); | struct json_object *jso = json_object_new(json_type_string); | ||||
| if (!jso) | if (!jso) | ||||
| return NULL; | return NULL; | ||||
| char *dstbuf = NULL; | |||||
| jso->_delete = &json_object_string_delete; | jso->_delete = &json_object_string_delete; | ||||
| jso->_to_json_string = &json_object_string_to_json_string; | jso->_to_json_string = &json_object_string_to_json_string; | ||||
| jso->o.c_string.len = len; | |||||
| /* short cut if the internal string buffer of jso is big enough */ | |||||
| if (len < LEN_DIRECT_STRING_DATA) | if (len < LEN_DIRECT_STRING_DATA) | ||||
| { | { | ||||
| dstbuf = jso->o.c_string.str.data; | dstbuf = jso->o.c_string.str.data; | ||||
| memcpy(dstbuf, s, jso->o.c_string.len); | |||||
| dstbuf[len] = '\0'; | |||||
| return jso; | |||||
| } | } | ||||
| else | |||||
| if (flags & JSON_C_NEW_STRING_STRDUP) | |||||
| dstbuf = strdup(s); | |||||
| else if (flags & JSON_C_NEW_STRING_LENGTH) | |||||
| { | { | ||||
| jso->o.c_string.str.ptr = (char *)malloc(len + 1); | |||||
| if (!jso->o.c_string.str.ptr) | |||||
| dstbuf = malloc(len + 1); | |||||
| if (dstbuf) | |||||
| { | { | ||||
| json_object_generic_delete(jso); | |||||
| errno = ENOMEM; | |||||
| return NULL; | |||||
| memcpy(dstbuf, s, len); | |||||
| dstbuf[len] = '\0'; | |||||
| } | } | ||||
| dstbuf = jso->o.c_string.str.ptr; | |||||
| } | } | ||||
| memcpy(dstbuf, (const void *)s, len); | |||||
| dstbuf[len] = '\0'; | |||||
| jso->o.c_string.len = len; | |||||
| /* cannot be reached if o.c_string.str.data is used */ | |||||
| if (!dstbuf) | |||||
| { | |||||
| /* errno has already been set by malloc or strdup */ | |||||
| json_object_generic_delete(jso); | |||||
| return NULL; | |||||
| } | |||||
| jso->o.c_string.str.ptr = dstbuf; | |||||
| return jso; | return jso; | ||||
| } | } | ||||
| struct json_object *json_object_new_string(const char *s) | |||||
| { | |||||
| return json_object_new_string_ext(s, strlen(s), JSON_C_NEW_STRING_STRDUP); | |||||
| } | |||||
| struct json_object *json_object_new_string_len(const char *s, const int len) | |||||
| { | |||||
| return json_object_new_string_ext(s, len, JSON_C_NEW_STRING_LENGTH); | |||||
| } | |||||
| const char *json_object_get_string(struct json_object *jso) | const char *json_object_get_string(struct json_object *jso) | ||||
| { | { | ||||
| if (!jso) | if (!jso) | ||||
| @@ -45,6 +45,16 @@ extern "C" { | |||||
| #define JSON_OBJECT_DEF_HASH_ENTRIES 16 | #define JSON_OBJECT_DEF_HASH_ENTRIES 16 | ||||
| /** | |||||
| * A copy of the string is made and the memory is managed by the json_object. | |||||
| */ | |||||
| #define JSON_C_NEW_STRING_STRDUP (1 << 0) | |||||
| /** | |||||
| * A copy of the string with a maximum of len characters is made and the | |||||
| * memory is managed by the json_object. | |||||
| */ | |||||
| #define JSON_C_NEW_STRING_LENGTH (1 << 1) | |||||
| /** | /** | ||||
| * A flag for the json_object_to_json_string_ext() and | * A flag for the json_object_to_json_string_ext() and | ||||
| * json_object_to_file_ext() functions which causes the output | * json_object_to_file_ext() functions which causes the output | ||||
| @@ -867,13 +877,27 @@ JSON_EXPORT int json_object_set_double(struct json_object *obj, double new_value | |||||
| /* string type methods */ | /* string type methods */ | ||||
| /** Create a new json_object of type json_type_string in a configurable way | |||||
| * | |||||
| * The string will be embedded into the new object as specified by the given | |||||
| * flags parameter. | |||||
| * | |||||
| * @param s the string | |||||
| * @param len the size of the string buffer in bytes | |||||
| * @param flags process-modifying options, MUST NOT equal zero, and only one | |||||
| * option can be specified. | |||||
| * @returns a json_object of type json_type_string | |||||
| */ | |||||
| JSON_EXPORT struct json_object *json_object_new_string_ext(const char *s, const int len, | |||||
| int flags); | |||||
| /** Create a new empty json_object of type json_type_string | /** Create a new empty json_object of type json_type_string | ||||
| * | * | ||||
| * A copy of the string is made and the memory is managed by the json_object | * A copy of the string is made and the memory is managed by the json_object | ||||
| * | * | ||||
| * @param s the string | * @param s the string | ||||
| * @returns a json_object of type json_type_string | * @returns a json_object of type json_type_string | ||||
| * @see json_object_new_string_len() | |||||
| * @see json_object_new_string_ext() | |||||
| */ | */ | ||||
| JSON_EXPORT struct json_object *json_object_new_string(const char *s); | JSON_EXPORT struct json_object *json_object_new_string(const char *s); | ||||
| @@ -883,9 +907,9 @@ JSON_EXPORT struct json_object *json_object_new_string(const char *s); | |||||
| * A copy of the string is made and the memory is managed by the json_object | * A copy of the string is made and the memory is managed by the json_object | ||||
| * | * | ||||
| * @param s the string | * @param s the string | ||||
| * @param len max length of the new string | |||||
| * @param len max length of the new string, must be >= 1 | |||||
| * @returns a json_object of type json_type_string | * @returns a json_object of type json_type_string | ||||
| * @see json_object_new_string() | |||||
| * @see json_object_new_string_ext() | |||||
| */ | */ | ||||
| JSON_EXPORT struct json_object *json_object_new_string_len(const char *s, const int len); | JSON_EXPORT struct json_object *json_object_new_string_len(const char *s, const int len); | ||||