diff options
author | Jo-Philipp Wich <jo@mein.io> | 2018-04-04 16:56:49 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2018-04-04 16:56:49 +0200 |
commit | d3b95607a7f0961038674c7651a50215a0eb2db1 (patch) | |
tree | a8b460d17393c1aa9719b1993743360db162c6ad | |
parent | a39b7f8e5b150c9c94ecf46f95084e4f001b03f2 (diff) |
utils: add uh_htmlescape() helper
The uh_htmlescape() function returns a copy of the given string with the
HTML special characters `<`, `>`, `"` and `'` replaced by HTML entities in
hexadecimal notation.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | utils.c | 42 | ||||
-rw-r--r-- | utils.h | 1 |
2 files changed, 43 insertions, 0 deletions
@@ -249,3 +249,45 @@ bool uh_addr_rfc1918(struct uh_addr *addr) return 0; } + + +static bool is_html_special_char(char c) +{ + switch (c) + { + case 0x22: + case 0x26: + case 0x27: + case 0x3C: + case 0x3E: + return true; + + default: + return false; + } +} + +char *uh_htmlescape(const char *str) +{ + size_t len; + char *p, *copy; + + for (p = str, len = 1; *p; p++) + if (is_html_special_char(*p)) + len += 6; /* &#x??; */ + else + len++; + + copy = calloc(1, len); + + if (!copy) + return NULL; + + for (p = copy; *str; str++) + if (is_html_special_char(*str)) + p += sprintf(p, "&#x%02x;", (unsigned int)*str); + else + *p++ = *str; + + return copy; +} @@ -73,5 +73,6 @@ int uh_b64decode(char *buf, int blen, const void *src, int slen); bool uh_path_match(const char *prefix, const char *url); char *uh_split_header(char *str); bool uh_addr_rfc1918(struct uh_addr *addr); +char *uh_htmlescape(const char *src); #endif |