shithub: choc

Download patch

ref: 1c8880feb84d2f7402445a856f03d5c6f3a9502d
parent: 1bbbdea98a3dcfea7ebe592329cfe79c06515935
author: Simon Howard <fraggle@soulsphere.org>
date: Sat Oct 27 14:31:37 EDT 2018

strife: Convert to new glob API.

This removes the need to do system-specific stuff to read the contents
of a directory - this is all now hidden away in i_glob.c.

--- a/src/strife/CMakeLists.txt
+++ b/src/strife/CMakeLists.txt
@@ -66,9 +66,7 @@
     st_lib.c        st_lib.h
     st_stuff.c      st_stuff.h
     wi_stuff.c      wi_stuff.h)
-if(MSVC)
-    list(APPEND STRIFE_SOURCES "../../win32/win_opendir.c" "../../win32/win_opendir.h")
-endif()
+
 add_library(strife STATIC ${STRIFE_SOURCES})
 
 target_include_directories(strife PRIVATE "../" "../../win32/" "${CMAKE_CURRENT_BINARY_DIR}/../../")
--- a/src/strife/m_saves.c
+++ b/src/strife/m_saves.c
@@ -19,22 +19,12 @@
 // Strife Hub Saving Code
 //
 
-// For GNU C and POSIX targets, dirent.h should be available. Otherwise, for
-// Visual C++, we need to include the win_opendir module.
-#if defined(_MSC_VER)
-#include <win_opendir.h>
-#elif defined(__GNUC__) || defined(POSIX)
-#include <dirent.h>
-#elif defined(__WATCOMC__)
-#include <direct.h>
-#else
-#error Need an include for dirent.h!
-#endif
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "z_zone.h"
+#include "i_glob.h"
 #include "i_system.h"
 #include "d_player.h"
 #include "deh_str.h"
@@ -61,32 +51,27 @@
 //
 void ClearTmp(void)
 {
-    DIR *sp2dir = NULL;
-    struct dirent *f = NULL;
+    glob_t *glob;
 
     if(savepathtemp == NULL)
         I_Error("you fucked up savedir man!");
 
-    if(!(sp2dir = opendir(savepathtemp)))
+    glob = I_StartGlob(savepathtemp, "*");
+    if (glob == NULL)
         I_Error("ClearTmp: Couldn't open dir %s", savepathtemp);
 
-    while((f = readdir(sp2dir)))
+    for (;;)
     {
-        char *filepath = NULL;
+        const char *path = I_NextGlob(glob);
 
-        // haleyjd: skip "." and ".." without assuming they're the
-        // first two entries like the original code did.
-        if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, ".."))
-            continue;
-
-        // haleyjd: use M_SafeFilePath, not sprintf
-        filepath = M_SafeFilePath(savepathtemp, f->d_name);
-        remove(filepath);
-
-        Z_Free(filepath);
+        if (path == NULL)
+        {
+            break;
+        }
+        remove(path);
     }
 
-    closedir(sp2dir);
+    I_EndGlob(glob);
 }
 
 //
@@ -96,30 +81,28 @@
 //
 void ClearSlot(void)
 {
-    DIR *spdir = NULL;
-    struct dirent *f = NULL;
+    glob_t *glob;
 
     if(savepath == NULL)
         I_Error("userdir is fucked up man!");
 
-    if(!(spdir = opendir(savepath)))
+    glob = I_StartGlob(savepath, "*");
+    if (glob == NULL)
         I_Error("ClearSlot: Couldn't open dir %s", savepath);
 
-    while((f = readdir(spdir)))
+    for (;;)
     {
-        char *filepath = NULL;
+        const char *filepath = I_NextGlob(glob);
 
-        if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, ".."))
-            continue;
-        
-        // haleyjd: use M_SafeFilePath, not sprintf
-        filepath = M_SafeFilePath(savepath, f->d_name);
-        remove(filepath);
+        if (filepath == NULL)
+        {
+            break;
+        }
 
-        Z_Free(filepath);
+        remove(filepath);
     }
 
-    closedir(spdir);
+    I_EndGlob(glob);
 }
 
 //
@@ -129,37 +112,36 @@
 //
 void FromCurr(void)
 {
-    DIR *sp2dir = NULL;
-    struct dirent *f = NULL;
+    glob_t *glob;
 
-    if(!(sp2dir = opendir(savepathtemp)))
+    glob = I_StartGlob(savepathtemp, "*");
+
+    if (glob == NULL)
         I_Error("FromCurr: Couldn't open dir %s", savepathtemp);
 
-    while((f = readdir(sp2dir)))
+    for (;;)
     {
-        byte *filebuffer  = NULL;
-        int   filelen     = 0;
-        char *srcfilename = NULL;
-        char *dstfilename = NULL;
+        byte *filebuffer;
+        int filelen;
+        const char *srcfilename;
+        char *dstfilename;
 
-        // haleyjd: skip "." and ".." without assuming they're the
-        // first two entries like the original code did.
-        if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, ".."))
-            continue;
+        srcfilename = I_NextGlob(glob);
+        if (srcfilename == NULL)
+        {
+            break;
+        }
 
-        // haleyjd: use M_SafeFilePath, NOT sprintf.
-        srcfilename = M_SafeFilePath(savepathtemp, f->d_name);
-        dstfilename = M_SafeFilePath(savepath,     f->d_name);
+        dstfilename = M_SafeFilePath(savepath, M_BaseName(srcfilename));
 
         filelen = M_ReadFile(srcfilename, &filebuffer);
         M_WriteFile(dstfilename, filebuffer, filelen);
 
         Z_Free(filebuffer);
-        Z_Free(srcfilename);
         Z_Free(dstfilename);
     }
 
-    closedir(sp2dir);
+    I_EndGlob(glob);
 }
 
 //
@@ -169,39 +151,39 @@
 //
 void ToCurr(void)
 {
-    DIR *spdir = NULL;
-    struct dirent *f = NULL;
+    glob_t *glob;
 
     ClearTmp();
 
     // BUG: Rogue copypasta'd this error message, which is why we don't know
     // the real original name of this function.
-    if(!(spdir = opendir(savepath)))
+    glob = I_StartGlob(savepath, "*");
+    if (glob == NULL)
         I_Error("ClearSlot: Couldn't open dir %s", savepath);
 
-    while((f = readdir(spdir)))
+    for (;;)
     {
-        byte *filebuffer  = NULL;
-        int   filelen     = 0;
-        char *srcfilename = NULL;
-        char *dstfilename = NULL;
+        byte *filebuffer;
+        int filelen;
+        const char *srcfilename;
+        char *dstfilename;
 
-        if(!strcmp(f->d_name, ".") || !strcmp(f->d_name, ".."))
-            continue;
+        srcfilename = I_NextGlob(glob);
+        if (srcfilename == NULL)
+        {
+            break;
+        }
 
-        // haleyjd: use M_SafeFilePath, NOT sprintf.
-        srcfilename = M_SafeFilePath(savepath,     f->d_name);
-        dstfilename = M_SafeFilePath(savepathtemp, f->d_name);
+        dstfilename = M_SafeFilePath(savepathtemp, M_BaseName(srcfilename));
 
         filelen = M_ReadFile(srcfilename, &filebuffer);
         M_WriteFile(dstfilename, filebuffer, filelen);
 
         Z_Free(filebuffer);
-        Z_Free(srcfilename);
         Z_Free(dstfilename);
     }
 
-    closedir(spdir);
+    I_EndGlob(glob);
 }
 
 //