=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/tbl_layout.c,v retrieving revision 1.5 retrieving revision 1.6 diff -c -r1.5 -r1.6 *** src/usr.bin/mandoc/tbl_layout.c 2011/01/04 23:44:20 1.5 --- src/usr.bin/mandoc/tbl_layout.c 2011/01/09 14:30:48 1.6 *************** *** 1,4 **** ! /* $Id: tbl_layout.c,v 1.5 2011/01/04 23:44:20 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: tbl_layout.c,v 1.6 2011/01/09 14:30:48 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * *************** *** 29,34 **** --- 29,40 ---- enum tbl_cellt key; }; + /* + * FIXME: we can make this parse a lot nicer by, when an error is + * encountered in a layout key, bailing to the next key (i.e. to the + * next whitespace then continuing). + */ + #define KEYS_MAX 11 static const struct tbl_phrase keys[KEYS_MAX] = { *************** *** 84,89 **** --- 90,109 ---- break; } + /* Throw away parenthesised expression. */ + + if ('(' == p[*pos]) { + (*pos)++; + while (p[*pos] && ')' != p[*pos]) + (*pos)++; + if (')' == p[*pos]) { + (*pos)++; + goto mod; + } + TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + return(0); + } + /* Parse numerical spacing from modifier string. */ if (isdigit((unsigned char)p[*pos])) { *************** *** 110,116 **** /* TODO: GNU has many more extensions. */ ! switch (tolower(p[(*pos)++])) { case ('z'): cp->flags |= TBL_CELL_WIGN; goto mod; --- 130,136 ---- /* TODO: GNU has many more extensions. */ ! switch (tolower((unsigned char)p[(*pos)++])) { case ('z'): cp->flags |= TBL_CELL_WIGN; goto mod; *************** *** 140,146 **** return(0); } ! switch (tolower(p[(*pos)++])) { case ('b'): cp->flags |= TBL_CELL_BOLD; goto mod; --- 160,166 ---- return(0); } ! switch (tolower((unsigned char)p[(*pos)++])) { case ('b'): cp->flags |= TBL_CELL_BOLD; goto mod; *************** *** 165,171 **** /* Parse the column position (`r', `R', `|', ...). */ for (i = 0; i < KEYS_MAX; i++) ! if (tolower(p[*pos]) == keys[i].name) break; if (KEYS_MAX == i) { --- 185,191 ---- /* Parse the column position (`r', `R', `|', ...). */ for (i = 0; i < KEYS_MAX; i++) ! if (tolower((unsigned char)p[*pos]) == keys[i].name) break; if (KEYS_MAX == i) { *************** *** 173,180 **** return(0); } - (*pos)++; c = keys[i].key; /* Extra check for the double-vertical. */ --- 193,211 ---- return(0); } c = keys[i].key; + + /* + * If a span cell is found first, raise a warning and abort the + * parse. FIXME: recover from this somehow? + */ + + if (NULL == rp->first && TBL_CELL_SPAN == c) { + TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + return(0); + } + + (*pos)++; /* Extra check for the double-vertical. */