]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_layout.c
When finding a bogus database entry,
[mandoc.git] / tbl_layout.c
index 17029e13d59a48ad8cca31426c153de259902fd9..42fc0e8296f59cbef47e5f9cc78fd41837cd5a50 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: tbl_layout.c,v 1.39 2015/04/29 12:44:58 schwarze Exp $ */
+/*     $Id: tbl_layout.c,v 1.44 2017/06/27 18:25:02 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2012, 2014, 2015, 2017 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
@@ -20,6 +20,7 @@
 #include <sys/types.h>
 
 #include <ctype.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
@@ -62,6 +63,7 @@ mods(struct tbl_node *tbl, struct tbl_cell *cp,
                int ln, const char *p, int *pos)
 {
        char            *endptr;
+       size_t           sz;
 
 mod:
        while (p[*pos] == ' ' || p[*pos] == '\t')
@@ -115,7 +117,6 @@ mod:
                    ln, *pos, "m");
                goto mod;
        case 'p':
-               /* FALLTHROUGH */
        case 'v':
                if (p[*pos] == '-' || p[*pos] == '+')
                        (*pos)++;
@@ -128,7 +129,22 @@ mod:
        case 'u':
                cp->flags |= TBL_CELL_UP;
                goto mod;
-       case 'w':  /* XXX for now, ignore minimal column width */
+       case 'w':
+               sz = 0;
+               if (p[*pos] == '(') {
+                       (*pos)++;
+                       while (p[*pos + sz] != '\0' && p[*pos + sz] != ')')
+                               sz++;
+               } else
+                       while (isdigit((unsigned char)p[*pos + sz]))
+                               sz++;
+               if (sz) {
+                       free(cp->wstr);
+                       cp->wstr = mandoc_strndup(p + *pos, sz);
+                       *pos += sz;
+                       if (p[*pos] == ')')
+                               (*pos)++;
+               }
                goto mod;
        case 'x':
                cp->flags |= TBL_CELL_WMAX;
@@ -168,17 +184,14 @@ mod:
 
        switch (p[(*pos)++]) {
        case '3':
-               /* FALLTHROUGH */
        case 'B':
                cp->flags |= TBL_CELL_BOLD;
                goto mod;
        case '2':
-               /* FALLTHROUGH */
        case 'I':
                cp->flags |= TBL_CELL_ITALIC;
                goto mod;
        case '1':
-               /* FALLTHROUGH */
        case 'R':
                goto mod;
        default:
@@ -286,6 +299,8 @@ tbl_layout(struct tbl_node *tbl, int ln, const char *p, int pos)
                                    tbl->parse, ln, pos, NULL);
                                cell_alloc(tbl, tbl->first_row,
                                    TBL_CELL_LEFT);
+                               if (tbl->opts.lvert < tbl->first_row->vert)
+                                       tbl->opts.lvert = tbl->first_row->vert;
                                return;
                        }
 
@@ -343,6 +358,7 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos)
        struct tbl_cell *p, *pp;
 
        p = mandoc_calloc(1, sizeof(*p));
+       p->spacing = SIZE_MAX;
        p->pos = pos;
 
        if ((pp = rp->last) != NULL) {
@@ -355,5 +371,5 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, enum tbl_cellt pos)
        if (tbl->opts.cols <= p->col)
                tbl->opts.cols = p->col + 1;
 
-       return(p);
+       return p;
 }