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

Reply via email to