From dc23cb8a10c46740644b3eb466d110311fd08682 Mon Sep 17 00:00:00 2001 From: CaS Date: Wed, 7 May 2003 13:15:15 +0000 Subject: [PATCH] bugfix initialising mutable string. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@16667 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Source/GSString.m | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index d5dc50d3e..d16bcfc7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-05-06 Richard Frith-Macdonald + + * Source/GSString.m: ([-initWithCStringNocopy:length:freeWhenDone:]) + check encodings and convert to unicode if necessary. Thanks to + Alaxander for pointing out bug. + 2003-05-06 Richard Frith-Macdonald * Source/GSString.m: Fix call to GSFormat() to append to a mutable diff --git a/Source/GSString.m b/Source/GSString.m index 4ad59aa51..f2447f9c9 100644 --- a/Source/GSString.m +++ b/Source/GSString.m @@ -424,7 +424,7 @@ setup(void) { self = [self initWithCharactersNoCopy: u length: l freeWhenDone: YES]; } - if (flag == YES) + if (flag == YES && chars != 0) { NSZoneFree(NSZoneFromPointer(chars), chars); } @@ -2860,20 +2860,36 @@ transmute(ivars self, NSString *aString) return self; } -- (id) initWithCStringNoCopy: (char*)byteString +- (id) initWithCStringNoCopy: (char*)chars length: (unsigned int)length freeWhenDone: (BOOL)flag { - _count = length; - _capacity = length; - _contents.c = byteString; - _flags.wide = 0; - if (flag == YES && byteString != 0) + if (defEnc == intEnc) + { + unichar *u = 0; + unsigned l = 0; + + if (GSToUnicode(&u, &l, chars, length, defEnc, GSObjCZone(self), 0) == NO) + { + DESTROY(self); + } + else + { + self = [self initWithCharactersNoCopy: u length: l freeWhenDone: YES]; + } + if (flag == YES && chars != 0) + { + NSZoneFree(NSZoneFromPointer(chars), chars); + } + return self; + } + + if (flag == YES && chars != 0) { #if GS_WITH_GC _zone = GSAtomicMallocZone(); #else - _zone = NSZoneFromPointer(byteString); + _zone = NSZoneFromPointer(chars); #endif _flags.free = 1; } @@ -2881,6 +2897,11 @@ transmute(ivars self, NSString *aString) { _zone = 0; } + _count = length; + _capacity = length; + _contents.c = chars; + _flags.wide = 0; + return self; }