161 lines
2.6 KiB
C
161 lines
2.6 KiB
C
|
/* Copyright (c) 1985 Ceriel J.H. Jacobs */
|
||
|
|
||
|
# ifndef lint
|
||
|
static char rcsid[] = "$Header$";
|
||
|
# endif not lint
|
||
|
|
||
|
# define _PATTERN_
|
||
|
|
||
|
# include "in_all.h"
|
||
|
# include "pattern.h"
|
||
|
# include "getline.h"
|
||
|
|
||
|
# if V8_REGEX
|
||
|
# include <regexp.h>
|
||
|
# endif V8_REGEX
|
||
|
|
||
|
/*
|
||
|
* Interface to regular expression routines.
|
||
|
* Also: simple minded patterns without meta-characters.
|
||
|
*/
|
||
|
|
||
|
# if USG_REGEX
|
||
|
static char *pattern; /* Pointer to compiled pattern */
|
||
|
char *regcmp(), *regex();
|
||
|
# endif USG_REGEX
|
||
|
# if V8_REGEX
|
||
|
static struct regexp *pattern;
|
||
|
static char *rc_error;
|
||
|
struct regexp *regcomp();
|
||
|
# endif V8_REGEX
|
||
|
|
||
|
# if USG_REGEX || V8_REGEX
|
||
|
/*
|
||
|
* Compile a new pattern, but first free previous result.
|
||
|
*/
|
||
|
|
||
|
char *
|
||
|
re_comp(s) char *s; {
|
||
|
|
||
|
if (!*s) {
|
||
|
/*
|
||
|
* user wants previous pattern
|
||
|
*/
|
||
|
return (char *) 0;
|
||
|
}
|
||
|
if (pattern) {
|
||
|
/*
|
||
|
* there was a compiled pattern
|
||
|
*/
|
||
|
free(pattern);
|
||
|
pattern = 0;
|
||
|
}
|
||
|
# if USG_REGEX
|
||
|
return (pattern = regcmp(s, (char *) 0)) ?
|
||
|
(char *) 0 :
|
||
|
"Error in pattern";
|
||
|
# endif USG_REGEX
|
||
|
# if V8_REGEX
|
||
|
pattern = regcomp(s);
|
||
|
if (pattern) return (char *) 0;
|
||
|
if (rc_error) return rc_error;
|
||
|
return "Error in pattern";
|
||
|
# endif V8_REGEX
|
||
|
}
|
||
|
|
||
|
# if V8_REGEX
|
||
|
VOID
|
||
|
regerror(str) char *str; {
|
||
|
rc_error = str;
|
||
|
}
|
||
|
# endif V8_REGEX
|
||
|
|
||
|
/*
|
||
|
* Search for compiled pattern in string "s". Return 0 if not found.
|
||
|
*/
|
||
|
|
||
|
re_exec(s) char *s; {
|
||
|
|
||
|
# if USG_REGEX
|
||
|
return !(regex(pattern,s) == 0);
|
||
|
# endif USG_REGEX
|
||
|
# if V8_REGEX
|
||
|
# if _MINIX
|
||
|
return regexec(pattern,s,1);
|
||
|
# else
|
||
|
return regexec(pattern,s);
|
||
|
# endif
|
||
|
# endif V8_REGEX
|
||
|
}
|
||
|
# else
|
||
|
# ifndef BSD_REGEX
|
||
|
/*
|
||
|
* In this case, simple minded pattern search without meta-characters
|
||
|
*/
|
||
|
|
||
|
char *strcpy();
|
||
|
|
||
|
static char *pattern;
|
||
|
|
||
|
/*
|
||
|
* re_comp : Just remember pattern.
|
||
|
*/
|
||
|
|
||
|
char *
|
||
|
re_comp(s) char *s; {
|
||
|
|
||
|
if (!*s) {
|
||
|
/*
|
||
|
* User wants previous pattern
|
||
|
*/
|
||
|
if (!pattern) {
|
||
|
return "No previous regular expression";
|
||
|
}
|
||
|
return (char *) 0;
|
||
|
}
|
||
|
if (pattern) {
|
||
|
/*
|
||
|
* Free old pattern
|
||
|
*/
|
||
|
free(pattern);
|
||
|
}
|
||
|
pattern = alloc((unsigned) (strlen(s) + 1), 0);
|
||
|
(VOID) strcpy(pattern,s);
|
||
|
return (char *) 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* re-exec : Simple minded pattern matcher
|
||
|
*/
|
||
|
|
||
|
re_exec(s) register char *s; {
|
||
|
|
||
|
register char *ppat, *pstr;
|
||
|
|
||
|
for (; *s; s++) {
|
||
|
/*
|
||
|
* As long as there are characters ...
|
||
|
*/
|
||
|
ppat = pattern; /* Try the pattern again */
|
||
|
pstr = s;
|
||
|
while (*ppat == *pstr) {
|
||
|
if (*++ppat == '\0') {
|
||
|
/*
|
||
|
* The pattern matched! Report success
|
||
|
*/
|
||
|
return 1;
|
||
|
}
|
||
|
if (*++pstr == '\0') {
|
||
|
/*
|
||
|
* Not enough characters left in the string.
|
||
|
* Report failure
|
||
|
*/
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return 0; /* Failure */
|
||
|
}
|
||
|
# endif not BSD_REGEX
|
||
|
# endif
|