From a4c7e88a11acfa33e0baae1fadd4eb37b5c4d169 Mon Sep 17 00:00:00 2001 From: rfm Date: Fri, 28 Oct 2011 14:25:17 +0000 Subject: [PATCH] fix error replacing strings in a string, and optimise literal strings a bit git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34081 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 10 +++++++++- Source/GSString.m | 24 ++++++++++++++++++++++++ Source/NSString.m | 11 +++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 328159667..ca21ba734 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ +2011-10-28 Richard Frith-Macdonald + + * Source/NSString.m: Fix bug when widening mutable string in + replaceOccurrencesOfString:...range: + * Source/GSString.m: more efficient check to see if a literal string + can be converted to ascii or latin1 + 2011-10-28 Fred Kiefer - * Tests/base/NSMutableString/basic.m: Add test for replaceOccurrencesOfString:...range: + * Tests/base/NSMutableString/basic.m: Add test for + replaceOccurrencesOfString:...range: 2011-10-27 Richard Frith-Macdonald diff --git a/Source/GSString.m b/Source/GSString.m index 7c569cf94..24e33e120 100644 --- a/Source/GSString.m +++ b/Source/GSString.m @@ -4996,6 +4996,30 @@ nextUTF8(const uint8_t *p, unsigned l, unsigned *o, unichar *n) return 0; } +- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding +{ + if (NSASCIIStringEncoding == encoding) + { + BOOL ascii; + + lengthUTF8((const uint8_t*)nxcsptr, nxcslen, &ascii, 0); + return ascii; + } + else if (NSISOLatin1StringEncoding == encoding) + { + BOOL latin1; + + lengthUTF8((const uint8_t*)nxcsptr, nxcslen, 0, &latin1); + return latin1; + } + else + { + id d = [self dataUsingEncoding: encoding allowLossyConversion: NO]; + + return d != nil ? YES : NO; + } +} + - (NSData*) dataUsingEncoding: (NSStringEncoding)encoding allowLossyConversion: (BOOL)flag { diff --git a/Source/NSString.m b/Source/NSString.m index bf5c6fca1..669b11cc1 100644 --- a/Source/NSString.m +++ b/Source/NSString.m @@ -5524,8 +5524,15 @@ static NSFileManager *fm = nil; searchRange.location = range.location + byLen; searchRange.length = newEnd - searchRange.location; } - - range = (*func)(self, replace, opts, searchRange); + if (searchRange.length > 0) + { + /* We replaced something and now need to scan again. + * As we modified the receiver, we must refresh the + * method implementation for searching. + */ + func = GSPrivateRangeOfString(self, replace); + range = (*func)(self, replace, opts, searchRange); + } } while (range.length > 0); }