json_add_string_escape: for escaping internally-generated strings.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2018-01-29 11:00:15 +10:30
committed by Christian Decker
parent 6112df3a90
commit 7f03e15e03
3 changed files with 91 additions and 3 deletions

View File

@@ -493,6 +493,56 @@ void json_add_string(struct json_result *result, const char *fieldname, const ch
result_append_fmt(result, "\"%s\"", escaped);
}
void json_add_string_escape(struct json_result *result, const char *fieldname,
const char *value)
{
/* Worst case: all \uXXXX */
char *escaped = tal_arr(result, char, strlen(value) * 6 + 1);
size_t i, n;
json_start_member(result, fieldname);
for (i = n = 0; value[i]; i++, n++) {
char esc = 0;
switch (value[i]) {
case '\n':
esc = 'n';
break;
case '\b':
esc = 'b';
break;
case '\f':
esc = 'f';
break;
case '\t':
esc = 't';
break;
case '\r':
esc = 'r';
break;
case '\\':
case '"':
esc = value[i];
break;
default:
if ((unsigned)value[i] < ' '
|| value[i] == 127) {
sprintf(escaped + n, "\\u%04X", value[i]);
n += 5;
continue;
}
}
if (esc) {
escaped[n++] = '\\';
escaped[n] = esc;
} else
escaped[n] = value[i];
}
escaped[n] = '\0';
result_append_fmt(result, "\"%s\"", escaped);
tal_free(escaped);
}
void json_add_bool(struct json_result *result, const char *fieldname, bool value)
{
json_start_member(result, fieldname);