summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-12-30 09:34:06 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-12-30 09:34:06 +0000
commite875ab2ae5330f3a0ed3e650ab2ea07460c2266a (patch)
tree594522ffb2684eb12a4f887266ea5a8eb5b9d576
parentf3fd4f5f1744aff75c7c584aa1f72da4dfbfb016 (diff)
downloadmandoc-e875ab2ae5330f3a0ed3e650ab2ea07460c2266a.tar.gz
Move clean-up of parsed tbl nodes into the tbl_clear() function, called
once per invocation.
-rw-r--r--libroff.h9
-rw-r--r--tbl.c45
-rw-r--r--tbl_data.c16
-rw-r--r--tbl_layout.c10
4 files changed, 48 insertions, 32 deletions
diff --git a/libroff.h b/libroff.h
index 3a7275c3..c593644e 100644
--- a/libroff.h
+++ b/libroff.h
@@ -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 14fd32b9..ea4965e7 100644
--- a/tbl.c
+++ b/tbl.c
@@ -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;
}
diff --git a/tbl_data.c b/tbl_data.c
index b50ce7f6..d5089d22 100644
--- a/tbl_data.c
+++ b/tbl_data.c
@@ -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);
}
diff --git a/tbl_layout.c b/tbl_layout.c
index 6262fafe..c03a39df 100644
--- a/tbl_layout.c
+++ b/tbl_layout.c
@@ -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;