diff options
author | Quentin Young <qlyoung@cumulusnetworks.com> | 2017-02-03 21:43:59 +0000 |
---|---|---|
committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2017-02-04 01:02:00 +0000 |
commit | f6f852fd9367a815a711b5097139002e7385b165 (patch) | |
tree | b73166603e4ab1a44cc85fb249497f2652846f52 /json_object.c | |
parent | 9ff0f4987fc17f957f520623f8dcc811fe9ffd22 (diff) | |
download | json-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.c | 61 |
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) |