More Windows support. trunk
authorRyan C. Gordon <icculus@icculus.org>
Wed, 30 Apr 2008 01:48:13 -0400
branchtrunk
changeset 256 8339b461ef26
parent 255 796394130035
child 257 ac8da90450f0
More Windows support.
finderrors.c
--- a/finderrors.c	Wed Apr 30 01:35:46 2008 -0400
+++ b/finderrors.c	Wed Apr 30 01:48:13 2008 -0400
@@ -12,7 +12,6 @@
 #include <string.h>
 #include <stdarg.h>
 #include <sys/types.h>
-#include <dirent.h>
 #include <errno.h>
 #include <unistd.h>
 
@@ -25,79 +24,108 @@
 #endif
 
 #ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
 #define snprintf _snprintf
+#else
+#include <dirent.h>
 #endif
 
 #define report printf
 
+static int do_file(const char *profile, const char *dname, const char *fn, int *total)
+{
+    int do_quit = 0;
+
+    #if FINDERRORS_COMPILE_SHADERS
+    SDL_Event e;  // pump event queue to keep OS happy.
+    while (SDL_PollEvent(&e))
+    {
+        if (e.type == SDL_QUIT)
+            do_quit = 1;
+    } // while
+    SDL_GL_SwapBuffers();
+    #endif
+
+    if (do_quit)
+    {
+        report("FAIL: user requested quit!\n");
+        return 0;
+    } // if
+
+    if (strstr(fn, ".bytecode") == NULL)
+        return 1;
+
+    (*total)++;
+
+    char *fname = (char *) alloca(strlen(fn) + strlen(dname) + 1);
+    sprintf(fname, "%s/%s", dname, fn);
+    FILE *io = fopen(fname, "rb");
+    if (io == NULL)
+    {
+        report("FAIL: %s fopen() failed.\n", fname);
+        return 1;
+    } // if
+
+    static unsigned char buf[1024 * 256];
+    int rc = fread(buf, 1, sizeof (buf), io);
+    fclose(io);
+    if (rc == -1)
+    {
+        report("FAIL: %s %s\n", fname, strerror(errno));
+        return 1;
+    } // if
+
+    #if FINDERRORS_COMPILE_SHADERS
+    MOJOSHADER_glShader *shader = MOJOSHADER_glCompileShader(buf, rc);
+    if (shader == NULL)
+        report("FAIL: %s %s\n", fname, MOJOSHADER_glGetError());
+    else
+        report("PASS: %s\n", fname);
+    MOJOSHADER_glDeleteShader(shader);
+    #else
+    const MOJOSHADER_parseData *pd = MOJOSHADER_parse(profile, buf, rc, 0, 0, 0);
+    if (pd->error != NULL)
+        report("FAIL: %s %s\n", fname, pd->error);
+    else
+        report("PASS: %s\n", fname);
+    MOJOSHADER_freeParseData(pd);
+    #endif
+
+    return 1;
+} // do_file
+
+
 static int do_dir(const char *dname, const char *profile)
 {
-    const int dirlen = strlen(dname) + 1;
     int total = 0;
+
+#ifdef _MSC_VER
+    WIN32_FIND_DATA dent;
+    HANDLE dirp = INVALID_HANDLE_VALUE;
+    FindFirstFileA(wSearchPath, &entw);
+    if (dirp != INVALID_HANDLE_VALUE)
+    {
+        do
+        {
+            if (!do_file(profile, dname, dent.cFileName, &total))
+                break;
+        } while (pFindNextFileA(dirp, &dent) != 0);
+        CloseHandle(dirp);
+    } // if
+#else
+    struct dirent *dent = NULL;
     DIR *dirp = opendir(dname);
     if (dirp != NULL)
     {
-        int do_quit = 0;
-        struct dirent *dent;
         while ((dent = readdir(dirp)) != NULL)
         {
-            #if FINDERRORS_COMPILE_SHADERS
-            SDL_Event e;  // pump event queue to keep OS happy.
-            while (SDL_PollEvent(&e))
-            {
-                if (e.type == SDL_QUIT)
-                    do_quit = 1;
-            } // while
-            SDL_GL_SwapBuffers();
-            #endif
-
-            if (do_quit)
-            {
-                report("FAIL: user requested quit!\n");
+            if (!do_file(profile, dname, dent->d_name, &total))
                 break;
-            } // if
-
-            if (strstr(dent->d_name, ".bytecode") == NULL)
-                continue;
-
-            total++;
-
-            char *fname = (char *) alloca(strlen(dent->d_name) + dirlen);
-            sprintf(fname, "%s/%s", dname, dent->d_name);
-            FILE *io = fopen(fname, "rb");
-            if (io == NULL)
-            {
-                report("FAIL: %s fopen() failed.\n", fname);
-                continue;
-            } // if
-
-            static unsigned char buf[1024 * 256];
-            int rc = fread(buf, 1, sizeof (buf), io);
-            fclose(io);
-            if (rc == -1)
-            {
-                report("FAIL: %s %s\n", fname, strerror(errno));
-                continue;
-            } // if
-
-            #if FINDERRORS_COMPILE_SHADERS
-            MOJOSHADER_glShader *shader = MOJOSHADER_glCompileShader(buf, rc);
-            if (shader == NULL)
-                report("FAIL: %s %s\n", fname, MOJOSHADER_glGetError());
-            else
-                report("PASS: %s\n", fname);
-            MOJOSHADER_glDeleteShader(shader);
-            #else
-            const MOJOSHADER_parseData *pd = MOJOSHADER_parse(profile, buf, rc, 0, 0, 0);
-            if (pd->error != NULL)
-                report("FAIL: %s %s\n", fname, pd->error);
-            else
-                report("PASS: %s\n", fname);
-            MOJOSHADER_freeParseData(pd);
-            #endif
         } // while
         closedir(dirp);
     } // if
+#endif
 
     return total;
 } // do_dir