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++;
 		}
 	}