This is FileCollection.m in view mode; [Download] [Up]
#import <regex.h> #import <sys/types.h> #import <pwd.h> #import <sys/dir.h> #import "StringStorage.h" #import "FileCollection.h" @interface FileCollection (PRIVATE) - bourne: (const char *)pattern toRegex: (char *)reg; @end @implementation FileCollection - init { [super init]; selectedFiles = [[List alloc] init]; return self; } - free { [selectedFiles free]; return [super free]; } - (int) select: (const char *)pattern { int x, cnt; char regex[2 * strlen(pattern)]; [selectedFiles empty]; [self bourne: pattern toRegex: regex]; /* convert the bourne shell wild cards to regex */ re_comp(regex); for(x = 0, cnt = [self count]; x < cnt; x++) { if(re_exec((char *)[[self objectAt:x] stringValue])) [selectedFiles addObject: [self objectAt: x]]; } return [selectedFiles count]; } - selectedFiles { return selectedFiles; } @end @implementation FileCollection (PRIVATE) /* * Using regex patterns for file matching is not intuitive, * so I take bourne type wild cards and convert them to regex. * * I support the bourne: *,?,[] * * To do this convert: * * ^ -> \^ * * And when not in a range: * * * -> .* * ? -> . * . -> \. * * And then wrap the regex in ^$ so that it is an exact match not a substring. */ - bourne: (const char *)pattern toRegex: (char *)reg { int x, cnt; BOOL inRange = NO; reg[0] = '^'; reg++; for(x = 0, cnt = strlen(pattern); x < cnt; x++) { if(!inRange) { switch(pattern[x]) { case '^': reg[0] = '\\'; reg[1] = '^'; reg += 2; break; case '?': reg[0] = '.'; reg++; break; case '.': reg[0] = '\\'; reg[1] = '.'; reg += 2; break; case '*': reg[0] = '.'; reg[1] = '*'; reg += 2; break; case '\\': reg[0] = pattern[x]; x++; reg[1] = pattern[x]; reg += 2; break; case '[': inRange = YES; default: reg[0] = pattern[x]; reg++; } } else { switch(pattern[x]) { case '^': reg[0] = '\\'; reg[1] = '^'; reg += 2; break; case ']': inRange = NO; default: reg[0] = pattern[x]; reg++; } } } reg[0] = '$'; reg[1] = (char)0; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.