]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_term.c
Remove \s TODO: these are intelligently ignored along with \m and \M.
[mandoc.git] / mdoc_term.c
index b134b3d1e127b8c5786e6140bcf28b0c1bf298eb..0755b1649103af8bbe17eadafb876e1e72edf7a1 100644 (file)
@@ -1,6 +1,7 @@
-/*     $Id: mdoc_term.c,v 1.169 2010/07/03 17:17:15 kristaps Exp $ */
+/*     $Id: mdoc_term.c,v 1.174 2010/07/16 00:03:37 schwarze Exp $ */
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -30,7 +31,6 @@
 #include "mandoc.h"
 #include "out.h"
 #include "term.h"
-#include "regs.h"
 #include "mdoc.h"
 #include "chars.h"
 #include "main.h"
@@ -57,7 +57,6 @@ 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 int       arg_getattr(int, const struct mdoc_node *);
 static void      print_bvspace(struct termp *,
                        const struct mdoc_node *,
                        const struct mdoc_node *);
@@ -330,6 +329,23 @@ print_mdoc_node(DECL_ARGS)
        else if (termacts[n->tok].pre && ENDBODY_NOT == n->end)
                chld = (*termacts[n->tok].pre)(p, &npair, m, n);
 
+       /*
+        * Keeps only work until the end of a line.  If a keep was
+        * invoked in a prior line, revert it to PREKEEP.
+        */
+
+       if (TERMP_KEEP & p->flags) {
+               if (n->prev && n->prev->line != n->line) {
+                       p->flags &= ~TERMP_KEEP;
+                       p->flags |= TERMP_PREKEEP;
+               } else if (NULL == n->prev) {
+                       if (n->parent && n->parent->line != n->line) {
+                               p->flags &= ~TERMP_KEEP;
+                               p->flags |= TERMP_PREKEEP;
+                       }
+               }
+       }
+
        if (chld && n->child)
                print_mdoc_nodelist(p, &npair, m, n->child);
 
@@ -526,26 +542,6 @@ a2offs(const struct termp *p, const char *v)
 }
 
 
-/*
- * Get the index of an argument in a node's argument list or -1 if it
- * does not exist.
- */
-static int
-arg_getattr(int v, const struct mdoc_node *n)
-{
-       int              i;
-
-       if (NULL == n->args)
-               return(0);
-
-       for (i = 0; i < (int)n->args->argc; i++) 
-               if (n->args->argv[i].arg == v)
-                       return(i);
-
-       return(-1);
-}
-
-
 /*
  * Determine how much space to print out before block elements of `It'
  * (and thus `Bl') and `Bd'.  And then go ahead and print that space,
@@ -631,7 +627,7 @@ termp_it_pre(DECL_ARGS)
 {
        const struct mdoc_node *bl, *nn;
        char                    buf[7];
-       int                     i, col;
+       int                     i;
        size_t                  width, offset, ncols, dcol;
        enum mdoc_list          type;
 
@@ -660,8 +656,6 @@ termp_it_pre(DECL_ARGS)
                if (MDOC_HEAD == n->type)
                        break;
 
-               col = arg_getattr(MDOC_Column, bl);
-
                /*
                 * Imitate groff's column handling:
                 * - For each earlier column, add its width.
@@ -671,7 +665,8 @@ termp_it_pre(DECL_ARGS)
                 *   column.
                 * - For more than 5 columns, add only one column.
                 */
-               ncols = bl->args->argv[col].sz;
+               ncols = bl->data.Bl->ncols;
+
                /* LINTED */
                dcol = ncols < 5 ? term_len(p, 4) : 
                        ncols == 5 ? term_len(p, 3) : term_len(p, 1);
@@ -685,7 +680,7 @@ termp_it_pre(DECL_ARGS)
                                nn->prev && i < (int)ncols; 
                                nn = nn->prev, i++)
                        offset += dcol + a2width
-                               (p, bl->args->argv[col].value[i]);
+                               (p, bl->data.Bl->cols[i]);
 
                /*
                 * When exceeding the declared number of columns, leave
@@ -700,7 +695,7 @@ termp_it_pre(DECL_ARGS)
                 * Use the declared column widths, extended as explained
                 * in the preceding paragraph.
                 */
-               width = a2width(p, bl->args->argv[col].value[i]) + dcol;
+               width = a2width(p, bl->data.Bl->cols[i]) + dcol;
                break;
        default:
                if (NULL == bl->data.Bl->width)
@@ -2071,9 +2066,11 @@ termp_sm_pre(DECL_ARGS)
 {
 
        assert(n->child && MDOC_TEXT == n->child->type);
-       if (0 == strcmp("on", n->child->string))
+       if (0 == strcmp("on", n->child->string)) {
+               if (p->col)
+                       p->flags &= ~TERMP_NOSPACE;
                p->flags &= ~TERMP_NONOSPACE;
-       else
+       else
                p->flags |= TERMP_NONOSPACE;
 
        return(0);