]> git.cameronkatri.com Git - mandoc.git/commitdiff
Move clean-up of parsed tbl nodes into the tbl_clear() function, called
authorKristaps Dzonsons <kristaps@bsd.lv>
Thu, 30 Dec 2010 09:34:06 +0000 (09:34 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Thu, 30 Dec 2010 09:34:06 +0000 (09:34 +0000)
once per invocation.

libroff.h
tbl.c
tbl_data.c
tbl_layout.c

index 828185f13df6fab139760427ba4f3e677443303a..ec51096efb34dc75bff6f16ad5b744528d2d77be 100644 (file)
--- a/libroff.h
+++ b/libroff.h
@@ -1,4 +1,4 @@
-/*     $Id: libroff.h,v 1.7 2010/12/29 16:44:23 kristaps Exp $ */
+/*     $Id: libroff.h,v 1.8 2010/12/30 09:34:06 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -76,6 +76,7 @@ struct        tbl_span {
        int               flags;
 #define        TBL_SPAN_HORIZ  (1 << 0)
 #define        TBL_SPAN_DHORIZ (1 << 1)
+       struct tbl_span  *next;
 };
 
 struct tbl {
@@ -94,8 +95,10 @@ struct       tbl {
 #define        TBL_OPT_ALLBOX   (1 << 4)
 #define        TBL_OPT_NOKEEP   (1 << 5)
 #define        TBL_OPT_NOSPACE  (1 << 6)
-       struct tbl_row   *first;
-       struct tbl_row   *last;
+       struct tbl_row   *first_row;
+       struct tbl_row   *last_row;
+       struct tbl_span  *first_span;
+       struct tbl_span  *last_span;
 };
 
 #define        TBL_MSG(tblp, type, line, col) \
@@ -108,7 +111,7 @@ void                 tbl_reset(struct tbl *);
 enum rofferr    tbl_read(struct tbl *, int, const char *, int);
 int             tbl_option(struct tbl *, int, const char *);
 int             tbl_layout(struct tbl *, int, const char *);
-struct tbl_span        *tbl_data(struct tbl *, int, const char *);
+int             tbl_data(struct tbl *, int, const char *);
 
 __END_DECLS
 
diff --git a/tbl.c b/tbl.c
index 42e0f0a7be052f1b58df5141229434abae6c8cd4..44e80aa65a404956c7a97c8a2b4725c6c2bafe52 100644 (file)
--- a/tbl.c
+++ b/tbl.c
@@ -1,4 +1,4 @@
-/*     $Id: tbl.c,v 1.8 2010/12/29 16:44:23 kristaps Exp $ */
+/*     $Id: tbl.c,v 1.9 2010/12/30 09:34:07 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -33,10 +33,12 @@ tbl_clear(struct tbl *tbl)
 {
        struct tbl_row  *rp;
        struct tbl_cell *cp;
+       struct tbl_span *sp;
+       struct tbl_dat  *dp;
 
-       while (tbl->first) {
-               rp = tbl->first;
-               tbl->first = rp->next;
+       while (tbl->first_row) {
+               rp = tbl->first_row;
+               tbl->first_row = rp->next;
                while (rp->first) {
                        cp = rp->first;
                        rp->first = cp->next;
@@ -45,7 +47,22 @@ tbl_clear(struct tbl *tbl)
                free(rp);
        }
 
-       tbl->last = NULL;
+       tbl->last_row = NULL;
+
+       while (tbl->first_span) {
+               sp = tbl->first_span;
+               tbl->first_span = sp->next;
+               while (sp->first) {
+                       dp = sp->first;
+                       sp->first = dp->next;
+                       if (dp->string)
+                               free(dp->string);
+                       free(dp);
+               }
+               free(sp);
+       }
+
+       tbl->last_span = NULL;
 }
 
 static void
@@ -63,8 +80,6 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
 {
        int              len;
        const char      *cp;
-       struct tbl_dat  *dp;
-       struct tbl_span *sp;
 
        cp = &p[offs];
        len = (int)strlen(cp);
@@ -91,18 +106,11 @@ tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
                break;
        }
 
-       /* XXX: throw away data for now. */
-       if (NULL != (sp = tbl_data(tbl, ln, p))) {
-               while (NULL != (dp = sp->first)) {
-                       sp->first = sp->first->next;
-                       if (dp->string)
-                               free(dp->string);
-                       free(dp);
-               }
-               free(sp);
-       }
-       
-       return(ROFF_CONT);
+       /* 
+        * FIXME: allow the original string to slip through for the time
+        * being. 
+        */
+       return(tbl_data(tbl, ln, p) ? ROFF_CONT : ROFF_ERR);
 }
 
 struct tbl *
@@ -137,7 +145,6 @@ void
 tbl_restart(struct tbl *tbl)
 {
 
-       tbl_clear(tbl);
        tbl->part = TBL_PART_LAYOUT;
 }
 
index 764ca2dc9c9182b0611993f0033e876b6e29fad5..3e89ca6a9a0d557e36a4651accbf7ed89dbbffb7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: tbl_data.c,v 1.1 2010/12/29 16:44:23 kristaps Exp $ */
+/*     $Id: tbl_data.c,v 1.2 2010/12/30 09:34:07 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -66,7 +66,7 @@ data(struct tbl *tbl, struct tbl_span *dp,
                dat->flags |= TBL_DATA_NDHORIZ;
 }
 
-struct tbl_span *
+int
 tbl_data(struct tbl *tbl, int ln, const char *p)
 {
        struct tbl_span *dp;
@@ -76,21 +76,27 @@ tbl_data(struct tbl *tbl, int ln, const char *p)
 
        if ('\0' == p[pos]) {
                TBL_MSG(tbl, MANDOCERR_TBL, ln, pos);
-               return(NULL);
+               return(1);
        }
 
        dp = mandoc_calloc(1, sizeof(struct tbl_span));
 
+       if (tbl->last_span) {
+               tbl->last_span->next = dp;
+               tbl->last_span = dp;
+       } else
+               tbl->last_span = tbl->first_span = dp;
+
        if ( ! strcmp(p, "_")) {
                dp->flags |= TBL_SPAN_HORIZ;
-               return(dp);
+               return(1);
        } else if ( ! strcmp(p, "=")) {
                dp->flags |= TBL_SPAN_DHORIZ;
-               return(dp);
+               return(1);
        }
 
        while ('\0' != p[pos])
                data(tbl, dp, ln, p, &pos);
 
-       return(dp);
+       return(1);
 }
index a2be7e4b19c5e8d77099ca6e404b602a3fa3d818..a93f5c9a560c98a101bcccf5f003393b6254e109 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: tbl_layout.c,v 1.2 2010/12/29 15:21:34 kristaps Exp $ */
+/*     $Id: tbl_layout.c,v 1.3 2010/12/30 09:34:07 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -217,11 +217,11 @@ row:      /*
         */
 
        rp = mandoc_calloc(1, sizeof(struct tbl_row));
-       if (tbl->last) {
-               tbl->last->next = rp;
-               tbl->last = rp;
+       if (tbl->last_row) {
+               tbl->last_row->next = rp;
+               tbl->last_row = rp;
        } else
-               tbl->last = tbl->first = rp;
+               tbl->last_row = tbl->first_row = rp;
 
 cell:
        while (isspace((unsigned char)p[*pos]))
@@ -231,7 +231,7 @@ cell:
 
        if ('.' == p[*pos]) {
                tbl->part = TBL_PART_DATA;
-               if (NULL == tbl->first) 
+               if (NULL == tbl->first_row
                        TBL_MSG(tbl, MANDOCERR_TBLNOLAYOUT, ln, *pos);
                (*pos)++;
                return;