=================================================================== RCS file: /cvs/mandoc/tbl_layout.c,v retrieving revision 1.6 retrieving revision 1.12 diff -u -p -r1.6 -r1.12 --- mandoc/tbl_layout.c 2011/01/02 10:10:57 1.6 +++ mandoc/tbl_layout.c 2011/01/07 14:59:52 1.12 @@ -1,4 +1,4 @@ -/* $Id: tbl_layout.c,v 1.6 2011/01/02 10:10:57 kristaps Exp $ */ +/* $Id: tbl_layout.c,v 1.12 2011/01/07 14:59:52 kristaps Exp $ */ /* * Copyright (c) 2009, 2010 Kristaps Dzonsons * @@ -29,6 +29,12 @@ struct tbl_phrase { 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,6 +90,20 @@ mod: 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])) { @@ -126,6 +146,8 @@ mod: case ('d'): cp->flags |= TBL_CELL_BALIGN; goto mod; + case ('w'): /* XXX for now, ignore minimal column width */ + goto mod; case ('f'): break; case ('b'): @@ -171,9 +193,20 @@ cell(struct tbl_node *tbl, struct tbl_row *rp, return(0); } - (*pos)++; 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. */ if (TBL_CELL_VERT == c && '|' == p[*pos]) { @@ -294,7 +327,7 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e * ones. */ - h = pp ? pp->head->prev : tbl->first_head; + h = pp ? pp->head->next : tbl->first_head; if (h) { /* Re-use data header. */ @@ -319,9 +352,12 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e (TBL_CELL_VERT == p->pos || TBL_CELL_DVERT == p->pos)) { hp = mandoc_calloc(1, sizeof(struct tbl_head)); + hp->ident = tbl->opts.cols++; hp->prev = h->prev; if (h->prev) h->prev->next = hp; + if (h == tbl->first_head) + tbl->first_head = hp; h->prev = hp; hp->next = h; head_adjust(p, hp); @@ -339,6 +375,7 @@ cell_alloc(struct tbl_node *tbl, struct tbl_row *rp, e } hp = mandoc_calloc(1, sizeof(struct tbl_head)); + hp->ident = tbl->opts.cols++; if (tbl->last_head) { hp->prev = tbl->last_head;