-/* $Id: main.c,v 1.123 2010/12/15 23:39:40 kristaps Exp $ */
+/* $Id: main.c,v 1.135 2011/01/04 15:02:00 kristaps Exp $ */
/*
- * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
/* related to macros and nesting */
"skipping obsolete macro",
+ "skipping paragraph macro",
"blocks badly nested",
"child violates parent syntax",
"nested displays are not portable",
/* related to missing macro arguments */
"skipping empty macro",
+ "argument count wrong",
"missing display type",
"list type must come first",
"tag lists require a width argument",
"bad comment style",
"unknown escape sequence",
"unterminated quoted string",
+
+ /* related to tables */
+ "extra data cells",
"generic error",
+ /* related to tables */
+ "bad table syntax",
+ "bad table option",
+ "bad table layout",
+ "no table layout cells specified",
+ "no table data cells specified",
+ "ignore data in cell",
+ "data block still open",
+
"input stack limit exceeded, infinite loop?",
"skipping bad character",
"skipping text before the first section header",
"skipping unknown macro",
- "skipping paragraph macro",
"NOT IMPLEMENTED: skipping request",
"line scope broken",
"argument count wrong",
resize_buf(struct buf *buf, size_t initial)
{
- buf->sz = buf->sz ? 2 * buf->sz : initial;
+ buf->sz = buf->sz > initial/2 ? 2 * buf->sz : initial;
buf->buf = realloc(buf->buf, buf->sz);
if (NULL == buf->buf) {
perror(NULL);
}
assert(curp->roff);
- if ( ! roff_endparse(curp->roff)) {
- assert(MANDOCLEVEL_FATAL <= file_status);
- goto cleanup;
- }
+ roff_endparse(curp->roff);
/*
* With -Wstop and warnings or errors of at least
continue;
} else
break;
- case (ROFF_CONT):
+ default:
break;
}
+ /*
+ * If we encounter errors in the recursive parsebuf()
+ * call, make sure we don't continue parsing.
+ */
+
+ if (MANDOCLEVEL_FATAL <= file_status)
+ break;
+
/*
* If input parsers have not been allocated, do so now.
* We keep these instanced betwen parsers, but set them
* Lastly, push down into the parsers themselves. One
* of these will have already been set in the pset()
* routine.
+ * If libroff returns ROFF_TBL, then add it to the
+ * currently open parse. Since we only get here if
+ * there does exist data (see tbl_data.c), we're
+ * guaranteed that something's been allocated.
*/
- if (curp->man || curp->mdoc) {
+ if (ROFF_TBL == rr) {
+ assert(curp->man || curp->mdoc);
+ if (curp->man)
+ man_addspan(curp->man, roff_span(curp->roff));
+ else
+ mdoc_addspan(curp->mdoc, roff_span(curp->roff));
+
+ } else if (curp->man || curp->mdoc) {
rc = curp->man ?
man_parseln(curp->man,
curp->line, ln.buf, of) :