static char *getScoreDir(char *level_subdir)
{
static char *score_dir = NULL;
- char *data_dir = options.rw_base_directory;
+ char *data_dir = getCommonDataDir();
char *score_subdir = SCORES_DIRECTORY;
if (score_dir)
{
static char *msdos_filename = NULL;
- if (filename != NULL)
- free(filename);
+ if (msdos_filename != NULL)
+ free(msdos_filename);
- filename = getStringCopy(basename_corrected);
- strncpy(&filename[8], &basename[strlen(basename) - 1+3], 1+3 + 1);
+ msdos_filename = getStringCopy(basename_corrected);
+ strncpy(&msdos_filename[8], &basename[strlen(basename) - 1+3], 1+3 + 1);
}
}
#endif
return basename_corrected;
}
-static boolean fileExists(char *filename)
-{
-#if 0
- printf("checking file '%s'\n", filename);
-#endif
-
- return (access(filename, F_OK) == 0);
-}
-
char *getCustomImageFilename(char *basename)
{
static char *filename = NULL;
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 2nd try: look for special artwork in current level series directory */
filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
if (fileExists(filename))
return filename;
+
+ free(filename);
}
/* 3rd try: look for special artwork in configured artwork directory */
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 4th try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 5th try: look for default artwork in old default artwork directory */
filename = getPath2(options.graphics_directory, basename);
if (fileExists(filename))
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 2nd try: look for special artwork in current level series directory */
filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename);
if (fileExists(filename))
return filename;
+
+ free(filename);
}
/* 3rd try: look for special artwork in configured artwork directory */
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 4th try: look for default artwork in new default artwork directory */
filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename);
if (fileExists(filename))
return filename;
+ free(filename);
+
/* 5th try: look for default artwork in old default artwork directory */
filename = getPath2(options.sounds_directory, basename);
if (fileExists(filename))
if (fileExists(directory))
return directory;
+ free(directory);
+
/* 2nd try: look for special artwork in current level series directory */
directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY);
if (fileExists(directory))
return directory;
+
+ free(directory);
}
/* 3rd try: look for special artwork in configured artwork directory */
if (fileExists(directory))
return directory;
+ free(directory);
+
/* 4th try: look for default artwork in new default artwork directory */
directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR));
if (fileExists(directory))
return directory;
+ free(directory);
+
/* 5th try: look for default artwork in old default artwork directory */
directory = getStringCopy(options.music_directory);
if (fileExists(directory))
void InitScoreDirectory(char *level_subdir)
{
+ createDirectory(getCommonDataDir(), "common data", PERMS_PUBLIC);
createDirectory(getScoreDir(NULL), "main score", PERMS_PUBLIC);
createDirectory(getScoreDir(level_subdir), "level score", PERMS_PUBLIC);
}
{
static char *userdata_dir = NULL;
- if (!userdata_dir)
+ if (userdata_dir == NULL)
+ userdata_dir = getPath2(getHomeDir(), program.userdata_directory);
+
+ return userdata_dir;
+}
+
+char *getCommonDataDir(void)
+{
+ static char *common_data_dir = NULL;
+
+#if defined(PLATFORM_WIN32)
+ if (common_data_dir == NULL)
{
- char *home_dir = getHomeDir();
- char *data_dir = program.userdata_directory;
+ char *dir = checked_malloc(MAX_PATH + 1);
- userdata_dir = getPath2(home_dir, data_dir);
+ if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_DOCUMENTS, NULL, 0, dir))
+ && strcmp(dir, "") != 0) /* empty for Windows 95/98 */
+ common_data_dir = getPath2(dir, program.userdata_directory);
+ else
+ common_data_dir = options.rw_base_directory;
}
+#else
+ if (common_data_dir == NULL)
+ common_data_dir = options.rw_base_directory;
+#endif
- return userdata_dir;
+ return common_data_dir;
}
char *getSetupDir()
/* setup file list handling functions */
/* ------------------------------------------------------------------------- */
-int get_string_integer_value(char *s)
-{
- static char *number_text[][3] =
- {
- { "0", "zero", "null", },
- { "1", "one", "first" },
- { "2", "two", "second" },
- { "3", "three", "third" },
- { "4", "four", "fourth" },
- { "5", "five", "fifth" },
- { "6", "six", "sixth" },
- { "7", "seven", "seventh" },
- { "8", "eight", "eighth" },
- { "9", "nine", "ninth" },
- { "10", "ten", "tenth" },
- { "11", "eleven", "eleventh" },
- { "12", "twelve", "twelfth" },
- };
-
- int i, j;
- char *s_lower = getStringToLower(s);
- int result = -1;
-
- for (i=0; i<13; i++)
- for (j=0; j<3; j++)
- if (strcmp(s_lower, number_text[i][j]) == 0)
- result = i;
-
- if (result == -1)
- result = atoi(s);
-
- free(s_lower);
-
- return result;
-}
-
-boolean get_string_boolean_value(char *s)
-{
- char *s_lower = getStringToLower(s);
- boolean result = FALSE;
-
- if (strcmp(s_lower, "true") == 0 ||
- strcmp(s_lower, "yes") == 0 ||
- strcmp(s_lower, "on") == 0 ||
- get_string_integer_value(s) == 1)
- result = TRUE;
-
- free(s_lower);
-
- return result;
-}
-
char *getFormattedSetupEntry(char *token, char *value)
{
int i;
void freeSetupFileList(struct SetupFileList *setup_file_list)
{
- if (!setup_file_list)
+ if (setup_file_list == NULL)
return;
if (setup_file_list->token)
free(setup_file_list);
}
-static struct SetupFileList *newSetupFileList(char *token, char *value)
+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->token = getStringCopy(token);
+ new->value = getStringCopy(value);
new->next = NULL;
char *getTokenValue(struct SetupFileList *setup_file_list, char *token)
{
- if (!setup_file_list)
+ if (setup_file_list == NULL)
return NULL;
if (strcmp(setup_file_list->token, token) == 0)
return getTokenValue(setup_file_list->next, token);
}
-static void setTokenValue(struct SetupFileList *setup_file_list,
- char *token, char *value)
+void setTokenValue(struct SetupFileList *setup_file_list,
+ char *token, char *value)
{
- if (!setup_file_list)
+ if (setup_file_list == NULL)
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);
+ if (setup_file_list->value)
+ free(setup_file_list->value);
+
+ setup_file_list->value = getStringCopy(value);
}
else if (setup_file_list->next == NULL)
setup_file_list->next = newSetupFileList(token, value);
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)))
{
case TYPE_BOOLEAN:
case TYPE_SWITCH:
- *(boolean *)setup_value = get_string_boolean_value(token_value);
+ *(boolean *)setup_value = get_boolean_from_string(token_value);
break;
case TYPE_KEY:
break;
case TYPE_INTEGER:
- *(int *)setup_value = get_string_integer_value(token_value);
+ *(int *)setup_value = get_integer_from_string(token_value);
break;
case TYPE_STRING:
ldi.first_level = 1;
ldi.sort_priority = LEVELCLASS_USER_START;
ldi.readonly = FALSE;
+ ldi.graphics_set = getStringCopy(GRAPHICS_SUBDIR);
+ ldi.sounds_set = getStringCopy(SOUNDS_SUBDIR);
+ ldi.music_set = getStringCopy(MUSIC_SUBDIR);
fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER,
getCookie("LEVELINFO")));