=================================================================== RCS file: /cvs/mandoc/html.c,v retrieving revision 1.52 retrieving revision 1.56 diff -u -p -r1.52 -r1.56 --- mandoc/html.c 2009/09/24 09:50:31 1.52 +++ mandoc/html.c 2009/10/03 16:37:23 1.56 @@ -1,4 +1,4 @@ -/* $Id: html.c,v 1.52 2009/09/24 09:50:31 kristaps Exp $ */ +/* $Id: html.c,v 1.56 2009/10/03 16:37:23 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,7 @@ static const char *const htmlattrs[ATTR_MAX] = { "style", "width", "valign", + "target", }; #ifdef __linux__ @@ -83,11 +85,12 @@ void * html_alloc(char *outopts) { struct html *h; - char *toks[3], *v; + char *toks[4], *v; toks[0] = "style"; - toks[1] = "base"; - toks[2] = NULL; + toks[1] = "man"; + toks[2] = "includes"; + toks[3] = NULL; if (NULL == (h = calloc(1, sizeof(struct html)))) return(NULL); @@ -106,8 +109,11 @@ html_alloc(char *outopts) h->style = v; break; case (1): - h->base = v; + h->base_man = v; break; + case (2): + h->base_includes = v; + break; default: break; } @@ -139,6 +145,7 @@ html_free(void *p) if (h->symtab) chars_free(h->symtab); + free(h); } @@ -171,12 +178,6 @@ print_gen_head(struct html *h) tag[3].val = "all"; print_otag(h, TAG_LINK, 4, tag); } - - if (h->base) { - tag[0].key = ATTR_HREF; - tag[1].val = h->base; - print_otag(h, TAG_BASE, 1, tag); - } } @@ -484,4 +485,96 @@ print_stagq(struct html *h, const struct tag *suntil) SLIST_REMOVE_HEAD(&h->tags, entry); 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 + (int)h->buflen, + BUFSIZ - h->buflen - 1, fmt, ap); + va_end(ap); + h->buflen = strlen(h->buf); +} + + +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; +} + + +void +buffmt_includes(struct html *h, const char *name) +{ + const char *p, *pp; + + pp = h->base_includes; + while ((p = strchr(pp, '%'))) { + bufncat(h, pp, (size_t)(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, (size_t)(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); }