X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=ac1b0fa74a380246fa12e2f8880e3240648f6fae;hb=40a487dcc5d3028343ff9123a72b8b3839a42861;hp=d96e3bf23000d25d6d112ed6b6c6c6c285d57833;hpb=ef86a9fafe44eeffdda3a301ca4a2f586602f481;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index d96e3bf2..ac1b0fa7 100644 --- a/src/files.c +++ b/src/files.c @@ -19,6 +19,92 @@ #include "tape.h" #include "joystick.h" +#define MAX_LINE_LEN 1000 + +static char *getGlobalDataDir() +{ + return GAME_DIR; +} + +static char *getUserDataDir() +{ + static char *userdata_dir = NULL; + + if (!userdata_dir) + { + char *home_dir = getHomeDir(); + char *data_dir = USERDATA_DIRECTORY; + + userdata_dir = checked_malloc(strlen(home_dir) + strlen(data_dir) + 2); + sprintf(userdata_dir, "%s/%s", home_dir, data_dir); + } + + return userdata_dir; +} + +static char *getSetupDir() +{ + return getUserDataDir(); +} + +static char *getTapeDir(char *level_subdir) +{ + static char *tape_dir = NULL; + char *data_dir = getUserDataDir(); + char *tape_subdir = TAPES_DIRECTORY; + + if (tape_dir) + free(tape_dir); + + tape_dir = checked_malloc(strlen(data_dir) + strlen(tape_subdir) + + strlen(level_subdir) + 3); + sprintf(tape_dir, "%s/%s%s%s", data_dir, tape_subdir, + (strlen(level_subdir) > 0 ? "/" : ""), level_subdir); + + return tape_dir; +} + +static char *getScoreDir(char *level_subdir) +{ + static char *score_dir = NULL; + char *data_dir = getGlobalDataDir(); + char *score_subdir = SCORES_DIRECTORY; + + if (score_dir) + free(score_dir); + + score_dir = checked_malloc(strlen(data_dir) + strlen(score_subdir) + + strlen(level_subdir) + 3); + sprintf(score_dir, "%s/%s%s%s", data_dir, score_subdir, + (strlen(level_subdir) > 0 ? "/" : ""), level_subdir); + + return score_dir; +} + +static void createDirectory(char *dir, char *text) +{ + if (access(dir, F_OK) != 0) + if (mkdir(dir, USERDATA_DIR_MODE) != 0) + Error(ERR_WARN, "cannot create %s directory '%s'", text, dir); +} + +static void InitUserDataDirectory() +{ + createDirectory(getUserDataDir(), "user data"); +} + +static void InitTapeDirectory(char *level_subdir) +{ + createDirectory(getTapeDir(""), "main tape"); + createDirectory(getTapeDir(level_subdir), "level tape"); +} + +static void InitScoreDirectory(char *level_subdir) +{ + createDirectory(getScoreDir(""), "main score"); + createDirectory(getScoreDir(level_subdir), "level score"); +} + boolean LoadLevelInfo() { int i; @@ -26,16 +112,16 @@ boolean LoadLevelInfo() char cookie[MAX_FILENAME_LEN]; FILE *file; - sprintf(filename,"%s/%s",level_directory,LEVDIR_FILENAME); + sprintf(filename, "%s/%s", options.level_directory, LEVDIR_FILENAME); - if (!(file=fopen(filename,"r"))) + if (!(file = fopen(filename, "r"))) { Error(ERR_WARN, "cannot read level info '%s'", filename); return(FALSE); } - fscanf(file,"%s\n",cookie); - if (strcmp(cookie,LEVELDIR_COOKIE)) /* ungültiges Format? */ + fscanf(file, "%s\n", cookie); + if (strcmp(cookie, LEVELDIR_COOKIE)) { Error(ERR_WARN, "wrong format of level info file"); fclose(file); @@ -44,12 +130,12 @@ boolean LoadLevelInfo() num_leveldirs = 0; leveldir_nr = 0; - for(i=0;i> 24) & 0xff,file); fputc((tape.random_seed >> 16) & 0xff,file); @@ -361,14 +441,14 @@ void SaveLevelTape(int level_nr) fputc((tape.length >> 8) & 0xff,file); fputc((tape.length >> 0) & 0xff,file); - for(i=0;iautorecord = FALSE; si->quick_doors = FALSE; - strncpy(si->login_name, GetLoginName(), MAX_NAMELEN-1); + strncpy(si->login_name, getLoginName(), MAX_NAMELEN-1); si->login_name[MAX_NAMELEN-1] = '\0'; - strncpy(si->alias_name, GetLoginName(), MAX_NAMELEN-1); + strncpy(si->alias_name, getLoginName(), MAX_NAMELEN-1); si->alias_name[MAX_NAMELEN-1] = '\0'; for (i=0; i