From ac7eae44144e812114d62579fe60dbb5d9bcbcbd Mon Sep 17 00:00:00 2001 From: fedor Date: Fri, 11 May 2001 15:23:24 +0000 Subject: [PATCH] Fix portability of [un]signed char encodings git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@9921 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 14 ++++++++++++++ Source/GSTemplateValue.m | 2 +- Source/GSValue.m | 4 ++-- Source/NSArchiver.m | 2 +- Source/NSConcreteNumber.m | 2 +- Source/NSNumber.m | 4 ++-- Source/NSPortCoder.m | 11 +++++++++-- Source/NSUnarchiver.m | 9 ++++++++- Source/NSValue.m | 6 +++--- 9 files changed, 41 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75d50feb8..aea743879 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2001-05-11 Adam Fedor + + * Source/NSArchiver.m ([NSArchiver -encodeValueOfObjCType:at:]): Use + signed char to encode _C_CHR. + * Source/NSPortCoder.m ([NSPortCoder -decodeValueOfObjCType:at:]): + Be lenient about decoding [un]signed chars. + * Source/NSUnarchiver.m: Likewise. + * Source/GSTemplateValue.m (-encodeWithCoder:): Use signed char to + encode/decode type info. + * Source/GSValue.m: Likewise. + * Source/NSConcreteNumber.m: Likewise. + * Source/NSNumber.m: Likewise. + * Source/NSValue.m: Likewise. + 2001-05-10 Richard Frith-Macdonald * Source/NSConnection.m: Use respondsToSelector rather than respondsTo diff --git a/Source/GSTemplateValue.m b/Source/GSTemplateValue.m index d3c7564c7..3da125b1b 100644 --- a/Source/GSTemplateValue.m +++ b/Source/GSTemplateValue.m @@ -255,7 +255,7 @@ const char *objctype = @encode(TYPE_NAME); unsigned size = strlen(objctype)+1; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; - [coder encodeArrayOfObjCType: @encode(char) count: size at: objctype]; + [coder encodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; [coder encodeValueOfObjCType: @encode(TYPE_NAME) at: &data]; #endif } diff --git a/Source/GSValue.m b/Source/GSValue.m index 2b27adb05..c7b70a13f 100644 --- a/Source/GSValue.m +++ b/Source/GSValue.m @@ -248,7 +248,7 @@ typeSize(const char* type) size = strlen(objctype)+1; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; - [coder encodeArrayOfObjCType: @encode(char) count: size at: objctype]; + [coder encodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; size = (unsigned)typeSize(objctype); [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; [coder encodeArrayOfObjCType: @encode(unsigned char) count: size at: data]; @@ -260,7 +260,7 @@ typeSize(const char* type) [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; objctype = (void *)NSZoneMalloc(GSObjCZone(self), size); - [coder decodeArrayOfObjCType: @encode(char) count: size at: objctype]; + [coder decodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; data = (void *)NSZoneMalloc(GSObjCZone(self), size); [coder decodeArrayOfObjCType: @encode(unsigned char) count: size at: data]; diff --git a/Source/NSArchiver.m b/Source/NSArchiver.m index 67460e9d9..c60a1a9a7 100644 --- a/Source/NSArchiver.m +++ b/Source/NSArchiver.m @@ -518,7 +518,7 @@ static Class NSMutableDataMallocClass; case _C_CHR: (*_tagImp)(_dst, tagSel, _GSC_CHR); - (*_serImp)(_dst, serSel, (void*)buf, @encode(char), nil); + (*_serImp)(_dst, serSel, (void*)buf, @encode(signed char), nil); return; case _C_UCHR: diff --git a/Source/NSConcreteNumber.m b/Source/NSConcreteNumber.m index 3149b09d1..ccd02e0d4 100644 --- a/Source/NSConcreteNumber.m +++ b/Source/NSConcreteNumber.m @@ -447,7 +447,7 @@ { const char *t = @encode(TYPE_TYPE); - [coder encodeValueOfObjCType: @encode(char) at: t]; + [coder encodeValueOfObjCType: @encode(signed char) at: t]; [coder encodeValueOfObjCType: t at: &data]; } diff --git a/Source/NSNumber.m b/Source/NSNumber.m index f434bd393..e9aa146b9 100644 --- a/Source/NSNumber.m +++ b/Source/NSNumber.m @@ -2274,7 +2274,7 @@ static Class doubleNumberClass; { const char *t = [self objCType]; - [coder encodeValueOfObjCType: @encode(char) at: t]; + [coder encodeValueOfObjCType: @encode(signed char) at: t]; [coder encodeValueOfObjCType: t at: [self pointerValue]]; } @@ -2296,7 +2296,7 @@ static Class doubleNumberClass; double d; } data; - [coder decodeValueOfObjCType: @encode(char) at: t]; + [coder decodeValueOfObjCType: @encode(signed char) at: t]; t[1] = '\0'; [coder decodeValueOfObjCType: t at: &data]; switch (*t) diff --git a/Source/NSPortCoder.m b/Source/NSPortCoder.m index 035fa22af..dd282c022 100644 --- a/Source/NSPortCoder.m +++ b/Source/NSPortCoder.m @@ -835,7 +835,14 @@ static IMP _xRefImp; /* Serialize a crossref. */ case _GSC_CHR: case _GSC_UCHR: - typeCheck(*type, info & _GSC_MASK); + /* Encoding of chars is not consistant across platforms, so we + loosen the type checking a little */ + if (*type != type_map[_GSC_CHR] && *type != type_map[_GSC_UCHR]) + { + [NSException raise: NSInternalInconsistencyException + format: @"expected %s and got %s", + typeToName1(*type), typeToName2(info)]; + } (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil); return; @@ -1559,7 +1566,7 @@ static IMP _xRefImp; /* Serialize a crossref. */ case _C_CHR: (*_eTagImp)(_dst, eTagSel, _GSC_CHR); - (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(char), nil); + (*_eSerImp)(_dst, eSerSel, (void*)buf, @encode(signed char), nil); return; case _C_UCHR: diff --git a/Source/NSUnarchiver.m b/Source/NSUnarchiver.m index 18cafd3f7..031fc386b 100644 --- a/Source/NSUnarchiver.m +++ b/Source/NSUnarchiver.m @@ -795,7 +795,14 @@ static Class NSDataMallocClass; case _GSC_CHR: case _GSC_UCHR: - typeCheck(*type, info & _GSC_MASK); + /* Encoding of chars is not consistant across platforms, so we + loosen the type checking a little */ + if (*type != type_map[_GSC_CHR] && *type != type_map[_GSC_UCHR]) + { + [NSException raise: NSInternalInconsistencyException + format: @"expected %s and got %s", + typeToName1(*type), typeToName2(info)]; + } (*desImp)(src, desSel, address, type, &cursor, nil); return; diff --git a/Source/NSValue.m b/Source/NSValue.m index da4afa446..b5b7f35ab 100644 --- a/Source/NSValue.m +++ b/Source/NSValue.m @@ -366,7 +366,7 @@ static NSLock *placeholderLock; size = strlen(objctype)+1; [coder encodeValueOfObjCType: @encode(unsigned) at: &size]; - [coder encodeArrayOfObjCType: @encode(char) count: size at: objctype]; + [coder encodeArrayOfObjCType: @encode(signed char) count: size at: objctype]; size = objc_sizeof_type(objctype); data = (void *)NSZoneMalloc(GSObjCZone(self), size); [self getValue: (void*)data]; @@ -384,7 +384,7 @@ static NSLock *placeholderLock; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; objctype = (void*)NSZoneMalloc(NSDefaultMallocZone(), size); - [coder decodeArrayOfObjCType: @encode(char) count: size at: (void*)objctype]; + [coder decodeArrayOfObjCType: @encode(signed char) count: size at: (void*)objctype]; c = [abstractClass valueClassWithObjCType: objctype]; o = [c alloc]; /* @@ -445,7 +445,7 @@ static NSLock *placeholderLock; [coder decodeValueOfObjCType: @encode(unsigned) at: &size]; objctype = (void*)NSZoneMalloc(NSDefaultMallocZone(), size); - [coder decodeArrayOfObjCType: @encode(char) count: size at: (void*)objctype]; + [coder decodeArrayOfObjCType: @encode(signed char) count: size at: (void*)objctype]; c = [abstractClass valueClassWithObjCType: objctype]; o = [c alloc]; /*