]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_term.c
Delete five standards that are:
[mandoc.git] / mdoc_term.c
index 1f759399060c03fbe7da85a58248f515c26d5062..486f1afe0b9fd27dee0988e95c3cd62678fabd10 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.279 2014/08/17 16:51:55 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.289 2014/11/10 21:56:43 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -51,7 +51,6 @@ struct        termact {
 
 static size_t    a2width(const struct termp *, const char *);
 static size_t    a2height(const struct termp *, const char *);
-static size_t    a2offs(const struct termp *, const char *);
 
 static void      print_bvspace(struct termp *,
                        const struct mdoc_node *,
@@ -65,7 +64,6 @@ static        void      synopsis_pre(struct termp *,
 
 static void      termp____post(DECL_ARGS);
 static void      termp__t_post(DECL_ARGS);
-static void      termp_an_post(DECL_ARGS);
 static void      termp_bd_post(DECL_ARGS);
 static void      termp_bk_post(DECL_ARGS);
 static void      termp_bl_post(DECL_ARGS);
@@ -138,7 +136,7 @@ static      const struct termact termacts[MDOC_MAX] = {
        { NULL, NULL }, /* El */
        { termp_it_pre, termp_it_post }, /* It */
        { termp_under_pre, NULL }, /* Ad */
-       { termp_an_pre, termp_an_post }, /* An */
+       { termp_an_pre, NULL }, /* An */
        { termp_under_pre, NULL }, /* Ar */
        { termp_cd_pre, NULL }, /* Cd */
        { termp_bold_pre, NULL }, /* Cm */
@@ -252,34 +250,41 @@ static    const struct termact termacts[MDOC_MAX] = {
 void
 terminal_mdoc(void *arg, const struct mdoc *mdoc)
 {
-       const struct mdoc_node  *n;
        const struct mdoc_meta  *meta;
+       struct mdoc_node        *n;
        struct termp            *p;
 
        p = (struct termp *)arg;
 
-       if (0 == p->defindent)
-               p->defindent = 5;
-
        p->overstep = 0;
-       p->maxrmargin = p->defrmargin;
+       p->rmargin = p->maxrmargin = p->defrmargin;
        p->tabwidth = term_len(p, 5);
 
-       if (NULL == p->symtab)
-               p->symtab = mchars_alloc();
-
-       n = mdoc_node(mdoc);
+       n = mdoc_node(mdoc)->child;
        meta = mdoc_meta(mdoc);
 
-       term_begin(p, print_mdoc_head, print_mdoc_foot, meta);
-
-       if (n->child) {
-               if (MDOC_Sh != n->child->tok)
-                       term_vspace(p);
-               print_mdoc_nodelist(p, NULL, meta, n->child);
+       if (p->synopsisonly) {
+               while (n != NULL) {
+                       if (n->tok == MDOC_Sh && n->sec == SEC_SYNOPSIS) {
+                               if (n->child->next->child != NULL)
+                                       print_mdoc_nodelist(p, NULL,
+                                           meta, n->child->next->child);
+                               term_newln(p);
+                               break;
+                       }
+                       n = n->next;
+               }
+       } else {
+               if (p->defindent == 0)
+                       p->defindent = 5;
+               term_begin(p, print_mdoc_head, print_mdoc_foot, meta);
+               if (n != NULL) {
+                       if (n->tok != MDOC_Sh)
+                               term_vspace(p);
+                       print_mdoc_nodelist(p, NULL, meta, n);
+               }
+               term_end(p);
        }
-
-       term_end(p);
 }
 
 static void
@@ -335,7 +340,11 @@ print_mdoc_node(DECL_ARGS)
                        p->flags |= TERMP_NOSPACE;
                break;
        case MDOC_EQN:
+               if ( ! (n->flags & MDOC_LINE))
+                       p->flags |= TERMP_NOSPACE;
                term_eqn(p, n->eqn);
+               if (n->next != NULL && ! (n->next->flags & MDOC_LINE))
+                       p->flags |= TERMP_NOSPACE;
                break;
        case MDOC_TBL:
                term_tbl(p, n->span);
@@ -463,9 +472,6 @@ print_mdoc_head(struct termp *p, const void *arg)
         * switches on the manual section.
         */
 
-       p->offset = 0;
-       p->rmargin = p->maxrmargin;
-
        assert(meta->vol);
        if (NULL == meta->arch)
                volume = mandoc_strdup(meta->vol);
@@ -535,27 +541,10 @@ a2width(const struct termp *p, const char *v)
        struct roffsu    su;
 
        assert(v);
-       if ( ! a2roffsu(v, &su, SCALE_MAX))
-               SCALE_HS_INIT(&su, term_strlen(p, v));
-
-       return(term_hspan(p, &su));
-}
-
-static size_t
-a2offs(const struct termp *p, const char *v)
-{
-       struct roffsu    su;
-
-       if ('\0' == *v)
-               return(0);
-       else if (0 == strcmp(v, "left"))
-               return(0);
-       else if (0 == strcmp(v, "indent"))
-               return(term_len(p, p->defindent + 1));
-       else if (0 == strcmp(v, "indent-two"))
-               return(term_len(p, (p->defindent + 1) * 2));
-       else if ( ! a2roffsu(v, &su, SCALE_MAX))
+       if ( ! a2roffsu(v, &su, SCALE_MAX)) {
                SCALE_HS_INIT(&su, term_strlen(p, v));
+               su.scale /= term_strlen(p, "0");
+       }
 
        return(term_hspan(p, &su));
 }
@@ -583,16 +572,18 @@ print_bvspace(struct termp *p,
 
        /* Do not vspace directly after Ss/Sh. */
 
-       for (nn = n; nn; nn = nn->parent) {
-               if (MDOC_BLOCK != nn->type)
-                       continue;
-               if (MDOC_Ss == nn->tok)
-                       return;
-               if (MDOC_Sh == nn->tok)
+       nn = n;
+       while (nn->prev == NULL) {
+               do {
+                       nn = nn->parent;
+                       if (nn->type == MDOC_ROOT)
+                               return;
+               } while (nn->type != MDOC_BLOCK);
+               if (nn->tok == MDOC_Sh || nn->tok == MDOC_Ss)
                        return;
-               if (NULL == nn->prev)
-                       continue;
-               break;
+               if (nn->tok == MDOC_It &&
+                   nn->parent->parent->norm->Bl.type != LIST_item)
+                       break;
        }
 
        /* A `-column' does not assert vspace within the list. */
@@ -648,7 +639,7 @@ termp_it_pre(DECL_ARGS)
        width = offset = 0;
 
        if (bl->norm->Bl.offs)
-               offset = a2offs(p, bl->norm->Bl.offs);
+               offset = a2width(p, bl->norm->Bl.offs);
 
        switch (type) {
        case LIST_column:
@@ -1075,9 +1066,10 @@ termp_fl_pre(DECL_ARGS)
        term_fontpush(p, TERMFONT_BOLD);
        term_word(p, "\\-");
 
-       if (n->child)
-               p->flags |= TERMP_NOSPACE;
-       else if (n->next && n->next->line == n->line)
+       if ( ! (n->nchild == 0 &&
+           (n->next == NULL ||
+            n->next->type == MDOC_TEXT ||
+            n->next->flags & MDOC_LINE)))
                p->flags |= TERMP_NOSPACE;
 
        return(1);
@@ -1098,54 +1090,27 @@ static int
 termp_an_pre(DECL_ARGS)
 {
 
-       if (NULL == n->child)
-               return(1);
-
-       /*
-        * If not in the AUTHORS section, `An -split' will cause
-        * newlines to occur before the author name.  If in the AUTHORS
-        * section, by default, the first `An' invocation is nosplit,
-        * then all subsequent ones, regardless of whether interspersed
-        * with other macros/text, are split.  -split, in this case,
-        * will override the condition of the implied first -nosplit.
-        */
-
-       if (n->sec == SEC_AUTHORS) {
-               if ( ! (TERMP_ANPREC & p->flags)) {
-                       if (TERMP_SPLIT & p->flags)
-                               term_newln(p);
-                       return(1);
-               }
-               if (TERMP_NOSPLIT & p->flags)
-                       return(1);
-               term_newln(p);
-               return(1);
-       }
-
-       if (TERMP_SPLIT & p->flags)
-               term_newln(p);
-
-       return(1);
-}
-
-static void
-termp_an_post(DECL_ARGS)
-{
-
-       if (n->child) {
-               if (SEC_AUTHORS == n->sec)
-                       p->flags |= TERMP_ANPREC;
-               return;
-       }
-
-       if (AUTH_split == n->norm->An.auth) {
+       if (n->norm->An.auth == AUTH_split) {
                p->flags &= ~TERMP_NOSPLIT;
                p->flags |= TERMP_SPLIT;
-       } else if (AUTH_nosplit == n->norm->An.auth) {
+               return(0);
+       }
+       if (n->norm->An.auth == AUTH_nosplit) {
                p->flags &= ~TERMP_SPLIT;
                p->flags |= TERMP_NOSPLIT;
+               return(0);
        }
 
+       if (n->child == NULL)
+               return(0);
+
+       if (p->flags & TERMP_SPLIT)
+               term_newln(p);
+
+       if (n->sec == SEC_AUTHORS && ! (p->flags & TERMP_NOSPLIT))
+               p->flags |= TERMP_SPLIT;
+
+       return(1);
 }
 
 static int
@@ -1596,8 +1561,17 @@ termp_bd_pre(DECL_ARGS)
        } else if (MDOC_HEAD == n->type)
                return(0);
 
-       if (n->norm->Bd.offs)
-               p->offset += a2offs(p, n->norm->Bd.offs);
+       /* Handle the -offset argument. */
+
+       if (n->norm->Bd.offs == NULL ||
+           ! strcmp(n->norm->Bd.offs, "left"))
+               /* nothing */;
+       else if ( ! strcmp(n->norm->Bd.offs, "indent"))
+               p->offset += term_len(p, p->defindent + 1);
+       else if ( ! strcmp(n->norm->Bd.offs, "indent-two"))
+               p->offset += term_len(p, (p->defindent + 1) * 2);
+       else
+               p->offset += a2width(p, n->norm->Bd.offs);
 
        /*
         * If -ragged or -filled are specified, the block does nothing