aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Ellcey <sje@cup.hp.com>2005-09-07 20:16:47 +0000
committerSteve Ellcey <sje@gcc.gnu.org>2005-09-07 20:16:47 +0000
commit98cd8256afa26fdcf4c4a7b01e4199fb47b2898d (patch)
tree1aba9950ba1a9a153cd920858aeac4426db8af55
parent9f36bc49f8e9af63c64536da3e6085274c842e5b (diff)
downloadgcc-98cd8256afa26fdcf4c4a7b01e4199fb47b2898d.zip
gcc-98cd8256afa26fdcf4c4a7b01e4199fb47b2898d.tar.gz
gcc-98cd8256afa26fdcf4c4a7b01e4199fb47b2898d.tar.bz2
re PR libfortran/23419 (unformatted complex I/O with kind=10)
PR libfortran/23419 * io/write.c (extract_int): Use memcpy to access buffer. (extract_uint): Ditto. (extract_real): Ditto. From-SVN: r104000
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/io/write.c84
2 files changed, 77 insertions, 14 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 8cc1a03..8b2bb62 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index 74d0f9f..da9feb3 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -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: