--- regexp.c.orig Thu Feb 24 09:55:47 1994 +++ regexp.c Sun Jan 5 12:25:10 1997 @@ -17,22 +17,14 @@ /* without prior permission from Harris Corporation. */ /************************************************************************/ +#include #include #include #include "manifest.h" #include "contool.h" -PRIVATE regexp_error(); - -#define INIT register char *expbuf = ep, *sp = instring; -#define GETC() (*sp++) -#define PEEKC() (*sp) -#define UNGETC(c) (--sp) -#define RETURN(p) {memcpy(sp = (char *) malloc(p - expbuf), expbuf, p - expbuf); return(sp);} -#define ERROR(val) {regexp_error(val, instring); return(NULL);} - -#include +#include PRIVATE char error_message[512]; @@ -49,37 +41,10 @@ p = str + strlen(str) - 1; if (p >= str && *p == '\n') *p = '\0'; - circf = circ; - result = step(str, exp); + result = regexec((regex_t*)exp, str, 0, NULL, 0); if (p >= str && *p == '\0') *p = '\n'; - return(result); -} - -/************************************************************************/ -PRIVATE regexp_error(val, string) - -int val; -char *string; - -{ char *msg; - - switch (val) { - case 11 : msg = "range endpoint too large"; - case 16 : msg = "bad number"; - case 25 : msg = "\"\\digit\" out of range"; - case 36 : msg = "illegal or missing delimiter"; - case 41 : msg = "no remembered search string"; - case 42 : msg = "\\(\\) imbalance"; - case 43 : msg = "too many \\("; - case 44 : msg = "more than 2 numbers given in \\{\\}"; - case 45 : msg = "} expected after \\"; - case 46 : msg = "first number exceeds second in \\{\\}"; - case 49 : msg = "[] imbalance"; - case 50 : msg = "regular expression overflow"; - default : msg = "regular expression error"; - } - sprintf(error_message, "%s in %s", msg, string); + return(!result); } /************************************************************************/ @@ -109,34 +74,40 @@ char *start; char *stop; -{ char rbuf[1024], *sre, *ere; - int sc, ec; +{ - sre = ere = NULL; + int errcod; + regex_t *sre, *ere; + + sre = (regex_t*) malloc(sizeof(regex_t)); + ere = (regex_t*) malloc(sizeof(regex_t)); if (start) { - if ((sre = compile(fix_control_chars(start), rbuf, rbuf+1024, '\0')) == NULL) + if (errcod = regcomp(sre, fix_control_chars(start), REG_NOSUB)) { + regerror(errcod, sre, error_message, 512); + strcat(error_message, " in "); + strcat(error_message,fix_control_chars(start)); return(error_message); - sc = circf; + } } if (stop) { - if ((ere = compile(fix_control_chars(stop), rbuf, rbuf+1024, '\0')) == NULL) { - cond_free(sre); + if (errcod = regcomp(ere, fix_control_chars(stop), REG_NOSUB)) { + regerror(errcod, ere, error_message, 512); + strcat(error_message," in "); + strcat(error_message,fix_control_chars(stop)); return(error_message); } - ec = circf; } if (filter) { filter->start = start; filter->stop = stop; - filter->start_re = sre; - filter->stop_re = ere; - filter->start_circf = sc; - filter->stop_circf = ec; + filter->start_re = (char *) sre; + filter->stop_re = (char *) ere; } else { + regfree(sre); + regfree(ere); cond_free(sre); - if (ere) - cond_free(ere); + cond_free(ere); } return(NULL); }