48#if defined(LIBC_SCCS) && !defined(lint)
49static char sccsid[] =
"@(#)regcomp.c 8.5 (Berkeley) 3/20/94";
81int collate_load_error;
82int collate_substitute_nontrivial;
83char collate_version[STR_LEN];
84unsigned char collate_substitute_table[UCHAR_MAX + 1][STR_LEN];
89#define isblank(X) isspace(X)
91#define isascii(X) ((unsigned int)(X) < 0177)
100static int collate_range_cmp(
int c1,
int c2) {
101 static char s1[2], s2[2];
103#ifndef ASCII_COMPATIBLE_COLLATE
104 int as1, as2, al1, al2;
112#ifndef ASCII_COMPATIBLE_COLLATE
118 if (as1 || as2 || al1 || al2) {
119 if ((as1 && as2) || (!al1 && !al2))
126 }
else if (al2 && !al1) {
136 if ((ret = strcoll(s1, s2)) != 0)
155 sopno pbegin[NPAREN];
165static void p_ere(
struct parse *p,
int stop);
166static void p_ere_exp(
struct parse *p);
167static void p_str(
struct parse *p);
168static void p_bre(
struct parse *p,
int end1,
int end2);
169static int p_simp_re(
struct parse *p,
int starordinary);
170static int p_count(
struct parse *p);
171static void p_bracket(
struct parse *p);
172static void p_b_term(
struct parse *p,
cset *cs);
173static void p_b_cclass(
struct parse *p,
cset *cs);
174static void p_b_eclass(
struct parse *p,
cset *cs);
175static char p_b_symbol(
struct parse *p);
176static char p_b_coll_elem(
struct parse *p,
int endc);
177static char othercase(
int ch);
178static void bothcases(
struct parse *p,
int ch);
179static void ordinary(
struct parse *p,
int ch);
180static void nonnewline(
struct parse *p);
181static void repeat(
struct parse *p, sopno start,
int from,
int to);
182static int seterr(
struct parse *p,
int e);
184static void freeset(
struct parse *p,
cset *cs);
185static int freezeset(
struct parse *p,
cset *cs);
186static int firstch(
struct parse *p,
cset *cs);
187static int nch(
struct parse *p,
cset *cs);
189static void mcadd(
struct parse *p,
cset *cs,
char *cp);
192static void mcsub(
cset *cs,
char *cp);
193static int mcin(
cset *cs,
char *cp);
194static char *mcfind(
cset *cs,
char *cp);
196static void mcinvert(
struct parse *p,
cset *cs);
197static void mccase(
struct parse *p,
cset *cs);
198static int isinsets(
struct re_guts *g,
int c);
199static int samesets(
struct re_guts *g,
int c1,
int c2);
200static void categorize(
struct parse *p,
struct re_guts *g);
201static sopno dupl(
struct parse *p, sopno start, sopno finish);
202static void doemit(
struct parse *p, sop op,
size_t opnd);
203static void doinsert(
struct parse *p, sop op,
size_t opnd, sopno pos);
204static void dofwd(
struct parse *p, sopno pos, sop value);
205static void enlarge(
struct parse *p, sopno size);
206static void stripsnug(
struct parse *p,
struct re_guts *g);
207static void findmust(
struct parse *p,
struct re_guts *g);
208static sopno pluscount(
struct parse *p,
struct re_guts *g);
221#define PEEK() (*p->next)
222#define PEEK2() (*(p->next + 1))
223#define MORE() (p->next < p->end)
224#define MORE2() (p->next + 1 < p->end)
225#define SEE(c) (MORE() && PEEK() == (c))
226#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
227#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
228#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
229#define NEXT() (p->next++)
230#define NEXT2() (p->next += 2)
231#define NEXTn(n) (p->next += (n))
232#define GETNEXT() (*p->next++)
233#define SETERROR(e) seterr(p, (e))
234#define REQUIRE(co, e) ((co) || SETERROR(e))
235#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
236#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
237#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
238#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
239#define INSERT(op, pos) doinsert(p, (sop)(op), HERE() - (pos) + 1, pos)
240#define AHEAD(pos) dofwd(p, pos, HERE() - (pos))
241#define ASTERN(sop, pos) EMIT(sop, HERE() - pos)
242#define HERE() (p->slen)
243#define THERE() (p->slen - 1)
244#define THERETHERE() (p->slen - 2)
245#define DROP(n) (p->slen -= (n))
266 yap_regcomp(preg, pattern, cflags)
regex_t *preg;
272 register struct parse *p = &pa;
276#define GOODFLAGS(f) (f)
278#define GOODFLAGS(f) ((f) & ~REG_DUMP)
281 cflags = GOODFLAGS(cflags);
282 if ((cflags & REG_EXTENDED) && (cflags & REG_NOSPEC))
285 if (cflags & REG_PEND) {
286 if (preg->re_endp < pattern)
288 len = preg->re_endp - pattern;
290 len = strlen((
char *)pattern);
294 (NC - 1) *
sizeof(cat_t));
297 p->ssize = len / (size_t)2 * (
size_t)3 + (size_t)1;
298 p->strip = (sop *)malloc(p->ssize *
sizeof(sop));
300 if (p->strip == NULL) {
307 p->next = (
char *)pattern;
308 p->end = p->next + len;
311 for (i = 0; i < NPAREN; i++) {
327 g->categories = &g->catspace[-(CHAR_MIN)];
328 (void)memset((
char *)g->catspace, 0, NC *
sizeof(cat_t));
333 g->firststate = THERE();
334 if (cflags & REG_EXTENDED)
336 else if (cflags & REG_NOSPEC)
341 g->laststate = THERE();
347 g->nplus = pluscount(p, g);
349 preg->re_nsub = g->nsub;
351 preg->re_magic = MAGIC1;
355 SETERROR(REG_ASSERT);
368static void p_ere(p, stop)
register struct parse *p;
372 register sopno prevback = 0;
373 register sopno prevfwd = 0;
375 register int first = 1;
380 while (MORE() && (c = PEEK()) !=
'|' && c != stop)
382 (void)REQUIRE(HERE() != conc, REG_EMPTY);
393 ASTERN(OOR1, prevback);
402 ASTERN(O_CH, prevback);
405 assert(!MORE() || SEE(stop));
412static void p_ere_exp(p)
register struct parse *p;
418 register sopno subno;
427 (void)REQUIRE(MORE(), REG_EPAREN);
431 p->pbegin[subno] = HERE();
432 EMIT(OLPAREN, subno);
435 if (subno < NPAREN) {
436 p->pend[subno] = HERE();
437 assert(p->pend[subno] != 0);
439 EMIT(ORPAREN, subno);
440 (void)MUSTEAT(
')', REG_EPAREN);
451 SETERROR(REG_EPAREN);
456 p->g->iflags |= USEBOL;
462 p->g->iflags |= USEEOL;
471 SETERROR(REG_BADRPT);
474 if (p->g->cflags & REG_NEWLINE)
483 (void)REQUIRE(MORE(), REG_EESCAPE);
488 (void)REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT);
499 if (!(c ==
'*' || c ==
'+' || c ==
'?' ||
500 (c ==
'{' && MORE2() && isdigit((uch)PEEK2()))))
504 (void)REQUIRE(!wascaret, REG_BADRPT);
510 INSERT(OQUEST_, pos);
511 ASTERN(O_QUEST, pos);
524 ASTERN(O_CH, THERETHERE());
529 if (isdigit((uch)PEEK())) {
531 (void)REQUIRE(count <= count2, REG_BADBR);
536 repeat(p, pos, count, count2);
538 while (MORE() && PEEK() !=
'}')
540 (void)REQUIRE(MORE(), REG_EBRACE);
549 if (!(c ==
'*' || c ==
'+' || c ==
'?' ||
550 (c ==
'{' && MORE2() && isdigit((uch)PEEK2()))))
552 SETERROR(REG_BADRPT);
559static void p_str(p)
register struct parse *p;
561 (void)REQUIRE(MORE(), REG_EMPTY);
563 ordinary(p, GETNEXT());
578static void p_bre(p, end1, end2)
register struct parse *p;
582 register sopno start = HERE();
583 register int first = 1;
584 register int wasdollar = 0;
588 p->g->iflags |= USEBOL;
591 while (MORE() && !SEETWO(end1, end2)) {
592 wasdollar = p_simp_re(p, first);
598 p->g->iflags |= USEEOL;
602 (void)REQUIRE(HERE() != start, REG_EMPTY);
610 p_simp_re(p, starordinary)
register struct parse *p;
618 register sopno subno;
619#define BACKSL (1 << CHAR_BIT)
626 (void)REQUIRE(MORE(), REG_EESCAPE);
627 c = BACKSL | GETNEXT();
631 if (p->g->cflags & REG_NEWLINE)
640 SETERROR(REG_BADRPT);
646 p->pbegin[subno] = HERE();
647 EMIT(OLPAREN, subno);
649 if (MORE() && !SEETWO(
'\\',
')'))
651 if (subno < NPAREN) {
652 p->pend[subno] = HERE();
653 assert(p->pend[subno] != 0);
655 EMIT(ORPAREN, subno);
656 (void)REQUIRE(EATTWO(
'\\',
')'), REG_EPAREN);
660 SETERROR(REG_EPAREN);
671 i = (c & ~BACKSL) -
'0';
673 if (p->pend[i] != 0) {
674 assert(i <= p->g->nsub);
676 assert(p->pbegin[i] != 0);
677 assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
678 assert(OP(p->strip[p->pend[i]]) == ORPAREN);
679 (void)dupl(p, p->pbegin[i] + 1, p->pend[i]);
682 SETERROR(REG_ESUBREG);
686 (void)REQUIRE(starordinary, REG_BADRPT);
689 ordinary(p, (
char)c);
697 INSERT(OQUEST_, pos);
698 ASTERN(O_QUEST, pos);
699 }
else if (EATTWO(
'\\',
'{')) {
702 if (MORE() && isdigit((uch)PEEK())) {
704 (void)REQUIRE(count <= count2, REG_BADBR);
709 repeat(p, pos, count, count2);
710 if (!EATTWO(
'\\',
'}')) {
711 while (MORE() && !SEETWO(
'\\',
'}'))
713 (void)REQUIRE(MORE(), REG_EBRACE);
727 p_count(p)
register struct parse *p;
729 register int count = 0;
730 register int ndigits = 0;
732 while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) {
733 count = count * 10 + (GETNEXT() -
'0');
737 (void)REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
748static void p_bracket(p)
register struct parse *p;
750 register cset *cs = allocset(p);
751 register int invert = 0;
754 if (p->next + 5 < p->end && strncmp(p->next,
"[:<:]]", 6) == 0) {
759 if (p->next + 5 < p->end && strncmp(p->next,
"[:>:]]", 6) == 0) {
771 while (MORE() && PEEK() !=
']' && !SEETWO(
'-',
']'))
775 (void)MUSTEAT(
']', REG_EBRACK);
780 if (p->g->cflags & REG_ICASE) {
784 for (i = p->g->csetsize - 1; i >= 0; i--)
785 if (CHIN(cs, i) && isalpha(i)) {
790 if (cs->multis != NULL)
796 for (i = p->g->csetsize - 1; i >= 0; i--)
801 if (p->g->cflags & REG_NEWLINE)
803 if (cs->multis != NULL)
807 assert(cs->multis == NULL);
809 if (nch(p, cs) == 1) {
810 ordinary(p, firstch(p, cs));
813 EMIT(OANYOF, freezeset(p, cs));
820static void p_b_term(p, cs)
register struct parse *p;
824 register char start, finish;
828 switch ((MORE()) ? PEEK() :
'\0') {
830 c = (MORE2()) ? PEEK2() :
'\0';
833 SETERROR(REG_ERANGE);
844 (void)REQUIRE(MORE(), REG_EBRACK);
846 (void)REQUIRE(c !=
'-' && c !=
']', REG_ECTYPE);
848 (void)REQUIRE(MORE(), REG_EBRACK);
849 (void)REQUIRE(EATTWO(
':',
']'), REG_ECTYPE);
853 (void)REQUIRE(MORE(), REG_EBRACK);
855 (void)REQUIRE(c !=
'-' && c !=
']', REG_ECOLLATE);
857 (void)REQUIRE(MORE(), REG_EBRACK);
858 (void)REQUIRE(EATTWO(
'=',
']'), REG_ECOLLATE);
862 start = p_b_symbol(p);
863 if (SEE(
'-') && MORE2() && PEEK2() !=
']') {
869 finish = p_b_symbol(p);
875 if (collate_load_error) {
876 (void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE);
877 for (i = (uch)start; i <= (uch)finish; i++)
880 (void)REQUIRE(collate_range_cmp(start, finish) <= 0, REG_ERANGE);
881 for (i = CHAR_MIN; i <= CHAR_MAX; i++) {
882 if (collate_range_cmp(start, i) <= 0 &&
883 collate_range_cmp(i, finish) <= 0)
896static void p_b_cclass(p, cs)
register struct parse *p;
900 register char *sp = p->next;
901 register struct cclass *cp;
904 while (MORE() && isalpha((uch)PEEK()))
907 for (cp = cclasses; cp->name != NULL; cp++)
908 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] ==
'\0')
910 if (cp->name == NULL) {
912 SETERROR(REG_ECTYPE);
918 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
919 if (isalpha((uch)c) || isdigit((uch)c))
923 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
928 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
929 if (((uch)c) ==
' ' || ((uch)c) ==
'\t')
933 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
938 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
943 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
948 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
953 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
958 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
963 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
968 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
973 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
974 if (isxdigit((uch)c))
979 for (u = cp->multis; *u !=
'\0'; u += strlen(u) + 1)
990static void p_b_eclass(p, cs)
register struct parse *p;
995 c = p_b_coll_elem(p,
'=');
1004 p_b_symbol(p)
register struct parse *p;
1006 register char value;
1008 (void)REQUIRE(MORE(), REG_EBRACK);
1009 if (!EATTWO(
'[',
'.'))
1013 value = p_b_coll_elem(p,
'.');
1014 (void)REQUIRE(EATTWO(
'.',
']'), REG_ECOLLATE);
1023 p_b_coll_elem(p, endc)
register struct parse *p;
1026 register char *sp = p->next;
1027 register struct cname *cp;
1030 while (MORE() && !SEETWO(endc,
']'))
1033 SETERROR(REG_EBRACK);
1037 for (cp = cnames; cp->name != NULL; cp++)
1038 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] ==
'\0')
1042 SETERROR(REG_ECOLLATE);
1051 othercase(ch)
int ch;
1054 assert(isalpha(ch));
1056 return (tolower(ch));
1057 else if (islower(ch))
1058 return (toupper(ch));
1069static void bothcases(p, ch)
register struct parse *p;
1072 register char *oldnext = p->next;
1073 register char *oldend = p->end;
1077 assert(othercase(ch) != ch);
1079 p->end = bracket + 2;
1084 assert(p->next == bracket + 2);
1093static void ordinary(p, ch)
register struct parse *p;
1096 register cat_t *cap = p->g->categories;
1098 if ((p->g->cflags & REG_ICASE) && isalpha((uch)ch) && othercase(ch) != ch)
1101 EMIT(OCHAR, (uch)ch);
1103 cap[ch] = p->g->ncategories++;
1113static void nonnewline(p)
register struct parse *p;
1115 register char *oldnext = p->next;
1116 register char *oldend = p->end;
1120 p->end = bracket + 3;
1126 assert(p->next == bracket + 3);
1135static void repeat(p, start, from, to)
register struct parse *p;
1140 register sopno finish = HERE();
1143#define REP(f, t) ((f)*8 + (t))
1144#define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
1145 register sopno copy;
1152 switch (REP(MAP(from), MAP(to))) {
1154 DROP(finish - start);
1160 INSERT(OCH_, start);
1161 repeat(p, start + 1, 1, to);
1162 ASTERN(OOR1, start);
1166 ASTERN(O_CH, THERETHERE());
1173 INSERT(OCH_, start);
1174 ASTERN(OOR1, start);
1178 ASTERN(O_CH, THERETHERE());
1179 copy = dupl(p, start + 1, finish + 1);
1180 assert(copy == finish + 4);
1181 repeat(p, copy, 1, to - 1);
1184 INSERT(OPLUS_, start);
1185 ASTERN(O_PLUS, start);
1188 copy = dupl(p, start, finish);
1189 repeat(p, copy, from - 1, to - 1);
1192 copy = dupl(p, start, finish);
1193 repeat(p, copy, from - 1, to);
1196 SETERROR(REG_ASSERT);
1206 seterr(p, e)
register struct parse *p;
1220static cset *allocset(p)
register struct parse *p;
1222 register int no = p->g->ncsets++;
1224 register size_t nbytes;
1226 register size_t css = (size_t)p->g->csetsize;
1229 if (no >= p->ncsalloc) {
1230 p->ncsalloc += CHAR_BIT;
1232 assert(nc % CHAR_BIT == 0);
1233 nbytes = nc / CHAR_BIT * css;
1234 if (p->g->sets == NULL)
1235 p->g->sets = (
cset *)malloc(nc *
sizeof(
cset));
1237 p->g->sets = (
cset *)realloc((
char *)p->g->sets, nc *
sizeof(
cset));
1238 if (p->g->setbits == NULL)
1239 p->g->setbits = (uch *)malloc(nbytes);
1241 p->g->setbits = (uch *)realloc((
char *)p->g->setbits, nbytes);
1243 for (i = 0; i < no; i++)
1244 p->g->sets[i].ptr = p->g->setbits + css * (i / CHAR_BIT);
1246 if (p->g->sets != NULL && p->g->setbits != NULL)
1247 (void)memset((
char *)p->g->setbits + (nbytes - css), 0, css);
1250 SETERROR(REG_ESPACE);
1255 assert(p->g->sets != NULL);
1256 cs = &p->g->sets[no];
1257 cs->ptr = p->g->setbits + css * ((no) / CHAR_BIT);
1258 cs->mask = 1 << ((no) % CHAR_BIT);
1270static void freeset(p, cs)
register struct parse *p;
1274 register cset *top = &p->g->sets[p->g->ncsets];
1275 register size_t css = (size_t)p->g->csetsize;
1277 for (i = 0; i < css; i++)
1294 freezeset(p, cs)
register struct parse *p;
1297 register short h = cs->hash;
1299 register cset *top = &p->g->sets[p->g->ncsets];
1301 register size_t css = (size_t)p->g->csetsize;
1304 for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
1305 if (cs2->hash == h && cs2 != cs) {
1307 for (i = 0; i < css; i++)
1308 if (!!CHIN(cs2, i) != !!CHIN(cs, i))
1319 return ((
int)(cs - p->g->sets));
1327 firstch(p, cs)
register struct parse *p;
1331 register size_t css = (size_t)p->g->csetsize;
1333 for (i = 0; i < css; i++)
1344static int nch(p, cs)
register struct parse *p;
1348 register size_t css = (size_t)p->g->csetsize;
1351 for (i = 0; i < css; i++)
1365register struct parse *p;
1369 register size_t oldend = cs->smultis;
1371 cs->smultis += strlen(cp) + 1;
1372 if (cs->multis == NULL)
1373 cs->multis = malloc(cs->smultis);
1375 cs->multis = realloc(cs->multis, cs->smultis);
1376 if (cs->multis == NULL) {
1377 SETERROR(REG_ESPACE);
1381 (void) strcpy(cs->multis + oldend - 1, cp);
1382 cs->multis[cs->smultis - 1] =
'\0';
1391static void mcsub(cs, cp)
register cset *cs;
1394 register char *fp = mcfind(cs, cp);
1395 register size_t len = strlen(fp);
1398 (void)memmove(fp, fp + len + 1, cs->smultis - (fp + len + 1 - cs->multis));
1401 if (cs->smultis == 0) {
1407 cs->multis = realloc(cs->multis, cs->smultis);
1408 assert(cs->multis != NULL);
1415static int mcin(cs, cp)
register cset *cs;
1417{
return (mcfind(cs, cp) != NULL); }
1423static char *mcfind(cs, cp)
register cset *cs;
1428 if (cs->multis == NULL)
1430 for (p = cs->multis; *p !=
'\0'; p += strlen(p) + 1)
1431 if (strcmp(cp, p) == 0)
1444static void mcinvert(p, cs)
register struct parse *p;
1446{ assert(cs->multis == NULL); }
1455static void mccase(p, cs)
register struct parse *p;
1457{ assert(cs->multis == NULL); }
1464 isinsets(g, c)
register struct re_guts *g;
1469 register int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
1470 register unsigned uc = (uch)c;
1472 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
1483 samesets(g, c1, c2)
register struct re_guts *g;
1489 register int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
1490 register unsigned uc1 = (uch)c1;
1491 register unsigned uc2 = (uch)c2;
1493 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
1494 if (col[uc1] != col[uc2])
1503static void categorize(p, g)
struct parse *p;
1506 register cat_t *cats = g->categories;
1515 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
1516 if (cats[c] == 0 && isinsets(g, c)) {
1517 cat = g->ncategories++;
1519 for (c2 = c + 1; c2 <= CHAR_MAX; c2++)
1520 if (cats[c2] == 0 && samesets(g, c, c2))
1530 dupl(p, start, finish)
register struct parse *p;
1534 register sopno ret = HERE();
1535 register sopno len = finish - start;
1537 assert(finish >= start);
1540 enlarge(p, p->ssize + len);
1541 assert(p->ssize >= p->slen + len);
1542 (void)memmove((
char *)(p->strip + p->slen), (
char *)(p->strip + start),
1543 (
size_t)len *
sizeof(sop));
1556static void doemit(p, op, opnd)
register struct parse *p;
1565 assert(opnd < 1 << OPSHIFT);
1568 if (p->slen >= p->ssize)
1569 enlarge(p, (p->ssize + 1) / 2 * 3);
1570 assert(p->slen < p->ssize);
1573 p->strip[p->slen++] = SOP(op, opnd);
1581static void doinsert(p, op, opnd, pos)
register struct parse *p;
1596 assert(HERE() == sn + 1);
1601 for (i = 1; i < NPAREN; i++) {
1602 if (p->pbegin[i] >= pos) {
1605 if (p->pend[i] >= pos) {
1610 memmove((
char *)&p->strip[pos + 1], (
char *)&p->strip[pos],
1611 (HERE() - pos - 1) *
sizeof(sop));
1619static void dofwd(p, pos, value)
register struct parse *p;
1627 assert(value < 1 << OPSHIFT);
1628 p->strip[pos] = OP(p->strip[pos]) | value;
1635static void enlarge(p, size)
register struct parse *p;
1640 if (p->ssize >= size)
1643 sp = (sop *)realloc(p->strip, size *
sizeof(sop));
1645 SETERROR(REG_ESPACE);
1656static void stripsnug(p, g)
register struct parse *p;
1659 g->nstates = p->slen;
1660 g->strip = (sop *)realloc((
char *)p->strip, p->slen *
sizeof(sop));
1661 if (g->strip == NULL) {
1662 SETERROR(REG_ESPACE);
1663 g->strip = p->strip;
1677static void findmust(p, g)
struct parse *p;
1682 register sop *newstart = NULL;
1683 register sopno newlen;
1694 scan = g->strip + 1;
1700 newstart = scan - 1;
1714 if (OP(s) != O_QUEST && OP(s) != O_CH && OP(s) != OOR2) {
1718 }
while (OP(s) != O_QUEST && OP(s) != O_CH);
1721 if (newlen > g->mlen) {
1728 }
while (OP(s) != OEND);
1734 g->must = malloc((
size_t)g->mlen + 1);
1735 if (g->must == NULL) {
1741 for (i = g->mlen; i > 0; i--) {
1742 while (OP(s = *scan++) != OCHAR)
1744 assert(cp < g->must + g->mlen);
1745 *cp++ = (char)OPND(s);
1747 assert(cp == g->must + g->mlen);
1757 pluscount(p, g)
struct parse *p;
1762 register sopno plusnest = 0;
1763 register sopno maxnest = 0;
1768 scan = g->strip + 1;
1776 if (plusnest > maxnest)
1781 }
while (OP(s) != OEND);
Regexp character classes.