* src/dfa.c (position_set): Add alloc.
(alloc_posset): Initialize it.
(dfaanalyze): Use it instead of the nalloc array or nelem.
---
src/dfa.c | 16 +++++++---------
1 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/src/dfa.c b/src/dfa.c
index 4644cab..03676b0 100644
--- a/src/dfa.c
+++ b/src/dfa.c
@@ -247,6 +247,7 @@ typedef struct
{
position *elems; /* Elements of this position set. */
int nelem; /* Number of elements in this set. */
+ size_t alloc; /* Number of elements allocated in
ELEMS. */
} position_set;
/* Sets of leaves are also stored as arrays. */
@@ -1835,6 +1836,7 @@ static void
alloc_posset (position_set *s, size_t size)
{
MALLOC(s->elems, size);
+ s->alloc = size;
s->nelem = 0;
}
@@ -2103,7 +2105,6 @@ dfaanalyze (struct dfa *d, int searchflag)
position *firstpos; /* Array where firstpos elements are stored. */
int *nlastpos; /* Element count stack for lastpos sets. */
position *lastpos; /* Array where lastpos elements are stored. */
- int *nalloc; /* Sizes of arrays allocated to follow sets. */
position_set tmp; /* Temporary set for merging sets. */
position_set merged; /* Result of merging sets. */
int wants_newline; /* True if some position wants newline info. */
@@ -2135,7 +2136,6 @@ dfaanalyze (struct dfa *d, int searchflag)
o_nlast = nlastpos;
MALLOC(lastpos, d->nleaves);
o_lastpos = lastpos, lastpos += d->nleaves;
- CALLOC(nalloc, d->tindex);
alloc_posset(&merged, d->nleaves);
CALLOC(d->follows, d->tindex);
@@ -2163,7 +2163,7 @@ dfaanalyze (struct dfa *d, int searchflag)
{
merge(&tmp, &d->follows[pos[j].index], &merged);
REALLOC_IF_NECESSARY(d->follows[pos[j].index].elems,
- nalloc[pos[j].index], merged.nelem);
+ d->follows[pos[j].index].alloc, merged.nelem);
copy(&merged, &d->follows[pos[j].index]);
}
@@ -2183,7 +2183,7 @@ dfaanalyze (struct dfa *d, int searchflag)
{
merge(&tmp, &d->follows[pos[j].index], &merged);
REALLOC_IF_NECESSARY(d->follows[pos[j].index].elems,
- nalloc[pos[j].index], merged.nelem);
+ d->follows[pos[j].index].alloc, merged.nelem);
copy(&merged, &d->follows[pos[j].index]);
}
@@ -2243,8 +2243,7 @@ dfaanalyze (struct dfa *d, int searchflag)
firstpos->constraint = lastpos->constraint = NO_CONSTRAINT;
/* Allocate the follow set for this position. */
- nalloc[i] = 1;
- alloc_posset(&d->follows[i], nalloc[i]);
+ alloc_posset(&d->follows[i], 1);
break;
}
#ifdef DEBUG
@@ -2292,8 +2291,8 @@ dfaanalyze (struct dfa *d, int searchflag)
#endif
copy(&d->follows[i], &merged);
epsclosure(&merged, d);
- if (d->follows[i].nelem < merged.nelem)
- REALLOC(d->follows[i].elems, merged.nelem);
+ REALLOC_IF_NECESSARY(d->follows[i].elems, d->follows[i].alloc,
+ merged.nelem);
copy(&merged, &d->follows[i]);
}
@@ -2321,7 +2320,6 @@ dfaanalyze (struct dfa *d, int searchflag)
free(o_firstpos);
free(o_nlast);
free(o_lastpos);
- free(nalloc);
free(merged.elems);
}
--
1.7.7.1