mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
Some optimisation for searcvhes in strings
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38517 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
3b492623bc
commit
8556e8e744
2 changed files with 63 additions and 34 deletions
|
@ -110,14 +110,28 @@ __attribute__((unused)) static void GSFreeTempBuffer(void **b)
|
|||
_base = malloc((S) * sizeof(T));\
|
||||
P = _base;\
|
||||
}
|
||||
# define GS_BEGINITEMBUF2(P, S, T) { \
|
||||
T _ibuf2[GS_MAX_OBJECTS_FROM_STACK];\
|
||||
T *P = _ibuf2;\
|
||||
__attribute__((cleanup(GSFreeTempBuffer))) void *_base2 = 0;\
|
||||
if (S > GS_MAX_OBJECTS_FROM_STACK)\
|
||||
{\
|
||||
_base2 = malloc((S) * sizeof(T));\
|
||||
P = _base2;\
|
||||
}
|
||||
#else
|
||||
/* Make minimum size of _ibuf 1 to avoid compiler warnings.
|
||||
*/
|
||||
# define GS_BEGINITEMBUF(P, S, T) { \
|
||||
T _ibuf[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \
|
||||
T *_base = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf \
|
||||
: (T*)NSZoneMalloc(NSDefaultMallocZone(), (S) * sizeof(T)); \
|
||||
: (T*)malloc((S) * sizeof(T)); \
|
||||
T *(P) = _base;
|
||||
# define GS_BEGINITEMBUF2(P, S, T) { \
|
||||
T _ibuf2[(S) > 0 && (S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 1]; \
|
||||
T *_base2 = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf2 \
|
||||
: (T*)malloc((S) * sizeof(T)); \
|
||||
T *(P) = _base2;
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -127,10 +141,15 @@ __attribute__((unused)) static void GSFreeTempBuffer(void **b)
|
|||
*/
|
||||
#if __GNUC__ > 3 && !defined(__clang__)
|
||||
# define GS_ENDITEMBUF() }
|
||||
# define GS_ENDITEMBUF2() }
|
||||
#else
|
||||
# define GS_ENDITEMBUF() \
|
||||
if (_base != _ibuf) \
|
||||
NSZoneFree(NSDefaultMallocZone(), _base); \
|
||||
free(_base); \
|
||||
}
|
||||
# define GS_ENDITEMBUF2() \
|
||||
if (_base2 != _ibuf2) \
|
||||
free(_base2); \
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1985,7 +1985,10 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
|
||||
search = NSMakeRange (0, [self length]);
|
||||
complete = search;
|
||||
found = [self rangeOfString: separator];
|
||||
found = [self rangeOfString: separator
|
||||
options: 0
|
||||
range: search
|
||||
locale: nil];
|
||||
while (found.length != 0)
|
||||
{
|
||||
NSRange current;
|
||||
|
@ -1998,7 +2001,8 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
complete.length - found.location - found.length);
|
||||
found = [self rangeOfString: separator
|
||||
options: 0
|
||||
range: search];
|
||||
range: search
|
||||
locale: nil];
|
||||
}
|
||||
// Add the last search string range
|
||||
[array addObject: [self substringWithRange: search]];
|
||||
|
@ -2211,7 +2215,8 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
|
||||
return [self rangeOfString: string
|
||||
options: 0
|
||||
range: all];
|
||||
range: all
|
||||
locale: nil];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2225,7 +2230,8 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
|
||||
return [self rangeOfString: string
|
||||
options: mask
|
||||
range: all];
|
||||
range: all
|
||||
locale: nil];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2301,18 +2307,13 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
|
||||
if (NULL != coll)
|
||||
{
|
||||
NSRange result = NSMakeRange(NSNotFound, 0);
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
NSUInteger countSelf = searchRange.length;
|
||||
NSUInteger countOther = [aString length];
|
||||
unichar *charsSelf;
|
||||
unichar *charsOther;
|
||||
NSRange result = NSMakeRange(NSNotFound, 0);
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
NSUInteger countSelf = searchRange.length;
|
||||
NSUInteger countOther = [aString length];
|
||||
UStringSearch *search = NULL;
|
||||
|
||||
charsSelf = NSZoneMalloc(NSDefaultMallocZone(),
|
||||
countSelf * sizeof(unichar));
|
||||
charsOther = NSZoneMalloc(NSDefaultMallocZone(),
|
||||
countOther * sizeof(unichar));
|
||||
GS_BEGINITEMBUF(charsSelf, (countSelf * sizeof(unichar)), unichar)
|
||||
GS_BEGINITEMBUF2(charsOther, (countOther * sizeof(unichar)), unichar)
|
||||
|
||||
// Copy to buffer
|
||||
|
||||
|
@ -2326,6 +2327,7 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
{
|
||||
int32_t matchLocation;
|
||||
int32_t matchLength;
|
||||
|
||||
if ((mask & NSBackwardsSearch) == NSBackwardsSearch)
|
||||
{
|
||||
matchLocation = usearch_last(search, &status);
|
||||
|
@ -2365,8 +2367,8 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
}
|
||||
}
|
||||
}
|
||||
NSZoneFree(NSDefaultMallocZone(), charsSelf);
|
||||
NSZoneFree(NSDefaultMallocZone(), charsOther);
|
||||
GS_ENDITEMBUF2()
|
||||
GS_ENDITEMBUF()
|
||||
usearch_close(search);
|
||||
ucol_close(coll);
|
||||
return result;
|
||||
|
@ -2381,7 +2383,7 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
{
|
||||
NSRange range = {0, [self length]};
|
||||
|
||||
range = [self rangeOfString: substring options: 0 range: range];
|
||||
range = [self rangeOfString: substring options: 0 range: range locale: nil];
|
||||
return range.length ? range.location : NSNotFound;
|
||||
}
|
||||
|
||||
|
@ -2390,7 +2392,7 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
{
|
||||
NSRange range = {index, [self length] - index};
|
||||
|
||||
range = [self rangeOfString: substring options: 0 range: range];
|
||||
range = [self rangeOfString: substring options: 0 range: range locale: nil];
|
||||
return range.length ? range.location : NSNotFound;
|
||||
}
|
||||
|
||||
|
@ -2483,9 +2485,12 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
*/
|
||||
- (BOOL) hasPrefix: (NSString*)aString
|
||||
{
|
||||
NSRange range;
|
||||
NSRange range = NSMakeRange(0, [self length]);
|
||||
|
||||
range = [self rangeOfString: aString options: NSAnchoredSearch];
|
||||
range = [self rangeOfString: aString
|
||||
options: NSAnchoredSearch
|
||||
range: range
|
||||
locale: nil];
|
||||
return (range.length > 0) ? YES : NO;
|
||||
}
|
||||
|
||||
|
@ -2494,10 +2499,12 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
*/
|
||||
- (BOOL) hasSuffix: (NSString*)aString
|
||||
{
|
||||
NSRange range;
|
||||
NSRange range = NSMakeRange(0, [self length]);
|
||||
|
||||
range = [self rangeOfString: aString
|
||||
options: NSAnchoredSearch | NSBackwardsSearch];
|
||||
options: NSAnchoredSearch | NSBackwardsSearch
|
||||
range: range
|
||||
locale: nil];
|
||||
return (range.length > 0) ? YES : NO;
|
||||
}
|
||||
|
||||
|
@ -2511,12 +2518,9 @@ GSICUCollatorOpen(NSStringCompareOptions mask, NSLocale *locale)
|
|||
{
|
||||
return YES;
|
||||
}
|
||||
if (anObject != nil && GSObjCIsInstance(anObject) == YES)
|
||||
if (anObject != nil && [anObject isKindOfClass: NSStringClass])
|
||||
{
|
||||
if ([anObject isKindOfClass: NSStringClass])
|
||||
{
|
||||
return [self isEqualToString: anObject];
|
||||
}
|
||||
return [self isEqualToString: anObject];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
@ -3905,7 +3909,10 @@ static NSFileManager *fm = nil;
|
|||
* Look for a dot in the path ... if there isn't one, or if it is
|
||||
* immediately after the root or a path separator, there is no extension.
|
||||
*/
|
||||
range = [self rangeOfString: @"." options: NSBackwardsSearch range: range];
|
||||
range = [self rangeOfString: @"."
|
||||
options: NSBackwardsSearch
|
||||
range: range
|
||||
locale: nil];
|
||||
if (range.length > 0 && range.location > root
|
||||
&& pathSepMember([self characterAtIndex: range.location-1]) == NO)
|
||||
{
|
||||
|
@ -4232,7 +4239,8 @@ static NSFileManager *fm = nil;
|
|||
*/
|
||||
r0 = [self rangeOfString: @"."
|
||||
options: NSBackwardsSearch
|
||||
range: range];
|
||||
range: range
|
||||
locale: nil];
|
||||
/*
|
||||
* Locate a path separator.
|
||||
*/
|
||||
|
@ -4841,7 +4849,8 @@ static NSFileManager *fm = nil;
|
|||
|
||||
// Condense ('/./') sequences.
|
||||
r = (NSRange){root, l-root};
|
||||
while ((r = [s rangeOfString: @"." options: 0 range: r]).length == 1)
|
||||
while ((r = [s rangeOfString: @"." options: 0 range: r locale: nil]).length
|
||||
== 1)
|
||||
{
|
||||
if (r.location > 0 && r.location < l - 1
|
||||
&& pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES
|
||||
|
@ -4884,7 +4893,8 @@ static NSFileManager *fm = nil;
|
|||
* remove '/../' sequences and their matching parent directories.
|
||||
*/
|
||||
r = (NSRange){root, l-root};
|
||||
while ((r = [s rangeOfString: @".." options: 0 range: r]).length == 2)
|
||||
while ((r = [s rangeOfString: @".." options: 0 range: r locale: nil]).length
|
||||
== 2)
|
||||
{
|
||||
if (r.location > 0
|
||||
&& pathSepMember((*caiImp)(s, caiSel, r.location-1)) == YES
|
||||
|
|
Loading…
Reference in a new issue