summaryrefslogtreecommitdiffstats
path: root/generic/regc_nfa.c
diff options
context:
space:
mode:
authorstanton <stanton>1999-06-02 01:53:29 (GMT)
committerstanton <stanton>1999-06-02 01:53:29 (GMT)
commit21c3baed52eba908b3e56f33f9d0f9541495616e (patch)
tree02591dac73223fda831014e215800dee4b75d811 /generic/regc_nfa.c
parenta045db4812c23138a2f998a7f827f46a30558a79 (diff)
downloadtcl-21c3baed52eba908b3e56f33f9d0f9541495616e.zip
tcl-21c3baed52eba908b3e56f33f9d0f9541495616e.tar.gz
tcl-21c3baed52eba908b3e56f33f9d0f9541495616e.tar.bz2
* tests/reg.test:
* generic/regc_color.c: * generic/regc_cvec.c: * generic/regc_lex.c: * generic/regc_locale.c: * generic/regc_nfa.c: * generic/regcomp.c: * generic/regcustom.h: * generic/rege_dfa.c: * generic/regerror.c: * generic/regerrs.h: * generic/regex.h: * generic/regexec.c: * generic/regfree.c: * generic/regfronts.c: * generic/regguts.h: * generic/tclCmdMZ.c: * generic/tclRegexp.c: * generic/tclRegexp.h: * generic/tclTest.c: Applied Henry Spencer's latest regexp patches that fix an infinite loop bug and add support for testing whether a string could match with additional input. [Bug: 2117]
Diffstat (limited to 'generic/regc_nfa.c')
-rw-r--r--generic/regc_nfa.c81
1 files changed, 64 insertions, 17 deletions
diff --git a/generic/regc_nfa.c b/generic/regc_nfa.c
index 80e9ac7..897b3eb 100644
--- a/generic/regc_nfa.c
+++ b/generic/regc_nfa.c
@@ -2,6 +2,34 @@
* NFA utilities.
* This file is #included by regcomp.c.
*
+ * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
+ *
+ * Development of this software was funded, in part, by Cray Research Inc.,
+ * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
+ * Corporation, none of whom are responsible for the results. The author
+ * thanks all of them.
+ *
+ * Redistribution and use in source and binary forms -- with or without
+ * modification -- are permitted for any purpose, provided that
+ * redistributions in source form retain this entire copyright notice and
+ * indicate the origin and nature of any modifications.
+ *
+ * I'd appreciate being given credit for this package in the documentation
+ * of software which uses it, but that is not a requirement.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ *
* One or two things that technically ought to be in here
* are actually in color.c, thanks to some incestuous relationships in
* the color chains.
@@ -86,16 +114,14 @@ struct nfa *nfa;
}
/*
- - newfstate - allocate an NFA state, with specified flag value
- ^ static struct state *newfstate(struct nfa *, int flag);
+ - newstate - allocate an NFA state, with zero flag value
+ ^ static struct state *newstate(struct nfa *);
*/
static struct state * /* NULL on error */
-newfstate(nfa, flag)
+newstate(nfa)
struct nfa *nfa;
-int flag;
{
struct state *s;
- int i;
if (nfa->free != NULL) {
s = nfa->free;
@@ -107,17 +133,13 @@ int flag;
return NULL;
}
s->oas.next = NULL;
- s->free = &s->oas.a[0];
- for (i = 0; i < ABSIZE; i++) {
- s->oas.a[i].type = 0;
- s->oas.a[i].freechain = &s->oas.a[i+1];
- }
- s->oas.a[ABSIZE-1].freechain = NULL;
+ s->free = NULL;
+ s->noas = 0;
}
assert(nfa->nstates >= 0);
s->no = nfa->nstates++;
- s->flag = (char)flag;
+ s->flag = 0;
if (nfa->states == NULL)
nfa->states = s;
s->nins = 0;
@@ -136,14 +158,20 @@ int flag;
}
/*
- - newstate - allocate an ordinary NFA state
- ^ static struct state *newstate(struct nfa *);
+ - newfstate - allocate an NFA state with a specified flag value
+ ^ static struct state *newfstate(struct nfa *, int flag);
*/
static struct state * /* NULL on error */
-newstate(nfa)
+newfstate(nfa, flag)
struct nfa *nfa;
+int flag;
{
- return newfstate(nfa, 0);
+ struct state *s;
+
+ s = newstate(nfa);
+ if (s != NULL)
+ s->flag = (char)flag;
+ return s;
}
/*
@@ -237,7 +265,7 @@ struct state *to;
/* check for duplicates */
for (a = from->outs; a != NULL; a = a->outchain)
- if (a->type == t && a->co == co && a->to == to)
+ if (a->to == to && a->co == co && a->type == t)
return;
a = allocarc(nfa, from);
@@ -283,6 +311,13 @@ struct state *s;
struct arcbatch *new;
int i;
+ /* shortcut */
+ if (s->free == NULL && s->noas < ABSIZE) {
+ a = &s->oas.a[s->noas];
+ s->noas++;
+ return a;
+ }
+
/* if none at hand, get more */
if (s->free == NULL) {
new = (struct arcbatch *)MALLOC(sizeof(struct arcbatch));
@@ -1329,6 +1364,9 @@ FILE *f;
}
#ifdef REG_DEBUG /* subordinates of dumpnfa */
+/*
+ ^ #ifdef REG_DEBUG
+ */
/*
- dumpstate - dump an NFA state in human-readable form
@@ -1458,6 +1496,9 @@ FILE *f;
fprintf(f, "?!?"); /* missing from in-chain */
}
+/*
+ ^ #endif
+ */
#endif /* ifdef REG_DEBUG */
/*
@@ -1491,6 +1532,9 @@ FILE *f;
}
#ifdef REG_DEBUG /* subordinates of dumpcnfa */
+/*
+ ^ #ifdef REG_DEBUG
+ */
/*
- dumpcstate - dump a compacted-NFA state in human-readable form
@@ -1525,4 +1569,7 @@ FILE *f;
fflush(f);
}
+/*
+ ^ #endif
+ */
#endif /* ifdef REG_DEBUG */