This is RegEx.m in view mode; [Download] [Up]
/*
* Filename: RegEx.m
* Created : Tue Dec 3 14:26:29 1996
* Author : Vince DeMarco
* LastEditDate Was "Wed Jan 22 12:14:30 1997"
*/
#import "RegEx.h"
#import <Foundation/Foundation.h>
#import <strings.h>
@implementation RegEx
+ (void)initialize
{
if (self == [RegEx class]) {
[self setVersion:100];
}
}
/* NSCoding Protocol */
- (void)encodeWithCoder:(NSCoder *)coder
{
BOOL ignoreCase = [self ignoreCase];
/* Do not call super. NSObject does not conform to NSCoding. */
/* [super encodeWithCoder:coder]; */
[coder encodeObject:_pattern];
[coder encodeValueOfObjCType:"C" at:&ignoreCase];
}
- (id)initWithCoder:(NSCoder *)coder
{
/* Do not call super. NSObject does not conform to NSCoding. */
/* self = [super initWithCoder:coder]; */
_pattern = [[coder decodeObject] retain];
[coder decodeValueOfObjCType:"C" at:&_ignoreCase];
if (_ignoreCase){
regcomp(&_regex,[_pattern cString],REG_EXTENDED|REG_ICASE);
}else{
regcomp(&_regex,[_pattern cString],REG_EXTENDED);
}
return self;
}
/* NSCopying Protocol */
- (id)copyWithZone:(NSZone *)zone
{
return [[[self class] allocWithZone:zone]
initWithPattern:[self pattern]
ignoreCase:[self ignoreCase]];
}
/* Rest of class */
+ (BOOL)validRegexPattern:(NSString *)pattern
{
regex_t regex;
if (regcomp(®ex,[pattern cString],REG_EXTENDED) != 0){
return NO;
}
regfree(®ex);
return YES;
}
+ (id)regexWithPattern:(NSString *)pattern
{
return [[self class] regexWithPattern:pattern ignoreCase:NO];
}
+ (id)regexWithPattern:(NSString *)pattern ignoreCase:(BOOL)flag
{
return [[[self class] alloc] initWithPattern:pattern ignoreCase:flag];
}
- (void)dealloc
{
[_pattern release];
regfree(&_regex);
[super dealloc];
}
- initWithPattern:(NSString *)pattern ignoreCase:(BOOL)flag
{
int ret;
[super init];
_pattern = [pattern retain];
_ignoreCase = flag;
if (flag){
ret = regcomp(&_regex,[_pattern cString],REG_EXTENDED|REG_ICASE);
}else{
ret = regcomp(&_regex,[_pattern cString],REG_EXTENDED);
}
if (ret != 0){
char *errbuf;
size_t length;
length = regerror(ret,&_regex,NULL,0);
/* errbuff leaks here so */
errbuf = NSZoneMalloc([self zone],sizeof(char)*length);
(void)regerror(ret,&_regex, errbuf, length);
[NSException raise:NSInvalidArgumentException
format:@"Invalid regular expression pattern \"%@\" %s", pattern,errbuf];
NSZoneFree([self zone],errbuf);
[self release];
return nil;
}
return self;
}
- initWithPattern:(NSString *)pattern
{
return [self initWithPattern:pattern ignoreCase:NO];
}
- (NSString *)pattern
{
return _pattern;
}
- (BOOL) ignoreCase
{
return _ignoreCase;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@>",[self pattern]];
}
- (BOOL)patternMatchesString:(NSString *)string
{
if (regexec(&_regex,[string cString],0,NULL,0) == 0){
return YES;
}
return NO;
}
- (NSArray *)stringWithComponents:(NSString *)matchString
{
regmatch_t *pmatch;
const char *string;
int i;
int err;
NSMutableArray *array;
string = [matchString cString];
array = [[[NSMutableArray allocWithZone:[self zone]] init] autorelease];
pmatch = NSZoneCalloc([self zone],_regex.re_nsub+1,sizeof(regmatch_t));
err = regexec(&_regex,string,_regex.re_nsub+1,pmatch,0);
i = 1;
while(pmatch[i].rm_so != -1){
[array addObject:[NSString stringWithCString:string+pmatch[i].rm_so
length:(pmatch[i].rm_eo - pmatch[i].rm_so)]];
i++;
}
NSZoneFree([self zone],pmatch);
return array;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.