aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/htmlroff/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/htmlroff/util.c')
-rw-r--r--src/cmd/htmlroff/util.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/cmd/htmlroff/util.c b/src/cmd/htmlroff/util.c
new file mode 100644
index 00000000..99e99543
--- /dev/null
+++ b/src/cmd/htmlroff/util.c
@@ -0,0 +1,123 @@
+#include "a.h"
+
+void*
+emalloc(uint n)
+{
+ void *v;
+
+ v = mallocz(n, 1);
+ if(v == nil)
+ sysfatal("out of memory");
+ return v;
+}
+
+char*
+estrdup(char *s)
+{
+ char *t;
+
+ t = strdup(s);
+ if(t == nil)
+ sysfatal("out of memory");
+ return t;
+}
+
+Rune*
+erunestrdup(Rune *s)
+{
+ Rune *t;
+
+ t = emalloc(sizeof(Rune)*(runestrlen(s)+1));
+ if(t == nil)
+ sysfatal("out of memory");
+ runestrcpy(t, s);
+ return t;
+}
+
+void*
+erealloc(void *ov, uint n)
+{
+ void *v;
+
+ v = realloc(ov, n);
+ if(v == nil)
+ sysfatal("out of memory");
+ return v;
+}
+
+Rune*
+erunesmprint(char *fmt, ...)
+{
+ Rune *s;
+ va_list arg;
+
+ va_start(arg, fmt);
+ s = runevsmprint(fmt, arg);
+ va_end(arg);
+ if(s == nil)
+ sysfatal("out of memory");
+ return s;
+}
+
+char*
+esmprint(char *fmt, ...)
+{
+ char *s;
+ va_list arg;
+
+ va_start(arg, fmt);
+ s = vsmprint(fmt, arg);
+ va_end(arg);
+ if(s == nil)
+ sysfatal("out of memory");
+ return s;
+}
+
+void
+warn(char *fmt, ...)
+{
+ va_list arg;
+
+ fprint(2, "htmlroff: %L: ");
+ va_start(arg, fmt);
+ vfprint(2, fmt, arg);
+ va_end(arg);
+ fprint(2, "\n");
+}
+
+/*
+ * For non-Unicode compilers, so we can say
+ * L("asdf") and get a Rune string. Assumes strings
+ * are identified by their pointers, so no mutable strings!
+ */
+typedef struct Lhash Lhash;
+struct Lhash
+{
+ char *s;
+ Lhash *next;
+ Rune r[1];
+};
+static Lhash *hash[1127];
+
+Rune*
+L(char *s)
+{
+ Rune *p;
+ Lhash *l;
+ uint h;
+
+ h = (uintptr)s%nelem(hash);
+ for(l=hash[h]; l; l=l->next)
+ if(l->s == s)
+ return l->r;
+ l = emalloc(sizeof *l+(utflen(s)+1)*sizeof(Rune));
+ p = l->r;
+ l->s = s;
+ while(*s)
+ s += chartorune(p++, s);
+ *p = 0;
+ l->next = hash[h];
+ hash[h] = l;
+ return l->r;
+}
+