diff --git a/src/port.c b/src/port.c index f7b7414159b8a7159538fac543b2b19ef531968e..4ec365daa662e301b2d3765d313110f92e370a4d 100644 --- a/src/port.c +++ b/src/port.c @@ -577,16 +577,27 @@ int VFPRINTF(FILE *f,char *s,va_list args) #if defined(DEBUG) && !defined(HANDLES_UNALIGNED_MEMORY_ACCESS) unsigned INT16 EXTRACT_UWORD(unsigned char *p) { - return (EXTRACT_UCHAR(p)<<8) + EXTRACT_UCHAR(p+1); + unsigned INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + return a; } INT16 EXTRACT_WORD(unsigned char *p) { - return (EXTRACT_CHAR(p)<<8) | EXTRACT_UCHAR(p+1); + INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + return a; } INT32 EXTRACT_INT(unsigned char *p) { - return (EXTRACT_WORD(p)<<16) | EXTRACT_UWORD(p+2); + INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + ((unsigned char *)&a)[2]=p[2]; + ((unsigned char *)&a)[3]=p[3]; + return a; } #endif diff --git a/src/port.h b/src/port.h index d956ae9a1d93539c289b87a14f436ad88d2a300c..f00de8a1794e4cbd83c016ffa6e465a7fda6c4ec 100644 --- a/src/port.h +++ b/src/port.h @@ -142,17 +142,28 @@ INT32 EXTRACT_INT(unsigned char *p); #else static INLINE unsigned INT16 EXTRACT_UWORD(unsigned char *p) { - return (EXTRACT_UCHAR(p)<<8) + EXTRACT_UCHAR(p+1); + unsigned INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + return a; } static INLINE INT16 EXTRACT_WORD(unsigned char *p) { - return (EXTRACT_CHAR(p)<<8) | EXTRACT_UCHAR(p+1); + INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + return a; } static INLINE INT32 EXTRACT_INT(unsigned char *p) { - return (EXTRACT_WORD(p)<<16) | EXTRACT_UWORD(p+2); + INT16 a; + ((unsigned char *)&a)[0]=p[0]; + ((unsigned char *)&a)[1]=p[1]; + ((unsigned char *)&a)[2]=p[2]; + ((unsigned char *)&a)[3]=p[3]; + return a; } #endif #endif