r937 - in trunk: . platform
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Mar 12 17:22:22 EDT 2008
Author: icculus
Date: 2008-03-12 17:22:22 -0400 (Wed, 12 Mar 2008)
New Revision: 937
Modified:
trunk/CHANGELOG.txt
trunk/physfs_internal.h
trunk/platform/windows.c
Log:
Fixed aliasing bug in Windows platform layer (thanks, Dennis!).
Modified: trunk/CHANGELOG.txt
===================================================================
--- trunk/CHANGELOG.txt 2008-03-12 21:21:40 UTC (rev 936)
+++ trunk/CHANGELOG.txt 2008-03-12 21:22:22 UTC (rev 937)
@@ -2,6 +2,7 @@
* CHANGELOG.
*/
+03122008 - Fixed aliasing bug in Windows platform layer (thanks, Dennis!).
03102008 - Changed some text files from ISO-8859-1 to UTF-8. Replaced all the
translations with UTF-8 encoded equivalents.
03082008 - Fixed compiler warnings in Windows platform layer (thanks, Dennis!).
Modified: trunk/physfs_internal.h
===================================================================
--- trunk/physfs_internal.h 2008-03-12 21:21:40 UTC (rev 936)
+++ trunk/physfs_internal.h 2008-03-12 21:22:22 UTC (rev 937)
@@ -33,6 +33,13 @@
extern "C" {
#endif
+#ifdef __GNUC__
+#define PHYSFS_MINIMUM_GCC_VER(major, minor) \
+ ( ((__GNUC__ << 16) + __GNUC_MINOR__) >= (((major) << 16) + (minor)) )
+#else
+#define PHYSFS_MINIMUM_GCC_VER(major, minor) (0)
+#endif
+
/*
* Interface for small allocations. If you need a little scratch space for
* a throwaway buffer or string, use this. It will make small allocations
@@ -1020,6 +1027,7 @@
#define __PHYSFS_UI64(x) x
#endif
+
/*
* Check if a ui64 will fit in the platform's address space.
* The initial sizeof check will optimize this macro out entirely on
@@ -1032,6 +1040,7 @@
((s) > (__PHYSFS_UI64(0xFFFFFFFFFFFFFFFF) >> (64-(sizeof(size_t)*8)))) \
)
+
/*
* This is a strcasecmp() or stricmp() replacement that expects both strings
* to be in UTF-8 encoding. It will do "case folding" to decide if the
Modified: trunk/platform/windows.c
===================================================================
--- trunk/platform/windows.c 2008-03-12 21:21:40 UTC (rev 936)
+++ trunk/platform/windows.c 2008-03-12 21:22:22 UTC (rev 937)
@@ -256,10 +256,21 @@
} /* fallbackCreateFileW */
-/* A blatant abuse of pointer casting... */
-static int symLookup(HMODULE dll, void **addr, const char *sym)
+#if (PHYSFS_MINIMUM_GCC_VERSION(3,3))
+ typedef FARPROC __attribute__((__may_alias__)) PHYSFS_FARPROC;
+#else
+ typedef FARPROC PHYSFS_FARPROC;
+#endif
+
+
+static void symLookup(HMODULE dll, PHYSFS_FARPROC *addr, const char *sym,
+ int reallyLook, PHYSFS_FARPROC fallback)
{
- return( (*addr = GetProcAddress(dll, sym)) != NULL );
+ PHYSFS_FARPROC proc;
+ proc = (PHYSFS_FARPROC) ((reallyLook) ? GetProcAddress(dll, sym) : NULL);
+ if (proc == NULL)
+ proc = fallback; /* may also be NULL. */
+ *addr = proc;
} /* symLookup */
@@ -267,17 +278,12 @@
{
HMODULE dll = NULL;
- #define LOOKUP_NOFALLBACK(x, reallyLook) { \
- if (reallyLook) \
- symLookup(dll, (void **) &p##x, #x); \
- else \
- p##x = NULL; \
- }
+ #define LOOKUP_NOFALLBACK(x, reallyLook) \
+ symLookup(dll, (PHYSFS_FARPROC *) &p##x, #x, reallyLook, NULL)
- #define LOOKUP(x, reallyLook) { \
- if ((!reallyLook) || (!symLookup(dll, (void **) &p##x, #x))) \
- p##x = fallback##x; \
- }
+ #define LOOKUP(x, reallyLook) \
+ symLookup(dll, (PHYSFS_FARPROC *) &p##x, #x, \
+ reallyLook, (PHYSFS_FARPROC) fallback##x)
/* Apparently Win9x HAS the Unicode entry points, they just don't WORK. */
/* ...so don't look them up unless we're on NT+. (see osHasUnicode.) */
More information about the physfs-commits
mailing list