Lines Matching refs:rex

89 static const char* rexname(Rex_t* rex)
91 if (!rex)
93 if (rex->type >= elementsof(rexnames))
95 return rexnames[rex->type];
248 _matchpush(Env_t* env, Rex_t* rex)
256 if (rex->re.group.number <= 0 || (num = rex->re.group.last - rex->re.group.number + 1) <= 0)
264 f->match = m = env->match + rex->re.group.number;
280 pospush(Env_t* env, Rex_t* rex, unsigned char* p, int be)
289 pos->serial = rex->serial;
402 parserep(Env_t* env, Rex_t* rex, Rex_t* cont, unsigned char* s, int n)
408 DEBUG_TEST(0x0010,(sfprintf(sfstdout, "AHA#%04d 0x%04x parserep %s %d %d %d %d `%-.*s'\n", __LINE__, debug_flag, rexname(rex->re.group.expr.rex), rex->re.group.number, rex->lo, n, rex->hi, env->end - s, s)),(0));
409 if ((rex->flags & REG_MINIMAL) && n >= rex->lo && n < rex->hi)
411 if (env->stack && pospush(env, rex, s, END_ANY))
413 i = follow(env, rex, cont, s);
427 if (n < rex->hi)
430 catcher.serial = rex->serial;
431 catcher.re.rep_catch.ref = rex;
435 catcher.next = rex->next;
437 rex->re.rep_catch.beg = s;
440 if (matchpush(env, rex))
442 if (pospush(env, rex, s, BEG_ONE))
444 DEBUG_TEST(0x0004,(sfprintf(sfstdout,"AHA#%04d 0x%04x PUSH %d (%z,%z)(%z,%z)(%z,%z) (%z,%z)(%z,%z)(%z,%z)\n", __LINE__, debug_flag, rex->re.group.number, env->best[0].rm_so, env->best[0].rm_eo, env->best[1].rm_so, env->best[1].rm_eo, env->best[2].rm_so, env->best[2].rm_eo, env->match[0].rm_so, env->match[0].rm_eo, env->match[1].rm_so, env->match[1].rm_eo, env->match[2].rm_so, env->match[2].rm_eo)),(0));
446 r = parse(env, rex->re.group.expr.rex, &catcher, s);
447 DEBUG_TEST(0x0010,(sfprintf(sfstdout, "AHA#%04d 0x%04x parserep parse %d %d `%-.*s'\n", __LINE__, debug_flag, rex->re.group.number, r, env->end - s, s)),(0));
451 matchpop(env, rex);
452 DEBUG_TEST(0x0004,(sfprintf(sfstdout,"AHA#%04d 0x%04x POP %d %d (%z,%z)(%z,%z)(%z,%z) (%z,%z)(%z,%z)(%z,%z)\n", __LINE__, debug_flag, rex->re.group.number, r, env->best[0].rm_so, env->best[0].rm_eo, env->best[1].rm_so, env->best[1].rm_eo, env->best[2].rm_so, env->best[2].rm_eo, env->match[0].rm_so, env->match[0].rm_eo, env->match[1].rm_so, env->match[1].rm_eo, env->match[2].rm_so, env->match[2].rm_eo)),(0));
464 if (rex->flags & REG_MINIMAL)
470 if (n < rex->lo)
472 if (!(rex->flags & REG_MINIMAL) || n >= rex->hi)
474 if (env->stack && pospush(env, rex, s, END_ANY))
476 i = follow(env, rex, cont, s);
491 r = (rex->flags & REG_MINIMAL) ? BEST : GOOD;
499 parsetrie(Env_t* env, Trie_node_t* x, Rex_t* rex, Rex_t* cont, unsigned char* s)
504 if (p = rex->map)
535 if (rex->flags & REG_MINIMAL)
536 switch (follow(env, rex, cont, s))
547 switch (parsetrie(env, x->son, rex, cont, s))
556 if (rex->flags & REG_MINIMAL)
566 if (!(rex->flags & REG_MINIMAL))
567 switch (follow(env, rex, cont, s))
650 collmatch(Rex_t* rex, unsigned char* s, unsigned char* e, unsigned char** p)
661 ic = (rex->flags & REG_ICASE);
707 if (ic ? collic(rex->re.collate.elements, (char*)key, (char*)key, c, x) : collelt(rex->re.collate.elements, (char*)key, c, x))
718 return rex->re.collate.invert ? !r : r;
797 parse(Env_t* env, Rex_t* rex, Rex_t* cont, unsigned char* s)
819 DEBUG_TEST(0x0008,(sfprintf(sfstdout, "AHA#%04d 0x%04x parse %s `%-.*s'\n", __LINE__, debug_flag, rexname(rex), env->end - s, s)),(0));
820 switch (rex->type)
825 if (matchpush(env, rex))
827 if (pospush(env, rex, s, BEG_ALT))
830 catcher.serial = rex->serial;
832 catcher.next = rex->next;
833 r = parse(env, rex->re.group.expr.binary.left, &catcher, s);
834 if (r < BEST || (rex->flags & REG_MINIMAL))
836 matchcopy(env, rex);
837 ((Pos_t*)env->pos->vec + env->pos->cur - 1)->serial = catcher.serial = rex->re.group.expr.binary.serial;
838 n = parse(env, rex->re.group.expr.binary.right, &catcher, s);
843 matchpop(env, rex);
847 if ((r = parse(env, rex->re.group.expr.binary.left, cont, s)) == NONE)
848 r = parse(env, rex->re.group.expr.binary.right, cont, s);
854 if (pospush(env, rex, s, END_ANY))
856 r = follow(env, rex, rex->re.alt_catch.cont, s);
860 o = &env->match[rex->lo];
868 if (!(p = rex->map))
892 if ((!(rex->flags & REG_NEWLINE) || s <= env->beg || *(s - 1) != '\n') && ((env->flags & REG_NOTBOL) || s != env->beg))
896 if (LEADING(env, rex, s))
898 n = rex->hi;
901 m = rex->lo;
905 if (!(rex->flags & REG_MINIMAL))
908 if (!settst(rex->re.charclass, s[i]))
914 switch (follow(env, rex, cont, s))
930 if (!settst(rex->re.charclass, *s))
935 switch (follow(env, rex, cont, s))
945 if (s >= e || !settst(rex->re.charclass, *s))
952 if (LEADING(env, rex, s))
954 n = rex->hi;
957 m = rex->lo;
962 if (!(rex->flags & REG_MINIMAL))
969 for (i = 0; s < e && i < n && collmatch(rex, s, e, &t); i++)
974 for (; i-- >= rex->lo; s -= b[i])
975 switch (follow(env, rex, cont, s))
995 if (!collmatch(rex, s, e, &t))
999 switch (follow(env, rex, cont, s))
1009 if (s >= e || !collmatch(rex, s, e, &s))
1017 next.next = rex->next;
1019 catcher.re.conj_left.right = rex->re.group.expr.binary.right;
1023 return parse(env, rex->re.group.expr.binary.left, &catcher, s);
1025 rex->re.conj_left.cont->re.conj_right.end = s;
1026 cont = rex->re.conj_left.cont;
1027 s = rex->re.conj_left.beg;
1028 rex = rex->re.conj_left.right;
1031 if (rex->re.conj_right.end != s)
1033 cont = rex->re.conj_right.cont;
1040 DEBUG_TEST(0x0100,(sfprintf(sfstdout,"AHA#%04d 0x%04x %s (%z,%z)(%z,%z)(%z,%z)(%z,%z) (%z,%z)(%z,%z)\n", __LINE__, debug_flag, rexname(rex), env->best[0].rm_so, env->best[0].rm_eo, env->best[1].rm_so, env->best[1].rm_eo, env->best[2].rm_so, env->best[2].rm_eo, env->best[3].rm_so, env->best[3].rm_eo, env->match[0].rm_so, env->match[0].rm_eo, env->match[1].rm_so, env->match[1].rm_eo)),(0));
1043 if (rex->flags & REG_MINIMAL)
1071 DEBUG_TEST(0x0100,(sfprintf(sfstdout,"AHA#%04d 0x%04x %s (%z,%z)(%z,%z)(%z,%z)(%z,%z) (%z,%z)(%z,%z)\n", __LINE__, debug_flag, rexname(rex), env->best[0].rm_so, env->best[0].rm_eo, env->best[1].rm_so, env->best[1].rm_eo, env->best[2].rm_so, env->best[2].rm_eo, env->best[3].rm_so, env->best[3].rm_eo, env->match[0].rm_so, env->match[0].rm_eo, env->match[1].rm_so, env->match[1].rm_eo)),(0));
1074 if (LEADING(env, rex, s))
1076 n = rex->hi;
1079 m = rex->lo;
1082 if ((c = rex->explicit) >= 0 && !mbwide())
1090 if (!(rex->flags & REG_MINIMAL))
1095 switch (follow(env, rex, cont, s))
1119 switch (follow(env, rex, cont, s))
1143 switch (follow(env, rex, cont, s))
1161 switch (follow(env, rex, cont, s))
1175 if ((!(rex->flags & REG_NEWLINE) || *s != '\n') && ((env->flags & REG_NOTEOL) || s < env->end))
1179 DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s `%-.*s'\n", __LINE__, debug_flag, rexname(rex), env->end - s, s)),(0));
1182 if (rex->re.group.number)
1183 env->match[rex->re.group.number].rm_so = s - env->beg;
1184 if (pospush(env, rex, s, BEG_SUB))
1186 catcher.re.group_catch.eo = rex->re.group.number ? &env->match[rex->re.group.number].rm_eo : (regoff_t*)0;
1189 catcher.serial = rex->serial;
1191 catcher.next = rex->next;
1192 r = parse(env, rex->re.group.expr.rex, &catcher, s);
1196 if (rex->re.group.number)
1197 env->match[rex->re.group.number].rm_so = -1;
1201 DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", __LINE__, debug_flag, rexname(rex), rexname(rex->re.group_catch.cont), env->end - s, s)),(0));
1204 if (rex->re.group_catch.eo)
1205 *rex->re.group_catch.eo = s - env->beg;
1206 if (pospush(env, rex, s, END_ANY))
1209 r = follow(env, rex, rex->re.group_catch.cont, s);
1213 if (rex->re.group_catch.eo)
1214 *rex->re.group_catch.eo = -1;
1219 catcher.flags = rex->flags;
1220 catcher.serial = rex->serial;
1223 catcher.next = rex->next;
1224 return parse(env, rex->re.group.expr.rex, &catcher, s);
1226 return follow(env, rex, rex->re.rep_catch.cont, rex->re.rep_catch.beg);
1228 r = parse(env, rex->re.group.expr.rex, NiL, s);
1230 r = follow(env, rex, cont, s);
1235 if ((s - env->beg) < rex->re.group.size)
1238 catcher.flags = rex->flags;
1239 catcher.serial = rex->serial;
1243 catcher.next = rex->next;
1244 for (t = s - rex->re.group.size; t >= env->beg; t--)
1247 r = parse(env, rex->re.group.expr.rex, &catcher, t);
1254 if (s != rex->re.behind_catch.beg)
1256 env->end = rex->re.behind_catch.end;
1257 return follow(env, rex, rex->re.behind_catch.cont, rex->re.behind_catch.beg);
1259 if ((s - env->beg) < rex->re.group.size)
1268 for (t = s - rex->re.group.size; t >= env->beg; t--)
1270 r = parse(env, rex->re.group.expr.rex, &catcher, t);
1277 r = follow(env, rex, cont, s);
1282 return s == rex->re.neg_catch.beg ? GOOD : NONE;
1284 if (q = rex->re.group.expr.binary.right)
1291 if (q = rex->re.group.expr.binary.left)
1294 catcher.flags = rex->flags;
1295 catcher.serial = rex->serial;
1299 catcher.next = rex->next;
1304 else if (!rex->re.group.size || rex->re.group.size > 0 && env->match[rex->re.group.size].rm_so >= 0)
1314 catcher.next = rex->next;
1317 return follow(env, rex, cont, s);
1319 rex->re.cond_catch.yes = 1;
1321 catcher.flags = rex->flags;
1322 catcher.serial = rex->serial;
1323 catcher.re.group_catch.cont = rex->re.cond_catch.cont;
1324 catcher.next = rex->next;
1325 return parse(env, rex->re.cond_catch.next[1], &catcher, rex->re.cond_catch.beg);
1327 return follow(env, rex, rex->re.group_catch.cont, s);
1330 catcher.flags = rex->flags;
1331 catcher.serial = rex->serial;
1333 catcher.next = rex->next;
1334 return parse(env, rex->re.group.expr.rex, &catcher, s);
1336 switch (r = follow(env, rex, rex->re.group_catch.cont, s))
1347 f = rex->re.string.fail;
1348 b = rex->re.string.base;
1349 n = rex->re.string.size;
1352 if (p = rex->map)
1367 switch (follow(env, rex, cont, t))
1398 switch (follow(env, rex, cont, t))
1416 if (LEADING(env, rex, s))
1425 catcher.next = rex->next;
1426 if (parse(env, rex->re.group.expr.rex, &catcher, s) == BAD)
1434 switch (follow(env, rex, cont, s + i))
1457 bitset(rex->re.neg_catch.index, s - rex->re.neg_catch.beg);
1464 if ((c = *s++) == rex->re.nest.primary)
1466 if (s >= env->end || !(s = nestmatch(s, env->end, rex->re.nest.type, c)))
1470 if (rex->re.nest.primary >= 0)
1472 if (rex->re.nest.type[c] & (REX_NEST_delimiter|REX_NEST_separator|REX_NEST_terminator))
1474 if (!(s = nestmatch(s, env->end, rex->re.nest.type, c)))
1476 } while (s < env->end && !(rex->re.nest.type[*(s-1)] & (REX_NEST_delimiter|REX_NEST_separator|REX_NEST_terminator)));
1481 n = rex->hi;
1484 m = rex->lo;
1488 c = rex->re.onechar;
1489 if (!(rex->flags & REG_MINIMAL))
1493 if (p = rex->map)
1506 switch (follow(env, rex, cont, s))
1527 if (!(rex->flags & REG_ICASE))
1548 switch (follow(env, rex, cont, s))
1571 if (p = rex->map)
1579 switch (follow(env, rex, cont, s))
1601 switch (follow(env, rex, cont, s))
1619 if (!(rex->flags & REG_ICASE))
1629 switch (follow(env, rex, cont, s))
1653 switch (follow(env, rex, cont, s))
1671 if (env->stack && pospush(env, rex, s, BEG_REP))
1673 r = parserep(env, rex, cont, s, 0);
1678 DEBUG_TEST(0x0020,(sfprintf(sfstdout, "AHA#%04d 0x%04x %s n %d len %d s `%-.*s'\n", __LINE__, debug_flag, rexname(rex), rex->re.rep_catch.n, s - rex->re.rep_catch.beg, env->end - s, s)),(0));
1679 if (env->stack && pospush(env, rex, s, END_ANY))
1681 if (s == rex->re.rep_catch.beg && rex->re.rep_catch.n > rex->re.rep_catch.ref->lo)
1687 DEBUG_TEST(0x0002,(sfprintf(sfstdout, "AHA#%04d %p re.group.back=%d re.group.expr.rex=%s\n", __LINE__, rex->re.rep_catch.ref->re.group.expr.rex, rex->re.rep_catch.ref->re.group.expr.rex->re.group.back, rexname(rex->re.rep_catch.ref->re.group.expr.rex))),(0));
1688 if (!env->stack || s != rex->re.rep_catch.ref->re.rep_catch.beg && !rex->re.rep_catch.ref->re.group.expr.rex->re.group.back)
1690 else if (pospush(env, rex, s, END_ANY))
1694 r = follow(env, rex, rex->re.rep_catch.cont, s);
1699 r = parserep(env, rex->re.rep_catch.ref, rex->re.rep_catch.cont, s, rex->re.rep_catch.n);
1704 DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s \"%-.*s\" `%-.*s'\n", __LINE__, debug_flag, rexname(rex), rex->re.string.size, rex->re.string.base, env->end - s, s)),(0));
1705 if (rex->re.string.size > (env->end - s))
1707 t = rex->re.string.base;
1708 e = t + rex->re.string.size;
1709 if (!(p = rex->map))
1733 if (((s + rex->re.trie.min) > env->end) || !(x = rex->re.trie.root[rex->map ? rex->map[*s] : *s]))
1735 return parsetrie(env, x, rex, cont, s);
1738 r = (*env->disc->re_execf)(env->regex, rex->re.exec.data, rex->re.exec.text, rex->re.exec.size, (const char*)s, env->end - s, &u, env->disc);
1783 if (!(rex = rex->next))
1785 if (!(rex = cont))
1822 listnode(e->re.group.expr.rex, level + 1);
1830 list(Env_t* env, Rex_t* rex)
1833 if (rex)
1834 listnode(rex, 1);
1894 DEBUG_TEST(0x1000,(list(env,env->rex)),(0));
1896 if ((e = env->rex)->type == REX_BM)
2036 drop(env->disc, env->rex);