Mimic OSX handling of what appears to be an ICU bug

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@37793 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2014-04-12 04:38:13 +00:00
parent 25a2db68d6
commit cdcb7a0310
5 changed files with 70 additions and 24 deletions

View file

@ -1,3 +1,9 @@
2014-04-12 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSRegularExpression.m: Check for bad range from ICU and
flag an internal error if we see it; mimic OSX behavior when a
range limited match fails.
2014-04-11 Fred Kiefer <fredkiefer@gmx.de>
* Headers/Foundation/NSXMLNodeOptions.h: Add new 10.7 options.

View file

@ -114,6 +114,7 @@
#import <Foundation/NSStream.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTask.h>
#import <Foundation/NSTextCheckingResult.h>
#import <Foundation/NSThread.h>
#import <Foundation/NSTimer.h>
#import <Foundation/NSTimeZone.h>

View file

@ -46,8 +46,6 @@ Foundation:
<NSOrthography.h>
<NSPort.h>
<NSPropertyList.h>
<NSRegularExpression.h>
<NSTextCheckingResult.h>
<NSByteCountFormatter.h>
<NSFileCoordinator.h>
<NSFilePresenter.h>
@ -1017,4 +1015,4 @@ Good headers:
<NSTimer.h>
<NSXMLDTD.h>
<NSXMLDTDNode.h>
<NSXMLElement.h>
<NSXMLElement.h>

View file

@ -300,6 +300,11 @@ prepareResult(NSRegularExpression *regex,
NSUInteger start = uregex_start(r, i, s);
NSUInteger end = uregex_end(r, i, s);
if (end < start)
{
flags |= NSMatchingInternalError;
end = start = NSNotFound;
}
ranges[i] = NSMakeRange(start, end-start);
}
if (uregex_hitEnd(r, s))
@ -344,7 +349,8 @@ prepareResult(NSRegularExpression *regex,
NSTextCheckingResult *result;
flags = prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
@ -359,7 +365,8 @@ prepareResult(NSRegularExpression *regex,
NSTextCheckingResult *result;
flags = prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
@ -403,7 +410,8 @@ prepareResult(NSRegularExpression *regex,
NSTextCheckingResult *result;
flags = prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
@ -418,7 +426,8 @@ prepareResult(NSRegularExpression *regex,
NSTextCheckingResult *result;
flags = prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
@ -603,8 +612,11 @@ prepareResult(NSRegularExpression *regex,
FAKE_BLOCK_HACK(result,
{
prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
uint32_t flags;
flags = prepareResult(self, r, ranges, groups, &s);
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
@ -624,13 +636,18 @@ prepareResult(NSRegularExpression *regex,
FAKE_BLOCK_HACK(array,
{
NSTextCheckingResult *result = NULL;
uint32_t flags;
prepareResult(self, r, ranges, groups, &s);
result = [NSTextCheckingResult
flags = prepareResult(self, r, ranges, groups, &s);
result = (flags & NSMatchingInternalError) ? nil
: [NSTextCheckingResult
regularExpressionCheckingResultWithRanges: ranges
count: groups
regularExpression: self];
[array addObject: result];
if (nil != result)
{
[array addObject: result];
}
});
return array;
}

View file

@ -1,21 +1,45 @@
#import <Foundation/NSString.h>
#import <Foundation/NSRegularExpression.h>
#import "ObjectTesting.h"
int main(void)
{
[NSAutoreleasePool new];
START_SET("NSString + regex")
[NSAutoreleasePool new];
START_SET("NSString + regex")
#if !(__APPLE__ || GS_USE_ICU)
SKIP("NSRegularExpression not built, please install libicu")
SKIP("NSRegularExpression not built, please install libicu")
#else
NSString *regex = @"abcd*";
NSString *source = @"abcdddddd e f g";
NSRange r = [source rangeOfString: regex options: NSRegularExpressionSearch];
PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length);
regex = @"aBcD*";
r = [source rangeOfString: regex options: (NSRegularExpressionSearch | NSCaseInsensitiveSearch)];
PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length);
NSRegularExpression *expr;
NSString *regex;
NSString *source;
NSInteger index;
NSRange r;
source = @"abcdddddd e f g";
regex = @"abcd*";
r = [source rangeOfString: regex options: NSRegularExpressionSearch];
PASS(r.length == 9, "Correct length for regex, expected 9 got %d",
(int)r.length);
regex = @"aBcD*";
r = [source rangeOfString: regex
options: (NSRegularExpressionSearch | NSCaseInsensitiveSearch)];
PASS(r.length == 9, "Correct length for regex, expected 9 got %d",
(int)r.length);
source = @"h1. Real Acme\n\n||{noborder}{left}Item||{right}Price||\n|Testproduct|{right}2 x $59.50|\n| |{right}net amount: $100.00|\n| |{right}total amount: $119.00|\n\n\nh2. Thanks for your purchase!\n\n\n";
expr = [NSRegularExpression regularExpressionWithPattern: @"h[123]\\. "
options: NSRegularExpressionCaseInsensitive error: NULL];
index = 33;
NSLog(@"%@", [expr firstMatchInString: source
options: NSMatchingAnchored
range: NSMakeRange(index, [source length] - index - 1)]);
#endif
END_SET("NSString + regex")
return 0;
END_SET("NSString + regex")
return 0;
}