summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/regc_color.c2
-rw-r--r--generic/regc_cvec.c2
-rw-r--r--generic/regcomp.c50
3 files changed, 48 insertions, 6 deletions
diff --git a/generic/regc_color.c b/generic/regc_color.c
index 2c4d97e..f1f216f 100644
--- a/generic/regc_color.c
+++ b/generic/regc_color.c
@@ -682,6 +682,7 @@ uncolorchain(
a->colorchain = NULL; /* paranoia */
}
+#ifdef REGEXP_MCCE_ENABLED
/*
- singleton - is this character in its own color?
^ static int singleton(struct colormap *, pchr c);
@@ -699,6 +700,7 @@ singleton(
}
return 0;
}
+#endif
/*
- rainbow - add arcs of all full colors (but one) between specified states
diff --git a/generic/regc_cvec.c b/generic/regc_cvec.c
index 1e38476..55d087a 100644
--- a/generic/regc_cvec.c
+++ b/generic/regc_cvec.c
@@ -111,7 +111,7 @@ addrange(
cv->nranges++;
}
-#ifdef REGEXP_ADDMCCE_UNUSED
+#ifdef REGEXP_MCCE_ENABLED
/*
* This static function is currently called from a single spot in regcomp.c,
* with two NULL pointers; in that case it does nothing, so that we define out
diff --git a/generic/regcomp.c b/generic/regcomp.c
index fb159cb..0d6f066 100644
--- a/generic/regcomp.c
+++ b/generic/regcomp.c
@@ -56,7 +56,9 @@ static chr *scanplain(struct vars *);
static VOID leaders(struct vars *, struct cvec *);
static VOID onechr(struct vars *, pchr, struct state *, struct state *);
static VOID dovec(struct vars *, struct cvec *, struct state *, struct state *);
+#ifdef REGEXP_MCCE_ENABLED
static celt nextleader(struct vars *, pchr, pchr);
+#endif
static VOID wordchrs(struct vars *);
static struct subre *subre(struct vars *, int, int, struct state *, struct state *);
static VOID freesubre(struct vars *, struct subre *);
@@ -105,7 +107,9 @@ static VOID subblock(struct vars *, pchr, struct state *, struct state *);
static VOID okcolors(struct nfa *, struct colormap *);
static VOID colorchain(struct colormap *, struct arc *);
static VOID uncolorchain(struct colormap *, struct arc *);
+#ifdef REGEXP_MCCE_ENABLED
static int singleton(struct colormap *, pchr c);
+#endif
static VOID rainbow(struct nfa *, struct colormap *, int, pcolor, struct state *, struct state *);
static VOID colorcomplement(struct nfa *, struct colormap *, int, struct state *, struct state *, struct state *);
#ifdef REG_DEBUG
@@ -171,7 +175,7 @@ static struct cvec *newcvec(int, int, int);
static struct cvec *clearcvec(struct cvec *);
static VOID addchr(struct cvec *, pchr);
static VOID addrange(struct cvec *, pchr, pchr);
-#ifdef REGEXP_ADDMCCE_UNUSED
+#ifdef REGEXP_MCCE_ENABLED
static VOID addmcce(struct cvec *, chr *, chr *);
#endif
static int haschr(struct cvec *, pchr);
@@ -366,7 +370,7 @@ compile(
CNOERR();
v->mcces = allmcces(v, v->mcces);
leaders(v, v->mcces);
-#ifdef REGEXP_ADDMCCE_UNUSED
+#ifdef REGEXP_MCCE_ENABLED
/* Function does nothing with NULL pointers */
addmcce(v->mcces, (chr *)NULL, (chr *)NULL); /* dummy */
#endif
@@ -1754,6 +1758,33 @@ onechr(
^ static VOID dovec(struct vars *, struct cvec *, struct state *,
^ struct state *);
*/
+#ifndef REGEXP_MCCE_ENABLED
+static void
+dovec(
+ struct vars *v,
+ struct cvec *cv,
+ struct state *lp,
+ struct state *rp)
+{
+ chr ch, from, to;
+ chr *p;
+ int i;
+
+ for (p = cv->chrs, i = cv->nchrs; i > 0; p++, i--) {
+ ch = *p;
+ newarc(v->nfa, PLAIN, subcolor(v->cm, ch), lp, rp);
+ }
+
+ for (p = cv->ranges, i = cv->nranges; i > 0; p += 2, i--) {
+ from = *p;
+ to = *(p+1);
+ if (from <= to) {
+ subrange(v, from, to, lp, rp);
+ }
+ }
+
+}
+#else /* REGEXP_MCCE_ENABLED */
static void
dovec(
struct vars *v,
@@ -1765,8 +1796,8 @@ dovec(
celt ce;
chr *p;
int i;
- color co;
struct cvec *leads;
+ color co;
struct arc *a;
struct arc *pa; /* arc in prototype */
struct state *s;
@@ -1791,7 +1822,7 @@ dovec(
} else {
leads = NULL;
}
-
+
/*
* First, get the ordinary characters out of the way.
*/
@@ -1832,7 +1863,15 @@ dovec(
}
}
- if ((leads == NULL || leads->nchrs == 0) && cv->nmcces == 0) {
+ /* *** WARNING ***
+ *
+ * This was buggy, check before enabling: the original version would cause
+ * a segfault at the loopinit below if (leads==NULL && cv->nmcces!=0)
+ * Possibly just a problem with parens? The original condition was
+ * ((leads == NULL || leads->nchrs == 0) && cv->nmcces == 0)
+ */
+
+ if (leads == NULL || (leads->nchrs == 0 && cv->nmcces == 0)) {
return;
}
@@ -1922,6 +1961,7 @@ nextleader(
}
return it;
}
+#endif
/*
- wordchrs - set up word-chr list for word-boundary stuff, if needed