diff options
author | Darkvater <darkvater@openttd.org> | 2006-02-03 21:51:42 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2006-02-03 21:51:42 +0000 |
commit | c5a669b39f6a78ee3ed0b819dd9bc5985cbb2c18 (patch) | |
tree | e7d2444a0b7e457cba604a7704ce886eb0a61612 | |
parent | 6dd2affaad238c40e36d29593c9e8217966355f2 (diff) | |
download | openttd-c5a669b39f6a78ee3ed0b819dd9bc5985cbb2c18.tar.xz |
(svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
-rw-r--r-- | gfx.c | 18 | ||||
-rw-r--r-- | macros.h | 18 | ||||
-rw-r--r-- | smallmap_gui.c | 2 | ||||
-rw-r--r-- | stdafx.h | 11 | ||||
-rw-r--r-- | strings.c | 4 |
5 files changed, 29 insertions, 24 deletions
@@ -698,7 +698,7 @@ static void GfxBlitTileZoomIn(BlitterParams *bp) const byte* ctab; if (bp->mode & 1) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { @@ -741,7 +741,7 @@ static void GfxBlitTileZoomIn(BlitterParams *bp) bp->dst += bp->pitch; } while (--bp->height != 0); } else if (bp->mode & 2) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { done = src_o[0]; @@ -775,7 +775,7 @@ static void GfxBlitTileZoomIn(BlitterParams *bp) bp->dst += bp->pitch; } while (--bp->height != 0); } else { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { done = src_o[0]; @@ -900,7 +900,7 @@ static void GfxBlitTileZoomMedium(BlitterParams *bp) const byte* ctab; if (bp->mode & 1) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { done = src_o[0]; @@ -949,7 +949,7 @@ static void GfxBlitTileZoomMedium(BlitterParams *bp) } while (!(done & 0x80)); } while (--bp->height != 0); } else if (bp->mode & 2) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { done = src_o[0]; @@ -994,7 +994,7 @@ static void GfxBlitTileZoomMedium(BlitterParams *bp) } while (!(done & 0x80)); } while (--bp->height != 0); } else { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); do { do { done = src_o[0]; @@ -1105,7 +1105,7 @@ static void GfxBlitTileZoomOut(BlitterParams *bp) const byte* ctab; if (bp->mode & 1) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); for (;;) { do { done = src_o[0]; @@ -1174,7 +1174,7 @@ static void GfxBlitTileZoomOut(BlitterParams *bp) if (--bp->height == 0) return; } } else if (bp->mode & 2) { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); for (;;) { do { done = src_o[0]; @@ -1239,7 +1239,7 @@ static void GfxBlitTileZoomOut(BlitterParams *bp) if (--bp->height == 0) return; } } else { - src_o += READ_LE_UINT16(src_o + bp->start_y * 2); + src_o += ReadLE16Aligned(src_o + bp->start_y * 2); for (;;) { do { done = src_o[0]; @@ -142,14 +142,20 @@ static inline void swap_int32(int32 *a, int32 *b) { int32 t = *a; *a = *b; *b = static inline void swap_tile(TileIndex *a, TileIndex *b) { TileIndex t = *a; *a = *b; *b = t; } +static inline uint16 ReadLE16Aligned(const void* x) +{ + return FROM_LE16(*(const uint16*)x); +} -#if defined(TTD_LITTLE_ENDIAN) -# define READ_LE_UINT16(b) (*(const uint16*)(b)) -#elif defined(TTD_BIG_ENDIAN) - static inline uint16 READ_LE_UINT16(const void *b) { - return ((const byte*)b)[0] + (((const byte*)b)[1] << 8); - } +static inline uint16 ReadLE16Unaligned(const void* x) +{ +#ifdef OTTD_ALIGNMENT + return ((const byte*)x)[0] | ((const byte*)x)[1] << 8; +#else + return FROM_LE16(*(const uint16*)x); #endif +} + /** * ROtate x Left/Right by n (must be >= 0) diff --git a/smallmap_gui.c b/smallmap_gui.c index 69bd6ab8d..0b3463c73 100644 --- a/smallmap_gui.c +++ b/smallmap_gui.c @@ -194,7 +194,7 @@ static const uint16 * const _legend_table[] = { _legend_industries_candy, }; -#if defined(TTD_ALIGNMENT_4) +#if defined(OTTD_ALIGNMENT) static inline void WRITE_PIXELS(Pixel* d, uint32 val) { # if defined(TTD_BIG_ENDIAN) @@ -82,8 +82,6 @@ # define CDECL # define NOT_REACHED() assert(0) # define GCC_PACK -# undef TTD_ALIGNMENT_4 -# undef TTD_ALIGNMENT_2 # include <malloc.h> #endif /* __WATCOMC__ */ @@ -133,8 +131,6 @@ # endif # endif /* _MSC_VER < 1300 */ -# undef TTD_ALIGNMENT_4 -# undef TTD_ALIGNMENT_2 # define GCC_PACK // This is needed to zlib uses the stdcall calling convention on visual studio, also used with libpng (VS6 warning) @@ -193,10 +189,13 @@ typedef unsigned char byte; typedef unsigned __int64 uint64; #endif /* __BEOS__ */ +#if defined(ARM) || defined(__arm__) +# define OTTD_ALIGNMENT +#endif + // Setup alignment and conversion macros #if defined(TTD_BIG_ENDIAN) -# define TTD_ALIGNMENT_2 -# define TTD_ALIGNMENT_4 +# define OTTD_ALIGNMENT static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); } static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); } static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); } @@ -500,7 +500,7 @@ static char *FormatString(char *buff, const char *str, const int32 *argv, uint c break; case 0x81: // {STRINL} - buff = GetStringWithArgs(buff, READ_LE_UINT16(str), argv); + buff = GetStringWithArgs(buff, ReadLE16Unaligned(str), argv); str += 2; break; case 0x82: // {DATE_LONG} @@ -1015,7 +1015,7 @@ bool ReadLanguagePack(int lang_index) #if defined(TTD_BIG_ENDIAN) for (i = 0; i != 32; i++) { - lang_pack->offsets[i] = READ_LE_UINT16(&lang_pack->offsets[i]); + lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]); } #endif |