]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl.c
Make width calculations occur within tbl_term.c, not tbl.c. This allows
[mandoc.git] / tbl.c
diff --git a/tbl.c b/tbl.c
index 7b5e299c38566fbcd08660db49f7cd705934584f..1ea37f5a3539467f50cd1d9a325f4c1bd6469224 100644 (file)
--- a/tbl.c
+++ b/tbl.c
@@ -1,4 +1,4 @@
-/*     $Id: tbl.c,v 1.11 2010/12/31 18:19:43 kristaps Exp $ */
+/*     $Id: tbl.c,v 1.20 2011/01/03 13:59:21 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -26,7 +26,7 @@
 #include "libroff.h"
 
 enum rofferr
-tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
+tbl_read(struct tbl_node *tbl, int ln, const char *p, int offs)
 {
        int              len;
        const char      *cp;
@@ -56,38 +56,40 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
                break;
        }
 
-       /* 
-        * FIXME: allow the original string to slip through for the time
-        * being. 
+       /*
+        * This only returns zero if the line is empty, so we ignore it
+        * and continue on.
         */
-       return(tbl_data(tbl, ln, p) ? ROFF_CONT : ROFF_ERR);
+       return(tbl_data(tbl, ln, p) ? ROFF_TBL : ROFF_IGN);
 }
 
-struct tbl *
-tbl_alloc(void *data, const mandocmsg msg)
+struct tbl_node *
+tbl_alloc(int pos, int line, void *data, const mandocmsg msg)
 {
-       struct tbl      *p;
+       struct tbl_node *p;
 
-       p = mandoc_calloc(1, sizeof(struct tbl));
+       p = mandoc_calloc(1, sizeof(struct tbl_node));
+       p->line = line;
+       p->pos = pos;
        p->data = data;
        p->msg = msg;
        p->part = TBL_PART_OPTS;
-       p->tab = '\t';
-       p->linesize = 12;
-       p->decimal = '.';
+       p->opts.tab = '\t';
+       p->opts.linesize = 12;
+       p->opts.decimal = '.';
        return(p);
 }
 
 void
-tbl_free(struct tbl *p)
+tbl_free(struct tbl_node *p)
 {
        struct tbl_row  *rp;
        struct tbl_cell *cp;
        struct tbl_span *sp;
        struct tbl_dat  *dp;
+       struct tbl_head *hp;
 
-       while (p->first_row) {
-               rp = p->first_row;
+       while (NULL != (rp = p->first_row)) {
                p->first_row = rp->next;
                while (rp->first) {
                        cp = rp->first;
@@ -97,8 +99,7 @@ tbl_free(struct tbl *p)
                free(rp);
        }
 
-       while (p->first_span) {
-               sp = p->first_span;
+       while (NULL != (sp = p->first_span)) {
                p->first_span = sp->next;
                while (sp->first) {
                        dp = sp->first;
@@ -110,20 +111,42 @@ tbl_free(struct tbl *p)
                free(sp);
        }
 
+       while (NULL != (hp = p->first_head)) {
+               p->first_head = hp->next;
+               free(hp);
+       }
+
        free(p);
 }
 
 void
-tbl_restart(struct tbl *tbl)
+tbl_restart(int line, int pos, struct tbl_node *tbl)
 {
 
        tbl->part = TBL_PART_LAYOUT;
+       tbl->line = line;
+       tbl->pos = pos;
+
+       if (NULL == tbl->first_span || NULL == tbl->first_span->first)
+               TBL_MSG(tbl, MANDOCERR_TBLNODATA, tbl->line, tbl->pos);
 }
 
 const struct tbl_span *
-tbl_span(const struct tbl *tbl)
+tbl_span(const struct tbl_node *tbl)
 {
 
        assert(tbl);
        return(tbl->last_span);
 }
+
+void
+tbl_end(struct tbl_node *tbl)
+{
+
+       if (NULL == tbl->first_span || NULL == tbl->first_span->first)
+               TBL_MSG(tbl, MANDOCERR_TBLNODATA, tbl->line, tbl->pos);
+
+       if (tbl->last_span)
+               tbl->last_span->flags |= TBL_SPAN_LAST;
+}
+