source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Move clean-up of parsed tbl nodes into the tbl_clear() function,
@ 2010-12-30  9:34 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2010-12-30  9:34 UTC (permalink / raw)
  To: source

Log Message:
-----------
Move clean-up of parsed tbl nodes into the tbl_clear() function, called
once per invocation.

Modified Files:
--------------
    mdocml:
        libroff.h
        tbl.c
        tbl_data.c
        tbl_layout.c

Revision Data
-------------
Index: tbl_data.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl_data.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -Ltbl_data.c -Ltbl_data.c -u -p -r1.1 -r1.2
--- tbl_data.c
+++ tbl_data.c
@@ -66,7 +66,7 @@ data(struct tbl *tbl, struct tbl_span *d
 		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 
 
 	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: tbl_layout.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl_layout.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -Ltbl_layout.c -Ltbl_layout.c -u -p -r1.2 -r1.3
--- tbl_layout.c
+++ 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;
Index: tbl.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -Ltbl.c -Ltbl.c -u -p -r1.8 -r1.9
--- tbl.c
+++ 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 
 {
 	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 
 		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: libroff.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libroff.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -Llibroff.h -Llibroff.h -u -p -r1.7 -r1.8
--- libroff.h
+++ 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
 
--
 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-30  9:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-30  9:34 mdocml: Move clean-up of parsed tbl nodes into the tbl_clear() function, 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).