]> git.cameronkatri.com Git - mandoc.git/blobdiff - main.c
Make -T[x]html for tables structure cells with a width. I don't
[mandoc.git] / main.c
diff --git a/main.c b/main.c
index 79a252e96d35803e4de703b4ad3fca5b981c2d3e..2be68a9350b9a64dfbb761eb75061221ed1f3da3 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,6 +1,6 @@
-/*     $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
@@ -145,6 +145,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
 
        /* related to macros and nesting */
        "skipping obsolete macro",
+       "skipping paragraph macro",
        "blocks badly nested",
        "child violates parent syntax",
        "nested displays are not portable",
@@ -152,6 +153,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
 
        /* 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",
@@ -175,14 +177,25 @@ static    const char * const      mandocerrs[MANDOCERR_MAX] = {
        "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",
@@ -389,7 +402,7 @@ static void
 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);
@@ -522,10 +535,7 @@ fdesc(struct curparse *curp)
        }
 
        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
@@ -794,10 +804,18 @@ rerun:
                                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
@@ -812,9 +830,20 @@ rerun:
                 * 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) :