* 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).