Diffstat (limited to 'html.c')
| -rw-r--r-- | html.c | 34 |
1 files changed, 22 insertions, 12 deletions
@@ -59,7 +59,7 @@ char *fmt(const char *format, ...) va_start(args, format); len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args); va_end(args); - if (len >= sizeof(buf[bufidx])) { + if (len > sizeof(buf[bufidx])) { fprintf(stderr, "[html.c] string truncated: %s\n", format); exit(1); } @@ -124,20 +124,29 @@ void html_vtxtf(const char *format, va_list ap) void html_txt(const char *txt) { - if (txt) - html_ntxt(txt, strlen(txt)); + const char *t = txt; + while (t && *t) { + int c = *t; + if (c == '<' || c == '>' || c == '&') { + html_raw(txt, t - txt); + if (c == '>') + html(">"); + else if (c == '<') + html("<"); + else if (c == '&') + html("&"); + txt = t + 1; + } + t++; + } + if (t != txt) + html(txt); } -ssize_t html_ntxt(const char *txt, size_t len) +void html_ntxt(int len, const char *txt) { const char *t = txt; - ssize_t slen; - - if (len > SSIZE_MAX) - return -1; - - slen = (ssize_t) len; - while (t && *t && slen--) { + while (t && *t && len--) { int c = *t; if (c == '<' || c == '>' || c == '&') { html_raw(txt, t - txt); @@ -153,7 +162,8 @@ ssize_t html_ntxt(const char *txt, size_t len) } if (t != txt) html_raw(txt, t - txt); - return slen; + if (len < 0) + html("..."); } void html_attrf(const char *fmt, ...) |