49 #define HASH(bv, nw) (((nw) == 1) ? *(bv) : hash(bv, nw)) 50 #define HIT(h,bv,ss,nw) ((ss)->hash == (h) && ((nw) == 1 || \ 51 memcmp(VS(bv), VS((ss)->states), (nw)*sizeof(unsigned)) == 0)) 56 #define NOPROGRESS 010 98 #define DOMALLOC ((struct smalldfa *)NULL) 123 #define VISERR(vv) ((vv)->err != 0) 124 #define ISERR() VISERR(v) 125 #define VERR(vv,e) ((vv)->err = ((vv)->err ? (vv)->err : (e))) 126 #define ERR(e) VERR(v, e) 127 #define NOERR() {if (ISERR()) return v->err;} 128 #define OFF(p) ((p) - v->start) 129 #define LOFF(p) ((long)OFF(p)) 160 static unsigned hash(
unsigned *,
int);
182 register struct vars *v = &var;
232 v->
stop = (
chr *)
string + len;
253 for (i = 0; i < n; i++)
266 for (i = 0; i < n; i++)
275 for (i = 0; i < n; i++)
304 for (i = 0; i < n; i++)
315 for (i = 0; i < n; i++)
396 &cold, (
int *) NULL);
421 for (begin = open; begin <=
close; begin++)
423 MDEBUG((
"\nfind trying at %ld\n",
LOFF(begin)));
426 (
chr **) NULL, &hitend);
434 if (hitend && cold == NULL)
485 ret =
cfindloop(v, cnfa, cm, d, s, &cold);
524 assert(d != NULL && s != NULL);
531 close =
shortest(v, s, close, close, v->
stop, &cold, (
int *) NULL);
544 for (begin = open; begin <=
close; begin++)
546 MDEBUG((
"\ncfind trying at %ld\n",
LOFF(begin)));
554 estop, (
chr **) NULL, &hitend);
556 end =
longest(v, d, begin, estop,
563 if (hitend && cold == NULL)
609 }
while (close < v->stop);
624 for (i = n - 1; i > 0; i--)
643 if ((
size_t) n < v->nmatch)
652 if (t->
right != NULL)
668 if ((
size_t) n >= v->
nmatch)
671 MDEBUG((
"setting %d\n", n));
785 mid =
longest(v, d, begin, end, (
int *) NULL);
789 MDEBUG((
"tentative midpoint %ld\n",
LOFF(mid)));
795 if (
longest(v, d2, mid, end, (
int *) NULL) == end)
817 MDEBUG((
"%d no midpoint\n", t->
id));
820 mid =
longest(v, d, begin, mid - 1, (
int *) NULL);
825 MDEBUG((
"%d failed midpoint\n", t->
id));
863 mid =
shortest(v, d, begin, begin, end, (
chr **) NULL, (
int *) NULL);
867 MDEBUG((
"tentative midpoint %ld\n",
LOFF(mid)));
873 if (
longest(v, d2, mid, end, (
int *) NULL) == end)
895 MDEBUG((
"%d no midpoint\n", t->
id));
898 mid =
shortest(v, d, begin, mid + 1, end, (
chr **) NULL, (
int *) NULL);
903 MDEBUG((
"%d failed midpoint\n", t->
id));
936 assert((
size_t) n < v->nmatch);
938 MDEBUG((
"cbackref n%d %d{%d-%d}\n", t->
id, n, min, max));
953 if (begin == end && min <= max)
955 MDEBUG((
"cbackref matched trivially\n"));
965 MDEBUG((
"cbackref matched trivially\n"));
977 if (tlen % brlen != 0)
979 numreps = tlen / brlen;
980 if (numreps < min || (numreps > max && max !=
DUPINF))
985 while (numreps-- > 0)
987 if ((*v->
g->compare) (brstring, p, brlen) != 0)
992 MDEBUG((
"cbackref matched\n"));
1018 if (
longest(v, d, begin, end, (
int *) NULL) == end)
1020 MDEBUG((
"calt matched\n"));
1066 min_matches = t->
min;
1067 if (min_matches <= 0)
1079 max_matches = end - begin;
1081 max_matches = t->
max;
1082 if (max_matches < min_matches)
1083 max_matches = min_matches;
1084 endpts = (
chr **)
MALLOC((max_matches + 1) *
sizeof(
chr *));
1116 endpts[k] =
longest(v, d, endpts[k - 1], limit, (
int *) NULL);
1122 if (endpts[k] == NULL)
1128 MDEBUG((
"%d: working endpoint %d: %ld\n",
1129 t->
id, k,
LOFF(endpts[k])));
1135 if (endpts[k] != end)
1138 if (k >= max_matches)
1146 if (endpts[k] == endpts[k - 1] &&
1147 (k >= min_matches || min_matches - k < end - endpts[k]))
1161 if (k < min_matches)
1164 MDEBUG((
"%d: verifying %d..%d\n", t->
id, nverified + 1, k));
1166 for (i = nverified + 1; i <= k; i++)
1185 MDEBUG((
"%d successful\n", t->
id));
1200 chr *prev_end = endpts[k - 1];
1202 if (endpts[k] > prev_end)
1204 limit = endpts[k] - 1;
1205 if (limit > prev_end ||
1206 (k < min_matches && min_matches - k >= end - prev_end))
1224 if (t->
min == 0 && begin == end)
1226 MDEBUG((
"%d allowing zero matches\n", t->
id));
1263 min_matches = t->
min;
1264 if (min_matches <= 0)
1280 max_matches = end - begin;
1282 max_matches = t->
max;
1283 if (max_matches < min_matches)
1284 max_matches = min_matches;
1285 endpts = (
chr **)
MALLOC((max_matches + 1) *
sizeof(
chr *));
1317 if (limit == endpts[k - 1] &&
1319 (k >= min_matches || min_matches - k < end - limit))
1323 if (k >= max_matches)
1327 endpts[k] =
shortest(v, d, endpts[k - 1], limit, end,
1328 (
chr **) NULL, (
int *) NULL);
1334 if (endpts[k] == NULL)
1340 MDEBUG((
"%d: working endpoint %d: %ld\n",
1341 t->
id, k,
LOFF(endpts[k])));
1347 if (endpts[k] != end)
1350 if (k >= max_matches)
1358 limit = endpts[k - 1];
1368 if (k < min_matches)
1371 MDEBUG((
"%d: verifying %d..%d\n", t->
id, nverified + 1, k));
1373 for (i = nverified + 1; i <= k; i++)
1392 MDEBUG((
"%d successful\n", t->
id));
1406 if (endpts[k] < end)
1408 limit = endpts[k] + 1;
static chr * shortest(struct vars *, struct dfa *, chr *, chr *, chr *, chr **, int *)
static struct sset * getvacant(struct vars *, struct dfa *, chr *, chr *)
static int find(struct vars *, struct cnfa *, struct colormap *)
static struct sset * miss(struct vars *, struct dfa *, struct sset *, color, chr *, chr *)
static unsigned hash(unsigned *, int)
static chr * lastcold(struct vars *, struct dfa *)
static struct dfa * newdfa(struct vars *, struct cnfa *, struct colormap *, struct smalldfa *)
static chr * longest(struct vars *, struct dfa *, chr *, chr *, int *)
static int matchuntil(struct vars *, struct dfa *, chr *, struct sset **, chr **)
static void zaptreesubs(struct vars *, struct subre *)
static struct dfa * getsubdfa(struct vars *, struct subre *)
static int cfindloop(struct vars *, struct cnfa *, struct colormap *, struct dfa *, struct dfa *, chr **)
static int cbrdissect(struct vars *, struct subre *, chr *, chr *)
static int creviterdissect(struct vars *, struct subre *, chr *, chr *)
static void cleanup(void)
static struct sset * initialize(struct vars *, struct dfa *, chr *)
static int caltdissect(struct vars *, struct subre *, chr *, chr *)
void pg_set_regex_collation(Oid collation)
static int lacon(struct vars *, struct cnfa *, chr *, color)
static int ccondissect(struct vars *, struct subre *, chr *, chr *)
static int citerdissect(struct vars *, struct subre *, chr *, chr *)
static void freedfa(struct dfa *)
static int cdissect(struct vars *, struct subre *, chr *, chr *)
static void zapallsubs(regmatch_t *, size_t)
int pg_regexec(regex_t *re, const chr *string, size_t len, size_t search_start, rm_detail_t *details, size_t nmatch, regmatch_t pmatch[], int flags)
static struct sset * pickss(struct vars *, struct dfa *, chr *, chr *)
#define CANCEL_REQUESTED(re)
static struct dfa * getladfa(struct vars *, int)
static int crevcondissect(struct vars *, struct subre *, chr *, chr *)
static void subset(struct vars *, struct subre *, chr *, chr *)
#define STACK_TOO_DEEP(re)
static int cfind(struct vars *, struct cnfa *, struct colormap *)