source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Put parsed tables into a queue that's cleared at the end of
@ 2010-12-31 14:52 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-12-31 14:52 UTC (permalink / raw)
  To: source

Log Message:
-----------
Put parsed tables into a queue that's cleared at the end of parsing.
This completes the parsing phase of the new tbl implementation.

Modified Files:
--------------
    mdocml:
        libroff.h
        roff.c
        tbl.c

Revision Data
-------------
Index: tbl.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -Ltbl.c -Ltbl.c -u -p -r1.9 -r1.10
--- tbl.c
+++ tbl.c
@@ -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 ms
 	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
Index: roff.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.c,v
retrieving revision 1.112
retrieving revision 1.113
diff -Lroff.c -Lroff.c -u -p -r1.112 -r1.113
--- roff.c
+++ roff.c
@@ -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
 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);
 }
 
Index: libroff.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libroff.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -Llibroff.h -Llibroff.h -u -p -r1.9 -r1.10
--- libroff.h
+++ libroff.h
@@ -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) \
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2010-12-31 14:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-31 14:52 mdocml: Put parsed tables into a queue that's cleared at the end of kristaps

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).