161 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* 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
 |