]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_data.c
The .Dd and .TH macros must interrupt .ce, too;
[mandoc.git] / tbl_data.c
index 8d4559792b92c5874f5ec7b956c908394647739d..ae1906ef735ac9b0020f9dc4b96f614b22cc7514 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: tbl_data.c,v 1.43 2017/06/16 20:01:06 schwarze Exp $ */
+/*     $Id: tbl_data.c,v 1.45 2017/07/08 17:52:50 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -128,7 +128,7 @@ getdata(struct tbl_node *tbl, struct tbl_span *dp,
                    tbl->parse, ln, sv, dat->string);
 }
 
-int
+void
 tbl_cdata(struct tbl_node *tbl, int ln, const char *p, int pos)
 {
        struct tbl_dat  *dat;
@@ -143,10 +143,10 @@ tbl_cdata(struct tbl_node *tbl, int ln, const char *p, int pos)
                        pos++;
                        while (p[pos] != '\0')
                                getdata(tbl, tbl->last_span, ln, p, &pos);
-                       return 1;
+                       return;
                } else if (p[pos] == '\0') {
                        tbl->part = TBL_PART_DATA;
-                       return 1;
+                       return;
                }
 
                /* Fallthrough: T} is part of a word. */
@@ -166,8 +166,6 @@ tbl_cdata(struct tbl_node *tbl, int ln, const char *p, int pos)
        if (dat->layout->pos == TBL_CELL_DOWN)
                mandoc_msg(MANDOCERR_TBLDATA_SPAN, tbl->parse,
                    ln, pos, dat->string);
-
-       return 0;
 }
 
 static struct tbl_span *
@@ -196,9 +194,7 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p, int pos)
 {
        struct tbl_row  *rp;
        struct tbl_cell *cp;
-       struct tbl_span *sp, *spi;
-       struct tbl_dat  *dp;
-       int              have_data, spans;
+       struct tbl_span *sp;
 
        rp = (sp = tbl->last_span) == NULL ? tbl->first_row :
            sp->pos == TBL_SPAN_DATA && sp->layout->next != NULL ?
@@ -206,66 +202,40 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p, int pos)
 
        assert(rp != NULL);
 
-       sp = newspan(tbl, ln, rp);
-
        if ( ! strcmp(p, "_")) {
+               sp = newspan(tbl, ln, rp);
                sp->pos = TBL_SPAN_HORIZ;
                return;
        } else if ( ! strcmp(p, "=")) {
+               sp = newspan(tbl, ln, rp);
                sp->pos = TBL_SPAN_DHORIZ;
                return;
        }
-       sp->pos = TBL_SPAN_DATA;
-
-       while (p[pos] != '\0')
-               getdata(tbl, sp, ln, p, &pos);
 
        /*
-        * If this span contains some data,
-        * make sure at least part of it gets printed.
+        * If the layout row contains nothing but horizontal lines,
+        * allocate an empty span for it and assign the current span
+        * to the next layout row accepting data.
         */
 
-       have_data = 0;
-       cp = rp->first;
-       for (dp = sp->first; dp != NULL; dp = dp->next) {
-               if (dp->pos == TBL_DATA_DATA && *dp->string != '\0') {
-                       if (cp == NULL ||
-                           (cp->pos != TBL_CELL_HORIZ &&
-                            cp->pos != TBL_CELL_DHORIZ))
-                               return;
-                       have_data = 1;
-               }
-               spans = dp->spans;
-               while (spans-- >= 0) {
-                       if (cp != NULL)
-                               cp = cp->next;
-               }
+       while (rp->next != NULL) {
+               if (rp->last->col + 1 < tbl->opts.cols)
+                       break;
+               for (cp = rp->first; cp != NULL; cp = cp->next)
+                       if (cp->pos != TBL_CELL_HORIZ &&
+                           cp->pos != TBL_CELL_DHORIZ)
+                               break;
+               if (cp != NULL)
+                       break;
+               sp = newspan(tbl, ln, rp);
+               sp->pos = TBL_SPAN_DATA;
+               rp = rp->next;
        }
-       if (have_data == 0 || rp->next == NULL)
-               return;
 
-       /*
-        * There is some data, but it would all get lost
-        * due to horizontal lines in the layout.
-        * Insert an empty span to consume the layout row.
-        */
+       /* Process a real data row. */
 
-       tbl->last_span = sp->prev;
-       spi = newspan(tbl, ln, rp);
-       spi->pos = TBL_SPAN_DATA;
-       spi->next = sp;
-       tbl->last_span = sp;
-       sp->prev = spi;
-       sp->layout = rp->next;
-       cp = sp->layout->first;
-       for (dp = sp->first; dp != NULL; dp = dp->next) {
-               dp->layout = cp;
-               dp->spans = 0;
-               if (cp != NULL)
-                       cp = cp->next;
-               while (cp != NULL && cp->pos == TBL_CELL_SPAN) {
-                       dp->spans++;
-                       cp = cp->next;
-               }
-       }
+       sp = newspan(tbl, ln, rp);
+       sp->pos = TBL_SPAN_DATA;
+       while (p[pos] != '\0')
+               getdata(tbl, sp, ln, p, &pos);
 }