Author: rfm
Date: Fri May 22 16:28:08 2015
New Revision: 38518

URL: http://svn.gna.org/viewcvs/gnustep?rev=38518&view=rev
Log:
Some string optimisation

Modified:
    libs/base/trunk/Source/GSString.m
    libs/base/trunk/Source/NSString.m
    libs/base/trunk/Source/NSXMLParser.m

Modified: libs/base/trunk/Source/GSString.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSString.m?rev=38518&r1=38517&r2=38518&view=diff
==============================================================================
--- libs/base/trunk/Source/GSString.m   (original)
+++ libs/base/trunk/Source/GSString.m   Fri May 22 16:28:08 2015
@@ -964,6 +964,16 @@
   return strtoll(buf, 0, 10);
 }
 
+- (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex
+{
+  uintptr_t s = (uintptr_t)self;
+  NSUInteger    l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK;
+
+  if (anIndex >= l)
+    [NSException raise: NSRangeException format:@"Invalid location."];
+  return NSMakeRange(anIndex, 1);
+}
+
 - (const char*) UTF8String
 {
   char  *buf = GSAutoreleasedBuffer(9);
@@ -1004,6 +1014,7 @@
 {
   return self;
 }
+
 - (NSUInteger) retainCount
 {
   return UINT_MAX;
@@ -1213,36 +1224,37 @@
              length: (NSUInteger)length
            encoding: (NSStringEncoding)encoding
 {
+  const void   *original;
   void         *chars = 0;
   BOOL         flag = NO;
   
-  if (GSPrivateIsEncodingSupported(encoding) == NO)
-    {
-      return nil;      // Invalid encoding
-    }
-  if (length > 0)
-    {
-      const void       *original;
-
-      if (0 == bytes)
-       {
-         [NSException raise: NSInvalidArgumentException
-                     format: @"-initWithBytes:lenth:encoding given nul bytes"];
-       }
-      original = bytes;
+  if (0 == length)
+    {
+      return (id)@"";
+    }
+
+  if (0 == bytes)
+    {
+      [NSException raise: NSInvalidArgumentException
+                  format: @"-initWithBytes:lenth:encoding given nul bytes"];
+    }
+
 #if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3)
-      if (useTinyStrings)
+  if (useTinyStrings)
+    {
+      if (NSASCIIStringEncoding == encoding)
         {
-          if (NSASCIIStringEncoding == encoding)
+          id tinyString = createTinyString(bytes, length);
+
+          if (tinyString)
             {
-              id tinyString = createTinyString(bytes, length);
-
-              if (tinyString)
-                {
-                  return tinyString;
-                }
+              return tinyString;
             }
-          if (NSUTF8StringEncoding == encoding && (length < 9))
+        }
+      if (length < 9)
+        {
+          if (NSUTF8StringEncoding == encoding
+            || GSPrivateIsByteEncoding(encoding))
             {
               NSUInteger i;
 
@@ -1264,31 +1276,33 @@
                 }
             }
         }
+    }
 #endif
 
-      fixBOM((unsigned char**)&bytes, &length, &flag, encoding);
+  original = bytes;
+  fixBOM((unsigned char**)&bytes, &length, &flag, encoding);
+  /*
+   * We need to copy the data if there is any, unless fixBOM()
+   * has already done it for us.
+   */
+  if (original == bytes)
+    {
+#if    GS_WITH_GC
+      chars = NSAllocateCollectable(length, 0);
+#else
+      chars = NSZoneMalloc([self zone], length);
+#endif
+      memcpy(chars, bytes, length);
+    }
+  else
+    {
       /*
-       * We need to copy the data if there is any, unless fixBOM()
-       * has already done it for us.
+       * The fixBOM() function has already copied the data and allocated
+       * new memory, so we can just pass that to the designated initialiser
        */
-      if (original == bytes)
-       {
-#if    GS_WITH_GC
-         chars = NSAllocateCollectable(length, 0);
-#else
-         chars = NSZoneMalloc([self zone], length);
-#endif
-         memcpy(chars, bytes, length);
-       }
-      else
-       {
-         /*
-          * The fixBOM() function has already copied the data and allocated
-          * new memory, so we can just pass that to the designated initialiser
-          */
-         chars = (void*)bytes;
-       }
-    }
+      chars = (void*)bytes;
+    }
+
   return [self initWithBytesNoCopy: chars
                            length: length
                          encoding: encoding
@@ -1305,49 +1319,27 @@
   BOOL         isLatin1 = NO;
   GSStr                me;
 
-  if (GSPrivateIsEncodingSupported(encoding) == NO)
-    {
-      if (flag == YES && bytes != 0)
-       {
-         NSZoneFree(NSZoneFromPointer(bytes), bytes);
-       }
-      return nil;      // Invalid encoding
-    }
-
-  if (length > 0)
-    {
-      fixBOM((unsigned char**)&bytes, &length, &flag, encoding);
-      if (encoding == NSUnicodeStringEncoding)
-       {
-         chars.u = bytes;
-       }
-      else
-       {
-         chars.c = bytes;
-       }
-    }
-
-  if (encoding == NSUTF8StringEncoding)
-    {
-      unsigned i;
-
-      for (i = 0; i < length; i++)
+  if (0 == length)
+    {
+      if (0 != bytes)
         {
-         if ((chars.c)[i] > 127)
-           {
-             break;
-           }
+          NSZoneFree(NSZoneFromPointer(bytes), bytes);
         }
-      if (i == length)
-       {
-         /*
-          * This is actually ASCII data ... so we can just store it as if
-          * in the internal 8bit encoding scheme.
-          */
-         encoding = internalEncoding;
-       }
-    }
-  else if (encoding != internalEncoding && isByteEncoding(encoding) == YES)
+      return (id)@"";
+    }
+
+  fixBOM((unsigned char**)&bytes, &length, &flag, encoding);
+  if (encoding == NSUnicodeStringEncoding)
+    {
+      chars.u = bytes;
+    }
+  else
+    {
+      chars.c = bytes;
+    }
+
+  if (encoding == NSUTF8StringEncoding
+    || (encoding != internalEncoding && isByteEncoding(encoding) == YES))
     {
       unsigned i;
 
@@ -1376,7 +1368,6 @@
        }
     }
 
-
   if (encoding == internalEncoding)
     {
 #if    GS_WITH_GC
@@ -1406,6 +1397,15 @@
     {
       unichar  *u = 0;
       unsigned l = 0;
+
+      if (GSPrivateIsEncodingSupported(encoding) == NO)
+        {
+          if (flag == YES && bytes != 0)
+            {
+              NSZoneFree(NSZoneFromPointer(bytes), bytes);
+            }
+          return nil;  // Invalid encoding
+        }
 
       if (GSToUnicode(&u, &l, chars.c, length, encoding,
        [self zone], 0) == NO)
@@ -3947,6 +3947,7 @@
   return rangeOfCharacter_c((GSStr)self, aSet, mask, aRange);
 }
 
+/*
 - (NSRange) rangeOfString: (NSString*)aString
                  options: (NSUInteger)mask
                    range: (NSRange)aRange
@@ -3966,6 +3967,7 @@
     }
   return rangeOfString_c((GSStr)self, aString, mask, aRange);
 }
+*/
 
 - (NSStringEncoding) smallestEncoding
 {
@@ -4338,6 +4340,7 @@
   return rangeOfCharacter_u((GSStr)self, aSet, mask, aRange);
 }
 
+/*
 - (NSRange) rangeOfString: (NSString*)aString
                  options: (NSUInteger)mask
                    range: (NSRange)aRange
@@ -4357,6 +4360,7 @@
     }
   return rangeOfString_u((GSStr)self, aString, mask, aRange);
 }
+*/
 
 - (NSStringEncoding) smallestEncoding
 {
@@ -5230,6 +5234,7 @@
     return rangeOfCharacter_c((GSStr)self, aSet, mask, aRange);
 }
 
+/*
 - (NSRange) rangeOfString: (NSString*)aString
                  options: (NSUInteger)mask
                    range: (NSRange)aRange
@@ -5252,6 +5257,7 @@
   else
     return rangeOfString_c((GSStr)self, aString, mask, aRange);
 }
+*/
 
 - (void) replaceCharactersInRange: (NSRange)aRange
                       withString: (NSString*)aString

Modified: libs/base/trunk/Source/NSString.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSString.m?rev=38518&r1=38517&r2=38518&view=diff
==============================================================================
--- libs/base/trunk/Source/NSString.m   (original)
+++ libs/base/trunk/Source/NSString.m   Fri May 22 16:28:08 2015
@@ -149,7 +149,7 @@
 #define IS_BIT_SET(a,i) ((((a) & (1<<(i)))) > 0)
 
 static NSCharacterSet  *nonspace = nil;
-static NSData *whitespaceBitmap;
+static NSData           *whitespaceBitmap;
 static unsigned const char *whitespaceBitmapRep = NULL;
 #define GS_IS_WHITESPACE(X) IS_BIT_SET(whitespaceBitmapRep[(X)/8], (X) % 8)
 
@@ -623,8 +623,7 @@
     {
       localeCString = [[locale localeIdentifier] UTF8String];
 
-      if (localeCString == NULL
-         || strcmp("", localeCString) == 0)
+      if (localeCString == NULL || strcmp("", localeCString) == 0)
        {
          return NULL;
        }
@@ -2273,7 +2272,10 @@
                     range: (NSRange)searchRange
                    locale: (NSLocale *)locale
 {
-  GS_RANGE_CHECK(searchRange, [self length]);
+  NSUInteger    length = [self length];
+  NSUInteger    countOther;
+
+  GS_RANGE_CHECK(searchRange, length);
   if (aString == nil)
     [NSException raise: NSInvalidArgumentException format: @"range of nil"];
 
@@ -2301,7 +2303,150 @@
       return r;
     }
 
+  countOther = [aString length];
+  if (0 == countOther)
+    {
+      if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
+        {
+          searchRange.location += searchRange.length;
+        }
+      searchRange.length = 0;
+      return searchRange;
+    }
+
+  if ((mask & NSLiteralSearch) == NSLiteralSearch)
+    {
+      NSRange   result;
+
+      if (searchRange.length < countOther)
+        {
+          /* Range to search is smaller than string to look for.
+           */
+          result = NSMakeRange(NSNotFound, 0);
+        }
+      else
+        {
+          GS_BEGINITEMBUF(charsOther, (countOther*sizeof(unichar)), unichar)
+
+          [aString getCharacters: charsOther range: NSMakeRange(0, 
countOther)];
+          if ((mask & NSAnchoredSearch) == NSAnchoredSearch
+            || searchRange.length == countOther)
+            {
+              /* Range to search is same size as string to look for.
+               */
+              GS_BEGINITEMBUF2(charsSelf, (countOther*sizeof(unichar)), 
unichar)
+              if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
+                {
+                  searchRange.location = NSMaxRange(searchRange) - countOther;
+                  searchRange.length = countOther;
+                }
+              else
+                {
+                  searchRange.length = countOther;
+                }
+              [self getCharacters: charsSelf range: searchRange];
+              if (memcmp(&charsSelf[0], &charsOther[0],
+                countOther * sizeof(unichar)) == 0)
+                {
+                  result = searchRange;
+                }
+              else
+                {
+                  result = NSMakeRange(NSNotFound, 0);
+                }
+              GS_ENDITEMBUF2()
+            }
+          else
+            {
+              NSUInteger    pos;
+              NSUInteger    end;
+
+              end = searchRange.length - countOther + 1;
+              if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
+                {
+                  pos = end;
+                }
+              else
+                {
+                  pos = 0;
+                }
+              /* Range to search is bigger than string to look for.
+               */
+              GS_BEGINITEMBUF2(charsSelf, (searchRange.length*sizeof(unichar)),
+                unichar)
+              [self getCharacters: charsSelf range: searchRange];
+              if (1 == countOther)
+                {
+                  unichar       u = charsOther[pos];
+
+                  if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
+                    {
+                      while (pos-- > 0)
+                        {
+                          if (charsSelf[pos] == u)
+                            {
+                              break;
+                            }
+                        }
+                    }
+                  else
+                    {
+                      while (pos < end)
+                        {
+                          if (charsSelf[pos] == u)
+                            {
+                              break;
+                            }
+                          pos++;
+                        }                        
+                    }
+                }
+              else
+                {
+                  if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
+                    {
+                      while (pos-- > 0)
+                        {
+                          if (memcmp(&charsSelf[pos], charsOther,
+                            countOther * sizeof(unichar)) == 0)
+                            {
+                              break;
+                            }
+                        }
+                    }
+                  else
+                    {
+                      while (pos < end)
+                        {
+                          if (memcmp(&charsSelf[pos], charsOther,
+                            countOther * sizeof(unichar)) == 0)
+                            {
+                              break;
+                            }
+                          pos++;
+                        }                        
+                    }
+                }
+              if (pos >= end)
+                {
+                  result = NSMakeRange(NSNotFound, 0);
+                }
+              else
+                {
+                  result = NSMakeRange(searchRange.location + pos, countOther);
+                }
+              GS_ENDITEMBUF2()
+            }
+          GS_ENDITEMBUF()
+        }
+      return result;
+    }
+
 #if GS_USE_ICU == 1
+  if (nil != locale && ![locale isKindOfClass: [NSLocale class]])
+    {
+      locale = [NSLocale currentLocale];
+    }
     {
       UCollator *coll = GSICUCollatorOpen(mask, locale);
 
@@ -2310,7 +2455,6 @@
          NSRange       result = NSMakeRange(NSNotFound, 0);
          UErrorCode    status = U_ZERO_ERROR; 
          NSUInteger    countSelf = searchRange.length;
-         NSUInteger    countOther = [aString length];       
          UStringSearch *search = NULL;
           GS_BEGINITEMBUF(charsSelf, (countSelf * sizeof(unichar)), unichar)
           GS_BEGINITEMBUF2(charsOther, (countOther * sizeof(unichar)), unichar)
@@ -2405,28 +2549,36 @@
  */
 - (NSRange) rangeOfComposedCharacterSequenceAtIndex: (NSUInteger)anIndex
 {
+static NSCharacterSet  *nonbase = nil;
+static SEL              nbSel;
+static BOOL             (*nbImp)(id, SEL, unichar) = 0;
   unsigned     start;
   unsigned     end;
   unsigned     length = [self length];
   unichar      ch;
   unichar      (*caiImp)(NSString*, SEL, NSUInteger);
-  NSCharacterSet *nbSet = [NSCharacterSet nonBaseCharacterSet];
 
   if (anIndex >= length)
     [NSException raise: NSRangeException format:@"Invalid location."];
   caiImp = (unichar (*)(NSString*,SEL,NSUInteger))
     [self methodForSelector: caiSel];
 
+  if (nil == nonbase)
+    {
+      nonbase = [[NSCharacterSet nonBaseCharacterSet] retain];
+      nbSel = @selector(characterIsMember:);
+      nbImp = (BOOL(*)(id,SEL,unichar))[nonbase methodForSelector: nbSel];
+    }
   for (start = anIndex; start > 0; start--)
     {
       ch = (*caiImp)(self, caiSel, start);
-      if ([nbSet characterIsMember: ch] == NO)
+      if ((*nbImp)(nonbase, nbSel, ch) == NO)
         break;
     }
   for (end = start+1; end < length; end++)
     {
       ch = (*caiImp)(self, caiSel, end);
-      if ([nbSet characterIsMember: ch] == NO)
+      if ((*nbImp)(nonbase, nbSel, ch) == NO)
         break;
     }
 
@@ -5247,12 +5399,10 @@
     [NSException raise: NSInvalidArgumentException format: @"compare with 
nil"];
 
 #if GS_USE_ICU == 1
-  if (nil != locale
-    && ![locale isKindOfClass: [NSLocale class]])
+  if (nil != locale && ![locale isKindOfClass: [NSLocale class]])
     {
       locale = [NSLocale currentLocale];
     }
-
     {
       UCollator *coll = GSICUCollatorOpen(mask, locale);
 

Modified: libs/base/trunk/Source/NSXMLParser.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSXMLParser.m?rev=38518&r1=38517&r2=38518&view=diff
==============================================================================
--- libs/base/trunk/Source/NSXMLParser.m        (original)
+++ libs/base/trunk/Source/NSXMLParser.m        Fri May 22 16:28:08 2015
@@ -967,9 +967,10 @@
 
       if (this->shouldProcessNamespaces)
         {
-          NSRange   r = [tag rangeOfString: @":"];
+          NSRange   r;
           NSString  *p = @"";
 
+          r = [tag rangeOfString: @":" options: NSLiteralSearch];
           if (r.length > 0)
             {
               p = [tag substringToIndex: r.location];
@@ -1354,9 +1355,10 @@
              qualified = tag;
               if (this->shouldProcessNamespaces)
                 {
-                  NSRange   r = [tag rangeOfString: @":"];
+                  NSRange   r;
                   NSString  *p = @"";
 
+                  r = [tag rangeOfString: @":" options: NSLiteralSearch];
                   if (r.length > 0)
                     {
                       p = [tag substringToIndex: r.location];


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to