rnd-20030413-1-src
[rocksndiamonds.git] / src / libgame / setup.c
index 083b9c895f50b552859ac9407c6bf12755fab356..0996d10dfea85596e4fdc50b8fb39e380af069e8 100644 (file)
@@ -170,7 +170,7 @@ static char *getTapeDir(char *level_subdir)
 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)
@@ -425,11 +425,11 @@ static char *getCorrectedImageBasename(char *basename)
     {
       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
@@ -437,15 +437,6 @@ static char *getCorrectedImageBasename(char *basename)
   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;
@@ -610,6 +601,7 @@ void InitTapeDirectory(char *level_subdir)
 
 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);
 }
@@ -885,15 +877,33 @@ char *getUserDataDir(void)
 {
   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()
@@ -1013,58 +1023,6 @@ boolean checkCookieString(const char *cookie, const char *template)
 /* 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;
@@ -1083,7 +1041,7 @@ char *getFormattedSetupEntry(char *token, char *value)
 
 void freeSetupFileList(struct SetupFileList *setup_file_list)
 {
-  if (!setup_file_list)
+  if (setup_file_list == NULL)
     return;
 
   if (setup_file_list->token)
@@ -1095,15 +1053,12 @@ void freeSetupFileList(struct SetupFileList *setup_file_list)
   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;
 
@@ -1112,7 +1067,7 @@ static struct SetupFileList *newSetupFileList(char *token, char *value)
 
 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)
@@ -1121,17 +1076,18 @@ char *getTokenValue(struct SetupFileList *setup_file_list, char *token)
     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);
@@ -1159,7 +1115,6 @@ struct SetupFileList *loadSetupFileList(char *filename)
   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)))
@@ -1411,7 +1366,7 @@ void setSetupInfo(struct TokenInfo *token_info,
   {
     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:
@@ -1423,7 +1378,7 @@ void setSetupInfo(struct TokenInfo *token_info,
       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: