static char *json_escape_str(const char *s) { static const char json_escape[] = {'"', '\\', '\b', '\f', '\n', '\r', '\t', 0}; static const char json_subst[] = {'"', '\\', 'b', 'f', 'n', 'r', 't', 0}; char *ret, *p; int i, len = 0; // compute the length of the escaped string for (i = 0; s[i]; i++) { if (strchr(json_escape, s[i])) len += 2; // simple escape else if ((unsigned char)s[i] < 32) len += 6; // handle non-printable chars else len += 1; // char copy } p = ret = av_malloc(len + 1); if (!p) return NULL; for (i = 0; s[i]; i++) { char *q = strchr(json_escape, s[i]); if (q) { *p++ = '\\'; *p++ = json_subst[q - json_escape]; } else if ((unsigned char)s[i] < 32) { snprintf(p, 7, "\\u00%02x", s[i] & 0xff); p += 6; } else { *p++ = s[i]; } } *p = 0; return ret; }