=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/tbl_layout.c,v retrieving revision 1.16 retrieving revision 1.17 diff -c -r1.16 -r1.17 *** src/usr.bin/mandoc/tbl_layout.c 2014/10/14 02:16:02 1.16 --- src/usr.bin/mandoc/tbl_layout.c 2014/11/25 05:39:00 1.17 *************** *** 1,4 **** ! /* $OpenBSD: tbl_layout.c,v 1.16 2014/10/14 02:16:02 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2014 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: tbl_layout.c,v 1.17 2014/11/25 05:39:00 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2014 Ingo Schwarze *************** *** 57,63 **** int, const char *, int *); static int cell(struct tbl_node *, struct tbl_row *, int, const char *, int *); - static void row(struct tbl_node *, int, const char *, int *); static struct tbl_cell *cell_alloc(struct tbl_node *, struct tbl_row *, enum tbl_cellt, int vert); --- 57,62 ---- *************** *** 298,365 **** return(mods(tbl, cell_alloc(tbl, rp, c, vert), ln, p, pos)); } ! static void ! row(struct tbl_node *tbl, int ln, const char *p, int *pos) { struct tbl_row *rp; ! row: /* ! * EBNF describing this section: ! * ! * row ::= row_list [:space:]* [.]?[\n] ! * row_list ::= [:space:]* row_elem row_tail ! * row_tail ::= [:space:]*[,] row_list | ! * epsilon ! * row_elem ::= [\t\ ]*[:alpha:]+ ! */ ! rp = mandoc_calloc(1, sizeof(struct tbl_row)); ! if (tbl->last_row) ! tbl->last_row->next = rp; ! else ! tbl->first_row = rp; ! tbl->last_row = rp; ! cell: ! while (isspace((unsigned char)p[*pos])) ! (*pos)++; ! /* Safely exit layout context. */ ! ! if ('.' == p[*pos]) { ! tbl->part = TBL_PART_DATA; ! if (NULL == tbl->first_row) mandoc_msg(MANDOCERR_TBLNOLAYOUT, ! tbl->parse, ln, *pos, NULL); ! (*pos)++; ! return; ! } ! /* End (and possibly restart) a row. */ ! ! if (',' == p[*pos]) { ! (*pos)++; ! goto row; ! } else if ('\0' == p[*pos]) ! return; ! ! if ( ! cell(tbl, rp, ln, p, pos)) ! return; ! ! goto cell; ! /* NOTREACHED */ ! } ! ! int ! tbl_layout(struct tbl_node *tbl, int ln, const char *p) ! { ! int pos; ! ! pos = 0; ! row(tbl, ln, p, &pos); ! ! /* Always succeed. */ ! return(1); } static struct tbl_cell * --- 297,350 ---- return(mods(tbl, cell_alloc(tbl, rp, c, vert), ln, p, pos)); } ! int ! tbl_layout(struct tbl_node *tbl, int ln, const char *p) { struct tbl_row *rp; + int pos; ! pos = 0; ! rp = NULL; ! for (;;) { ! /* Skip whitespace before and after each cell. */ ! while (isspace((unsigned char)p[pos])) ! pos++; ! switch (p[pos]) { ! case ',': /* Next row on this input line. */ ! pos++; ! rp = NULL; ! continue; ! case '\0': /* Next row on next input line. */ ! return(1); ! case '.': /* End of layout. */ ! pos++; ! tbl->part = TBL_PART_DATA; ! if (tbl->first_row != NULL) ! return(1); mandoc_msg(MANDOCERR_TBLNOLAYOUT, ! tbl->parse, ln, pos, NULL); ! rp = mandoc_calloc(1, sizeof(*rp)); ! cell_alloc(tbl, rp, TBL_CELL_LEFT, 0); ! tbl->first_row = tbl->last_row = rp; ! return(1); ! default: /* Cell. */ ! break; ! } ! if (rp == NULL) { /* First cell on this line. */ ! rp = mandoc_calloc(1, sizeof(*rp)); ! if (tbl->last_row) ! tbl->last_row->next = rp; ! else ! tbl->first_row = rp; ! tbl->last_row = rp; ! } ! if ( ! cell(tbl, rp, ln, p, &pos)) ! return(1); ! } } static struct tbl_cell *