aboutsummaryrefslogtreecommitdiff
path: root/html.c
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'html.c')
-rw-r--r--html.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/html.c b/html.c
index 0bac34b..e7e6e07 100644
--- a/html.c
+++ b/html.c
@@ -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("&gt;");
+ else if (c == '<')
+ html("&lt;");
+ else if (c == '&')
+ html("&amp;");
+ 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, ...)