aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--libroff.h11
-rw-r--r--tbl.c47
-rw-r--r--tbl_data.c18
-rw-r--r--tbl_layout.c12
4 files changed, 52 insertions, 36 deletions
diff --git a/libroff.h b/libroff.h
index 828185f1..ec51096e 100644
--- 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 42e0f0a7..44e80aa6 100644
--- 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;
}
diff --git a/tbl_data.c b/tbl_data.c
index 764ca2dc..3e89ca6a 100644
--- a/tbl_data.c
+++ b/tbl_data.c
@@ -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);
}
diff --git a/tbl_layout.c b/tbl_layout.c
index a2be7e4b..a93f5c9a 100644
--- a/tbl_layout.c
+++ b/tbl_layout.c
@@ -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;