80 lines
1.6 KiB
C
80 lines
1.6 KiB
C
/* Scheme48 interface to Henry Spencer's regular expression package.
|
|
** Copyright (c) 1993, 1994 by Olin Shivers.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#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; i<NSUBEXP; i++) {
|
|
VECTOR_REF(start_vec,i) = ENTER_FIXNUM(prog->startp[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;
|
|
}
|