From 63898f61b0ce4e321b5a7c39da2cfb5b16cfde5f Mon Sep 17 00:00:00 2001 From: Charles Pigott Date: Mon, 18 Jun 2018 21:21:45 +0100 Subject: Codechange: Rearrange struct packing defines and make MinGW use _Pragma pack style --- src/music/dmusic.cpp | 10 ++++------ src/os/windows/win32.cpp | 9 ++++----- src/screenshot.cpp | 11 ++--------- src/stdafx.h | 13 ++++++++++--- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index d48f51e85..56707a797 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -102,21 +102,19 @@ private: bool ReadDLSWave(FILE *f, DWORD list_length, long offset); }; -#pragma pack(2) /** A RIFF chunk header. */ -struct ChunkHeader { +PACK_N(struct ChunkHeader { FOURCC type; ///< Chunk type. DWORD length; ///< Length of the chunk, not including the chunk header itself. -}; +}, 2); /** Buffer format for a DLS wave download. */ -struct WAVE_DOWNLOAD { +PACK_N(struct WAVE_DOWNLOAD { DMUS_DOWNLOADINFO dlInfo; ULONG ulOffsetTable[2]; DMUS_WAVE dmWave; DMUS_WAVEDATA dmWaveData; -}; -#pragma pack() +}, 2); struct PlaybackSegment { uint32 start, end; diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 2d853037f..59b2fccac 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -805,16 +805,15 @@ int OTTDStringCompare(const char *s1, const char *s2) } #ifdef _MSC_VER -/* Code from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */ +/* Based on code from MSDN: https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */ const DWORD MS_VC_EXCEPTION = 0x406D1388; -#pragma pack(push,8) -typedef struct { + +PACK_N(struct THREADNAME_INFO { DWORD dwType; ///< Must be 0x1000. LPCSTR szName; ///< Pointer to name (in user addr space). DWORD dwThreadID; ///< Thread ID (-1=caller thread). DWORD dwFlags; ///< Reserved for future use, must be zero. -} THREADNAME_INFO; -#pragma pack(pop) +}, 8); /** * Signal thread name to any attached debuggers. diff --git a/src/screenshot.cpp b/src/screenshot.cpp index a24cc6b21..1e7a45645 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -71,23 +71,16 @@ struct ScreenshotFormat { /************************************************* **** SCREENSHOT CODE FOR WINDOWS BITMAP (.BMP) *************************************************/ -#if defined(_MSC_VER) || defined(__WATCOMC__) -#pragma pack(push, 1) -#endif /** BMP File Header (stored in little endian) */ -struct BitmapFileHeader { +PACK(struct BitmapFileHeader { uint16 type; uint32 size; uint32 reserved; uint32 off_bits; -} GCC_PACK; +}); assert_compile(sizeof(BitmapFileHeader) == 14); -#if defined(_MSC_VER) || defined(__WATCOMC__) -#pragma pack(pop) -#endif - /** BMP Info Header (stored in little endian) */ struct BitmapInfoHeader { uint32 size; diff --git a/src/stdafx.h b/src/stdafx.h index 621b1f61d..54709d151 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -133,7 +133,6 @@ #define NORETURN __attribute__ ((noreturn)) #define CDECL #define __int64 long long - #define GCC_PACK __attribute__((packed)) /* Warn about functions using 'printf' format syntax. First argument determines which parameter * is the format string, second argument is start of values passed to printf. */ #define WARN_FORMAT(string, args) __attribute__ ((format (printf, string, args))) @@ -158,7 +157,6 @@ #if defined(__WATCOMC__) #define NORETURN #define CDECL - #define GCC_PACK #define WARN_FORMAT(string, args) #define FINAL #define FALLTHROUGH @@ -224,7 +222,6 @@ #endif #define CDECL _cdecl - #define GCC_PACK #define WARN_FORMAT(string, args) #define FINAL sealed @@ -303,6 +300,16 @@ #define PATHSEPCHAR '/' #endif +#if defined(_MSC_VER) || defined(__WATCOMC__) +# define PACK_N(type_dec, n) __pragma(pack(push, n)) type_dec; __pragma(pack(pop)) +#elif defined(__MINGW32__) +# define PRAGMA(x) _Pragma(#x) +# define PACK_N(type_dec, n) PRAGMA(pack(push, n)) type_dec; PRAGMA(pack(pop)) +#else +# define PACK_N(type_dec, n) type_dec __attribute__((__packed__, aligned(n))) +#endif +#define PACK(type_dec) PACK_N(type_dec, 1) + /* MSVCRT of course has to have a different syntax for long long *sigh* */ #if defined(_MSC_VER) || defined(__MINGW32__) #define OTTD_PRINTF64 "%I64d" -- cgit v1.2.3-54-g00ecf