]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_html.c
Don't let empty strings into the makewhatis keyword database.
[mandoc.git] / mdoc_html.c
index 49782a39f9a9a36520e5095b55ee569a266cd5ad..1db351cee77867610710dbf9e6026d7902734088 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_html.c,v 1.162 2011/04/04 16:48:18 kristaps Exp $ */
+/*     $Id: mdoc_html.c,v 1.170 2011/06/16 22:21:28 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -288,7 +288,7 @@ a2width(const char *p, struct roffsu *su)
 
        if ( ! a2roffsu(p, su, SCALE_MAX)) {
                su->unit = SCALE_BU;
 
        if ( ! a2roffsu(p, su, SCALE_MAX)) {
                su->unit = SCALE_BU;
-               su->scale = (int)strlen(p);
+               su->scale = html_strlen(p);
        }
 }
 
        }
 }
 
@@ -355,7 +355,7 @@ a2offs(const char *p, struct roffsu *su)
                SCALE_HS_INIT(su, INDENT * 2);
        else if ( ! a2roffsu(p, su, SCALE_MAX)) {
                su->unit = SCALE_BU;
                SCALE_HS_INIT(su, INDENT * 2);
        else if ( ! a2roffsu(p, su, SCALE_MAX)) {
                su->unit = SCALE_BU;
-               su->scale = (int)strlen(p);
+               su->scale = html_strlen(p);
        }
 }
 
        }
 }
 
@@ -382,13 +382,10 @@ print_mdoc_head(MDOC_ARGS)
 
        print_gen_head(h);
        bufinit(h);
 
        print_gen_head(h);
        bufinit(h);
-       buffmt(h, "%s(%s)", m->title, m->msec);
+       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,14 @@ 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);
        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 +627,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 +635,14 @@ 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);
        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);
 }
@@ -703,7 +696,7 @@ mdoc_nm_pre(MDOC_ARGS)
 {
        struct htmlpair  tag;
        struct roffsu    su;
 {
        struct htmlpair  tag;
        struct roffsu    su;
-       size_t           len;
+       int              len;
 
        switch (n->type) {
        case (MDOC_ELEM):
 
        switch (n->type) {
        case (MDOC_ELEM):
@@ -731,12 +724,13 @@ mdoc_nm_pre(MDOC_ARGS)
 
        for (len = 0, n = n->child; n; n = n->next)
                if (MDOC_TEXT == n->type)
 
        for (len = 0, n = n->child; n; n = n->next)
                if (MDOC_TEXT == n->type)
-                       len += strlen(n->string);
+                       len += html_strlen(n->string);
 
        if (0 == len && m->name)
 
        if (0 == len && m->name)
-               len = strlen(m->name);
+               len = html_strlen(m->name);
 
        SCALE_HS_INIT(&su, (double)len);
 
        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 +893,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 +995,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 +1016,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 +1144,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 +1169,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 +1217,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 +1437,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) {
@@ -1558,9 +1556,10 @@ mdoc_fn_pre(MDOC_ARGS)
 
        h->flags |= HTML_NOSPACE;
        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);
 
@@ -1639,6 +1638,7 @@ mdoc_sp_pre(MDOC_ARGS)
        } 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);
@@ -1666,10 +1666,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);
 }
@@ -1775,10 +1776,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);
@@ -1917,6 +1916,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. */