X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ffiles.c;h=9b5b73f5b302b002695091b382af99f7ea8f33da;hb=4311b2aed4570447d0e082334e8b8a6b7da6e9f9;hp=7937c9482ff423c385d6bec4bb6b423efe0b909f;hpb=d5f5329a0cf3d0cb533fe0e1e90d4363e93889b1;p=rocksndiamonds.git diff --git a/src/files.c b/src/files.c index 7937c948..9b5b73f5 100644 --- a/src/files.c +++ b/src/files.c @@ -22,8 +22,6 @@ #include "tape.h" #include "joystick.h" -#define MAX_FILENAME_LEN 256 /* maximal filename length */ -#define MAX_LINE_LEN 1000 /* maximal input line length */ #define CHUNK_ID_LEN 4 /* IFF style chunk id length */ #define CHUNK_SIZE_UNDEFINED 0 /* undefined chunk size == 0 */ #define CHUNK_SIZE_NONE -1 /* do not write chunk size */ @@ -36,18 +34,12 @@ #define TAPE_HEADER_UNUSED 7 /* unused tape header bytes */ /* file identifier strings */ -#define LEVEL_COOKIE "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_2.0" +#define LEVEL_COOKIE_TMPL "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_x.x" +#define TAPE_COOKIE_TMPL "ROCKSNDIAMONDS_TAPE_FILE_VERSION_x.x" #define SCORE_COOKIE "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2" -#define TAPE_COOKIE "ROCKSNDIAMONDS_TAPE_FILE_VERSION_2.0" #define SETUP_COOKIE "ROCKSNDIAMONDS_SETUP_FILE_VERSION_1.2" #define LEVELSETUP_COOKIE "ROCKSNDIAMONDS_LEVELSETUP_FILE_VERSION_1.2" #define LEVELINFO_COOKIE "ROCKSNDIAMONDS_LEVELINFO_FILE_VERSION_1.2" -/* old file identifiers for backward compatibility */ -#define LEVEL_COOKIE_10 "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.0" -#define LEVEL_COOKIE_12 "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.2" -#define LEVEL_COOKIE_14 "ROCKSNDIAMONDS_LEVEL_FILE_VERSION_1.4" -#define TAPE_COOKIE_10 "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.0" -#define TAPE_COOKIE_12 "ROCKSNDIAMONDS_TAPE_FILE_VERSION_1.2" /* file names and filename extensions */ #if !defined(PLATFORM_MSDOS) @@ -68,39 +60,6 @@ #define SCOREFILE_EXTENSION "sco" #endif -#if 0 -#if defined(PLATFORM_WIN32) -#ifndef S_IRGRP -#define S_IRGRP S_IRUSR -#endif -#ifndef S_IROTH -#define S_IROTH S_IRUSR -#endif -#ifndef S_IWGRP -#define S_IWGRP S_IWUSR -#endif -#ifndef S_IWOTH -#define S_IWOTH S_IWUSR -#endif -#ifndef S_IXGRP -#define S_IXGRP S_IXUSR -#endif -#ifndef S_IXOTH -#define S_IXOTH S_IXUSR -#endif -#endif /* PLATFORM_WIN32 */ - -/* file permissions for newly written files */ -#define MODE_R_ALL (S_IRUSR | S_IRGRP | S_IROTH) -#define MODE_W_ALL (S_IWUSR | S_IWGRP | S_IWOTH) -#define MODE_X_ALL (S_IXUSR | S_IXGRP | S_IXOTH) - -#define LEVEL_PERMS (MODE_R_ALL | MODE_W_ALL) -#define SCORE_PERMS LEVEL_PERMS -#define TAPE_PERMS LEVEL_PERMS -#define SETUP_PERMS LEVEL_PERMS -#endif - /* sort priorities of level series (also used as level series classes) */ #define LEVELCLASS_TUTORIAL_START 10 #define LEVELCLASS_TUTORIAL_END 99 @@ -211,11 +170,6 @@ char *getLevelClassDescription(struct LevelDirInfo *ldi) static void SaveUserLevelInfo(); /* for 'InitUserLevelDir()' */ static char *getSetupLine(char *, int); /* for 'SaveUserLevelInfo()' */ -static char *getSetupDir() -{ - return getUserDataDir(); -} - static char *getUserLevelDir(char *level_subdir) { static char *userlevel_dir = NULL; @@ -332,24 +286,24 @@ static char *getScoreFilename(int nr) static void InitTapeDirectory(char *level_subdir) { - createDirectory(getUserDataDir(), "user data"); - createDirectory(getTapeDir(""), "main tape"); - createDirectory(getTapeDir(level_subdir), "level tape"); + createDirectory(getUserDataDir(), "user data", PERMS_PRIVATE); + createDirectory(getTapeDir(""), "main tape", PERMS_PRIVATE); + createDirectory(getTapeDir(level_subdir), "level tape", PERMS_PRIVATE); } static void InitScoreDirectory(char *level_subdir) { - createDirectory(getScoreDir(""), "main score"); - createDirectory(getScoreDir(level_subdir), "level score"); + createDirectory(getScoreDir(""), "main score", PERMS_PUBLIC); + createDirectory(getScoreDir(level_subdir), "level score", PERMS_PUBLIC); } static void InitUserLevelDirectory(char *level_subdir) { if (access(getUserLevelDir(level_subdir), F_OK) != 0) { - createDirectory(getUserDataDir(), "user data"); - createDirectory(getUserLevelDir(""), "main user level"); - createDirectory(getUserLevelDir(level_subdir), "user level"); + createDirectory(getUserDataDir(), "user data", PERMS_PRIVATE); + createDirectory(getUserLevelDir(""), "main user level", PERMS_PRIVATE); + createDirectory(getUserLevelDir(level_subdir), "user level",PERMS_PRIVATE); SaveUserLevelInfo(); } @@ -357,21 +311,9 @@ static void InitUserLevelDirectory(char *level_subdir) static void InitLevelSetupDirectory(char *level_subdir) { - createDirectory(getUserDataDir(), "user data"); - createDirectory(getLevelSetupDir(""), "main level setup"); - createDirectory(getLevelSetupDir(level_subdir), "level setup"); -} - -static void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes) -{ - while (bytes--) - fgetc(file); -} - -static void WriteUnusedBytesToFile(FILE *file, unsigned long bytes) -{ - while (bytes--) - fputc(0, file); + createDirectory(getUserDataDir(), "user data", PERMS_PRIVATE); + createDirectory(getLevelSetupDir(""), "main level setup", PERMS_PRIVATE); + createDirectory(getLevelSetupDir(level_subdir), "level setup",PERMS_PRIVATE); } static void ReadChunk_VERS(FILE *file, int *file_version, int *game_version) @@ -418,53 +360,6 @@ static void WriteChunk_VERS(FILE *file, int file_version, int game_version) fputc(0, file); /* not used */ } -static int getFileVersionFromCookieString(const char *cookie) -{ - const char *ptr_cookie1, *ptr_cookie2; - const char *pattern1 = "_FILE_VERSION_"; - const char *pattern2 = "?.?"; - const int len_cookie = strlen(cookie); - const int len_pattern1 = strlen(pattern1); - const int len_pattern2 = strlen(pattern2); - const int len_pattern = len_pattern1 + len_pattern2; - int version_major, version_minor; - - if (len_cookie <= len_pattern) - return -1; - - ptr_cookie1 = &cookie[len_cookie - len_pattern]; - ptr_cookie2 = &cookie[len_cookie - len_pattern2]; - - if (strncmp(ptr_cookie1, pattern1, len_pattern1) != 0) - return -1; - - if (ptr_cookie2[0] < '0' || ptr_cookie2[0] > '9' || - ptr_cookie2[1] != '.' || - ptr_cookie2[2] < '0' || ptr_cookie2[2] > '9') - return -1; - - version_major = ptr_cookie2[0] - '0'; - version_minor = ptr_cookie2[2] - '0'; - - return VERSION_IDENT(version_major, version_minor, 0); -} - -boolean checkCookieString(const char *cookie, const char *template) -{ - const char *pattern = "_FILE_VERSION_?.?"; - const int len_cookie = strlen(cookie); - const int len_template = strlen(template); - const int len_pattern = strlen(pattern); - - if (len_cookie != len_template) - return FALSE; - - if (strncmp(cookie, template, len_cookie - len_pattern) != 0) - return FALSE; - - return TRUE; -} - static void setLevelInfoToDefaults() { int i, x, y; @@ -560,203 +455,6 @@ static int checkLevelElement(int element) return element; } -void OLD_LoadLevel(int level_nr) -{ - int i, x, y; - char *filename = getLevelFilename(level_nr); - char cookie[MAX_LINE_LEN]; - char chunk_name[CHUNK_ID_LEN + 1]; - boolean encoding_16bit = FALSE; /* default: maximal 256 elements */ - int file_version = FILE_VERSION_ACTUAL; - int chunk_size; - FILE *file; - - /* always start with reliable default values */ - setLevelInfoToDefaults(); - - if (!(file = fopen(filename, MODE_READ))) - { - Error(ERR_WARN, "cannot read level '%s' - creating new level", filename); - return; - } - - /* check file identifier */ - fgets(cookie, MAX_LINE_LEN, file); - if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') - cookie[strlen(cookie) - 1] = '\0'; - -#if 0 - if (strcmp(cookie, LEVEL_COOKIE_10) == 0) /* old 1.0 level format */ - file_version = FILE_VERSION_1_0; - else if (strcmp(cookie, LEVEL_COOKIE_12) == 0)/* 1.2 (8 bit) level format */ - file_version = FILE_VERSION_1_2; - else if (strcmp(cookie, LEVEL_COOKIE) != 0) /* unknown level format */ - { - Error(ERR_WARN, "wrong file identifier of level file '%s'", filename); - fclose(file); - return; - } -#else - if (!checkCookieString(cookie, LEVEL_COOKIE)) /* unknown file format */ - { - Error(ERR_WARN, "unknown format of level file '%s'", filename); - fclose(file); - return; - } - - file_version = getFileVersionFromCookieString(cookie); -#endif - - level.file_version = file_version; - - /* read chunk "HEAD" */ - if (file_version >= FILE_VERSION_1_2) - { - getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN); - if (strcmp(chunk_name, "HEAD") || chunk_size != LEVEL_HEADER_SIZE) - { - Error(ERR_WARN, "wrong 'HEAD' chunk of level file '%s'", filename); - fclose(file); - return; - } - } - - lev_fieldx = level.fieldx = fgetc(file); - lev_fieldy = level.fieldy = fgetc(file); - - level.time = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - level.gems_needed = getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - - for(i=0; i= FILE_VERSION_1_2) - { - getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN); - - /* look for optional author chunk */ - if (strcmp(chunk_name, "AUTH") == 0 && chunk_size == MAX_LEVEL_AUTHOR_LEN) - { - for(i=0; i MAX_ELEMENT_CONTENTS) - { -#if DEBUG - printf("WARNING: num_yam_contents == %d (corrected)\n", - level.num_yam_contents); -#endif - level.num_yam_contents = STD_ELEMENT_CONTENTS; - } - - for(i=0; ifile_version), &(level->game_version)); @@ -942,26 +640,6 @@ void LoadLevel(int level_nr) return; } -#if 0 - /* check file identifier */ - fgets(cookie, MAX_LINE_LEN, file); - if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') - cookie[strlen(cookie) - 1] = '\0'; - - if (!checkCookieString(cookie, LEVEL_COOKIE)) /* unknown file format */ - { - Error(ERR_WARN, "unknown format of level file '%s'", filename); - fclose(file); - return; - } - - if ((level.file_version = getFileVersionFromCookieString(cookie)) == -1) - { - Error(ERR_WARN, "unsupported version of level file '%s'", filename); - fclose(file); - return; - } -#else getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); if (strcmp(chunk_name, "RND1") == 0) { @@ -982,7 +660,7 @@ void LoadLevel(int level_nr) if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; - if (!checkCookieString(cookie, LEVEL_COOKIE)) /* unknown file format */ + if (!checkCookieString(cookie, LEVEL_COOKIE_TMPL)) { Error(ERR_WARN, "unknown format of level file '%s'", filename); fclose(file); @@ -996,7 +674,6 @@ void LoadLevel(int level_nr) return; } } -#endif if (level.file_version < FILE_VERSION_1_2) { @@ -1090,106 +767,6 @@ void LoadLevel(int level_nr) SetBorderElement(); } -void OLD_SaveLevel(int level_nr) -{ - int i, x, y; - char *filename = getLevelFilename(level_nr); -#if 0 - boolean encoding_16bit_amoeba = FALSE; - boolean encoding_16bit_yamyam = FALSE; -#endif - boolean encoding_16bit = FALSE; /* default: only 8-bit elements */ - char *oldest_possible_cookie; - FILE *file; - - if (!(file = fopen(filename, MODE_WRITE))) - { - Error(ERR_WARN, "cannot save level file '%s'", filename); - return; - } - - /* check yam content for 16-bit elements */ - for(i=0; i 255) - encoding_16bit = TRUE; - - /* check level field for 16-bit elements */ - for(y=0; y 255) - encoding_16bit = TRUE; - - oldest_possible_cookie = (encoding_16bit ? LEVEL_COOKIE : LEVEL_COOKIE_12); - - fputs(oldest_possible_cookie, file); /* file identifier */ - fputc('\n', file); - - putFileChunk(file, "HEAD", LEVEL_HEADER_SIZE, BYTE_ORDER_BIG_ENDIAN); - - fputc(level.fieldx, file); - fputc(level.fieldy, file); - - putFile16BitInteger(file, level.time, BYTE_ORDER_BIG_ENDIAN); - putFile16BitInteger(file, level.gems_needed, BYTE_ORDER_BIG_ENDIAN); - - for(i=0; ifieldy; y++) + for(x=0; xfieldx; x++) if (level->encoding_16bit_field) putFile16BitInteger(file, Ur[x][y], BYTE_ORDER_BIG_ENDIAN); else @@ -1331,13 +908,16 @@ void SaveLevel(int level_nr) return; } + /* check level field for 16-bit elements */ + level.encoding_16bit_field = FALSE; for(y=0; y 255) level.encoding_16bit_field = TRUE; /* check yamyam content for 16-bit elements */ + level.encoding_16bit_yamyam = FALSE; for(i=0; i 255) level.encoding_16bit_amoeba = TRUE; body_chunk_size = level.fieldx * level.fieldy * (level.encoding_16bit_field ? 2 : 1); -#if 0 - fputs(LEVEL_COOKIE, file); /* file identifier */ - fputc('\n', file); -#else putFileChunk(file, "RND1", CHUNK_SIZE_UNDEFINED, BYTE_ORDER_BIG_ENDIAN); putFileChunk(file, "CAVE", CHUNK_SIZE_NONE, BYTE_ORDER_BIG_ENDIAN); putFileChunk(file, "VERS", FILE_VERS_CHUNK_SIZE, BYTE_ORDER_BIG_ENDIAN); WriteChunk_VERS(file, FILE_VERSION_ACTUAL, GAME_VERSION_ACTUAL); -#endif putFileChunk(file, "HEAD", LEVEL_HEADER_SIZE, BYTE_ORDER_BIG_ENDIAN); SaveLevel_HEAD(file, &level); @@ -1368,16 +944,6 @@ void SaveLevel(int level_nr) putFileChunk(file, "AUTH", MAX_LEVEL_AUTHOR_LEN, BYTE_ORDER_BIG_ENDIAN); SaveLevel_AUTH(file, &level); -#if 0 - if (level.encoding_16bit_field) /* obsolete since new "CNT2" chunk */ - { - chunk_size = 4 + 2 * (MAX_ELEMENT_CONTENTS * 3 * 3); - - putFileChunk(file, "CONT", chunk_size, BYTE_ORDER_BIG_ENDIAN); - SaveLevel_CONT(file, &level); - } -#endif - putFileChunk(file, "BODY", body_chunk_size, BYTE_ORDER_BIG_ENDIAN); SaveLevel_BODY(file, &level); @@ -1396,7 +962,7 @@ void SaveLevel(int level_nr) fclose(file); - SetFilePermissions_Level(filename); + SetFilePermissions(filename, PERMS_PRIVATE); } static void setTapeInfoToDefaults() @@ -1425,222 +991,12 @@ static void setTapeInfoToDefaults() tape.pausing = FALSE; } -void OLD_LoadTape(int level_nr) +static int LoadTape_VERS(FILE *file, int chunk_size, struct TapeInfo *tape) { - int i, j; - char *filename = getTapeFilename(level_nr); - char cookie[MAX_LINE_LEN]; - char chunk_name[CHUNK_ID_LEN + 1]; - FILE *file; - int num_participating_players; - int file_version = FILE_VERSION_ACTUAL; /* last version of tape files */ - int chunk_size; + ReadChunk_VERS(file, &(tape->file_version), &(tape->game_version)); - /* always start with reliable default values (empty tape) */ - tape.file_version = FILE_VERSION_ACTUAL; - tape.game_version = GAME_VERSION_ACTUAL; - TapeErase(); - - /* default values (also for pre-1.2 tapes) with only the first player */ - tape.player_participates[0] = TRUE; - for(i=1; i 0 && cookie[strlen(cookie) - 1] == '\n') - cookie[strlen(cookie) - 1] = '\0'; - -#if 0 - if (strcmp(cookie, TAPE_COOKIE_10) == 0) /* old 1.0 tape format */ - file_version = FILE_VERSION_1_0; - else if (strcmp(cookie, TAPE_COOKIE) != 0) /* unknown tape format */ - { - Error(ERR_WARN, "wrong file identifier of tape file '%s'", filename); - fclose(file); - return; - } -#else - if (!checkCookieString(cookie, TAPE_COOKIE)) /* unknown file format */ - { - Error(ERR_WARN, "unknown format of tape file '%s'", filename); - fclose(file); - return; - } - - file_version = getFileVersionFromCookieString(cookie); -#endif - - tape.file_version = file_version; - tape.game_version = file_version; - - /* read chunk "HEAD" */ - if (file_version >= FILE_VERSION_1_2) - { - getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN); - if (strcmp(chunk_name, "HEAD") || chunk_size != TAPE_HEADER_SIZE) - { - Error(ERR_WARN, "wrong 'HEAD' chunk of tape file '%s'", filename); - fclose(file); - return; - } - } - - tape.random_seed = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - tape.date = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - tape.length = getFile32BitInteger(file, BYTE_ORDER_BIG_ENDIAN); - - /* read header fields that are new since version 1.2 */ - if (file_version >= FILE_VERSION_1_2) - { - byte store_participating_players = fgetc(file); - - for(i=0; i= FILE_VERSION_1_2) - { - getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_BIG_ENDIAN); - if (strcmp(chunk_name, "BODY") || - chunk_size != (num_participating_players + 1) * tape.length) - { - Error(ERR_WARN, "wrong 'BODY' chunk of tape file '%s'", filename); - fclose(file); - return; - } - } - -#if DEBUG - printf("\nTAPE OF LEVEL %d\n", level_nr); -#endif - - for(i=0; i= MAX_TAPELEN) - break; - - for(j=0; j' : ' '), - (x & JOY_UP ? '^' : ' '), - (x & JOY_DOWN ? 'v' : ' '), - (x & JOY_BUTTON_1 ? '1' : ' '), - (x & JOY_BUTTON_2 ? '2' : ' ')); - } -#endif - - } - - tape.pos[i].delay = fgetc(file); - -#if DEBUG - printf("[%03d]\n", tape.pos[i].delay); -#endif - - if (file_version == FILE_VERSION_1_0) - { - /* eliminate possible diagonal moves in old tapes */ - /* this is only for backward compatibility */ - - byte joy_dir[4] = { JOY_LEFT, JOY_RIGHT, JOY_UP, JOY_DOWN }; - byte action = tape.pos[i].action[0]; - int k, num_moves = 0; - - for (k=0; k<4; k++) - { - if (action & joy_dir[k]) - { - tape.pos[i + num_moves].action[0] = joy_dir[k]; - if (num_moves > 0) - tape.pos[i + num_moves].delay = 0; - num_moves++; - } - } - - if (num_moves > 1) - { - num_moves--; - i += num_moves; - tape.length += num_moves; - } - } - else if (file_version < FILE_VERSION_2_0) - { - if (tape.pos[i].delay > 1) - { - /* action part */ - tape.pos[i + 1] = tape.pos[i]; - tape.pos[i + 1].delay = 1; - - /* delay part */ - for(j=0; jfile_version), &(tape->game_version)); - - return chunk_size; -} + return chunk_size; +} static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape) { @@ -1770,26 +1126,6 @@ void LoadTape(int level_nr) if (!(file = fopen(filename, MODE_READ))) return; -#if 0 - /* check file identifier */ - fgets(cookie, MAX_LINE_LEN, file); - if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') - cookie[strlen(cookie) - 1] = '\0'; - - if (!checkCookieString(cookie, TAPE_COOKIE)) /* unknown file format */ - { - Error(ERR_WARN, "unknown format of tape file '%s'", filename); - fclose(file); - return; - } - - if ((level.file_version = getFileVersionFromCookieString(cookie)) == -1) - { - Error(ERR_WARN, "unsupported version of level file '%s'", filename); - fclose(file); - return; - } -#else getFileChunk(file, chunk_name, NULL, BYTE_ORDER_BIG_ENDIAN); if (strcmp(chunk_name, "RND1") == 0) { @@ -1810,7 +1146,7 @@ void LoadTape(int level_nr) if (strlen(cookie) > 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; - if (!checkCookieString(cookie, TAPE_COOKIE)) /* unknown file format */ + if (!checkCookieString(cookie, TAPE_COOKIE_TMPL)) { Error(ERR_WARN, "unknown format of tape file '%s'", filename); fclose(file); @@ -1824,7 +1160,6 @@ void LoadTape(int level_nr) return; } } -#endif tape.game_version = tape.file_version; @@ -1894,81 +1229,6 @@ void LoadTape(int level_nr) tape.length_seconds = GetTapeLength(); } -void OLD_SaveTape(int level_nr) -{ - int i; - char *filename = getTapeFilename(level_nr); - FILE *file; - boolean new_tape = TRUE; - byte store_participating_players; - int num_participating_players; - - InitTapeDirectory(leveldir_current->filename); - - /* if a tape still exists, ask to overwrite it */ - if (access(filename, F_OK) == 0) - { - new_tape = FALSE; - if (!Request("Replace old tape ?", REQ_ASK)) - return; - } - - /* count number of players and set corresponding bits for compact storage */ - store_participating_players = 0; - num_participating_players = 0; - for(i=0; i 0 && cookie[strlen(cookie) - 1] == '\n') cookie[strlen(cookie) - 1] = '\0'; -#if 0 - if (strcmp(cookie, SCORE_COOKIE) != 0) - { - Error(ERR_WARN, "wrong file identifier of score file '%s'", filename); - fclose(file); - return; - } -#else - if (!checkCookieString(cookie, SCORE_COOKIE)) /* unknown file format */ + if (!checkCookieString(cookie, SCORE_COOKIE)) { Error(ERR_WARN, "unknown format of score file '%s'", filename); fclose(file); return; } -#endif for(i=0; i= 100) - return s; - - strcpy(s_lower, s); - - for (i=0; itoken) - free(setup_file_list->token); - if (setup_file_list->value) - free(setup_file_list->value); - if (setup_file_list->next) - freeSetupFileList(setup_file_list->next); - free(setup_file_list); -} - -static struct SetupFileList *newSetupFileList(char *token, char *value) -{ - struct SetupFileList *new = checked_malloc(sizeof(struct SetupFileList)); - - new->token = checked_malloc(strlen(token) + 1); - strcpy(new->token, token); - - new->value = checked_malloc(strlen(value) + 1); - strcpy(new->value, value); - - new->next = NULL; - - return new; -} - -static char *getTokenValue(struct SetupFileList *setup_file_list, - char *token) -{ - if (!setup_file_list) - return NULL; - - if (strcmp(setup_file_list->token, token) == 0) - return setup_file_list->value; - else - return getTokenValue(setup_file_list->next, token); -} - -static void setTokenValue(struct SetupFileList *setup_file_list, - char *token, char *value) -{ - if (!setup_file_list) - return; - - if (strcmp(setup_file_list->token, token) == 0) - { - free(setup_file_list->value); - setup_file_list->value = checked_malloc(strlen(value) + 1); - strcpy(setup_file_list->value, value); - } - else if (setup_file_list->next == NULL) - setup_file_list->next = newSetupFileList(token, value); - else - setTokenValue(setup_file_list->next, token, value); -} - -#ifdef DEBUG -static void printSetupFileList(struct SetupFileList *setup_file_list) -{ - if (!setup_file_list) - return; - - printf("token: '%s'\n", setup_file_list->token); - printf("value: '%s'\n", setup_file_list->value); - - printSetupFileList(setup_file_list->next); -} -#endif - -static struct SetupFileList *loadSetupFileList(char *filename) -{ - int line_len; - char line[MAX_LINE_LEN]; - char *token, *value, *line_ptr; - struct SetupFileList *setup_file_list = newSetupFileList("", ""); - struct SetupFileList *first_valid_list_entry; - - FILE *file; - - if (!(file = fopen(filename, MODE_READ))) - { - Error(ERR_WARN, "cannot open configuration file '%s'", filename); - return NULL; - } - - while(!feof(file)) - { - /* read next line of input file */ - if (!fgets(line, MAX_LINE_LEN, file)) - break; - - /* cut trailing comment or whitespace from input line */ - for (line_ptr = line; *line_ptr; line_ptr++) - { - if (*line_ptr == '#' || *line_ptr == '\n' || *line_ptr == '\r') - { - *line_ptr = '\0'; - break; - } - } - - /* cut trailing whitespaces from input line */ - for (line_ptr = &line[strlen(line)]; line_ptr > line; line_ptr--) - if ((*line_ptr == ' ' || *line_ptr == '\t') && line_ptr[1] == '\0') - *line_ptr = '\0'; - - /* ignore empty lines */ - if (*line == '\0') - continue; - - line_len = strlen(line); - - /* cut leading whitespaces from token */ - for (token = line; *token; token++) - if (*token != ' ' && *token != '\t') - break; - - /* find end of token */ - for (line_ptr = token; *line_ptr; line_ptr++) - { - if (*line_ptr == ' ' || *line_ptr == '\t' || *line_ptr == ':') - { - *line_ptr = '\0'; - break; - } - } - - if (line_ptr < line + line_len) - value = line_ptr + 1; - else - value = "\0"; - - /* cut leading whitespaces from value */ - for (; *value; value++) - if (*value != ' ' && *value != '\t') - break; - - if (*token && *value) - setTokenValue(setup_file_list, token, value); - } - - fclose(file); - - first_valid_list_entry = setup_file_list->next; - - /* free empty list header */ - setup_file_list->next = NULL; - freeSetupFileList(setup_file_list); - - if (first_valid_list_entry == NULL) - Error(ERR_WARN, "configuration file '%s' is empty", filename); - - return first_valid_list_entry; -} - -static void checkSetupFileListIdentifier(struct SetupFileList *setup_file_list, - char *identifier) -{ - if (!setup_file_list) - return; - - if (strcmp(setup_file_list->token, TOKEN_STR_FILE_IDENTIFIER) == 0) - { - if (strcmp(setup_file_list->value, identifier) != 0) - { - Error(ERR_WARN, "configuration file has wrong version"); - return; - } - else - return; - } - - if (setup_file_list->next) - checkSetupFileListIdentifier(setup_file_list->next, identifier); - else - { - Error(ERR_WARN, "configuration file has no version information"); - return; - } -} - static void setLevelDirInfoToDefaults(struct LevelDirInfo *ldi) { ldi->filename = NULL; @@ -2989,7 +1963,7 @@ static void SaveUserLevelInfo() fclose(file); free(filename); - SetFilePermissions_Setup(filename); + SetFilePermissions(filename, PERMS_PRIVATE); } void LoadSetup() @@ -3142,7 +2116,7 @@ void SaveSetup() fclose(file); free(filename); - SetFilePermissions_Setup(filename); + SetFilePermissions(filename, PERMS_PRIVATE); } void LoadLevelSetup_LastSeries() @@ -3207,7 +2181,7 @@ void SaveLevelSetup_LastSeries() fclose(file); free(filename); - SetFilePermissions_Setup(filename); + SetFilePermissions(filename, PERMS_PRIVATE); } static void checkSeriesInfo() @@ -3354,5 +2328,5 @@ void SaveLevelSetup_SeriesInfo() fclose(file); free(filename); - SetFilePermissions_Setup(filename); + SetFilePermissions(filename, PERMS_PRIVATE); }