@@ -83,15 +83,13 @@ static void json_object_fini(void) {
/* string escaping */
static int json_escape_str(struct printbuf *pb, char *str)
static int json_escape_str(struct printbuf *pb, char *str, int len )
{
int pos = 0, start_offset = 0;
unsigned char c;
do {
while (len--) {
c = str[pos];
switch(c) {
case '\0':
break;
case '\b':
case '\n':
case '\r':
@@ -120,7 +118,7 @@ static int json_escape_str(struct printbuf *pb, char *str)
start_offset = ++pos;
} else pos++;
}
} while(c);
}
if(pos - start_offset > 0)
printbuf_memappend(pb, str + start_offset, pos - start_offset);
return 0;
@@ -218,7 +216,7 @@ static int json_object_object_to_json_string(struct json_object* jso,
json_object_object_foreachC(jso, iter) {
if(i) sprintbuf(pb, ",");
sprintbuf(pb, " \"");
json_escape_str(pb, iter.key);
json_escape_str(pb, iter.key, strlen(iter.key) );
sprintbuf(pb, "\": ");
if(iter.val == NULL) sprintbuf(pb, "null");
else iter.val->_to_json_string(iter.val, pb);
@@ -309,7 +307,7 @@ boolean json_object_get_boolean(struct json_object *jso)
case json_type_double:
return (jso->o.c_double != 0);
case json_type_string:
return (strlen(jso->o.c_string) != 0);
return (jso->o.c_string.len != 0);
default:
return FALSE;
}
@@ -346,7 +344,7 @@ int32_t json_object_get_int(struct json_object *jso)
* Parse strings into 64-bit numbers, then use the
* 64-to-32-bit number handling below.
*/
if (json_parse_int64(jso->o.c_string, &cint64) != 0)
if (json_parse_int64(jso->o.c_string.str , &cint64) != 0)
return 0; /* whoops, it didn't work. */
o_type = json_type_int;
}
@@ -391,7 +389,7 @@ int64_t json_object_get_int64(struct json_object *jso)
case json_type_boolean:
return jso->o.c_boolean;
case json_type_string:
if (json_parse_int64(jso->o.c_string, &cint) == 0) return cint;
if (json_parse_int64(jso->o.c_string.str , &cint) == 0) return cint;
default:
return 0;
}
@@ -428,7 +426,7 @@ double json_object_get_double(struct json_object *jso)
case json_type_boolean:
return jso->o.c_boolean;
case json_type_string:
if(sscanf(jso->o.c_string, "%lf", &cdouble) == 1) return cdouble;
if(sscanf(jso->o.c_string.str , "%lf", &cdouble) == 1) return cdouble;
default:
return 0.0;
}
@@ -441,14 +439,14 @@ static int json_object_string_to_json_string(struct json_object* jso,
struct printbuf *pb)
{
sprintbuf(pb, "\"");
json_escape_str(pb, jso->o.c_string);
json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len );
sprintbuf(pb, "\"");
return 0;
}
static void json_object_string_delete(struct json_object* jso)
{
free(jso->o.c_string);
free(jso->o.c_string.str );
json_object_generic_delete(jso);
}
@@ -458,7 +456,8 @@ struct json_object* json_object_new_string(const char *s)
if(!jso) return NULL;
jso->_delete = &json_object_string_delete;
jso->_to_json_string = &json_object_string_to_json_string;
jso->o.c_string = strdup(s);
jso->o.c_string.str = strdup(s);
jso->o.c_string.len = strlen(s);
return jso;
}
@@ -468,7 +467,9 @@ struct json_object* json_object_new_string_len(const char *s, int len)
if(!jso) return NULL;
jso->_delete = &json_object_string_delete;
jso->_to_json_string = &json_object_string_to_json_string;
jso->o.c_string = strndup(s, len);
jso->o.c_string.str = malloc(len);
memcpy(jso->o.c_string.str, (void *)s, len);
jso->o.c_string.len = len;
return jso;
}
@@ -477,12 +478,22 @@ const char* json_object_get_string(struct json_object *jso)
if(!jso) return NULL;
switch(jso->o_type) {
case json_type_string:
return jso->o.c_string;
return jso->o.c_string.str ;
default:
return json_object_to_json_string(jso);
}
}
int json_object_get_string_len(struct json_object *jso) {
if(!jso) return 0;
switch(jso->o_type) {
case json_type_string:
return jso->o.c_string.len;
default:
return 0;
}
}
/* json_object_array */