This is NSScanner+MiscRegex.m in view mode; [Download] [Up]
//
// NSScanner+MiscRegex.m
// Regular expression support for NSScanner (using NSString+MiscRegex)
//
// Written by Carl Lindberg Copyright (c) 1997 by Carl Lindberg.
// Version 1.0 All rights reserved.
// This notice may not be removed from this source code.
//
// This object is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
// This file formatted with 4 spaces per tabstop.
#import "NSScanner+MiscRegex.h"
#import "NSString+MiscRegex.h"
#import <stdlib.h>
@interface NSScanner (Misc_NeXT_Private)
/*
* This skips past any "skip" characters, updating the scanLocation. It
* returns an NSCharacterSet, presumably the charactersToSkip set.
*/
- (NSCharacterSet *)skipCharacters;
@end
@implementation NSScanner (MiscRegex)
- (BOOL)scanRegex:(NSString *)regex intoString:(NSString **)value
{
int options = [self caseSensitive]? 0 : NSCaseInsensitiveSearch;
regexp_t pattern = MiscNewRegexStruct(regex, options);
BOOL retVal;
retVal = [self scanRegexStruct:pattern intoString:value];
MiscFreeRegexStruct(pattern);
return retVal;
}
- (BOOL)scanUpToRegex:(NSString *)regex intoString:(NSString **)value;
{
int options = MiscFasterSearch;
regexp_t pattern;
BOOL retVal;
if (![self caseSensitive]) options |= NSCaseInsensitiveSearch;
pattern = MiscNewRegexStruct(regex, options);
retVal = [self scanUpToRegexStruct:pattern intoString:value];
MiscFreeRegexStruct(pattern);
return retVal;
}
- (BOOL)scanRegexStruct:(regexp_t)pattern intoString:(NSString **)value
{
NSString *theString = [self string];
NSRange scanRange;
NSRange foundRange;
int options = NSAnchoredSearch;
[self skipCharacters];
scanRange.location = [self scanLocation];
scanRange.length = [theString length] - scanRange.location;
foundRange = [theString rangeOfRegexStruct:pattern options:options range:scanRange];
if (foundRange.location == NSNotFound)
{
return NO;
}
else
{
if (value) *value = [theString substringWithRange:foundRange];
[self setScanLocation:NSMaxRange(foundRange)];
return YES;
}
}
- (BOOL)scanUpToRegexStruct:(regexp_t)pattern intoString:(NSString **)value
{
NSString *theString = [self string];
NSRange scanRange;
NSRange foundRange;
NSRange betweenRange;
int options = 0;
if ([self isAtEnd]) return NO;
[self skipCharacters];
scanRange.location = [self scanLocation];
scanRange.length = [theString length] - scanRange.location;
foundRange = [theString rangeOfRegexStruct:pattern options:options range:scanRange];
if (foundRange.location == NSNotFound)
{
[self setScanLocation:[theString length]];
if (value) *value = [theString substringWithRange:scanRange];
return YES;
}
else
{
betweenRange.location = scanRange.location;
betweenRange.length = foundRange.location - scanRange.location;
if (betweenRange.length == 0)
{
return NO;
}
else
{
[self setScanLocation:foundRange.location];
if (value) *value = [theString substringWithRange:betweenRange];
return YES;
}
}
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.