]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_term.c
Pledge man.cgi(8).
[mandoc.git] / mdoc_term.c
index 9540b3269fc57064724631a45a6a5ad29fe2c906..e9ea455a48e833c04698998e0ad77ebcce7a5598 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.340 2017/01/10 23:36:34 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.346 2017/02/17 19:15:41 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -91,7 +91,6 @@ static        int       termp_bf_pre(DECL_ARGS);
 static int       termp_bk_pre(DECL_ARGS);
 static int       termp_bl_pre(DECL_ARGS);
 static int       termp_bold_pre(DECL_ARGS);
-static int       termp_bt_pre(DECL_ARGS);
 static int       termp_cd_pre(DECL_ARGS);
 static int       termp_d1_pre(DECL_ARGS);
 static int       termp_eo_pre(DECL_ARGS);
@@ -114,7 +113,6 @@ static      int       termp_nm_pre(DECL_ARGS);
 static int       termp_ns_pre(DECL_ARGS);
 static int       termp_quote_pre(DECL_ARGS);
 static int       termp_rs_pre(DECL_ARGS);
-static int       termp_rv_pre(DECL_ARGS);
 static int       termp_sh_pre(DECL_ARGS);
 static int       termp_skip_pre(DECL_ARGS);
 static int       termp_sm_pre(DECL_ARGS);
@@ -123,7 +121,6 @@ static      int       termp_ss_pre(DECL_ARGS);
 static int       termp_sy_pre(DECL_ARGS);
 static int       termp_tag_pre(DECL_ARGS);
 static int       termp_under_pre(DECL_ARGS);
-static int       termp_ud_pre(DECL_ARGS);
 static int       termp_vt_pre(DECL_ARGS);
 static int       termp_xr_pre(DECL_ARGS);
 static int       termp_xx_pre(DECL_ARGS);
@@ -165,7 +162,7 @@ static      const struct termact termacts[MDOC_MAX] = {
        { termp_quote_pre, termp_quote_post }, /* Op */
        { termp_ft_pre, NULL }, /* Ot */
        { termp_under_pre, NULL }, /* Pa */
-       { termp_rv_pre, NULL }, /* Rv */
+       { termp_ex_pre, NULL }, /* Rv */
        { NULL, NULL }, /* St */
        { termp_under_pre, NULL }, /* Va */
        { termp_vt_pre, NULL }, /* Vt */
@@ -231,10 +228,10 @@ static    const struct termact termacts[MDOC_MAX] = {
        { NULL, NULL }, /* Oc */
        { termp_bk_pre, termp_bk_post }, /* Bk */
        { NULL, NULL }, /* Ek */
-       { termp_bt_pre, NULL }, /* Bt */
+       { NULL, NULL }, /* Bt */
        { NULL, NULL }, /* Hf */
        { termp_under_pre, NULL }, /* Fr */
-       { termp_ud_pre, NULL }, /* Ud */
+       { NULL, NULL }, /* Ud */
        { NULL, termp_lb_post }, /* Lb */
        { termp_sp_pre, NULL }, /* Lp */
        { termp_lk_pre, NULL }, /* Lk */
@@ -261,6 +258,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc)
 {
        struct roff_node        *n;
        struct termp            *p;
+       size_t                   save_defindent;
 
        p = (struct termp *)arg;
        p->overstep = 0;
@@ -281,6 +279,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc)
                        n = n->next;
                }
        } else {
+               save_defindent = p->defindent;
                if (p->defindent == 0)
                        p->defindent = 5;
                term_begin(p, print_mdoc_head, print_mdoc_foot,
@@ -293,6 +292,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc)
                        print_mdoc_nodelist(p, NULL, &mdoc->meta, n);
                }
                term_end(p);
+               p->defindent = save_defindent;
        }
 }
 
@@ -395,14 +395,6 @@ print_mdoc_node(DECL_ARGS)
                 */
                if (ENDBODY_NOT != n->end)
                        n->body->flags |= NODE_ENDED;
-
-               /*
-                * End of line terminating an implicit block
-                * while an explicit block is still open.
-                * Continue the explicit block without spacing.
-                */
-               if (ENDBODY_NOSPACE == n->end)
-                       p->flags |= TERMP_NOSPACE;
                break;
        }
 
@@ -614,6 +606,7 @@ termp_ll_pre(DECL_ARGS)
 static int
 termp_it_pre(DECL_ARGS)
 {
+       struct roffsu           su;
        char                    buf[24];
        const struct roff_node *bl, *nn;
        size_t                  ncols, dcol;
@@ -691,9 +684,12 @@ termp_it_pre(DECL_ARGS)
 
                for (i = 0, nn = n->prev;
                    nn->prev && i < (int)ncols;
-                   nn = nn->prev, i++)
-                       offset += dcol + a2width(p,
-                           bl->norm->Bl.cols[i]);
+                   nn = nn->prev, i++) {
+                       SCALE_HS_INIT(&su,
+                           term_strlen(p, bl->norm->Bl.cols[i]));
+                       su.scale /= term_strlen(p, "0");
+                       offset += term_hspan(p, &su) / 24 + dcol;
+               }
 
                /*
                 * When exceeding the declared number of columns, leave
@@ -708,7 +704,9 @@ termp_it_pre(DECL_ARGS)
                 * Use the declared column widths, extended as explained
                 * in the preceding paragraph.
                 */
-               width = a2width(p, bl->norm->Bl.cols[i]) + dcol;
+               SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i]));
+               su.scale /= term_strlen(p, "0");
+               width = term_hspan(p, &su) / 24 + dcol;
                break;
        default:
                if (NULL == bl->norm->Bl.width)
@@ -996,7 +994,7 @@ termp_nm_pre(DECL_ARGS)
                return 1;
        }
 
-       if (NULL == n->child && NULL == meta->name)
+       if (n->child == NULL)
                return 0;
 
        if (n->type == ROFFT_HEAD)
@@ -1020,8 +1018,6 @@ termp_nm_pre(DECL_ARGS)
        }
 
        term_fontpush(p, TERMFONT_BOLD);
-       if (NULL == n->child)
-               term_word(p, meta->name);
        return 1;
 }
 
@@ -1112,92 +1108,11 @@ termp_rs_pre(DECL_ARGS)
        return 1;
 }
 
-static int
-termp_rv_pre(DECL_ARGS)
-{
-       struct roff_node *nch;
-
-       term_newln(p);
-
-       if (n->child != NULL) {
-               term_word(p, "The");
-
-               for (nch = n->child; nch != NULL; nch = nch->next) {
-                       term_fontpush(p, TERMFONT_BOLD);
-                       term_word(p, nch->string);
-                       term_fontpop(p);
-
-                       p->flags |= TERMP_NOSPACE;
-                       term_word(p, "()");
-
-                       if (nch->next == NULL)
-                               continue;
-
-                       if (nch->prev != NULL || nch->next->next != NULL) {
-                               p->flags |= TERMP_NOSPACE;
-                               term_word(p, ",");
-                       }
-                       if (nch->next->next == NULL)
-                               term_word(p, "and");
-               }
-
-               if (n->child != NULL && n->child->next != NULL)
-                       term_word(p, "functions return");
-               else
-                       term_word(p, "function returns");
-
-               term_word(p, "the value\\~0 if successful;");
-       } else
-               term_word(p, "Upon successful completion,"
-                   " the value\\~0 is returned;");
-
-       term_word(p, "otherwise the value\\~\\-1 is returned"
-           " and the global variable");
-
-       term_fontpush(p, TERMFONT_UNDER);
-       term_word(p, "errno");
-       term_fontpop(p);
-
-       term_word(p, "is set to indicate the error.");
-       p->flags |= TERMP_SENTENCE;
-
-       return 0;
-}
-
 static int
 termp_ex_pre(DECL_ARGS)
 {
-       struct roff_node *nch;
-
        term_newln(p);
-       term_word(p, "The");
-
-       for (nch = n->child; nch != NULL; nch = nch->next) {
-               term_fontpush(p, TERMFONT_BOLD);
-               term_word(p, nch->string);
-               term_fontpop(p);
-
-               if (nch->next == NULL)
-                       continue;
-
-               if (nch->prev != NULL || nch->next->next != NULL) {
-                       p->flags |= TERMP_NOSPACE;
-                       term_word(p, ",");
-               }
-
-               if (nch->next->next == NULL)
-                       term_word(p, "and");
-       }
-
-       if (n->child != NULL && n->child->next != NULL)
-               term_word(p, "utilities exit\\~0");
-       else
-               term_word(p, "utility exits\\~0");
-
-       term_word(p, "on success, and\\~>0 if an error occurs.");
-
-       p->flags |= TERMP_SENTENCE;
-       return 0;
+       return 1;
 }
 
 static int
@@ -1398,15 +1313,6 @@ termp_sh_post(DECL_ARGS)
        }
 }
 
-static int
-termp_bt_pre(DECL_ARGS)
-{
-
-       term_word(p, "is currently in beta test.");
-       p->flags |= TERMP_SENTENCE;
-       return 0;
-}
-
 static void
 termp_lb_post(DECL_ARGS)
 {
@@ -1415,15 +1321,6 @@ termp_lb_post(DECL_ARGS)
                term_newln(p);
 }
 
-static int
-termp_ud_pre(DECL_ARGS)
-{
-
-       term_word(p, "currently under development.");
-       p->flags |= TERMP_SENTENCE;
-       return 0;
-}
-
 static int
 termp_d1_pre(DECL_ARGS)
 {
@@ -1817,6 +1714,8 @@ termp_quote_pre(DECL_ARGS)
        case MDOC_Bq:
                term_word(p, "[");
                break;
+       case MDOC__T:
+               /* FALLTHROUGH */
        case MDOC_Do:
        case MDOC_Dq:
                term_word(p, "\\(Lq");
@@ -1831,7 +1730,6 @@ termp_quote_pre(DECL_ARGS)
        case MDOC_Pq:
                term_word(p, "(");
                break;
-       case MDOC__T:
        case MDOC_Qo:
        case MDOC_Qq:
                term_word(p, "\"");
@@ -1874,6 +1772,8 @@ termp_quote_post(DECL_ARGS)
        case MDOC_Bq:
                term_word(p, "]");
                break;
+       case MDOC__T:
+               /* FALLTHROUGH */
        case MDOC_Do:
        case MDOC_Dq:
                term_word(p, "\\(Rq");
@@ -1890,7 +1790,6 @@ termp_quote_post(DECL_ARGS)
        case MDOC_Pq:
                term_word(p, ")");
                break;
-       case MDOC__T:
        case MDOC_Qo:
        case MDOC_Qq:
                term_word(p, "\"");