version 1.2, 2001/01/29 01:58:04 |
version 1.3, 2001/11/19 19:02:14 |
|
|
regcomp(exp) |
regcomp(exp) |
char *exp; |
char *exp; |
{ |
{ |
register regexp *r; |
regexp *r; |
register char *scan; |
char *scan; |
register char *longest; |
char *longest; |
register int len; |
int len; |
int flags; |
int flags; |
|
|
if (exp == NULL) |
if (exp == NULL) |
|
|
int paren; /* Parenthesized? */ |
int paren; /* Parenthesized? */ |
int *flagp; |
int *flagp; |
{ |
{ |
register char *ret; |
char *ret; |
register char *br; |
char *br; |
register char *ender; |
char *ender; |
register int parno = 0; |
int parno = 0; |
int flags; |
int flags; |
|
|
*flagp = HASWIDTH; /* Tentatively. */ |
*flagp = HASWIDTH; /* Tentatively. */ |
|
|
regbranch(flagp) |
regbranch(flagp) |
int *flagp; |
int *flagp; |
{ |
{ |
register char *ret; |
char *ret; |
register char *chain; |
char *chain; |
register char *latest; |
char *latest; |
int flags; |
int flags; |
|
|
*flagp = WORST; /* Tentatively. */ |
*flagp = WORST; /* Tentatively. */ |
|
|
regpiece(flagp) |
regpiece(flagp) |
int *flagp; |
int *flagp; |
{ |
{ |
register char *ret; |
char *ret; |
register char op; |
char op; |
register char *next; |
char *next; |
int flags; |
int flags; |
|
|
ret = regatom(&flags); |
ret = regatom(&flags); |
|
|
regatom(flagp) |
regatom(flagp) |
int *flagp; |
int *flagp; |
{ |
{ |
register char *ret; |
char *ret; |
int flags; |
int flags; |
|
|
*flagp = WORST; /* Tentatively. */ |
*flagp = WORST; /* Tentatively. */ |
|
|
*flagp |= HASWIDTH|SIMPLE; |
*flagp |= HASWIDTH|SIMPLE; |
break; |
break; |
case '[': { |
case '[': { |
register int clss; |
int clss; |
register int classend; |
int classend; |
|
|
if (*regparse == '^') { /* Complement of range. */ |
if (*regparse == '^') { /* Complement of range. */ |
ret = regnode(ANYBUT); |
ret = regnode(ANYBUT); |
|
|
*flagp |= HASWIDTH|SIMPLE; |
*flagp |= HASWIDTH|SIMPLE; |
break; |
break; |
default: { |
default: { |
register int len; |
int len; |
register char ender; |
char ender; |
|
|
regparse--; |
regparse--; |
len = strcspn(regparse, META); |
len = strcspn(regparse, META); |
|
|
regnode(op) |
regnode(op) |
char op; |
char op; |
{ |
{ |
register char *ret; |
char *ret; |
register char *ptr; |
char *ptr; |
|
|
ret = regcode; |
ret = regcode; |
if (ret == ®dummy) { |
if (ret == ®dummy) { |
|
|
char op; |
char op; |
char *opnd; |
char *opnd; |
{ |
{ |
register char *src; |
char *src; |
register char *dst; |
char *dst; |
register char *place; |
char *place; |
|
|
if (regcode == ®dummy) { |
if (regcode == ®dummy) { |
regsize += 3; |
regsize += 3; |
|
|
char *p; |
char *p; |
char *val; |
char *val; |
{ |
{ |
register char *scan; |
char *scan; |
register char *temp; |
char *temp; |
register int offset; |
int offset; |
|
|
if (p == ®dummy) |
if (p == ®dummy) |
return; |
return; |
|
|
*/ |
*/ |
int |
int |
regexec(prog, string) |
regexec(prog, string) |
register regexp *prog; |
regexp *prog; |
register char *string; |
char *string; |
{ |
{ |
register char *s; |
char *s; |
|
|
/* Be paranoid... */ |
/* Be paranoid... */ |
if (prog == NULL || string == NULL) { |
if (prog == NULL || string == NULL) { |
|
|
regexp *prog; |
regexp *prog; |
char *string; |
char *string; |
{ |
{ |
register int i; |
int i; |
register char **sp; |
char **sp; |
register char **ep; |
char **ep; |
|
|
reginput = string; |
reginput = string; |
regstartp = prog->startp; |
regstartp = prog->startp; |
|
|
regmatch(prog) |
regmatch(prog) |
char *prog; |
char *prog; |
{ |
{ |
register char *scan; /* Current node. */ |
char *scan; /* Current node. */ |
char *next; /* Next node. */ |
char *next; /* Next node. */ |
|
|
scan = prog; |
scan = prog; |
|
|
reginput++; |
reginput++; |
break; |
break; |
case EXACTLY: { |
case EXACTLY: { |
register int len; |
int len; |
register char *opnd; |
char *opnd; |
|
|
opnd = OPERAND(scan); |
opnd = OPERAND(scan); |
/* Inline the first character, for speed. */ |
/* Inline the first character, for speed. */ |
|
|
case OPEN+7: |
case OPEN+7: |
case OPEN+8: |
case OPEN+8: |
case OPEN+9: { |
case OPEN+9: { |
register int no; |
int no; |
register char *save; |
char *save; |
|
|
no = OP(scan) - OPEN; |
no = OP(scan) - OPEN; |
save = reginput; |
save = reginput; |
|
|
case CLOSE+7: |
case CLOSE+7: |
case CLOSE+8: |
case CLOSE+8: |
case CLOSE+9: { |
case CLOSE+9: { |
register int no; |
int no; |
register char *save; |
char *save; |
|
|
no = OP(scan) - CLOSE; |
no = OP(scan) - CLOSE; |
save = reginput; |
save = reginput; |
|
|
/* NOTREACHED */ |
/* NOTREACHED */ |
break; |
break; |
case BRANCH: { |
case BRANCH: { |
register char *save; |
char *save; |
|
|
if (OP(next) != BRANCH) /* No choice. */ |
if (OP(next) != BRANCH) /* No choice. */ |
next = OPERAND(scan); /* Avoid recursion. */ |
next = OPERAND(scan); /* Avoid recursion. */ |
|
|
break; |
break; |
case STAR: |
case STAR: |
case PLUS: { |
case PLUS: { |
register char nextch; |
char nextch; |
register int no; |
int no; |
register char *save; |
char *save; |
register int min; |
int min; |
|
|
/* |
/* |
* Lookahead to avoid useless match attempts |
* Lookahead to avoid useless match attempts |
|
|
regrepeat(p) |
regrepeat(p) |
char *p; |
char *p; |
{ |
{ |
register int count = 0; |
int count = 0; |
register char *scan; |
char *scan; |
register char *opnd; |
char *opnd; |
|
|
scan = reginput; |
scan = reginput; |
opnd = OPERAND(p); |
opnd = OPERAND(p); |
|
|
*/ |
*/ |
static char * |
static char * |
regnext(p) |
regnext(p) |
register char *p; |
char *p; |
{ |
{ |
register int offset; |
int offset; |
|
|
if (p == ®dummy) |
if (p == ®dummy) |
return(NULL); |
return(NULL); |
|
|
regdump(r) |
regdump(r) |
regexp *r; |
regexp *r; |
{ |
{ |
register char *s; |
char *s; |
register char op = EXACTLY; /* Arbitrary non-END op. */ |
char op = EXACTLY; /* Arbitrary non-END op. */ |
register char *next; |
char *next; |
|
|
|
|
s = r->program + 1; |
s = r->program + 1; |
|
|
regprop(op) |
regprop(op) |
char *op; |
char *op; |
{ |
{ |
register char *p; |
char *p; |
static char buf[50]; |
static char buf[50]; |
|
|
(void) strcpy(buf, ":"); |
(void) strcpy(buf, ":"); |
|
|
char *s1; |
char *s1; |
char *s2; |
char *s2; |
{ |
{ |
register char *scan1; |
char *scan1; |
register char *scan2; |
char *scan2; |
register int count; |
int count; |
|
|
count = 0; |
count = 0; |
for (scan1 = s1; *scan1 != '\0'; scan1++) { |
for (scan1 = s1; *scan1 != '\0'; scan1++) { |