Various archiver swap and compare functions now check if they are stable-1.0
authorRyan C. Gordon <icculus@icculus.org>
Wed, 20 Feb 2008 12:24:10 +0000
branchstable-1.0
changeset 927 8867d6c60ebf
parent 925 2efbe76dcd67
child 929 f2a9da5cc943
Various archiver swap and compare functions now check if they are swapping/comparing an item against itself, for efficiency and to prevent overlapping memcpy() calls.
CHANGELOG
archivers/grp.c
archivers/hog.c
archivers/mvl.c
archivers/qpak.c
archivers/wad.c
archivers/zip.c
--- a/CHANGELOG	Wed Feb 13 05:48:57 2008 +0000
+++ b/CHANGELOG	Wed Feb 20 12:24:10 2008 +0000
@@ -4,6 +4,9 @@
 
 -- stuff in the stable-1.0 branch, backported from 2.0.0 dev branch, etc ---
 
+02202008 - Various archiver swap and compare functions now check if they are
+           swapping/comparing an item against itself, for efficiency and
+           to prevent overlapping memcpy() calls.
 02132008 - Minor Windows fix (thanks, fydo!).
 01222008 - Added zlib README, and updated LICENSE.txt.
 01212008 - Fixed HTTP header in physfshttpd.c.
--- a/archivers/grp.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/grp.c	Wed Feb 20 12:24:10 2008 +0000
@@ -263,19 +263,27 @@
 
 static int grp_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    GRPentry *a = (GRPentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const GRPentry *a = (const GRPentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* grp_entry_cmp */
 
 
 static void grp_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    GRPentry tmp;
-    GRPentry *first = &(((GRPentry *) _a)[one]);
-    GRPentry *second = &(((GRPentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (GRPentry));
-    memcpy(first, second, sizeof (GRPentry));
-    memcpy(second, &tmp, sizeof (GRPentry));
+    if (one != two)
+    {
+        GRPentry tmp;
+        GRPentry *first = &(((GRPentry *) _a)[one]);
+        GRPentry *second = &(((GRPentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (GRPentry));
+        memcpy(first, second, sizeof (GRPentry));
+        memcpy(second, &tmp, sizeof (GRPentry));
+    } /* if */
 } /* grp_entry_swap */
 
 
--- a/archivers/hog.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/hog.c	Wed Feb 20 12:24:10 2008 +0000
@@ -300,19 +300,27 @@
 
 static int hog_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    HOGentry *a = (HOGentry *) _a;
-    return(__PHYSFS_platformStricmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const HOGentry *a = (const HOGentry *) _a;
+        return(__PHYSFS_platformStricmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* hog_entry_cmp */
 
 
 static void hog_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    HOGentry tmp;
-    HOGentry *first = &(((HOGentry *) _a)[one]);
-    HOGentry *second = &(((HOGentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (HOGentry));
-    memcpy(first, second, sizeof (HOGentry));
-    memcpy(second, &tmp, sizeof (HOGentry));
+    if (one != two)
+    {
+        HOGentry tmp;
+        HOGentry *first = &(((HOGentry *) _a)[one]);
+        HOGentry *second = &(((HOGentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (HOGentry));
+        memcpy(first, second, sizeof (HOGentry));
+        memcpy(second, &tmp, sizeof (HOGentry));
+    } /* if */
 } /* hog_entry_swap */
 
 
--- a/archivers/mvl.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/mvl.c	Wed Feb 20 12:24:10 2008 +0000
@@ -266,19 +266,27 @@
 
 static int mvl_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    MVLentry *a = (MVLentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const MVLentry *a = (const MVLentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* mvl_entry_cmp */
 
 
 static void mvl_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    MVLentry tmp;
-    MVLentry *first = &(((MVLentry *) _a)[one]);
-    MVLentry *second = &(((MVLentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (MVLentry));
-    memcpy(first, second, sizeof (MVLentry));
-    memcpy(second, &tmp, sizeof (MVLentry));
+    if (one != two)
+    {
+        MVLentry tmp;
+        MVLentry *first = &(((MVLentry *) _a)[one]);
+        MVLentry *second = &(((MVLentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (MVLentry));
+        memcpy(first, second, sizeof (MVLentry));
+        memcpy(second, &tmp, sizeof (MVLentry));
+    } /* if */
 } /* mvl_entry_swap */
 
 
--- a/archivers/qpak.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/qpak.c	Wed Feb 20 12:24:10 2008 +0000
@@ -296,19 +296,27 @@
 
 static int qpak_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    QPAKentry *a = (QPAKentry *) _a;
-    return(QPAK_strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const QPAKentry *a = (const QPAKentry *) _a;
+        return(QPAK_strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* qpak_entry_cmp */
 
 
 static void qpak_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    QPAKentry tmp;
-    QPAKentry *first = &(((QPAKentry *) _a)[one]);
-    QPAKentry *second = &(((QPAKentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (QPAKentry));
-    memcpy(first, second, sizeof (QPAKentry));
-    memcpy(second, &tmp, sizeof (QPAKentry));
+    if (one != two)
+    {
+        QPAKentry tmp;
+        QPAKentry *first = &(((QPAKentry *) _a)[one]);
+        QPAKentry *second = &(((QPAKentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (QPAKentry));
+        memcpy(first, second, sizeof (QPAKentry));
+        memcpy(second, &tmp, sizeof (QPAKentry));
+    } /* if */
 } /* qpak_entry_swap */
 
 
--- a/archivers/wad.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/wad.c	Wed Feb 20 12:24:10 2008 +0000
@@ -287,19 +287,27 @@
 
 static int wad_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    WADentry *a = (WADentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const WADentry *a = (const WADentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* wad_entry_cmp */
 
 
 static void wad_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    WADentry tmp;
-    WADentry *first = &(((WADentry *) _a)[one]);
-    WADentry *second = &(((WADentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (WADentry));
-    memcpy(first, second, sizeof (WADentry));
-    memcpy(second, &tmp, sizeof (WADentry));
+    if (one != two)
+    {
+        WADentry tmp;
+        WADentry *first = &(((WADentry *) _a)[one]);
+        WADentry *second = &(((WADentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (WADentry));
+        memcpy(first, second, sizeof (WADentry));
+        memcpy(second, &tmp, sizeof (WADentry));
+    } /* if */
 } /* wad_entry_swap */
 
 
--- a/archivers/zip.c	Wed Feb 13 05:48:57 2008 +0000
+++ b/archivers/zip.c	Wed Feb 20 12:24:10 2008 +0000
@@ -992,19 +992,27 @@
 
 static int zip_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    ZIPentry *a = (ZIPentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const ZIPentry *a = (const ZIPentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* zip_entry_cmp */
 
 
 static void zip_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    ZIPentry tmp;
-    ZIPentry *first = &(((ZIPentry *) _a)[one]);
-    ZIPentry *second = &(((ZIPentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (ZIPentry));
-    memcpy(first, second, sizeof (ZIPentry));
-    memcpy(second, &tmp, sizeof (ZIPentry));
+    if (one != two)
+    {
+        ZIPentry tmp;
+        ZIPentry *first = &(((ZIPentry *) _a)[one]);
+        ZIPentry *second = &(((ZIPentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (ZIPentry));
+        memcpy(first, second, sizeof (ZIPentry));
+        memcpy(second, &tmp, sizeof (ZIPentry));
+    } /* if */
 } /* zip_entry_swap */