changed simple "printf()" debug output to new debug log function
[rocksndiamonds.git] / src / libgame / setup.c
index 7d17464164e4f33f8e09b7fd0e0b45a80c0f9c53..206db77e4de949a765822011b9ddd738a68917ca 100644 (file)
@@ -4,7 +4,7 @@
 // (c) 1995-2014 by Artsoft Entertainment
 //                         Holger Schemel
 //                 info@artsoft.org
-//                 http://www.artsoft.org/
+//                 https://www.artsoft.org/
 // ----------------------------------------------------------------------------
 // setup.c
 // ============================================================================
@@ -99,6 +99,7 @@ static int token_comment_position = TOKEN_COMMENT_POSITION_DEFAULT;
 
 static SetupFileHash *artworkinfo_cache_old = NULL;
 static SetupFileHash *artworkinfo_cache_new = NULL;
+static SetupFileHash *optional_tokens_hash = NULL;
 static boolean use_artworkinfo_cache = TRUE;
 
 
@@ -819,9 +820,7 @@ char *getCustomImageFilename(char *basename)
   {
     free(filename);
 
-    if (options.debug)
-      Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)",
-           basename);
+    Warn("cannot find artwork file '%s' (using fallback)", basename);
 
     // 6th try: look for fallback artwork in old default artwork directory
     // (needed to prevent errors when trying to access unused artwork files)
@@ -892,9 +891,7 @@ char *getCustomSoundFilename(char *basename)
   {
     free(filename);
 
-    if (options.debug)
-      Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)",
-           basename);
+    Warn("cannot find artwork file '%s' (using fallback)", basename);
 
     // 6th try: look for fallback artwork in old default artwork directory
     // (needed to prevent errors when trying to access unused artwork files)
@@ -965,9 +962,7 @@ char *getCustomMusicFilename(char *basename)
   {
     free(filename);
 
-    if (options.debug)
-      Error(ERR_WARN, "cannot find artwork file '%s' (using fallback)",
-           basename);
+    Warn("cannot find artwork file '%s' (using fallback)", basename);
 
     // 6th try: look for fallback artwork in old default artwork directory
     // (needed to prevent errors when trying to access unused artwork files)
@@ -1366,19 +1361,19 @@ void dumpTreeInfo(TreeInfo *node, int depth)
 {
   int i;
 
-  printf("Dumping TreeInfo:\n");
+  Print("Dumping TreeInfo:\n");
 
   while (node)
   {
     for (i = 0; i < (depth + 1) * 3; i++)
-      printf(" ");
+      Print(" ");
 
-    printf("'%s' / '%s'\n", node->identifier, node->name);
+    Print("'%s' / '%s'\n", node->identifier, node->name);
 
     /*
     // use for dumping artwork info tree
-    printf("subdir == '%s' ['%s', '%s'] [%d])\n",
-          node->subdir, node->fullpath, node->basepath, node->in_user_dir);
+    Print("subdir == '%s' ['%s', '%s'] [%d])\n",
+         node->subdir, node->fullpath, node->basepath, node->in_user_dir);
     */
 
     if (node->node_group != NULL)
@@ -1638,8 +1633,7 @@ void createDirectory(char *dir, char *text, int permission_class)
   }
 
   if (posix_mkdir(dir, dir_mode) != 0)
-    Error(ERR_WARN, "cannot create %s directory '%s': %s",
-         text, dir, strerror(errno));
+    Warn("cannot create %s directory '%s': %s", text, dir, strerror(errno));
 
   if (permission_class == PERMS_PUBLIC && !running_setgid)
     chmod(dir, dir_mode);
@@ -1836,8 +1830,8 @@ static void printSetupFileList(SetupFileList *list)
   if (!list)
     return;
 
-  printf("token: '%s'\n", list->token);
-  printf("value: '%s'\n", list->value);
+  Debug("setup:printSetupFileList", "token: '%s'", list->token);
+  Debug("setup:printSetupFileList", "value: '%s'", list->value);
 
   printSetupFileList(list->next);
 }
@@ -1947,8 +1941,8 @@ static void printSetupFileHash(SetupFileHash *hash)
 {
   BEGIN_HASH_ITERATION(hash, itr)
   {
-    printf("token: '%s'\n", HASH_ITERATION_TOKEN(itr));
-    printf("value: '%s'\n", HASH_ITERATION_VALUE(itr));
+    Debug("setup:printSetupFileHash", "token: '%s'", HASH_ITERATION_TOKEN(itr));
+    Debug("setup:printSetupFileHash", "value: '%s'", HASH_ITERATION_VALUE(itr));
   }
   END_HASH_ITERATION(hash, itr)
 }
@@ -2053,25 +2047,25 @@ static boolean getTokenValueFromSetupLineExt(char *line,
     {
       if (!token_value_separator_warning)
       {
-       Error(ERR_INFO_LINE, "-");
+       Debug("setup", "---");
 
        if (filename != NULL)
        {
-         Error(ERR_WARN, "missing token/value separator(s) in config file:");
-         Error(ERR_INFO, "- config file: '%s'", filename);
+         Debug("setup", "missing token/value separator(s) in config file:");
+         Debug("setup", "- config file: '%s'", filename);
        }
        else
        {
-         Error(ERR_WARN, "missing token/value separator(s):");
+         Debug("setup", "missing token/value separator(s):");
        }
 
        token_value_separator_warning = TRUE;
       }
 
       if (filename != NULL)
-       Error(ERR_INFO, "- line %d: '%s'", line_nr, line_raw);
+       Debug("setup", "- line %d: '%s'", line_nr, line_raw);
       else
-       Error(ERR_INFO, "- line: '%s'", line_raw);
+       Debug("setup", "- line: '%s'", line_raw);
     }
 #endif
   }
@@ -2124,7 +2118,7 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
   if (!(file = openFile(filename, MODE_READ)))
   {
 #if DEBUG_NO_CONFIG_FILE
-    Error(ERR_DEBUG, "cannot open configuration file '%s'", filename);
+    Debug("setup", "cannot open configuration file '%s'", filename);
 #endif
 
     return FALSE;
@@ -2205,7 +2199,7 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
        }
        else
        {
-         Error(ERR_WARN, "ignoring already processed file '%s'", value);
+         Warn("ignoring already processed file '%s'", value);
        }
       }
       else
@@ -2220,16 +2214,16 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
          {
            if (!token_already_exists_warning)
            {
-             Error(ERR_INFO_LINE, "-");
-             Error(ERR_WARN, "duplicate token(s) found in config file:");
-             Error(ERR_INFO, "- config file: '%s'", filename);
+             Debug("setup", "---");
+             Debug("setup", "duplicate token(s) found in config file:");
+             Debug("setup", "- config file: '%s'", filename);
 
              token_already_exists_warning = TRUE;
            }
 
-           Error(ERR_INFO, "- token: '%s' (in line %d)", token, line_nr);
-           Error(ERR_INFO, "  old value: '%s'", old_value);
-           Error(ERR_INFO, "  new value: '%s'", value);
+           Debug("setup", "- token: '%s' (in line %d)", token, line_nr);
+           Debug("setup", "  old value: '%s'", old_value);
+           Debug("setup", "  new value: '%s'", value);
          }
 #endif
 
@@ -2249,16 +2243,16 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
 
 #if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
   if (token_value_separator_warning)
-    Error(ERR_INFO_LINE, "-");
+    Debug("setup", "---");
 #endif
 
 #if CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH
   if (token_already_exists_warning)
-    Error(ERR_INFO_LINE, "-");
+    Debug("setup", "---");
 #endif
 
   if (token_count == 0 && include_count == 0)
-    Error(ERR_WARN, "configuration file '%s' is empty", filename);
+    Warn("configuration file '%s' is empty", filename);
 
   if (top_recursion_level)
     freeSetupFileHash(include_filename_hash);
@@ -2272,7 +2266,7 @@ static void saveSetupFileHash(SetupFileHash *hash, char *filename)
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
-    Error(ERR_WARN, "cannot write configuration file '%s'", filename);
+    Warn("cannot write configuration file '%s'", filename);
 
     return;
   }
@@ -2423,6 +2417,15 @@ static struct TokenInfo artworkinfo_tokens[] =
   { -1,                        NULL,                   NULL                    },
 };
 
+static char *optional_tokens[] =
+{
+  "program_title",
+  "program_copyright",
+  "program_company",
+
+  NULL
+};
+
 static void setTreeInfoToDefaults(TreeInfo *ti, int type)
 {
   ti->type = type;
@@ -2502,7 +2505,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent)
 {
   if (parent == NULL)
   {
-    Error(ERR_WARN, "setTreeInfoToDefaultsFromParent(): parent == NULL");
+    Warn("setTreeInfoToDefaultsFromParent(): parent == NULL");
 
     setTreeInfoToDefaults(ti, TREE_TYPE_UNDEFINED);
 
@@ -2957,6 +2960,16 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type)
   if (!use_artworkinfo_cache)
     return NULL;
 
+  if (optional_tokens_hash == NULL)
+  {
+    int i;
+
+    // create hash from list of optional tokens (for quick access)
+    optional_tokens_hash = newSetupFileHash();
+    for (i = 0; optional_tokens[i] != NULL; i++)
+      setHashEntry(optional_tokens_hash, optional_tokens[i], "");
+  }
+
   if (cached)
   {
     int i;
@@ -2968,16 +2981,28 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type)
     ldi = *artwork_info;
     for (i = 0; artworkinfo_tokens[i].type != -1; i++)
     {
-      char *token = getCacheToken(token_prefix, artworkinfo_tokens[i].text);
+      char *token_suffix = artworkinfo_tokens[i].text;
+      char *token = getCacheToken(token_prefix, token_suffix);
       char *value = getHashEntry(artworkinfo_cache_old, token);
+      boolean optional =
+       (getHashEntry(optional_tokens_hash, token_suffix) != NULL);
 
-      // if defined, use value from cache, else keep default value
-      if (value != NULL)
-       setSetupInfo(artworkinfo_tokens, i, value);
+      setSetupInfo(artworkinfo_tokens, i, value);
+
+      // check if cache entry for this item is mandatory, but missing
+      if (value == NULL && !optional)
+      {
+       Warn("missing cache entry '%s'", token);
+
+       cached = FALSE;
+      }
     }
 
     *artwork_info = ldi;
+  }
 
+  if (cached)
+  {
     char *filename_levelinfo = getPath2(getLevelDirFromTreeInfo(level_node),
                                        LEVELINFO_FILENAME);
     char *filename_artworkinfo = getPath2(getSetupArtworkDir(artwork_info),
@@ -3204,7 +3229,7 @@ char *ExtractZipFileIntoDirectory(char *zip_filename, char *directory,
 
   if (!zip_file_valid)
   {
-    Error(ERR_WARN, "zip file '%s' rejected!", zip_filename);
+    Warn("zip file '%s' rejected!", zip_filename);
 
     return NULL;
   }
@@ -3213,12 +3238,12 @@ char *ExtractZipFileIntoDirectory(char *zip_filename, char *directory,
 
   if (zip_entries == NULL)
   {
-    Error(ERR_WARN, "zip file '%s' could not be extracted!", zip_filename);
+    Warn("zip file '%s' could not be extracted!", zip_filename);
 
     return NULL;
   }
 
-  Error(ERR_INFO, "zip file '%s' successfully extracted!", zip_filename);
+  Info("zip file '%s' successfully extracted!", zip_filename);
 
   // first zip file entry contains top level directory
   char *top_dir = zip_entries[0];
@@ -3239,7 +3264,7 @@ static void ProcessZipFilesInDirectory(char *directory, int tree_type)
     // display error if directory is main "options.graphics_directory" etc.
     if (tree_type == TREE_TYPE_LEVEL_DIR ||
        directory == OPTIONS_ARTWORK_DIRECTORY(tree_type))
-      Error(ERR_WARN, "cannot read directory '%s'", directory);
+      Warn("cannot read directory '%s'", directory);
 
     return;
   }
@@ -3305,7 +3330,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
   if (setup_file_hash == NULL)
   {
 #if DEBUG_NO_CONFIG_FILE
-    Error(ERR_WARN, "ignoring level directory '%s'", directory_path);
+    Debug("setup", "ignoring level directory '%s'", directory_path);
 #endif
 
     free(directory_path);
@@ -3416,7 +3441,7 @@ static void LoadLevelInfoFromLevelDir(TreeInfo **node_first,
 
   if ((dir = openDirectory(level_directory)) == NULL)
   {
-    Error(ERR_WARN, "cannot read level directory '%s'", level_directory);
+    Warn("cannot read level directory '%s'", level_directory);
 
     return;
   }
@@ -3466,7 +3491,7 @@ static void LoadLevelInfoFromLevelDir(TreeInfo **node_first,
   }
 
   if (!valid_entry_found)
-    Error(ERR_WARN, "cannot find any valid level series in directory '%s'",
+    Warn("cannot find any valid level series in directory '%s'",
          level_directory);
 }
 
@@ -3563,7 +3588,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     {
 #if DEBUG_NO_CONFIG_FILE
       if (!strEqual(directory_name, "."))
-       Error(ERR_WARN, "ignoring artwork directory '%s'", directory_path);
+       Debug("setup", "ignoring artwork directory '%s'", directory_path);
 #endif
 
       free(directory_path);
@@ -3678,7 +3703,7 @@ static void LoadArtworkInfoFromArtworkDir(TreeInfo **node_first,
   {
     // display error if directory is main "options.graphics_directory" etc.
     if (base_directory == OPTIONS_ARTWORK_DIRECTORY(type))
-      Error(ERR_WARN, "cannot read directory '%s'", base_directory);
+      Warn("cannot read directory '%s'", base_directory);
 
     return;
   }
@@ -3720,8 +3745,7 @@ static void LoadArtworkInfoFromArtworkDir(TreeInfo **node_first,
                                                      base_directory, ".",
                                                      type);
   if (!valid_entry_found)
-    Error(ERR_WARN, "cannot find any valid artwork in directory '%s'",
-         base_directory);
+    Warn("cannot find any valid artwork in directory '%s'", base_directory);
 }
 
 static TreeInfo *getDummyArtworkInfo(int type)
@@ -3806,9 +3830,12 @@ void LoadArtworkInfo(void)
   artwork.mus_current_identifier = artwork.mus_current->identifier;
 
 #if ENABLE_UNUSED_CODE
-  printf("graphics set == %s\n\n", artwork.gfx_current_identifier);
-  printf("sounds set == %s\n\n", artwork.snd_current_identifier);
-  printf("music set == %s\n\n", artwork.mus_current_identifier);
+  Debug("setup:LoadArtworkInfo", "graphics set == %s",
+       artwork.gfx_current_identifier);
+  Debug("setup:LoadArtworkInfo", "sounds set == %s",
+       artwork.snd_current_identifier);
+  Debug("setup:LoadArtworkInfo", "music set == %s",
+       artwork.mus_current_identifier);
 #endif
 
   sortTreeInfo(&artwork.gfx_first);
@@ -4168,7 +4195,8 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name,
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
-    Error(ERR_WARN, "cannot write level info file '%s'", filename);
+    Warn("cannot write level info file '%s'", filename);
+
     free(filename);
 
     return FALSE;
@@ -4379,7 +4407,7 @@ void LoadLevelSetup_LastSeries(void)
   }
   else
   {
-    Error(ERR_DEBUG, "using default setup values");
+    Debug("setup", "using default setup values");
   }
 
   free(filename);
@@ -4403,7 +4431,7 @@ static void SaveLevelSetup_LastSeries_Ext(boolean deactivate_last_level_series)
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
-    Error(ERR_WARN, "cannot write setup file '%s'", filename);
+    Warn("cannot write setup file '%s'", filename);
 
     free(filename);
 
@@ -4454,7 +4482,7 @@ static void checkSeriesInfo(void)
 
   if ((dir = openDirectory(level_directory)) == NULL)
   {
-    Error(ERR_WARN, "cannot read level directory '%s'", level_directory);
+    Warn("cannot read level directory '%s'", level_directory);
 
     return;
   }
@@ -4476,12 +4504,14 @@ static void checkSeriesInfo(void)
 
       if (levelnum_value < leveldir_current->first_level)
       {
-       Error(ERR_WARN, "additional level %d found", levelnum_value);
+       Warn("additional level %d found", levelnum_value);
+
        leveldir_current->first_level = levelnum_value;
       }
       else if (levelnum_value > leveldir_current->last_level)
       {
-       Error(ERR_WARN, "additional level %d found", levelnum_value);
+       Warn("additional level %d found", levelnum_value);
+
        leveldir_current->last_level = levelnum_value;
       }
     }
@@ -4583,7 +4613,7 @@ void LoadLevelSetup_SeriesInfo(void)
   }
   else
   {
-    Error(ERR_DEBUG, "using default setup values");
+    Debug("setup", "using default setup values");
   }
 
   free(filename);
@@ -4608,8 +4638,10 @@ void SaveLevelSetup_SeriesInfo(void)
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
-    Error(ERR_WARN, "cannot write setup file '%s'", filename);
+    Warn("cannot write setup file '%s'", filename);
+
     free(filename);
+
     return;
   }