Author: rfm
Date: Thu Nov 10 12:31:33 2016
New Revision: 40209
URL: http://svn.gna.org/viewcvs/gnustep?rev=40209&view=rev
Log:
Additions ot last change
Modified:
libs/base/trunk/Source/NSPortCoder.m
Modified: libs/base/trunk/Source/NSPortCoder.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSPortCoder.m?rev=40209&r1=40208&r2=40209&view=diff
==============================================================================
--- libs/base/trunk/Source/NSPortCoder.m (original)
+++ libs/base/trunk/Source/NSPortCoder.m Thu Nov 10 12:31:33 2016
@@ -603,15 +603,6 @@
{
unsigned xref;
unsigned char info;
-#if GS_HAVE_I128
- gsu128 bigval;
-#else
-#if GS_HAVE_I64
- uint64_t bigval;
-#else
- uint32_t bigval;
-#endif
-#endif
(*_dTagImp)(_src, dTagSel, &info, &xref, &_cursor);
@@ -1065,98 +1056,188 @@
* whose natural size on this system is not the same as on the
* machine on which the archive was created.
*/
+{
+ uint8_t size;
+
+ /*
+ * We fall through to here only when we have to decode a value
+ * whose natural size on this system is not the same as on the
+ * machine on which the archive was created.
+ */
+
+ switch (*type)
+ {
+ case _C_SHT:
+ case _C_USHT: size = sizeof(short); break;
+ case _C_INT:
+ case _C_UINT: size = sizeof(int); break;
+ case _C_LNG:
+ case _C_ULNG: size = sizeof(long); break;
+ case _C_LNG_LNG:
+ case _C_ULNG_LNG: size = sizeof(long long); break;
+ default: size = 1;
+ }
/*
* First, we read the data and convert it to the largest size
* this system can support.
*/
- switch (info & _GSC_SIZE)
- {
- case _GSC_I16: /* Encoded as 16-bit */
- {
- uint16_t val;
-
- (*_dDesImp)(_src, dDesSel, &val, @encode(uint16_t), &_cursor, nil);
- bigval = val;
- break;
- }
-
- case _GSC_I32: /* Encoded as 32-bit */
- {
- uint32_t val;
-
- (*_dDesImp)(_src, dDesSel, &val, @encode(uint32_t), &_cursor, nil);
- bigval = val;
- break;
- }
-
- case _GSC_I64: /* Encoded as 64-bit */
- {
- uint64_t val;
-
- (*_dDesImp)(_src, dDesSel, &val, @encode(uint64_t), &_cursor, nil);
-#if GS_HAVE_I64
- bigval = val;
-#else
- bigval = GSSwapBigI64ToHost(val);
-#endif
- break;
- }
-
- default: /* A 128-bit value */
- {
- gsu128 val;
-
- (*_dDesImp)(_src, dDesSel, &val, @encode(gsu128), &_cursor, nil);
-#if GS_HAVE_I128
- bigval = val;
-#else
- val = GSSwapBigI128ToHost(val);
-#if GS_HAVE_I64
- bigval = *(uint64_t*)(void*)&val;
-#else
- bigval = *(uint32_t*)&val;
-#endif
-#endif
- break;
- }
- }
-
-/*
- * Now we copy from the 'bigval' to the destination location.
- */
- switch (info & _GSC_MASK)
- {
- case _GSC_SHT:
- *(short*)address = (short)bigval;
- return;
- case _GSC_USHT:
- *(unsigned short*)address = (unsigned short)bigval;
- return;
- case _GSC_INT:
- *(int*)address = (int)bigval;
- return;
- case _GSC_UINT:
- *(unsigned int*)address = (unsigned int)bigval;
- return;
- case _GSC_LNG:
- *(long*)address = (long)bigval;
- return;
- case _GSC_ULNG:
- *(unsigned long*)address = (unsigned long)bigval;
- return;
-#ifdef _C_LNG_LNG
- case _GSC_LNG_LNG:
- *(long long*)address = (long long)bigval;
- return;
- case _GSC_ULNG_LNG:
- *(unsigned long long*)address = (unsigned long long)bigval;
- return;
-#endif
- default:
- [NSException raise: NSInternalInconsistencyException
- format: @"type/size information error"];
- }
+ if (*type == _C_SHT
+ || *type == _C_INT
+ || *type == _C_LNG
+ || *type == _C_LNG_LNG)
+ {
+ int64_t big;
+
+ switch (info & _GSC_SIZE)
+ {
+ case _GSC_I16: /* Encoded as 16-bit */
+ {
+ int16_t val;
+
+ (*_dDesImp)(_src, dDesSel, &val, @encode(int16_t), &_cursor,
nil);
+ big = val;
+ break;
+ }
+
+ case _GSC_I32: /* Encoded as 32-bit */
+ {
+ int32_t val;
+
+ (*_dDesImp)(_src, dDesSel, &val, @encode(int32_t), &_cursor,
nil);
+ big = val;
+ break;
+ }
+
+ case _GSC_I64: /* Encoded as 64-bit */
+ {
+ (*_dDesImp)(_src, dDesSel, &big, @encode(int64_t), &_cursor,
nil);
+ break;
+ }
+
+ default: /* A 128-bit value */
+ {
+ big = 0;
+ [NSException raise: NSInternalInconsistencyException
+ format: @"Archiving of 128bit integer not allowed"];
+ }
+ }
+ /*
+ * Now we copy from the big value to the destination location.
+ */
+ switch (size)
+ {
+ case 1:
+ *(int8_t*)address = (int8_t)big;
+ if (big & ~0xff)
+ {
+ if ((int8_t)big >= 0 || (big & ~0xff) != ~0xff)
+ {
+ NSLog(@"Loss of information converting decoded value to
int8_t");
+ }
+ }
+ return;
+ case 2:
+ *(int16_t*)address = (int16_t)big;
+ if (big & ~0xffff)
+ {
+ if ((int16_t)big >= 0 || (big & ~0xffff) != ~0xffff)
+ {
+ NSLog(@"Loss of information converting decoded value to
int16_t");
+ }
+ }
+ return;
+ case 4:
+ *(int32_t*)address = (int32_t)big;
+ if (big & ~0xffffffff)
+ {
+ if ((int32_t)big >= 0 || (big & ~0xffffffff) != ~0xffffffff)
+ {
+ NSLog(@"Loss of information converting decoded value to
int32_t");
+ }
+ }
+ return;
+ case 8:
+ *(int64_t*)address = big;
+ return;
+ default:
+ [NSException raise: NSInternalInconsistencyException
+ format: @"type/size information error"];
+ }
+ }
+ else
+ {
+ uint64_t big;
+
+ switch (info & _GSC_SIZE)
+ {
+ case _GSC_I16: /* Encoded as 16-bit */
+ {
+ uint16_t val;
+
+ (*_dDesImp)(_src, dDesSel, &val, @encode(uint16_t), &_cursor,
nil);
+ big = val;
+ break;
+ }
+
+ case _GSC_I32: /* Encoded as 32-bit */
+ {
+ uint32_t val;
+
+ (*_dDesImp)(_src, dDesSel, &val, @encode(uint32_t), &_cursor,
nil);
+ big = val;
+ break;
+ }
+
+ case _GSC_I64: /* Encoded as 64-bit */
+ {
+ (*_dDesImp)(_src, dDesSel, &big, @encode(uint64_t), &_cursor,
nil);
+ break;
+ }
+
+ default: /* A 128-bit value */
+ {
+ big = 0;
+ [NSException raise: NSInternalInconsistencyException
+ format: @"Archiving of 128bit integer not allowed"];
+ }
+ }
+ /*
+ * Now we copy from the big value to the destination location.
+ */
+ switch (size)
+ {
+ case 1:
+ if (big & ~0xff)
+ {
+ NSLog(@"Loss of information converting decoded value to
uint8_t");
+ }
+ *(uint8_t*)address = (uint8_t)big;
+ return;
+ case 2:
+ if (big & ~0xffff)
+ {
+ NSLog(@"Loss of information converting decoded value to
uint16_t");
+ }
+ *(uint16_t*)address = (uint16_t)big;
+ return;
+ case 4:
+ if (big & ~0xffffffff)
+ {
+ NSLog(@"Loss of information converting decoded value to
uint32_t");
+ }
+ *(uint32_t*)address = (uint32_t)big;
+ return;
+ case 8:
+ *(uint64_t*)address = big;
+ return;
+ default:
+ [NSException raise: NSInternalInconsistencyException
+ format: @"type/size information error"];
+ }
+ }
+}
+
}
- (void) dispatch
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs