X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=file.c;h=efd08e5a0f23ac78f9444312349de8779c8ce4d8;hp=9461616d4dedf9a66d204e5112438b05f273f7e1;hb=HEAD;hpb=e0fab1bd78914a12ee88f2a9fcfca9f28a1df0f2 diff --git a/file.c b/file.c index 9461616..5f6204d 100644 --- a/file.c +++ b/file.c @@ -19,97 +19,149 @@ #include #include #include -#include +#ifndef WIN32 +# include +#endif #include #include #include "common.h" -#include "config.h" +#include "vorconfig.h" #include "file.h" +#ifdef WIN32 + +#define DATA_DIR "data\\" + +char * +add_data_path(char *filename) +{ + char *s; + if(!filename) return filename; + s = malloc(sizeof(DATA_DIR)+strlen(filename)); + if(s) { + strcpy(s, DATA_DIR); + strcpy(s+sizeof(DATA_DIR)-1, filename); + } + return s; +} + +bool +find_files(void) +{ + return true; +} + +FILE * +open_score_file(char *mode) +{ + return fopen("scores", mode); +} + + +#else /* !WIN32 */ + + char *g_data_dir; char *g_score_file; -mode_t g_score_mode; + +static char * +add_path(char *path, char *file) +{ + 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] = '/'; + memcpy(s+plen+1, file, flen+1); + return s; +} char * -add_path(char *filename) +add_data_path(char *filename) { - static char r[MAX_PATH_LEN]; - snprintf(r, MAX_PATH_LEN, "%s/%s", g_data_dir, filename); - return r; + return add_path(g_data_dir, filename); } -int +static bool is_dir(char *dirname) { struct stat buf; - stat(dirname, &buf); + if(stat(dirname, &buf)) { + return false; + } return S_ISDIR(buf.st_mode); } -int +static bool is_file(char *filename) { struct stat buf; - stat(filename, &buf); + if(stat(filename, &buf)) { + return false; + } return S_ISREG(buf.st_mode); } -int +static bool find_data_dir(void) { int i; char *data_options[3] = { - "./data", getenv("VOR_DATA"), + "data", DATA_PREFIX }; for(i=0; i<3; i++) { if(!data_options[i]) continue; g_data_dir = strdup(data_options[i]); - if(is_dir(g_data_dir)) return true; + if(is_dir(g_data_dir)) { + char *s = add_path(g_data_dir, "b_variations.png"); + if(s) if(is_file(s)) + return true; + } } fprintf(stderr, "Can't find VoR data! Tried:\n"); for(i=0; i<3; i++) { - fprintf(stderr, "\t%s\n", data_options[i]); + if(data_options[i]) fprintf(stderr, "\t%s\n", data_options[i]); } return false; } -int +static 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; + return true; + } 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; - - if(!g_score_file) return f; - - old_mask = umask(g_score_mode); - f = fopen(g_score_file, mode); - - umask(old_mask); - return f; + if(!g_score_file) return NULL; + return fopen(g_score_file, mode); } + +#endif /* !WIN32 */