summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-02-03 21:51:42 +0000
committerDarkvater <Darkvater@openttd.org>2006-02-03 21:51:42 +0000
commite57ea5e57dea355ef86ff62089d505beae641c38 (patch)
treee7d2444a0b7e457cba604a7704ce886eb0a61612
parent144c1f39a484e5030f568cda41011791a3b5b104 (diff)
downloadopenttd-e57ea5e57dea355ef86ff62089d505beae641c38.tar.xz
(svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
-rw-r--r--gfx.c18
-rw-r--r--macros.h18
-rw-r--r--smallmap_gui.c2
-rw-r--r--stdafx.h11
-rw-r--r--strings.c4
5 files changed, 29 insertions, 24 deletions
diff --git a/gfx.c b/gfx.c
index 3ff96716b..f75183c40 100644
--- a/gfx.c
+++ b/gfx.c
@@ -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];
diff --git a/macros.h b/macros.h
index e3192c8b3..75a365d63 100644
--- a/macros.h
+++ b/macros.h
@@ -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)
diff --git a/stdafx.h b/stdafx.h
index 0589002a6..16933ab73 100644
--- a/stdafx.h
+++ b/stdafx.h
@@ -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); }
diff --git a/strings.c b/strings.c
index b68cd99dc..a1534da76 100644
--- a/strings.c
+++ b/strings.c
@@ -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