CELL * bi_match(CELL * sp) { char *p; size_t length; if (sp->type != C_RE) cast_to_RE(sp); if ((--sp)->type < C_STRING) cast1_to_s(sp); cell_destroy(RSTART); cell_destroy(RLENGTH); RSTART->type = C_DOUBLE; RLENGTH->type = C_DOUBLE; p = REmatch(string(sp)->str, string(sp)->len, cast_to_re((sp + 1)->ptr), &length); if (p) { sp->dval = (double) (p - string(sp)->str + 1); RLENGTH->dval = (double) length; } else { sp->dval = 0.0; RLENGTH->dval = -1.0; /* posix */ } free_STRING(string(sp)); sp->type = C_DOUBLE; RSTART->dval = sp->dval; return sp; }
PROC findback(char *pattern, int start, int endp) /* look for a regular expression backwards */ { int ep,i, j; while (start > endp) { ep = bseekeol(start); if ((j = REmatch(pattern, ep, start)) <= start) { i = j; while((j=REmatch(pattern, i+1, start)) <= start) { i = j; } return i; } start = ep-1; } return ERR; }
PROC findfwd(char *pattern, int start, int endp) /* look for a regular expression forward */ { int ep; while (start < endp) { ep = fseekeol(start); if ((start = REmatch(pattern, start, ep)) <= ep) return start; } return ERR; }