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
Gnustep-cvs@gna.org
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to