aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-12-31 14:52:41 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-12-31 14:52:41 +0000
commit6120130ed0e80f6397c99e688829ad06c4415cd6 (patch)
tree93e4d40958b76fae1b57ec09aa87b9902337f803
parentf4ef2b56c63e66af623a65be9e0bc802888eacb5 (diff)
downloadmandoc-6120130ed0e80f6397c99e688829ad06c4415cd6.tar.gz
mandoc-6120130ed0e80f6397c99e688829ad06c4415cd6.tar.zst
mandoc-6120130ed0e80f6397c99e688829ad06c4415cd6.zip
Put parsed tables into a queue that's cleared at the end of parsing.
This completes the parsing phase of the new tbl implementation.
-rw-r--r--libroff.h3
-rw-r--r--roff.c32
-rw-r--r--tbl.c92
3 files changed, 55 insertions, 72 deletions
diff --git a/libroff.h b/libroff.h
index 251c22a8..b6883638 100644
--- a/libroff.h
+++ b/libroff.h
@@ -1,4 +1,4 @@
-/* $Id: libroff.h,v 1.9 2010/12/30 10:26:00 kristaps Exp $ */
+/* $Id: libroff.h,v 1.10 2010/12/31 14:52:41 kristaps Exp $ */
/*
* Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -101,6 +101,7 @@ struct tbl {
struct tbl_row *last_row;
struct tbl_span *first_span;
struct tbl_span *last_span;
+ struct tbl *next;
};
#define TBL_MSG(tblp, type, line, col) \
diff --git a/roff.c b/roff.c
index d62ebcc3..439784a9 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.112 2010/12/29 14:53:31 kristaps Exp $ */
+/* $Id: roff.c,v 1.113 2010/12/31 14:52:41 kristaps Exp $ */
/*
* Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -86,7 +86,9 @@ struct roff {
struct regset *regs; /* read/writable registers */
struct roffstr *first_string; /* user-defined strings & macros */
const char *current_string; /* value of last called user macro */
- struct tbl *tbl;
+ struct tbl *first_tbl; /* first table parsed */
+ struct tbl *last_tbl; /* last table parsed */
+ struct tbl *tbl; /* current table being parsed */
};
struct roffnode {
@@ -299,12 +301,16 @@ roffnode_push(struct roff *r, enum rofft tok, const char *name,
static void
roff_free1(struct roff *r)
{
+ struct tbl *t;
- if (r->tbl) {
- tbl_free(r->tbl);
- r->tbl = NULL;
+ while (r->first_tbl) {
+ t = r->first_tbl;
+ r->first_tbl = t->next;
+ tbl_free(t);
}
+ r->first_tbl = r->last_tbl = r->tbl = NULL;
+
while (r->last)
roffnode_pop(r);
@@ -1117,8 +1123,6 @@ roff_TE(ROFF_ARGS)
if (NULL == r->tbl)
(*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL);
- else
- tbl_free(r->tbl);
r->tbl = NULL;
return(ROFF_IGN);
@@ -1141,13 +1145,19 @@ roff_T_(ROFF_ARGS)
static enum rofferr
roff_TS(ROFF_ARGS)
{
+ struct tbl *t;
- if (r->tbl) {
+ if (r->tbl)
(*r->msg)(MANDOCERR_SCOPEBROKEN, r->data, ln, ppos, NULL);
- tbl_reset(r->tbl);
- } else
- r->tbl = tbl_alloc(r->data, r->msg);
+ t = tbl_alloc(r->data, r->msg);
+
+ if (r->last_tbl)
+ r->last_tbl->next = t;
+ else
+ r->first_tbl = r->last_tbl = t;
+
+ r->tbl = r->last_tbl = t;
return(ROFF_IGN);
}
diff --git a/tbl.c b/tbl.c
index 44e80aa6..15581b02 100644
--- a/tbl.c
+++ b/tbl.c
@@ -1,4 +1,4 @@
-/* $Id: tbl.c,v 1.9 2010/12/30 09:34:07 kristaps Exp $ */
+/* $Id: tbl.c,v 1.10 2010/12/31 14:52:41 kristaps Exp $ */
/*
* Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -25,56 +25,6 @@
#include "libmandoc.h"
#include "libroff.h"
-static void tbl_init(struct tbl *);
-static void tbl_clear(struct tbl *);
-
-static void
-tbl_clear(struct tbl *tbl)
-{
- struct tbl_row *rp;
- struct tbl_cell *cp;
- struct tbl_span *sp;
- struct tbl_dat *dp;
-
- while (tbl->first_row) {
- rp = tbl->first_row;
- tbl->first_row = rp->next;
- while (rp->first) {
- cp = rp->first;
- rp->first = cp->next;
- free(cp);
- }
- free(rp);
- }
-
- 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
-tbl_init(struct tbl *tbl)
-{
-
- tbl->part = TBL_PART_OPTS;
- tbl->tab = '\t';
- tbl->linesize = 12;
- tbl->decimal = '.';
-}
-
enum rofferr
tbl_read(struct tbl *tbl, int ln, const char *p, int offs)
{
@@ -121,24 +71,46 @@ tbl_alloc(void *data, const mandocmsg msg)
p = mandoc_calloc(1, sizeof(struct tbl));
p->data = data;
p->msg = msg;
- tbl_init(p);
+ p->part = TBL_PART_OPTS;
+ p->tab = '\t';
+ p->linesize = 12;
+ p->decimal = '.';
return(p);
}
void
tbl_free(struct tbl *p)
{
+ struct tbl_row *rp;
+ struct tbl_cell *cp;
+ struct tbl_span *sp;
+ struct tbl_dat *dp;
- tbl_clear(p);
- free(p);
-}
+ while (p->first_row) {
+ rp = p->first_row;
+ p->first_row = rp->next;
+ while (rp->first) {
+ cp = rp->first;
+ rp->first = cp->next;
+ free(cp);
+ }
+ free(rp);
+ }
-void
-tbl_reset(struct tbl *tbl)
-{
+ while (p->first_span) {
+ sp = p->first_span;
+ p->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_clear(tbl);
- tbl_init(tbl);
+ free(p);
}
void