summaryrefslogtreecommitdiff
path: root/json_object.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2017-02-03 21:43:59 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2017-02-04 01:02:00 +0000
commitf6f852fd9367a815a711b5097139002e7385b165 (patch)
treeb73166603e4ab1a44cc85fb249497f2652846f52 /json_object.c
parent9ff0f4987fc17f957f520623f8dcc811fe9ffd22 (diff)
downloadjson-c-f6f852fd9367a815a711b5097139002e7385b165.tar.gz
Restore sprintbuf(), add macro for string literals
Hawciz pointed out that the previous commit modifies the public interface of printbuf. Per his suggestion, sprintbuf() was restored and a new pair of macros was added that wraps printbuf_memappend(). Using a wrapper macro instead of modifying sprintbuf() also reduces function call overhead, bringing total performance gains to approximately 400%.
Diffstat (limited to 'json_object.c')
-rw-r--r--json_object.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/json_object.c b/json_object.c
index 2d688ce..076cf45 100644
--- a/json_object.c
+++ b/json_object.c
@@ -149,11 +149,10 @@ static int json_escape_str(struct printbuf *pb, const char *str, int len, int fl
pos - start_offset);
static char sbuf[7];
snprintf(sbuf, sizeof(sbuf),
- "\\u00%c%c",
- json_hex_chars[c >> 4],
- json_hex_chars[c & 0xf]);
- printbuf_memappend (pb, sbuf, sizeof(sbuf) - 1);
-
+ "\\u00%c%c",
+ json_hex_chars[c >> 4],
+ json_hex_chars[c & 0xf]);
+ printbuf_memappend_fast(pb, sbuf, (int) sizeof(sbuf) - 1);
start_offset = ++pos;
} else
pos++;
@@ -364,29 +363,29 @@ static int json_object_object_to_json_string(struct json_object* jso,
int had_children = 0;
struct json_object_iter iter;
- sprintbuf(pb, "{" /*}*/);
+ printbuf_strappend(pb, "{" /*}*/);
if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
json_object_object_foreachC(jso, iter)
{
if (had_children)
{
- sprintbuf(pb, ",");
+ printbuf_strappend(pb, ",");
if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
}
had_children = 1;
if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, " ");
+ printbuf_strappend(pb, " ");
indent(pb, level+1, flags);
- sprintbuf(pb, "\"");
+ printbuf_strappend(pb, "\"");
json_escape_str(pb, iter.key, strlen(iter.key), flags);
if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, "\": ");
+ printbuf_strappend(pb, "\": ");
else
- sprintbuf(pb, "\":");
+ printbuf_strappend(pb, "\":");
if(iter.val == NULL)
- sprintbuf(pb, "null");
+ printbuf_strappend(pb, "null");
else
if (iter.val->_to_json_string(iter.val, pb, level+1,flags) < 0)
return -1;
@@ -394,13 +393,13 @@ static int json_object_object_to_json_string(struct json_object* jso,
if (flags & JSON_C_TO_STRING_PRETTY)
{
if (had_children)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
indent(pb,level,flags);
}
if (flags & JSON_C_TO_STRING_SPACED)
- return sprintbuf(pb, /*{*/ " }");
+ return printbuf_strappend(pb, /*{*/ " }");
else
- return sprintbuf(pb, /*{*/ "}");
+ return printbuf_strappend(pb, /*{*/ "}");
}
@@ -541,8 +540,8 @@ static int json_object_boolean_to_json_string(struct json_object* jso,
int flags)
{
if (jso->o.c_boolean)
- return sprintbuf(pb, "true");
- return sprintbuf(pb, "false");
+ return printbuf_strappend(pb, "true");
+ return printbuf_strappend(pb, "false");
}
struct json_object* json_object_new_boolean(json_bool b)
@@ -592,7 +591,7 @@ static int json_object_int_to_json_string(struct json_object* jso,
/* room for 19 digits, the sign char, and a null term */
static char sbuf[21];
snprintf(sbuf, sizeof(sbuf), "%"PRId64, jso->o.c_int64);
- return sprintbuf(pb, sbuf);
+ return printbuf_memappend (pb, sbuf, strlen(sbuf));
}
struct json_object* json_object_new_int(int32_t i)
@@ -860,9 +859,9 @@ static int json_object_string_to_json_string(struct json_object* jso,
int level,
int flags)
{
- sprintbuf(pb, "\"");
+ printbuf_strappend(pb, "\"");
json_escape_str(pb, get_string_component(jso), jso->o.c_string.len, flags);
- sprintbuf(pb, "\"");
+ printbuf_strappend(pb, "\"");
return 0;
}
@@ -979,25 +978,25 @@ static int json_object_array_to_json_string(struct json_object* jso,
int had_children = 0;
size_t ii;
- sprintbuf(pb, "[");
+ printbuf_strappend(pb, "[");
if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
for(ii=0; ii < json_object_array_length(jso); ii++)
{
struct json_object *val;
if (had_children)
{
- sprintbuf(pb, ",");
+ printbuf_strappend(pb, ",");
if (flags & JSON_C_TO_STRING_PRETTY)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
}
had_children = 1;
if (flags & JSON_C_TO_STRING_SPACED)
- sprintbuf(pb, " ");
+ printbuf_strappend(pb, " ");
indent(pb, level + 1, flags);
val = json_object_array_get_idx(jso, ii);
if(val == NULL)
- sprintbuf(pb, "null");
+ printbuf_strappend(pb, "null");
else
if (val->_to_json_string(val, pb, level+1, flags) < 0)
return -1;
@@ -1005,13 +1004,13 @@ static int json_object_array_to_json_string(struct json_object* jso,
if (flags & JSON_C_TO_STRING_PRETTY)
{
if (had_children)
- sprintbuf(pb, "\n");
+ printbuf_strappend(pb, "\n");
indent(pb,level,flags);
}
if (flags & JSON_C_TO_STRING_SPACED)
- return sprintbuf(pb, " ]");
- return sprintbuf(pb, "]");
+ return printbuf_strappend(pb, " ]");
+ return printbuf_strappend(pb, "]");
}
static void json_object_array_entry_free(void *data)