mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-11 08:40:44 +00:00
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:
parent
be29047e59
commit
3df1043cea
5 changed files with 70 additions and 24 deletions
|
@ -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>
|
2014-04-11 Fred Kiefer <fredkiefer@gmx.de>
|
||||||
|
|
||||||
* Headers/Foundation/NSXMLNodeOptions.h: Add new 10.7 options.
|
* Headers/Foundation/NSXMLNodeOptions.h: Add new 10.7 options.
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
#import <Foundation/NSStream.h>
|
#import <Foundation/NSStream.h>
|
||||||
#import <Foundation/NSString.h>
|
#import <Foundation/NSString.h>
|
||||||
#import <Foundation/NSTask.h>
|
#import <Foundation/NSTask.h>
|
||||||
|
#import <Foundation/NSTextCheckingResult.h>
|
||||||
#import <Foundation/NSThread.h>
|
#import <Foundation/NSThread.h>
|
||||||
#import <Foundation/NSTimer.h>
|
#import <Foundation/NSTimer.h>
|
||||||
#import <Foundation/NSTimeZone.h>
|
#import <Foundation/NSTimeZone.h>
|
||||||
|
|
|
@ -46,8 +46,6 @@ Foundation:
|
||||||
<NSOrthography.h>
|
<NSOrthography.h>
|
||||||
<NSPort.h>
|
<NSPort.h>
|
||||||
<NSPropertyList.h>
|
<NSPropertyList.h>
|
||||||
<NSRegularExpression.h>
|
|
||||||
<NSTextCheckingResult.h>
|
|
||||||
<NSByteCountFormatter.h>
|
<NSByteCountFormatter.h>
|
||||||
<NSFileCoordinator.h>
|
<NSFileCoordinator.h>
|
||||||
<NSFilePresenter.h>
|
<NSFilePresenter.h>
|
||||||
|
|
|
@ -300,6 +300,11 @@ prepareResult(NSRegularExpression *regex,
|
||||||
NSUInteger start = uregex_start(r, i, s);
|
NSUInteger start = uregex_start(r, i, s);
|
||||||
NSUInteger end = uregex_end(r, i, s);
|
NSUInteger end = uregex_end(r, i, s);
|
||||||
|
|
||||||
|
if (end < start)
|
||||||
|
{
|
||||||
|
flags |= NSMatchingInternalError;
|
||||||
|
end = start = NSNotFound;
|
||||||
|
}
|
||||||
ranges[i] = NSMakeRange(start, end-start);
|
ranges[i] = NSMakeRange(start, end-start);
|
||||||
}
|
}
|
||||||
if (uregex_hitEnd(r, s))
|
if (uregex_hitEnd(r, s))
|
||||||
|
@ -344,7 +349,8 @@ prepareResult(NSRegularExpression *regex,
|
||||||
NSTextCheckingResult *result;
|
NSTextCheckingResult *result;
|
||||||
|
|
||||||
flags = prepareResult(self, r, ranges, groups, &s);
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
result = [NSTextCheckingResult
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
@ -359,7 +365,8 @@ prepareResult(NSRegularExpression *regex,
|
||||||
NSTextCheckingResult *result;
|
NSTextCheckingResult *result;
|
||||||
|
|
||||||
flags = prepareResult(self, r, ranges, groups, &s);
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
result = [NSTextCheckingResult
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
@ -403,7 +410,8 @@ prepareResult(NSRegularExpression *regex,
|
||||||
NSTextCheckingResult *result;
|
NSTextCheckingResult *result;
|
||||||
|
|
||||||
flags = prepareResult(self, r, ranges, groups, &s);
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
result = [NSTextCheckingResult
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
@ -418,7 +426,8 @@ prepareResult(NSRegularExpression *regex,
|
||||||
NSTextCheckingResult *result;
|
NSTextCheckingResult *result;
|
||||||
|
|
||||||
flags = prepareResult(self, r, ranges, groups, &s);
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
result = [NSTextCheckingResult
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
@ -603,8 +612,11 @@ prepareResult(NSRegularExpression *regex,
|
||||||
|
|
||||||
FAKE_BLOCK_HACK(result,
|
FAKE_BLOCK_HACK(result,
|
||||||
{
|
{
|
||||||
prepareResult(self, r, ranges, groups, &s);
|
uint32_t flags;
|
||||||
result = [NSTextCheckingResult
|
|
||||||
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
@ -624,13 +636,18 @@ prepareResult(NSRegularExpression *regex,
|
||||||
FAKE_BLOCK_HACK(array,
|
FAKE_BLOCK_HACK(array,
|
||||||
{
|
{
|
||||||
NSTextCheckingResult *result = NULL;
|
NSTextCheckingResult *result = NULL;
|
||||||
|
uint32_t flags;
|
||||||
|
|
||||||
prepareResult(self, r, ranges, groups, &s);
|
flags = prepareResult(self, r, ranges, groups, &s);
|
||||||
result = [NSTextCheckingResult
|
result = (flags & NSMatchingInternalError) ? nil
|
||||||
|
: [NSTextCheckingResult
|
||||||
regularExpressionCheckingResultWithRanges: ranges
|
regularExpressionCheckingResultWithRanges: ranges
|
||||||
count: groups
|
count: groups
|
||||||
regularExpression: self];
|
regularExpression: self];
|
||||||
|
if (nil != result)
|
||||||
|
{
|
||||||
[array addObject: result];
|
[array addObject: result];
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,45 @@
|
||||||
#import <Foundation/NSString.h>
|
#import <Foundation/NSString.h>
|
||||||
|
#import <Foundation/NSRegularExpression.h>
|
||||||
#import "ObjectTesting.h"
|
#import "ObjectTesting.h"
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
[NSAutoreleasePool new];
|
[NSAutoreleasePool new];
|
||||||
START_SET("NSString + regex")
|
START_SET("NSString + regex")
|
||||||
|
|
||||||
#if !(__APPLE__ || GS_USE_ICU)
|
#if !(__APPLE__ || GS_USE_ICU)
|
||||||
SKIP("NSRegularExpression not built, please install libicu")
|
SKIP("NSRegularExpression not built, please install libicu")
|
||||||
#else
|
#else
|
||||||
NSString *regex = @"abcd*";
|
NSRegularExpression *expr;
|
||||||
NSString *source = @"abcdddddd e f g";
|
NSString *regex;
|
||||||
NSRange r = [source rangeOfString: regex options: NSRegularExpressionSearch];
|
NSString *source;
|
||||||
PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length);
|
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*";
|
regex = @"aBcD*";
|
||||||
r = [source rangeOfString: regex options: (NSRegularExpressionSearch | NSCaseInsensitiveSearch)];
|
r = [source rangeOfString: regex
|
||||||
PASS(r.length == 9, "Correct length for regex, expected 9 got %d", (int)r.length);
|
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
|
#endif
|
||||||
|
|
||||||
END_SET("NSString + regex")
|
END_SET("NSString + regex")
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue