/* Scheme48 interface to Henry Spencer's regular expression package. ** Copyright (c) 1993, 1994 by Olin Shivers. */ #include #include "regexp.h" #include "cstuff.h" /* Make sure our exports match up w/the implementation: */ #include "re1.h" #ifndef NULL #define NULL 0 #endif /* Not multi-threaded reentrant. */ static char *regexp_error; /* Stash error msg in global. */ void regerror(char *msg) {regexp_error = msg;} /* Return NULL normally, error string on error. ** Stash match info in start_vec and end_vec. ** Returns boolean match/no-match in hit. */ char *reg_match(const char *re, const char *string, int start, scheme_value start_vec, scheme_value end_vec, int *hit) { regexp *prog; regexp_error = 0; *hit = 0; prog = regcomp(re); if( !prog ) return regexp_error; if( VECTOR_LENGTH(start_vec) != NSUBEXP ) { Free(prog); return "Illegal start vector"; } if( VECTOR_LENGTH(end_vec) != NSUBEXP ) { Free(prog); return "Illegal end vector"; } if( regexec(prog, string+start) ) { int i; for(i=0; istartp[i] - string); VECTOR_REF(end_vec,i) = ENTER_FIXNUM(prog->endp[i] - string); } *hit = 1; } Free(prog); return regexp_error; } char *filter_stringvec(const char *re, char const **stringvec, int *nummatch) { regexp *prog; regexp_error = 0; if( prog=regcomp(re) ) { char const **p = stringvec; char const **q = p; while(*p) { if( regexec(prog, *p) ) *q++ = *p; p++; } Free(prog); *nummatch = q-stringvec; } return regexp_error; }