When REG_DEBUG is defined, ensure that an un-filled "struct cnfa"
is all-zeroes, not just that it has nstates == 0. This is mainly
so that looking at "struct subre" structs in gdb doesn't distract
one with a lot of garbage fields during regex compilation.
Adjust some places that print debug output to have suitable fflush
calls afterwards.
In passing, correct an erroneous ancient comment: the concatenation
subre-s created by parsebranch() have op == '.' not ','.
Noted while fooling around with some regex performance improvements.
static void
freecnfa(struct cnfa *cnfa)
{
- assert(cnfa->nstates != 0); /* not empty already */
- cnfa->nstates = 0;
+ assert(!NULLCNFA(*cnfa)); /* not empty already */
FREE(cnfa->stflags);
FREE(cnfa->states);
FREE(cnfa->arcs);
+ ZAPCNFA(*cnfa);
}
/*
fprintf(f, "\tno out arcs\n");
else
dumparcs(s, f);
- fflush(f);
for (a = s->ins; a != NULL; a = a->inchain)
{
if (a->to != s)
fprintf(f, "\tlink from %d to %d on %d's in-chain\n",
a->from->no, a->to->no, s->no);
}
+ fflush(f);
}
/*
#ifdef REG_DEBUG
if (flags & REG_DUMP)
+ {
dump(re, stdout);
+ fflush(stdout);
+ }
#endif
assert(v->err == 0);
*
* This mostly manages concatenation, working closely with parseqatom().
* Concatenated things are bundled up as much as possible, with separate
- * ',' nodes introduced only when necessary due to substructure.
+ * '.' nodes introduced only when necessary due to substructure.
*/
static struct subre *
parsebranch(struct vars *v,
struct carc *arcs; /* the area for the lists */
};
+/*
+ * When debugging, it's helpful if an un-filled CNFA is all-zeroes.
+ * In production, though, we only require nstates to be zero.
+ */
+#ifdef REG_DEBUG
+#define ZAPCNFA(cnfa) memset(&(cnfa), 0, sizeof(cnfa))
+#else
#define ZAPCNFA(cnfa) ((cnfa).nstates = 0)
+#endif
#define NULLCNFA(cnfa) ((cnfa).nstates == 0)
/*