=================================================================== RCS file: /cvs/mandoc/tbl_layout.c,v retrieving revision 1.42 retrieving revision 1.49 diff -u -p -r1.42 -r1.49 --- mandoc/tbl_layout.c 2017/06/08 18:11:22 1.42 +++ mandoc/tbl_layout.c 2020/09/01 18:25:28 1.49 @@ -1,4 +1,4 @@ -/* $Id: tbl_layout.c,v 1.42 2017/06/08 18:11:22 schwarze Exp $ */ +/* $Id: tbl_layout.c,v 1.49 2020/09/01 18:25:28 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2014, 2015, 2017 Ingo Schwarze @@ -20,14 +20,17 @@ #include #include +#include +#include #include #include #include -#include "mandoc.h" #include "mandoc_aux.h" +#include "mandoc.h" +#include "tbl.h" #include "libmandoc.h" -#include "libroff.h" +#include "tbl_int.h" struct tbl_phrase { char name; @@ -62,6 +65,7 @@ mods(struct tbl_node *tbl, struct tbl_cell *cp, int ln, const char *p, int *pos) { char *endptr; + unsigned long spacing; size_t sz; mod: @@ -83,15 +87,18 @@ mod: (*pos)++; goto mod; } - mandoc_msg(MANDOCERR_TBLLAYOUT_PAR, tbl->parse, - ln, *pos, NULL); + mandoc_msg(MANDOCERR_TBLLAYOUT_PAR, ln, *pos, NULL); return; } /* Parse numerical spacing from modifier string. */ if (isdigit((unsigned char)p[*pos])) { - cp->spacing = strtoull(p + *pos, &endptr, 10); + if ((spacing = strtoul(p + *pos, &endptr, 10)) > 9) + mandoc_msg(MANDOCERR_TBLLAYOUT_SPC, ln, *pos, + "%lu", spacing); + else + cp->spacing = spacing; *pos = endptr - p; goto mod; } @@ -112,8 +119,7 @@ mod: cp->flags |= TBL_CELL_ITALIC; goto mod; case 'm': - mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, tbl->parse, - ln, *pos, "m"); + mandoc_msg(MANDOCERR_TBLLAYOUT_MOD, ln, *pos, "m"); goto mod; case 'p': case 'v': @@ -156,10 +162,10 @@ mod: cp->vert++; else mandoc_msg(MANDOCERR_TBLLAYOUT_VERT, - tbl->parse, ln, *pos - 1, NULL); + ln, *pos - 1, NULL); goto mod; default: - mandoc_vmsg(MANDOCERR_TBLLAYOUT_CHAR, tbl->parse, + mandoc_msg(MANDOCERR_TBLLAYOUT_CHAR, ln, *pos - 1, "%c", p[*pos - 1]); goto mod; } @@ -172,7 +178,7 @@ mod: /* Support only one-character font-names for now. */ if (p[*pos] == '\0' || (p[*pos + 1] != ' ' && p[*pos + 1] != '.')) { - mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse, + mandoc_msg(MANDOCERR_FT_BAD, ln, *pos, "TS %s", p + *pos - 1); if (p[*pos] != '\0') (*pos)++; @@ -194,7 +200,7 @@ mod: case 'R': goto mod; default: - mandoc_vmsg(MANDOCERR_FT_BAD, tbl->parse, + mandoc_msg(MANDOCERR_FT_BAD, ln, *pos - 1, "TS f%c", p[*pos - 1]); goto mod; } @@ -215,7 +221,7 @@ cell(struct tbl_node *tbl, struct tbl_row *rp, rp->vert++; else mandoc_msg(MANDOCERR_TBLLAYOUT_VERT, - tbl->parse, ln, *pos, NULL); + ln, *pos, NULL); } (*pos)++; } @@ -234,7 +240,7 @@ again: break; if (i == KEYS_MAX) { - mandoc_vmsg(MANDOCERR_TBLLAYOUT_CHAR, tbl->parse, + mandoc_msg(MANDOCERR_TBLLAYOUT_CHAR, ln, *pos, "%c", p[*pos]); (*pos)++; goto again; @@ -245,14 +251,12 @@ again: if (c == TBL_CELL_SPAN) { if (rp->last == NULL) - mandoc_msg(MANDOCERR_TBLLAYOUT_SPAN, - tbl->parse, ln, *pos, NULL); + mandoc_msg(MANDOCERR_TBLLAYOUT_SPAN, ln, *pos, NULL); else if (rp->last->pos == TBL_CELL_HORIZ || rp->last->pos == TBL_CELL_DHORIZ) c = rp->last->pos; } else if (c == TBL_CELL_DOWN && rp == tbl->first_row) - mandoc_msg(MANDOCERR_TBLLAYOUT_DOWN, - tbl->parse, ln, *pos, NULL); + mandoc_msg(MANDOCERR_TBLLAYOUT_DOWN, ln, *pos, NULL); (*pos)++; @@ -295,9 +299,11 @@ tbl_layout(struct tbl_node *tbl, int ln, const char *p } if (tbl->first_row->first == NULL) { mandoc_msg(MANDOCERR_TBLLAYOUT_NONE, - tbl->parse, ln, pos, NULL); + 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; } @@ -355,6 +361,7 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e struct tbl_cell *p, *pp; p = mandoc_calloc(1, sizeof(*p)); + p->spacing = SIZE_MAX; p->pos = pos; if ((pp = rp->last) != NULL) {