From feccda75ecb5617a8440e0d614062178a228c3c0 Mon Sep 17 00:00:00 2001 From: Andrew McCallum Date: Fri, 31 May 1996 14:22:25 +0000 Subject: [PATCH] (WRITE_SIGNED_TYPE): Avoid alignment errors by using memcpy() instead of trying to assign to (_TYPE*)(BUFFER+1). (WRITE_UNSIGNED_TYPE): Likewise. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@1595 72102866-910b-0410-8b05-ffd578937521 --- Source/BinaryCStream.m | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Source/BinaryCStream.m b/Source/BinaryCStream.m index fe7544b90..7f469e5d9 100644 --- a/Source/BinaryCStream.m +++ b/Source/BinaryCStream.m @@ -106,20 +106,23 @@ static int debug_binary_coder = 0; [stream writeByte: *type]; -#define WRITE_SIGNED_TYPE(_PTR, _TYPE, _CONV_FUNC) \ - { \ - char buffer[1+sizeof(_TYPE)]; \ - buffer[0] = sizeof (_TYPE); \ - if (*(_TYPE*)_PTR < 0) \ - { \ - buffer[0] |= 0x80; \ - *(_TYPE*)(buffer+1) = _CONV_FUNC (- *(_TYPE*)_PTR); \ - } \ - else \ - { \ - *(_TYPE*)(buffer+1) = _CONV_FUNC (*(_TYPE*)_PTR); \ - } \ - [stream writeBytes: buffer length: 1+sizeof(_TYPE)]; \ +#define WRITE_SIGNED_TYPE(_PTR, _TYPE, _CONV_FUNC) \ + { \ + _TYPE tmp; \ + char buffer[1+sizeof(_TYPE)]; \ + buffer[0] = sizeof (_TYPE); \ + if (*(_TYPE*)_PTR < 0) \ + { \ + buffer[0] |= 0x80; \ + tmp = _CONV_FUNC (- *(_TYPE*)_PTR); \ + memcpy (buffer+1, &tmp, sizeof(_TYPE)); \ + } \ + else \ + { \ + tmp = _CONV_FUNC (*(_TYPE*)_PTR); \ + memcpy (buffer+1, &tmp, sizeof(_TYPE)); \ + } \ + [stream writeBytes: buffer length: 1+sizeof(_TYPE)]; \ } #define READ_SIGNED_TYPE(_PTR, _TYPE, _CONV_FUNC) \ @@ -145,9 +148,11 @@ static int debug_binary_coder = 0; #define WRITE_UNSIGNED_TYPE(_PTR, _TYPE, _CONV_FUNC) \ { \ + _TYPE tmp; \ char buffer[1+sizeof(_TYPE)]; \ buffer[0] = sizeof (_TYPE); \ - *(_TYPE*)(buffer+1) = _CONV_FUNC (*(_TYPE*)_PTR); \ + tmp = _CONV_FUNC (*(_TYPE*)_PTR); \ + memcpy (buffer+1, &tmp, sizeof(_TYPE)); \ [stream writeBytes: buffer length: (1+sizeof(_TYPE))]; \ }