lib: json: Do not use translation tables to encode characters
It has been suggested in a review to use a simple function with a
switch statement instead of the table trick.
Jira: ZEP-1607
Change-Id: I5290de175021bfa8642334548ece8266d4c137f0
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
diff --git a/lib/json/json.c b/lib/json/json.c
index 41b7586..283ab06 100644
--- a/lib/json/json.c
+++ b/lib/json/json.c
@@ -596,29 +596,44 @@
return obj_parse(&obj, descr, descr_len, val);
}
-static const char escapable[] = "\"\\/\b\f\n\r\t";
+static uint8_t escape_as(uint8_t chr)
+{
+ switch (chr) {
+ case '"':
+ return '"';
+ case '\\':
+ return '\\';
+ case '\b':
+ return 'b';
+ case '\f':
+ return 'f';
+ case '\n':
+ return 'n';
+ case '\r':
+ return 'r';
+ case '\t':
+ return 't';
+ }
+
+ return 0;
+}
static int json_escape_internal(const char *str,
json_append_bytes_t append_bytes,
void *data)
{
- const char *cur, *escape;
- size_t out_len = 0;
+ const char *cur;
int ret = 0;
for (cur = str; ret == 0 && *cur; cur++) {
- escape = memchr(escapable, *cur, sizeof(escapable) - 1);
+ uint8_t escaped = escape_as(*cur);
- if (escape) {
- uint8_t bytes[2] = {
- '\\', "\"\\/bfnrt"[escape - escapable]
- };
+ if (escaped) {
+ uint8_t bytes[2] = { '\\', escaped };
ret = append_bytes(bytes, 2, data);
- out_len += 2;
} else {
ret = append_bytes(cur, 1, data);
- out_len++;
}
}
@@ -674,7 +689,7 @@
size_t pos;
for (pos = 0; pos < len; pos++) {
- if (memchr(escapable, str[pos], sizeof(escapable) - 1)) {
+ if (escape_as(str[pos])) {
escaped_len++;
}
}