re PR libfortran/23419 (unformatted complex I/O with kind=10)
authorSteve Ellcey <sje@cup.hp.com>
Wed, 7 Sep 2005 20:16:47 +0000 (20:16 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Wed, 7 Sep 2005 20:16:47 +0000 (20:16 +0000)
PR libfortran/23419
* io/write.c (extract_int): Use memcpy to access buffer.
(extract_uint): Ditto.
(extract_real): Ditto.

From-SVN: r104000

libgfortran/ChangeLog
libgfortran/io/write.c

index 8cc1a03e70a78ae993e4043372b8f6a216f7229c..8b2bb625a468a1bde21eebdd3d5a7b4c7904be44 100644 (file)
@@ -1,3 +1,10 @@
+2005-09-07  Steve Ellcey  <sje@cup.hp.com>
+
+       PR libfortran/23419
+       * io/write.c (extract_int): Use memcpy to access buffer.
+       (extract_uint): Ditto.
+       (extract_real): Ditto.
+
 2005-09-05  Thomas Koenig  <Thomas.Koenig@online.de>
 
        * io/list_read.c:  Adjust size of of value to 32 (to hold
index 74d0f9fa0ad6caaa7eff40a05a06bc04d49b04c3..da9feb3e09e5099a1fd12476d2d490806c00ebf0 100644 (file)
@@ -79,20 +79,40 @@ extract_int (const void *p, int len)
   switch (len)
     {
     case 1:
-      i = *((const GFC_INTEGER_1 *) p);
+      {
+       GFC_INTEGER_1 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
     case 2:
-      i = *((const GFC_INTEGER_2 *) p);
+      {
+       GFC_INTEGER_2 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
     case 4:
-      i = *((const GFC_INTEGER_4 *) p);
+      {
+       GFC_INTEGER_4 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
     case 8:
-      i = *((const GFC_INTEGER_8 *) p);
+      {
+       GFC_INTEGER_8 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
 #ifdef HAVE_GFC_INTEGER_16
     case 16:
-      i = *((const GFC_INTEGER_16 *) p);
+      {
+       GFC_INTEGER_16 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
 #endif
     default:
@@ -113,20 +133,40 @@ extract_uint (const void *p, int len)
   switch (len)
     {
     case 1:
-      i = (GFC_UINTEGER_1) *((const GFC_INTEGER_1 *) p);
+      {
+       GFC_INTEGER_1 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = (GFC_UINTEGER_1) tmp;
+      }
       break;
     case 2:
-      i = (GFC_UINTEGER_2) *((const GFC_INTEGER_2 *) p);
+      {
+       GFC_INTEGER_2 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = (GFC_UINTEGER_2) tmp;
+      }
       break;
     case 4:
-      i = (GFC_UINTEGER_4) *((const GFC_INTEGER_4 *) p);
+      {
+       GFC_INTEGER_4 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = (GFC_UINTEGER_4) tmp;
+      }
       break;
     case 8:
-      i = (GFC_UINTEGER_8) *((const GFC_INTEGER_8 *) p);
+      {
+       GFC_INTEGER_8 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = (GFC_UINTEGER_8) tmp;
+      }
       break;
 #ifdef HAVE_GFC_INTEGER_16
     case 16:
-      i = (GFC_UINTEGER_16) *((const GFC_INTEGER_16 *) p);
+      {
+       GFC_INTEGER_16 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = (GFC_UINTEGER_16) tmp;
+      }
       break;
 #endif
     default:
@@ -143,19 +183,35 @@ extract_real (const void *p, int len)
   switch (len)
     {
     case 4:
-      i = *((const GFC_REAL_4 *) p);
+      {
+       GFC_REAL_4 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
     case 8:
-      i = *((const GFC_REAL_8 *) p);
+      {
+       GFC_REAL_8 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
 #ifdef HAVE_GFC_REAL_10
     case 10:
-      i = *((const GFC_REAL_10 *) p);
+      {
+       GFC_REAL_10 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
 #endif
 #ifdef HAVE_GFC_REAL_16
     case 16:
-      i = *((const GFC_REAL_16 *) p);
+      {
+       GFC_REAL_16 tmp;
+       memcpy ((void *) &tmp, p, len);
+       i = tmp;
+      }
       break;
 #endif
     default: