summaryrefslogtreecommitdiffstatshomepage
path: root/html.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-10-03 16:36:06 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-10-03 16:36:06 +0000
commit5fd4bbfb011aeb0750a37047be4d3fade1964aea (patch)
tree1dc8a3461388b9f151c4f2321f0e8214676d3252 /html.c
parent2c8407d1d02802e3c8bd38cf02d3e7cc8252a498 (diff)
downloadmandoc-5fd4bbfb011aeb0750a37047be4d3fade1964aea.tar.gz
mandoc-5fd4bbfb011aeb0750a37047be4d3fade1964aea.tar.zst
mandoc-5fd4bbfb011aeb0750a37047be4d3fade1964aea.zip
Fixed mandoc.1 examples (new -Thtml options).
Fixed manuals to use `In', not `Fd'. Moved buf* functions into html.c.
Diffstat (limited to 'html.c')
-rw-r--r--html.c99
1 files changed, 96 insertions, 3 deletions
diff --git a/html.c b/html.c
index 45b40be8..02d77cbe 100644
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.54 2009/10/03 15:26:26 kristaps Exp $ */
+/* $Id: html.c,v 1.55 2009/10/03 16:36:06 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -20,6 +20,7 @@
#include <assert.h>
#include <err.h>
#include <stdio.h>
+#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -142,8 +143,6 @@ html_free(void *p)
free(tag);
}
- if (h->buf)
- free(h->buf);
if (h->symtab)
chars_free(h->symtab);
@@ -487,3 +486,97 @@ print_stagq(struct html *h, const struct tag *suntil)
free(tag);
}
}
+
+
+void
+bufinit(struct html *h)
+{
+
+ h->buf[0] = '\0';
+ h->buflen = 0;
+}
+
+
+void
+bufcat(struct html *h, const char *p)
+{
+
+ bufncat(h, p, strlen(p));
+}
+
+
+void
+buffmt(struct html *h, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ (void)vsnprintf(h->buf + h->buflen,
+ BUFSIZ - h->buflen - 1, fmt, ap);
+ va_end(ap);
+ h->buflen = strlen(h->buf);
+ assert('\0' == h->buf[h->buflen]);
+}
+
+
+void
+bufncat(struct html *h, const char *p, size_t sz)
+{
+
+ if (h->buflen + sz > BUFSIZ - 1)
+ sz = BUFSIZ - 1 - h->buflen;
+
+ (void)strncat(h->buf, p, sz);
+ h->buflen += sz;
+ assert('\0' == h->buf[h->buflen]);
+}
+
+
+void
+buffmt_includes(struct html *h, const char *name)
+{
+ const char *p, *pp;
+
+ pp = h->base_includes;
+ while ((p = strchr(pp, '%'))) {
+ bufncat(h, pp, p - pp);
+ switch (*(p + 1)) {
+ case('I'):
+ bufcat(h, name);
+ break;
+ default:
+ bufncat(h, p, 2);
+ break;
+ }
+ pp = p + 2;
+ }
+ if (pp)
+ bufcat(h, pp);
+}
+
+
+void
+buffmt_man(struct html *h,
+ const char *name, const char *sec)
+{
+ const char *p, *pp;
+
+ pp = h->base_man;
+ while ((p = strchr(pp, '%'))) {
+ bufncat(h, pp, p - pp);
+ switch (*(p + 1)) {
+ case('S'):
+ bufcat(h, sec);
+ break;
+ case('N'):
+ buffmt(h, name ? name : "1");
+ break;
+ default:
+ bufncat(h, p, 2);
+ break;
+ }
+ pp = p + 2;
+ }
+ if (pp)
+ bufcat(h, pp);
+}