JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed messages
[vor.git] / file.c
diff --git a/file.c b/file.c
index 9461616..4b7872a 100644 (file)
--- a/file.c
+++ b/file.c
@@ -19,7 +19,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/stat.h>
+#ifndef WIN32
+# include <sys/stat.h>
+#endif
 #include <sys/types.h>
 #include <unistd.h>
 
 
 char *g_data_dir;
 char *g_score_file;
-mode_t g_score_mode;
+mode_t g_score_mask;
 
 char *
-add_path(char *filename)
+add_path(char *path, char *file)
 {
-       static char r[MAX_PATH_LEN];
-       snprintf(r, MAX_PATH_LEN, "%s/%s", g_data_dir, filename);
-       return r;
+       char *s;
+       size_t plen, flen;
+
+       if(!path || !file) return NULL;
+       plen = strlen(path);
+       flen = strlen(file);
+       s = malloc(2+plen+flen);
+       if(!s) return NULL;
+       memcpy(s, path, plen);
+       s[plen] = PATH_SEPARATOR;
+       memcpy(s+plen+1, file, flen+1);
+       return s;
 }
 
-int
+char *
+add_data_path(char *filename)
+{
+       return add_path(g_data_dir, filename);
+}
+
+#ifdef WIN32
+
+bool
+is_dir(char *dirname)
+{
+       WIN32_FILE_ATTRIBUTE_DATA buf;
+       if(!GetFileAttributesEx(dirname, GetFileExInfoStandard, &buf))
+               return false;
+       return buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+}
+
+bool
+is_file(char *filename)
+{
+       WIN32_FILE_ATTRIBUTE_DATA buf;
+       if(!GetFileAttributesEx(filename, GetFileExInfoStandard, &buf))
+               return false;
+       return buf.dwFileAttributes & FILE_ATTRIBUTE_NORMAL;
+}
+
+#else /* !WIN32 */
+
+bool
 is_dir(char *dirname)
 {
        struct stat buf;
@@ -47,7 +86,7 @@ is_dir(char *dirname)
        return S_ISDIR(buf.st_mode);
 }
 
-int
+bool
 is_file(char *filename)
 {
        struct stat buf;
@@ -55,13 +94,15 @@ is_file(char *filename)
        return S_ISREG(buf.st_mode);
 }
 
-int
+#endif /* !WIN32 */
+
+bool
 find_data_dir(void)
 {
        int i;
        char *data_options[3] = {
-               "./data",
                getenv("VOR_DATA"),
+               "data",
                DATA_PREFIX
        };
 
@@ -78,38 +119,39 @@ find_data_dir(void)
        return false;
 }
 
-int
+bool
 find_score_file(void)
 {
-       g_score_file = malloc(MAX_PATH_LEN);
-       snprintf(g_score_file, MAX_PATH_LEN,
-                       "%s/.vor-scores", getenv("HOME"));
-       g_score_mode = 0177;
-       if(is_file(g_score_file)) return true;
-
-       return false;
+       char *dir, *s;
+       
+       /* in case we get called twice */
+       if(g_score_file) return true;
+
+       dir = getenv("HOME"); if(!dir) return false;
+       s = add_path(dir, ".vor-scores");
+       if(s) {
+               g_score_file = s;
+               g_score_mask = 0177;
+               return is_file(s);
+       } else return false;
 }
 
-int
+bool
 find_files(void)
 {
-       int r;
-       r = find_data_dir();
-       find_score_file();
-       return r;
+       return find_data_dir() && find_score_file();
 }
 
 FILE *
 open_score_file(char *mode)
 {
        mode_t old_mask;
-       FILE *f = NULL;
+       FILE *f;
 
-       if(!g_score_file) return f;
+       if(!g_score_file) return NULL;
 
-       old_mask = umask(g_score_mode);
+       old_mask = umask(g_score_mask);
        f = fopen(g_score_file, mode);
-
        umask(old_mask);
        return f;
 }