Centralise the program name into the main header file. I'm probably
[sgt/agedu] / malloc.c
index 3cb5dfe..7de2e13 100644 (file)
--- a/malloc.c
+++ b/malloc.c
@@ -9,10 +9,9 @@
 #include <assert.h>
 #include <stdio.h>
 
+#include "agedu.h"
 #include "malloc.h"
 
-#define lenof(x) (sizeof((x))/sizeof(*(x)))
-
 extern void fatal(const char *, ...);
 
 void *smalloc(size_t size) {
@@ -69,7 +68,7 @@ char *dupfmt(const char *fmt, ...)
 
        while (*p) {
            const char *data = NULL;
-           int datalen = 0, stuffcr = 0;
+           int datalen = 0, stuffcr = 0, htmlesc = 0;
 
            if (*p == '%') {
                p++;
@@ -93,6 +92,10 @@ char *dupfmt(const char *fmt, ...)
                } else if (*p == 's') {
                    data = va_arg(ap, const char *);
                    datalen = strlen(data);
+               } else if (*p == 'h') {
+                   htmlesc = 1;
+                   data = va_arg(ap, const char *);
+                   datalen = strlen(data);
                } else if (assert(*p == 'S'), 1) {
                    stuffcr = va_arg(ap, int);
                    data = va_arg(ap, const char *);
@@ -106,20 +109,30 @@ char *dupfmt(const char *fmt, ...)
            }
 
            if (pass == 0) {
-               totallen += datalen;
-               if (stuffcr) {
-                   while (datalen > 0) {
-                       if (*data == '\n')
-                           totallen++;
-                       data++, datalen--;
-                   }
+               while (datalen > 0) {
+                   totallen++;
+                   if (stuffcr && *data == '\n')
+                       totallen++;
+                   if (htmlesc &&
+                       (*data == '<' || *data == '>' || *data == '&'))
+                       totallen += 4; /* max(len("gt;"),len("amp;")) */
+                   data++, datalen--;
                }
            } else {
                while (datalen > 0) {
-                   if (stuffcr && *data == '\n')
-                       *rp++ = '\r';
-                   *rp++ = *data++;
-                   datalen--;
+                   if (htmlesc && (*data < 32 || *data >= 127))
+                       *rp++ = '?';   /* *shrug* */
+                   else if (htmlesc && *data == '<')
+                       rp += sprintf(rp, "&lt;");
+                   else if (htmlesc && *data == '>')
+                       rp += sprintf(rp, "&gt;");
+                   else if (htmlesc && *data == '&')
+                       rp += sprintf(rp, "&amp;");
+                   else if (stuffcr && *data == '\n')
+                       *rp++ = '\r', *rp++ = '\n';
+                   else
+                       *rp++ = *data;
+                   data++, datalen--;
                }
            }
        }