Restore (fixed) previous reverted code.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@22953 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2006-05-20 14:52:38 +00:00
parent 21a64f7f01
commit 390661c762
3 changed files with 182 additions and 488 deletions

View file

@ -1,3 +1,7 @@
2006-05-20 Richard Frith-Macdonald <rfm@gnu.org>
Restore reversions with a bugfix for deserialising ascii strings
2006-05-20 Richard Frith-Macdonald <rfm@gnu.org>
Revert last changes ... passed regression tests but broke some

View file

@ -125,17 +125,11 @@ we need to free the buffer when we are deallocated.
@interface GSCBufferString : GSCString
{
}
- (id) initWithCStringNoCopy: (char*)chars
length: (unsigned int)length
freeWhenDone: (BOOL)flag;
@end
@interface GSUnicodeBufferString : GSUnicodeString
{
}
- (id) initWithCharactersNoCopy: (unichar *)chars
length: (unsigned int)length
freeWhenDone: (BOOL)flag;
@end
@ -146,13 +140,11 @@ the instance iself.
@interface GSCInlineString : GSCString
{
}
- (id) initWithCString: (const char*)chars length: (unsigned)length;
@end
@interface GSUnicodeInlineString : GSUnicodeString
{
}
- (id) initWithCharacters: (const unichar*)chars length: (unsigned)length;
@end
@ -165,8 +157,6 @@ instance.
@public
GSCString *_parent;
}
- (id) initWithCString: (char *)chars length: (unsigned)length
fromParent: (GSCString *)parent;
@end
@interface GSUnicodeSubString : GSUnicodeString
@ -174,8 +164,6 @@ instance.
@public
GSUnicodeString *_parent;
}
- (id) initWithCharacters: (unichar *)chars length: (unsigned)length
fromParent: (GSUnicodeString *)parent;
@end
@ -475,7 +463,7 @@ fixBOM(unsigned char **bytes, unsigned *length, BOOL *shouldFree,
freeWhenDone: YES];
}
- (id) initWithBytesNoCopy: (const void*)bytes
- (id) initWithBytesNoCopy: (void*)bytes
length: (unsigned int)length
encoding: (NSStringEncoding)encoding
freeWhenDone: (BOOL)flag
@ -490,7 +478,7 @@ fixBOM(unsigned char **bytes, unsigned *length, BOOL *shouldFree,
{
if (flag == YES && bytes != 0)
{
NSZoneFree(NSZoneFromPointer((void*)bytes), (void*)bytes);
NSZoneFree(NSZoneFromPointer(bytes), bytes);
}
return nil; // Invalid encoding
}
@ -618,7 +606,7 @@ fixBOM(unsigned char **bytes, unsigned *length, BOOL *shouldFree,
length: (unsigned)length
freeWhenDone: (BOOL)flag
{
return [self initWithBytesNoCopy: (const void*)chars
return [self initWithBytesNoCopy: (void*)chars
length: length * sizeof(unichar)
encoding: NSUnicodeStringEncoding
freeWhenDone: flag];
@ -636,7 +624,7 @@ fixBOM(unsigned char **bytes, unsigned *length, BOOL *shouldFree,
length: (unsigned)length
freeWhenDone: (BOOL)flag
{
return [self initWithBytesNoCopy: (const void*)chars
return [self initWithBytesNoCopy: (void*)chars
length: length
encoding: externalEncoding
freeWhenDone: flag];
@ -2462,48 +2450,37 @@ rangeOfString_u(GSStr self, NSString *aString, unsigned mask, NSRange aRange)
static inline NSString*
substring_c(GSStr self, NSRange aRange)
{
id sub;
struct {
@defs(GSCSubString)
} *o;
if (self->_flags.free == 1)
{
sub = NSAllocateObject(GSCSubStringClass, 0, NSDefaultMallocZone());
sub = [sub initWithCString: (char*)self->_contents.c + aRange.location
length: aRange.length
fromParent: (GSCString *)self];
}
else
{
sub = NSAllocateObject(GSCInlineStringClass,
aRange.length, NSDefaultMallocZone());
sub = [sub initWithCString: (char*)self->_contents.c + aRange.location
length: aRange.length];
}
AUTORELEASE(sub);
return sub;
o = (typeof(o))NSAllocateObject(GSCSubStringClass,
0, NSDefaultMallocZone());
o->_contents.c = self->_contents.c + aRange.location;
o->_count = aRange.length;
o->_flags.wide = 0;
o->_flags.free = 0;
ASSIGN(o->_parent, self);
AUTORELEASE((id)o);
return (id)o;
}
static inline NSString*
substring_u(GSStr self, NSRange aRange)
{
id sub;
struct {
@defs(GSUnicodeSubString)
} *o;
if (self->_flags.free == 1)
{
sub = NSAllocateObject(GSUnicodeSubStringClass, 0, NSDefaultMallocZone());
sub = [sub initWithCharacters: self->_contents.u + aRange.location
length: aRange.length
fromParent: (GSUnicodeString *)self];
}
else
{
sub = NSAllocateObject(GSUnicodeInlineStringClass,
aRange.length*sizeof(unichar),
NSDefaultMallocZone());
sub = [sub initWithCharacters: self->_contents.u + aRange.location
length: aRange.length];
}
AUTORELEASE(sub);
return sub;
o = (typeof(o))NSAllocateObject(GSUnicodeSubStringClass,
0, NSDefaultMallocZone());
o->_contents.u = self->_contents.u + aRange.location;
o->_count = aRange.length;
o->_flags.wide = 1;
o->_flags.free = 0;
ASSIGN(o->_parent, self);
AUTORELEASE((id)o);
return (id)o;
}
/*
@ -2624,13 +2601,13 @@ transmute(GSStr self, NSString *aString)
memcpy(tmp, chars, length);
chars = tmp;
}
return [self initWithBytesNoCopy: chars
return [self initWithBytesNoCopy: (void*)chars
length: length
encoding: encoding
freeWhenDone: YES];
}
- (id) initWithBytesNoCopy: (const void*)chars
- (id) initWithBytesNoCopy: (void*)chars
length: (unsigned int)length
encoding: (NSStringEncoding)encoding
freeWhenDone: (BOOL)flag
@ -2644,7 +2621,7 @@ transmute(GSStr self, NSString *aString)
return nil;
}
- (id) initWithCharacters: (unichar*)chars
- (id) initWithCharacters: (const unichar*)chars
length: (unsigned int)length
{
return [self initWithBytes: chars
@ -2662,14 +2639,14 @@ transmute(GSStr self, NSString *aString)
freeWhenDone: flag];
}
- (id) initWithCString: (char*)chars
- (id) initWithCString: (const char*)chars
{
return [self initWithBytes: chars
length: strlen(chars)
encoding: externalEncoding];
}
- (id) initWithCString: (char*)chars
- (id) initWithCString: (const char*)chars
encoding: (NSStringEncoding)encoding
{
return [self initWithBytes: chars
@ -2677,7 +2654,7 @@ transmute(GSStr self, NSString *aString)
encoding: encoding];
}
- (id) initWithCString: (char*)chars
- (id) initWithCString: (const char*)chars
length: (unsigned int)length
{
return [self initWithBytes: chars
@ -2934,11 +2911,17 @@ agree, create a new GSCInlineString otherwise.
{
if (!_flags.free || NSShouldRetainWithZone(self, z) == NO)
{
NSString *obj;
struct {
@defs(GSCInlineString)
} *o;
obj = (NSString*)NSAllocateObject(GSCInlineStringClass, _count, z);
obj = [obj initWithCString: (char*)_contents.c length: _count];
return obj;
o = (typeof(o))NSAllocateObject(GSCInlineStringClass, _count, z);
o->_contents.c = (unsigned char*)&o[1];
o->_count = _count;
memcpy(o->_contents.c, _contents.c, _count);
o->_flags.wide = 0;
o->_flags.free = 0;
return (id)o;
}
else
{
@ -2951,25 +2934,6 @@ agree, create a new GSCInlineString otherwise.
@implementation GSCBufferString
- (id) initWithCStringNoCopy: (char*)chars
length: (unsigned int)length
freeWhenDone: (BOOL)flag
{
if (_contents.c != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.c = (unsigned char*)chars;
_flags.wide = 0;
if (flag == YES)
{
_flags.free = 1;
}
return self;
}
- (void) dealloc
{
if (_flags.free && _contents.c != 0)
@ -2984,22 +2948,6 @@ agree, create a new GSCInlineString otherwise.
@implementation GSCInlineString
- (id) initWithCString: (const char*)chars length: (unsigned)length
{
if (_contents.c != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.c = (unsigned char*)&self[1];
if (_count > 0)
memcpy(_contents.c, chars, length);
_flags.wide = 0;
_flags.free = 1;
return self;
}
- (void) dealloc
{
NSDeallocateObject(self);
@ -3009,32 +2957,23 @@ agree, create a new GSCInlineString otherwise.
@implementation GSCSubString
- (id) initWithCString: (char *)chars length: (unsigned)length
fromParent: (GSCString *)parent
{
if (_contents.c != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.c = (unsigned char *)chars;
_flags.wide = 0;
_flags.free = 1;
ASSIGN(_parent, parent);
return self;
}
/*
* Assume that a copy should be a new string, never just a retained substring.
*/
- (id) copyWithZone: (NSZone*)z
{
NSString *obj;
struct {
@defs(GSCInlineString)
} *o;
obj = (NSString*)NSAllocateObject(GSCInlineStringClass, _count, z);
obj = [obj initWithCString: (char*)_contents.c length: _count];
return obj;
o = (typeof(o))NSAllocateObject(GSCInlineStringClass, _count, z);
o->_contents.c = (unsigned char*)&o[1];
o->_count = _count;
memcpy(o->_contents.c, _contents.c, _count);
o->_flags.wide = 0;
o->_flags.free = 0;
return (id)o;
}
- (void) dealloc
@ -3208,7 +3147,9 @@ agree, create a new GSCInlineString otherwise.
obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0,
NSDefaultMallocZone());
obj = [obj initWithCharacters: _contents.u length: _count];
obj = [obj initWithBytes: (const void*)_contents.u
length: _count * sizeof(unichar)
encoding: NSUnicodeStringEncoding];
return obj;
}
@ -3217,7 +3158,9 @@ agree, create a new GSCInlineString otherwise.
GSMutableString *obj;
obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z);
obj = [obj initWithCharacters: _contents.u length: _count];
obj = [obj initWithBytes: (const void*)_contents.u
length: _count * sizeof(unichar)
encoding: NSUnicodeStringEncoding];
return obj;
}
@ -3278,12 +3221,18 @@ agree, create a new GSUnicodeInlineString otherwise.
{
if (!_flags.free || NSShouldRetainWithZone(self, z) == NO)
{
NSString *obj;
struct {
@defs(GSUnicodeInlineString)
} *o;
obj = (NSString*)NSAllocateObject(GSUnicodeInlineStringClass,
_count*sizeof(unichar), z);
obj = [obj initWithCharacters: _contents.u length: _count];
return obj;
o = (typeof(o))NSAllocateObject(GSUnicodeInlineStringClass,
_count * sizeof(unichar), z);
o->_contents.u = (unichar*)&o[1];
o->_count = _count;
memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar));
o->_flags.wide = 1;
o->_flags.free = 0;
return (id)o;
}
else
{
@ -3296,62 +3245,6 @@ agree, create a new GSUnicodeInlineString otherwise.
@implementation GSUnicodeBufferString
- (id) initWithCharactersNoCopy: (unichar *)chars
length: (unsigned int)length
freeWhenDone: (BOOL)flag
{
BOOL isASCII;
BOOL isLatin1;
if (GSUnicode(chars, length, &isASCII, &isLatin1) != length)
{
RELEASE(self);
if (flag == YES && chars != 0)
{
NSZoneFree(NSZoneFromPointer(chars), chars);
}
return nil; // Invalid data
}
if (isASCII == YES
|| (internalEncoding == NSISOLatin1StringEncoding && isLatin1 == YES))
{
GSStr me;
/*
* OK ... we can do a more compact version
*/
me = (GSStr)NSAllocateObject(GSCInlineStringClass, length,
GSObjCZone(self));
me->_contents.c = (unsigned char*)&((GSCInlineString*)me)[1];
me->_count = length;
me->_flags.wide = 0;
me->_flags.free = 1;
while (length-- > 0)
{
me->_contents.c[length] = (unsigned char)chars[length];
}
RELEASE(self);
if (flag == YES && chars != 0)
{
NSZoneFree(NSZoneFromPointer(chars), chars);
}
return (id)me;
}
if (_contents.u != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.u = chars;
_flags.wide = 1;
if (flag == YES)
{
_flags.free = 1;
}
return self;
}
- (void) dealloc
{
if (_flags.free && _contents.u != 0)
@ -3366,51 +3259,6 @@ agree, create a new GSUnicodeInlineString otherwise.
@implementation GSUnicodeInlineString
- (id) initWithCharacters: (const unichar*)chars length: (unsigned)length
{
BOOL isASCII;
BOOL isLatin1;
if (GSUnicode(chars, length, &isASCII, &isLatin1) != length)
{
RELEASE(self);
return nil; // Invalid data
}
if (isASCII == YES
|| (internalEncoding == NSISOLatin1StringEncoding && isLatin1 == YES))
{
GSStr me;
/*
* OK ... we can do a more compact version
*/
me = (GSStr)NSAllocateObject(GSCInlineStringClass, length,
GSObjCZone(self));
me->_contents.c = (unsigned char*)&((GSCInlineString*)me)[1];
me->_count = length;
me->_flags.wide = 0;
me->_flags.free = 1;
while (length-- > 0)
{
me->_contents.c[length] = (unsigned char)chars[length];
}
RELEASE(self);
return (id)me;
}
if (_contents.u != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.u = (unichar*)&((GSUnicodeInlineString*)self)[1];
if (_count > 0)
memcpy(_contents.u, chars, length*sizeof(unichar));
_flags.wide = 1;
_flags.free = 1;
return self;
}
- (void) dealloc
{
NSDeallocateObject(self);
@ -3420,33 +3268,24 @@ agree, create a new GSUnicodeInlineString otherwise.
@implementation GSUnicodeSubString
- (id) initWithCharacters: (unichar *)chars length: (unsigned)length
fromParent: (GSUnicodeString *)parent
{
if (_contents.u != 0)
{
[NSException raise: NSInternalInconsistencyException
format: @"re-initialisation of string"];
}
_count = length;
_contents.u = chars;
_flags.wide = 1;
_flags.free = 1;
ASSIGN(_parent, parent);
return self;
}
/*
* Assume that a copy should be a new string, never just a retained substring.
*/
- (id) copyWithZone: (NSZone*)z
{
NSString *obj;
struct {
@defs(GSUnicodeInlineString)
} *o;
obj = (NSString*)NSAllocateObject(GSUnicodeInlineStringClass,
_count*sizeof(unichar), z);
obj = [obj initWithCharacters: _contents.u length: _count];
return obj;
o = (typeof(o))NSAllocateObject(GSUnicodeInlineStringClass,
_count * sizeof(unichar), z);
o->_contents.u = (unichar*)&o[1];
o->_count = _count;
memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar));
o->_flags.wide = 1;
o->_flags.free = 0;
return (id)o;
}
- (void) dealloc
@ -3552,29 +3391,35 @@ agree, create a new GSUnicodeInlineString otherwise.
- (id) copyWithZone: (NSZone*)z
{
GSMutableString *copy;
if (_flags.wide == 1)
{
copy = (GSMutableString*)NSAllocateObject(GSUnicodeInlineStringClass,
_count*sizeof(unichar), z);
copy->_contents.u = (unichar*)&((GSUnicodeInlineString*)copy)[1];
copy->_count = _count;
copy->_flags.wide = 1;
copy->_flags.free = 0;
memcpy(copy->_contents.u, _contents.u, _count * sizeof(unichar));
struct {
@defs(GSUnicodeInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSUnicodeInlineStringClass,
_count * sizeof(unichar), z);
o->_contents.u = (unichar*)&o[1];
o->_count = _count;
memcpy(o->_contents.u, _contents.u, _count * sizeof(unichar));
o->_flags.wide = 1;
o->_flags.free = 0;
return (id)o;
}
else
{
copy = (GSMutableString*)NSAllocateObject(GSCInlineStringClass,
_count, z);
copy->_contents.c = (unsigned char*)&((GSCInlineString*)copy)[1];
copy->_count = _count;
copy->_flags.wide = 0;
copy->_flags.free = 0;
memcpy(copy->_contents.c, _contents.c, _count);
struct {
@defs(GSCInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSCInlineStringClass, _count, z);
o->_contents.c = (unsigned char*)&o[1];
o->_count = _count;
memcpy(o->_contents.c, _contents.c, _count);
o->_flags.wide = 0;
o->_flags.free = 0;
return (id)o;
}
return copy;
}
- (const char *) cString
@ -3886,21 +3731,17 @@ agree, create a new GSUnicodeInlineString otherwise.
}
}
- (id) initWithBytesNoCopy: (const void*)bytes
- (id) initWithBytesNoCopy: (void*)bytes
length: (unsigned int)length
encoding: (NSStringEncoding)encoding
freeWhenDone: (BOOL)flag
{
/*
* We can't use a 'const void*' as our buffer because we are going to
* modify it ... so we do a copy anyway and free the original if needed.
*/
self = [self initWithBytes: bytes
length: length
encoding: encoding];
if (flag == YES && bytes != 0)
{
NSZoneFree(NSZoneFromPointer((void*)bytes), (void*)bytes);
NSZoneFree(NSZoneFromPointer(bytes), bytes);
}
return self;
}
@ -4046,9 +3887,11 @@ agree, create a new GSUnicodeInlineString otherwise.
NSDefaultMallocZone());
if (_flags.wide == 1)
obj = [obj initWithCharacters: _contents.u length: _count];
obj = [obj initWithBytes: (void*)_contents.u
length: _count * sizeof(unichar)
encoding: NSUnicodeStringEncoding];
else
obj = [obj initWithBytes: (char*)_contents.c
obj = [obj initWithBytes: (void*)_contents.c
length: _count
encoding: internalEncoding];
return obj;
@ -4061,7 +3904,9 @@ agree, create a new GSUnicodeInlineString otherwise.
obj = (GSMutableString*)NSAllocateObject(GSMutableStringClass, 0, z);
if (_flags.wide == 1)
obj = [obj initWithCharacters: _contents.u length: _count];
obj = [obj initWithBytes: (void*)_contents.u
length: _count * sizeof(unichar)
encoding: NSUnicodeStringEncoding];
else
obj = [obj initWithBytes: (char*)_contents.c
length: _count
@ -4279,52 +4124,76 @@ agree, create a new GSUnicodeInlineString otherwise.
- (NSString*) substringFromRange: (NSRange)aRange
{
NSString *sub;
GS_RANGE_CHECK(aRange, _count);
if (_flags.wide == 1)
{
sub = (NSString*)NSAllocateObject(GSUnicodeInlineStringClass,
_count*sizeof(unichar), NSDefaultMallocZone());
sub = [sub initWithCharacters: self->_contents.u + aRange.location
length: aRange.length];
struct {
@defs(GSUnicodeInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSUnicodeInlineStringClass,
aRange.length * sizeof(unichar), NSDefaultMallocZone());
o->_contents.u = (unichar*)&o[1];
o->_count = aRange.length;
memcpy(o->_contents.u, _contents.u + aRange.location,
aRange.length * sizeof(unichar));
o->_flags.wide = 1;
o->_flags.free = 0;
return AUTORELEASE((id)o);
}
else
{
sub = (NSString*)NSAllocateObject(GSCInlineStringClass,
_count, NSDefaultMallocZone());
sub = [sub initWithCString: (char*)self->_contents.c + aRange.location
length: aRange.length];
struct {
@defs(GSCInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSCInlineStringClass,
aRange.length, NSDefaultMallocZone());
o->_contents.c = (unsigned char*)&o[1];
o->_count = aRange.length;
memcpy(o->_contents.c, _contents.c + aRange.location, aRange.length);
o->_flags.wide = 0;
o->_flags.free = 0;
return AUTORELEASE((id)o);
}
AUTORELEASE(sub);
return sub;
}
- (NSString*) substringWithRange: (NSRange)aRange
{
NSString *sub;
GS_RANGE_CHECK(aRange, _count);
if (_flags.wide == 1)
{
sub = (NSString*)NSAllocateObject(GSUnicodeInlineStringClass,
(aRange.length)*sizeof(unichar),
NSDefaultMallocZone());
sub = [sub initWithCharacters: self->_contents.u + aRange.location
length: aRange.length];
struct {
@defs(GSUnicodeInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSUnicodeInlineStringClass,
aRange.length * sizeof(unichar), NSDefaultMallocZone());
o->_contents.u = (unichar*)&o[1];
o->_count = aRange.length;
memcpy(o->_contents.u, _contents.u + aRange.location,
aRange.length * sizeof(unichar));
o->_flags.wide = 1;
o->_flags.free = 0;
return AUTORELEASE((id)o);
}
else
{
sub = (NSString*)NSAllocateObject(GSCInlineStringClass,
aRange.length,
NSDefaultMallocZone());
sub = [sub initWithCString: (char*)self->_contents.c + aRange.location
length: aRange.length];
struct {
@defs(GSCInlineString)
} *o;
o = (typeof(o))NSAllocateObject(GSCInlineStringClass,
aRange.length, NSDefaultMallocZone());
o->_contents.c = (unsigned char*)&o[1];
o->_count = aRange.length;
memcpy(o->_contents.c, _contents.c + aRange.location, aRange.length);
o->_flags.wide = 0;
o->_flags.free = 0;
return AUTORELEASE((id)o);
}
AUTORELEASE(sub);
return sub;
}
// private method for Unicode level 3 implementation
@ -4763,7 +4632,7 @@ agree, create a new GSUnicodeInlineString otherwise.
*/
#define _self ((GSStr)self)
- (id) initWithBytes: (void*)bytes
- (id) initWithBytes: (const void*)bytes
length: (unsigned int)length
encoding: (NSStringEncoding)encoding
{
@ -4973,134 +4842,6 @@ agree, create a new GSUnicodeInlineString otherwise.
@end
/*
* Some classes for backward compatibility with archives.
*/
@interface NSGCString : NSString
@end
@implementation NSGCString
- (id) initWithCoder: (NSCoder*)aCoder
{
unsigned count;
NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class]));
RELEASE(self);
self = (id)NSAllocateObject(GSCBufferStringClass, 0, NSDefaultMallocZone());
[aCoder decodeValueOfObjCType: @encode(unsigned) at: &count];
if (count > 0)
{
unsigned char *chars;
chars = NSZoneMalloc(NSDefaultMallocZone(), count+1);
[aCoder decodeArrayOfObjCType: @encode(unsigned char)
count: count
at: chars];
self = [self initWithCStringNoCopy: (char*)chars
length: count
freeWhenDone: YES];
}
else
{
self = [self initWithCStringNoCopy: (char*)0 length: 0 freeWhenDone: NO];
}
return self;
}
@end
@interface NSGMutableCString : NSMutableString
@end
@implementation NSGMutableCString
- (id) initWithCoder: (NSCoder*)aCoder
{
unsigned count;
NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class]));
RELEASE(self);
self = (id)NSAllocateObject(GSMutableStringClass, 0, NSDefaultMallocZone());
[aCoder decodeValueOfObjCType: @encode(unsigned) at: &count];
if (count > 0)
{
unsigned char *chars;
chars = NSZoneMalloc(NSDefaultMallocZone(), count+1);
[aCoder decodeArrayOfObjCType: @encode(unsigned char)
count: count
at: chars];
self = [self initWithCStringNoCopy: (char*)chars
length: count
freeWhenDone: YES];
}
else
{
self = [self initWithCStringNoCopy: (char*)0 length: 0 freeWhenDone: NO];
}
return self;
}
@end
@interface NSGString : NSString
@end
@implementation NSGString
- (id) initWithCoder: (NSCoder*)aCoder
{
unsigned count;
NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class]));
RELEASE(self);
self = (id)NSAllocateObject(GSUnicodeBufferStringClass, 0, NSDefaultMallocZone());
[aCoder decodeValueOfObjCType: @encode(unsigned) at: &count];
if (count > 0)
{
unichar *chars;
chars = NSZoneMalloc(NSDefaultMallocZone(), count*sizeof(unichar));
[aCoder decodeArrayOfObjCType: @encode(unichar)
count: count
at: chars];
self = [self initWithCharactersNoCopy: chars
length: count
freeWhenDone: YES];
}
else
{
self = [self initWithCharactersNoCopy: 0 length: 0 freeWhenDone: NO];
}
return self;
}
@end
@interface NSGMutableString : NSMutableString
@end
@implementation NSGMutableString
- (id) initWithCoder: (NSCoder*)aCoder
{
unsigned count;
NSLog(@"Warning - decoding archive containing obsolete %@ object - please delete/replace this archive", NSStringFromClass([self class]));
RELEASE(self);
self = (id)NSAllocateObject(GSMutableStringClass, 0, NSDefaultMallocZone());
[aCoder decodeValueOfObjCType: @encode(unsigned) at: &count];
if (count > 0)
{
unichar *chars;
chars = NSZoneMalloc(NSDefaultMallocZone(), count*sizeof(unichar));
[aCoder decodeArrayOfObjCType: @encode(unichar)
count: count
at: chars];
self = [self initWithCharactersNoCopy: chars
length: count
freeWhenDone: YES];
}
else
{
self = [self initWithCharactersNoCopy: 0 length: 0 freeWhenDone: NO];
}
return self;
}
@end
/**
* Append characters to a string.
*/

View file

@ -18,7 +18,8 @@
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA.
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02111 USA.
<title>NSSerializer class reference</title>
$Date$ $Revision$
@ -52,17 +53,6 @@
@class GSMutableArray;
@interface GSMutableArray : NSObject // Help the compiler
@end
@class GSCString;
@interface GSCString : NSObject // Help the compiler
@end
@class GSCBufferString;
@interface GSCBufferString : NSObject // Help the compiler
@end
@class GSUnicodeString;
@class GSUnicodeBufferString;
@interface GSUnicodeBufferString : NSObject // Help the compiler
@end
@class GSMutableString;
/*
* Setup for inline operation of string map tables.
@ -123,8 +113,6 @@ static Class DataClass = 0;
static Class DateClass = 0;
static Class DictionaryClass = 0;
static Class MutableDictionaryClass = 0;
static Class CStringClass = 0;
static Class MStringClass = 0;
static Class StringClass = 0;
static Class NumberClass = 0;
@ -196,8 +184,7 @@ serializeToInfo(id object, _NSSerializerInfo* info)
}
c = GSObjCClass(object);
if ((GSObjCIsKindOf(c, CStringClass)
|| (c == MStringClass && ((ivars)object)->_flags.wide == 0))
if (GSObjCIsKindOf(c, StringClass)
/*
We can only save it as a c-string if it only contains ASCII characters.
Other characters might be decoded incorrectly when deserialized since
@ -381,8 +368,6 @@ static BOOL shouldBeCompact = NO;
DictionaryClass = [NSDictionary class];
MutableDictionaryClass = [NSMutableDictionary class];
StringClass = [NSString class];
CStringClass = [GSCString class];
MStringClass = [GSMutableString class];
}
}
@ -452,8 +437,6 @@ static BOOL uniquing = NO; /* Make incoming strings unique */
static Class MACls = 0; /* Mutable Array */
static Class DCls = 0; /* Data */
static Class MDCls = 0; /* Mutable Dictionary */
static Class USCls = 0; /* Unicode String */
static Class CSCls = 0; /* C String */
typedef struct {
NSData *data;
@ -467,15 +450,11 @@ typedef struct {
static SEL debSel;
static SEL deiSel;
static SEL csInitSel;
static SEL usInitSel;
static SEL dInitSel;
static SEL maInitSel;
static SEL mdInitSel;
static SEL maAddSel;
static SEL mdSetSel;
static IMP csInitImp;
static IMP usInitImp;
static IMP dInitImp;
static IMP maInitImp;
static IMP mdInitImp;
@ -564,15 +543,16 @@ deserializeFromInfo(_NSDeserializerInfo* info)
case ST_CSTRING:
{
GSCString *s;
NSString *s;
char *b;
size = (*info->deiImp)(info->data, deiSel, info->cursor);
b = NSZoneMalloc(NSDefaultMallocZone(), size);
(*info->debImp)(info->data, debSel, b, size, info->cursor);
s = (GSCString*)NSAllocateObject(CSCls, 0, NSDefaultMallocZone());
s = (*csInitImp)(s, csInitSel, b, size-1, YES);
s = [[StringClass alloc] initWithBytesNoCopy: b
length: size - 1
encoding: NSASCIIStringEncoding
freeWhenDone: YES];
/*
* If we are supposed to be doing uniquing of strings, handle it.
*/
@ -596,41 +576,15 @@ deserializeFromInfo(_NSDeserializerInfo* info)
{
NSString *s;
unichar *b;
unsigned i;
size = (*info->deiImp)(info->data, deiSel, info->cursor);
b = NSZoneMalloc(NSDefaultMallocZone(), size*sizeof(unichar));
(*info->debImp)(info->data, debSel, b, size*sizeof(unichar),
info->cursor);
/*
* Check to see if this really IS unicode ... if not, use a cString
*/
for (i = 0; i < size; i++)
{
if (b[i] > 127)
{
break;
}
}
if (i == size)
{
char *p = (char*)b;
for (i = 0; i < size; i++)
{
p[i] = (char)b[i];
}
p = NSZoneRealloc(NSDefaultMallocZone(), b, size);
s = (NSString*)NSAllocateObject(CSCls, 0, NSDefaultMallocZone());
s = (*csInitImp)(s, csInitSel, p, size, YES);
}
else
{
s = (NSString*)NSAllocateObject(USCls, 0, NSDefaultMallocZone());
s = (*usInitImp)(s, usInitSel, b, size, YES);
}
s = [[StringClass alloc] initWithBytesNoCopy: b
length: size*sizeof(unichar)
encoding: NSUnicodeStringEncoding
freeWhenDone: YES];
/*
* If we are supposed to be doing uniquing of strings, handle it.
*/
@ -857,8 +811,6 @@ deserializeFromInfo(_NSDeserializerInfo* info)
{
debSel = @selector(deserializeBytes:length:atCursor:);
deiSel = @selector(deserializeIntAtCursor:);
csInitSel = @selector(initWithCStringNoCopy:length:freeWhenDone:);
usInitSel = @selector(initWithCharactersNoCopy:length:freeWhenDone:);
dInitSel = @selector(initWithBytesNoCopy:length:);
maInitSel = @selector(initWithCapacity:);
mdInitSel = @selector(initWithCapacity:);
@ -867,15 +819,12 @@ deserializeFromInfo(_NSDeserializerInfo* info)
MACls = [GSMutableArray class];
DCls = [NSDataMalloc class];
MDCls = [GSMutableDictionary class];
USCls = [GSUnicodeBufferString class];
CSCls = [GSCBufferString class];
csInitImp = [CSCls instanceMethodForSelector: csInitSel];
usInitImp = [USCls instanceMethodForSelector: usInitSel];
dInitImp = [DCls instanceMethodForSelector: dInitSel];
maInitImp = [MACls instanceMethodForSelector: maInitSel];
mdInitImp = [MDCls instanceMethodForSelector: mdInitSel];
maAddImp = [MACls instanceMethodForSelector: maAddSel];
mdSetImp = [MDCls instanceMethodForSelector: mdSetSel];
StringClass = [NSString class];
}
}