]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
The bufcat() function in -T[x]html was eating one byte off the end of its
[mandoc.git] / mdoc_html.c
index b5fc053a842fbd0fb8882dbe75fcbdea25432df2..33cebdacc11d42d56aef1ced4b5f6c946116d280 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.167 2011/05/17 11:19:45 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.172 2011/07/04 09:42:38 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -384,11 +384,8 @@ print_mdoc_head(MDOC_ARGS)
        bufinit(h);
        bufcat_fmt(h, "%s(%s)", m->title, m->msec);
 
        bufinit(h);
        bufcat_fmt(h, "%s(%s)", m->title, m->msec);
 
-       if (m->arch) {
-               bufcat(h, " (");
-               bufcat(h, m->arch);
-               bufcat(h, ")");
-       }
+       if (m->arch)
+               bufcat_fmt(h, " (%s)", m->arch);
 
        print_otag(h, TAG_TITLE, 0, NULL);
        print_text(h, h->buf);
 
        print_otag(h, TAG_TITLE, 0, NULL);
        print_text(h, h->buf);
@@ -415,7 +412,6 @@ print_mdoc_node(MDOC_ARGS)
        child = 1;
        t = h->tags.head;
 
        child = 1;
        t = h->tags.head;
 
-       bufinit(h);
        switch (n->type) {
        case (MDOC_ROOT):
                child = mdoc_root_pre(m, n, h);
        switch (n->type) {
        case (MDOC_ROOT):
                child = mdoc_root_pre(m, n, h);
@@ -484,7 +480,6 @@ print_mdoc_node(MDOC_ARGS)
 
        print_stagq(h, t);
 
 
        print_stagq(h, t);
 
-       bufinit(h);
        switch (n->type) {
        case (MDOC_ROOT):
                mdoc_root_post(m, n, h);
        switch (n->type) {
        case (MDOC_ROOT):
                mdoc_root_post(m, n, h);
@@ -606,7 +601,6 @@ static int
 mdoc_sh_pre(MDOC_ARGS)
 {
        struct htmlpair  tag;
 mdoc_sh_pre(MDOC_ARGS)
 {
        struct htmlpair  tag;
-       char             buf[BUFSIZ];
 
        if (MDOC_BLOCK == n->type) {
                PAIR_CLASS_INIT(&tag, "section");
 
        if (MDOC_BLOCK == n->type) {
                PAIR_CLASS_INIT(&tag, "section");
@@ -615,14 +609,15 @@ mdoc_sh_pre(MDOC_ARGS)
        } else if (MDOC_BODY == n->type)
                return(1);
 
        } else if (MDOC_BODY == n->type)
                return(1);
 
-       buf[0] = '\0';
+       bufinit(h);
+       bufcat(h, "x");
        for (n = n->child; n; n = n->next) {
        for (n = n->child; n; n = n->next) {
-               html_idcat(buf, n->string, BUFSIZ);
+               bufcat_id(h, n->string);
                if (n->next)
                if (n->next)
-                       html_idcat(buf, " ", BUFSIZ);
+                       bufcat_id(h, " ");
        }
 
        }
 
-       PAIR_ID_INIT(&tag, buf);
+       PAIR_ID_INIT(&tag, h->buf);
        print_otag(h, TAG_H1, 1, &tag);
        return(1);
 }
        print_otag(h, TAG_H1, 1, &tag);
        return(1);
 }
@@ -633,7 +628,6 @@ static int
 mdoc_ss_pre(MDOC_ARGS)
 {
        struct htmlpair  tag;
 mdoc_ss_pre(MDOC_ARGS)
 {
        struct htmlpair  tag;
-       char             buf[BUFSIZ];
 
        if (MDOC_BLOCK == n->type) {
                PAIR_CLASS_INIT(&tag, "subsection");
 
        if (MDOC_BLOCK == n->type) {
                PAIR_CLASS_INIT(&tag, "subsection");
@@ -642,14 +636,15 @@ mdoc_ss_pre(MDOC_ARGS)
        } else if (MDOC_BODY == n->type)
                return(1);
 
        } else if (MDOC_BODY == n->type)
                return(1);
 
-       buf[0] = '\0';
+       bufinit(h);
+       bufcat(h, "x");
        for (n = n->child; n; n = n->next) {
        for (n = n->child; n; n = n->next) {
-               html_idcat(buf, n->string, BUFSIZ);
+               bufcat_id(h, n->string);
                if (n->next)
                if (n->next)
-                       html_idcat(buf, " ", BUFSIZ);
+                       bufcat_id(h, " ");
        }
 
        }
 
-       PAIR_ID_INIT(&tag, buf);
+       PAIR_ID_INIT(&tag, h->buf);
        print_otag(h, TAG_H2, 1, &tag);
        return(1);
 }
        print_otag(h, TAG_H2, 1, &tag);
        return(1);
 }
@@ -737,6 +732,7 @@ mdoc_nm_pre(MDOC_ARGS)
                len = html_strlen(m->name);
 
        SCALE_HS_INIT(&su, (double)len);
                len = html_strlen(m->name);
 
        SCALE_HS_INIT(&su, (double)len);
+       bufinit(h);
        bufcat_su(h, "width", &su);
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_COL, 1, &tag);
        bufcat_su(h, "width", &su);
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_COL, 1, &tag);
@@ -899,6 +895,8 @@ mdoc_it_pre(MDOC_ARGS)
        assert(lists[type]);
        PAIR_CLASS_INIT(&tag[0], lists[type]);
 
        assert(lists[type]);
        PAIR_CLASS_INIT(&tag[0], lists[type]);
 
+       bufinit(h);
+
        if (MDOC_HEAD == n->type) {
                switch (type) {
                case(LIST_bullet):
        if (MDOC_HEAD == n->type) {
                switch (type) {
                case(LIST_bullet):
@@ -999,6 +997,8 @@ mdoc_bl_pre(MDOC_ARGS)
        struct roffsu    su;
        char             buf[BUFSIZ];
 
        struct roffsu    su;
        char             buf[BUFSIZ];
 
+       bufinit(h);
+
        if (MDOC_BODY == n->type) {
                if (LIST_column == n->norm->Bl.type)
                        print_otag(h, TAG_TBODY, 0, NULL);
        if (MDOC_BODY == n->type) {
                if (LIST_column == n->norm->Bl.type)
                        print_otag(h, TAG_TBODY, 0, NULL);
@@ -1018,7 +1018,6 @@ mdoc_bl_pre(MDOC_ARGS)
 
                for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
                        a2width(n->norm->Bl.cols[i], &su);
 
                for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
                        a2width(n->norm->Bl.cols[i], &su);
-                       bufinit(h);
                        if (i < (int)n->norm->Bl.ncols - 1)
                                bufcat_su(h, "width", &su);
                        else
                        if (i < (int)n->norm->Bl.ncols - 1)
                                bufcat_su(h, "width", &su);
                        else
@@ -1147,6 +1146,7 @@ mdoc_d1_pre(MDOC_ARGS)
                return(1);
 
        SCALE_VS_INIT(&su, 0);
                return(1);
 
        SCALE_VS_INIT(&su, 0);
+       bufinit(h);
        bufcat_su(h, "margin-top", &su);
        bufcat_su(h, "margin-bottom", &su);
        PAIR_STYLE_INIT(&tag[0], h);
        bufcat_su(h, "margin-top", &su);
        bufcat_su(h, "margin-bottom", &su);
        PAIR_STYLE_INIT(&tag[0], h);
@@ -1171,17 +1171,17 @@ static int
 mdoc_sx_pre(MDOC_ARGS)
 {
        struct htmlpair  tag[2];
 mdoc_sx_pre(MDOC_ARGS)
 {
        struct htmlpair  tag[2];
-       char             buf[BUFSIZ];
 
 
-       strlcpy(buf, "#", BUFSIZ);
+       bufinit(h);
+       bufcat(h, "#x");
        for (n = n->child; n; n = n->next) {
        for (n = n->child; n; n = n->next) {
-               html_idcat(buf, n->string, BUFSIZ);
+               bufcat_id(h, n->string);
                if (n->next)
                if (n->next)
-                       html_idcat(buf, " ", BUFSIZ);
+                       bufcat_id(h, " ");
        }
 
        PAIR_CLASS_INIT(&tag[0], "link-sec");
        }
 
        PAIR_CLASS_INIT(&tag[0], "link-sec");
-       PAIR_HREF_INIT(&tag[1], buf);
+       PAIR_HREF_INIT(&tag[1], h->buf);
 
        print_otag(h, TAG_I, 1, tag);
        print_otag(h, TAG_A, 2, tag);
 
        print_otag(h, TAG_I, 1, tag);
        print_otag(h, TAG_A, 2, tag);
@@ -1219,7 +1219,8 @@ mdoc_bd_pre(MDOC_ARGS)
        SCALE_HS_INIT(&su, 0);
        if (n->norm->Bd.offs)
                a2offs(n->norm->Bd.offs, &su);
        SCALE_HS_INIT(&su, 0);
        if (n->norm->Bd.offs)
                a2offs(n->norm->Bd.offs, &su);
-
+       
+       bufinit(h);
        bufcat_su(h, "margin-left", &su);
        PAIR_STYLE_INIT(&tag[0], h);
 
        bufcat_su(h, "margin-left", &su);
        PAIR_STYLE_INIT(&tag[0], h);
 
@@ -1438,7 +1439,6 @@ mdoc_fd_pre(MDOC_ARGS)
                        buf[sz - 1] = '\0';
 
                PAIR_CLASS_INIT(&tag[0], "link-includes");
                        buf[sz - 1] = '\0';
 
                PAIR_CLASS_INIT(&tag[0], "link-includes");
-               bufinit(h);
                
                i = 1;
                if (h->base_includes) {
                
                i = 1;
                if (h->base_includes) {
@@ -1560,8 +1560,8 @@ mdoc_fn_pre(MDOC_ARGS)
        print_text(h, "(");
        h->flags |= HTML_NOSPACE;
 
        print_text(h, "(");
        h->flags |= HTML_NOSPACE;
 
-       bufinit(h);
        PAIR_CLASS_INIT(&tag[0], "farg");
        PAIR_CLASS_INIT(&tag[0], "farg");
+       bufinit(h);
        bufcat_style(h, "white-space", "nowrap");
        PAIR_STYLE_INIT(&tag[1], h);
 
        bufcat_style(h, "white-space", "nowrap");
        PAIR_STYLE_INIT(&tag[1], h);
 
@@ -1635,11 +1635,13 @@ mdoc_sp_pre(MDOC_ARGS)
        SCALE_VS_INIT(&su, 1);
 
        if (MDOC_sp == n->tok) {
        SCALE_VS_INIT(&su, 1);
 
        if (MDOC_sp == n->tok) {
-               if (n->child)
-                       a2roffsu(n->child->string, &su, SCALE_VS);
+               if (NULL != (n = n->child))
+                       if ( ! a2roffsu(n->string, &su, SCALE_VS))
+                               SCALE_VS_INIT(&su, atoi(n->string));
        } else
                su.scale = 0;
 
        } else
                su.scale = 0;
 
+       bufinit(h);
        bufcat_su(h, "height", &su);
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_DIV, 1, &tag);
        bufcat_su(h, "height", &su);
        PAIR_STYLE_INIT(&tag, h);
        print_otag(h, TAG_DIV, 1, &tag);
@@ -1667,10 +1669,11 @@ mdoc_lk_pre(MDOC_ARGS)
 
        print_otag(h, TAG_A, 2, tag);
 
 
        print_otag(h, TAG_A, 2, tag);
 
-       for (n = n->next; n; n = n->next) {
-               assert(MDOC_TEXT == n->type);
+       if (NULL == n->next)
+               print_text(h, n->string);
+
+       for (n = n->next; n; n = n->next)
                print_text(h, n->string);
                print_text(h, n->string);
-       }
 
        return(0);
 }
 
        return(0);
 }
@@ -1776,10 +1779,8 @@ mdoc_in_pre(MDOC_ARGS)
                assert(MDOC_TEXT == n->type);
 
                PAIR_CLASS_INIT(&tag[0], "link-includes");
                assert(MDOC_TEXT == n->type);
 
                PAIR_CLASS_INIT(&tag[0], "link-includes");
-               bufinit(h);
 
                i = 1;
 
                i = 1;
-
                if (h->base_includes) {
                        buffmt_includes(h, n->string);
                        PAIR_HREF_INIT(&tag[i], h->buf);
                if (h->base_includes) {
                        buffmt_includes(h, n->string);
                        PAIR_HREF_INIT(&tag[i], h->buf);
@@ -1918,6 +1919,7 @@ mdoc_bf_pre(MDOC_ARGS)
         * We want this to be inline-formatted, but needs to be div to
         * accept block children. 
         */
         * We want this to be inline-formatted, but needs to be div to
         * accept block children. 
         */
+       bufinit(h);
        bufcat_style(h, "display", "inline");
        SCALE_HS_INIT(&su, 1);
        /* Needs a left-margin for spacing. */
        bufcat_style(h, "display", "inline");
        SCALE_HS_INIT(&su, 1);
        /* Needs a left-margin for spacing. */