Author: rfm
Date: Sat Apr 12 06:38:13 2014
New Revision: 37793
URL: http://svn.gna.org/viewcvs/gnustep?rev=37793&view=rev
Log:
Mimic OSX handling of what appears to be an ICU bug
Modified:
libs/base/trunk/ChangeLog
libs/base/trunk/Headers/Foundation/Foundation.h
libs/base/trunk/Headers/Foundation/MISSING
libs/base/trunk/Source/NSRegularExpression.m
libs/base/trunk/Tests/base/NSString/regex.m
Modified: libs/base/trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=37793&r1=37792&r2=37793&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog (original)
+++ libs/base/trunk/ChangeLog Sat Apr 12 06:38:13 2014
@@ -1,3 +1,9 @@
+2014-04-12 Richard Frith-Macdonald <[email protected]>
+
+ * 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 <[email protected]>
* Headers/Foundation/NSXMLNodeOptions.h: Add new 10.7 options.
Modified: libs/base/trunk/Headers/Foundation/Foundation.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Headers/Foundation/Foundation.h?rev=37793&r1=37792&r2=37793&view=diff
==============================================================================
--- libs/base/trunk/Headers/Foundation/Foundation.h (original)
+++ libs/base/trunk/Headers/Foundation/Foundation.h Sat Apr 12 06:38:13 2014
@@ -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>
Modified: libs/base/trunk/Headers/Foundation/MISSING
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Headers/Foundation/MISSING?rev=37793&r1=37792&r2=37793&view=diff
==============================================================================
--- libs/base/trunk/Headers/Foundation/MISSING (original)
+++ libs/base/trunk/Headers/Foundation/MISSING Sat Apr 12 06:38:13 2014
@@ -46,8 +46,6 @@
<NSOrthography.h>
<NSPort.h>
<NSPropertyList.h>
- <NSRegularExpression.h>
- <NSTextCheckingResult.h>
<NSByteCountFormatter.h>
<NSFileCoordinator.h>
<NSFilePresenter.h>
@@ -1017,4 +1015,4 @@
<NSTimer.h>
<NSXMLDTD.h>
<NSXMLDTDNode.h>
- <NSXMLElement.h>
+ <NSXMLElement.h>
Modified: libs/base/trunk/Source/NSRegularExpression.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSRegularExpression.m?rev=37793&r1=37792&r2=37793&view=diff
==============================================================================
--- libs/base/trunk/Source/NSRegularExpression.m (original)
+++ libs/base/trunk/Source/NSRegularExpression.m Sat Apr 12 06:38:13 2014
@@ -300,6 +300,11 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
FAKE_BLOCK_HACK(array,
{
NSTextCheckingResult *result = NULL;
-
- 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];
- [array addObject: result];
+ if (nil != result)
+ {
+ [array addObject: result];
+ }
});
return array;
}
Modified: libs/base/trunk/Tests/base/NSString/regex.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSString/regex.m?rev=37793&r1=37792&r2=37793&view=diff
==============================================================================
--- libs/base/trunk/Tests/base/NSString/regex.m (original)
+++ libs/base/trunk/Tests/base/NSString/regex.m Sat Apr 12 06:38:13 2014
@@ -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;
}
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs