rnd-20070427-3-src
authorHolger Schemel <info@artsoft.org>
Fri, 27 Apr 2007 18:40:57 +0000 (20:40 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:55:49 +0000 (10:55 +0200)
* added use of hashes created from static lists (element tokens, image
  config, font tokens) to speed up lookup of configuration parameters
* fixed bug where element and graphic config token lookup was mixed up

ChangeLog
src/conf_gfx.c
src/conftime.h
src/files.c
src/init.c
src/libgame/misc.c
src/libgame/misc.h
src/libgame/setup.h
src/main.c
src/main.h

index 3908154ee47f4ab887f0ea1680b9b7d5efac9fef..9141158e8d130bb467dd5af13e393799bcba86b6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-27
+       * added use of hashes created from static lists (element tokens, image
+         config, font tokens) to speed up lookup of configuration parameters
+       * fixed bug where element and graphic config token lookup was mixed up
+
 2007-04-26
        * added "busy" animation when initializing program and loading artwork
        * added initialization profiling for program startup (debugging only)
index 751876b5a69ab1049cee3eb03de12ac5e7d9706d..139b61b413c97549e0d113821ad3a01fec8fb904 100644 (file)
@@ -43,8 +43,8 @@ struct ConfigTypeInfo image_config_suffix[] =
   { ".delay",                          "1",            TYPE_INTEGER    },
   { ".anim_mode",                      ARG_UNDEFINED,  TYPE_STRING     },
   { ".global_sync",                    "false",        TYPE_BOOLEAN    },
-  { ".crumbled_like",                  ARG_UNDEFINED,  TYPE_TOKEN      },
-  { ".diggable_like",                  ARG_UNDEFINED,  TYPE_TOKEN      },
+  { ".crumbled_like",                  ARG_UNDEFINED,  TYPE_ELEMENT    },
+  { ".diggable_like",                  ARG_UNDEFINED,  TYPE_ELEMENT    },
   { ".border_size",                    ARG_UNDEFINED,  TYPE_INTEGER    },
   { ".step_offset",                    "4",            TYPE_INTEGER    },
   { ".step_delay",                     "1",            TYPE_INTEGER    },
@@ -59,7 +59,7 @@ struct ConfigTypeInfo image_config_suffix[] =
   { ".post_delay_random",              ARG_UNDEFINED,  TYPE_INTEGER    },
   { ".name",                           ARG_UNDEFINED,  TYPE_STRING     },
   { ".scale_up_factor",                        ARG_UNDEFINED,  TYPE_INTEGER    },
-  { ".clone_from",                     ARG_UNDEFINED,  TYPE_TOKEN      },
+  { ".clone_from",                     ARG_UNDEFINED,  TYPE_GRAPHIC    },
   { ".fade_mode",                      ARG_UNDEFINED,  TYPE_INTEGER    },
   { ".fade_delay",                     ARG_UNDEFINED,  TYPE_INTEGER    },
   { ".post_delay",                     ARG_UNDEFINED,  TYPE_INTEGER    },
index 757f0637662ca8dcd2d962b2dce92c154b3ae7fc..7d91c5cef6e92187ad4afbd10a71b2f424c674e6 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2007-04-27 03:49"
+#define COMPILE_DATE_STRING "2007-04-27 20:23"
index 01c166e12a857dab0ef3212b5e0d0087e311620e..df60536450e43b3954df90ba81ed3b831e0e1354 100644 (file)
@@ -1694,8 +1694,8 @@ static int getFileTypeFromBasename(char *basename)
     return LEVEL_FILE_TYPE_SP;
 
   /* check for typical filename of a Diamond Caves II level package file */
-  if (strEqualSuffix(basename, ".dc") ||
-      strEqualSuffix(basename, ".dc2"))
+  if (strSuffix(basename, ".dc") ||
+      strSuffix(basename, ".dc2"))
     return LEVEL_FILE_TYPE_DC;
 
   /* ---------- try to determine file type from filesize ---------- */
@@ -5767,7 +5767,7 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level,
     fgets(magic_bytes, num_magic_bytes + 1, file);
 
     /* check "magic bytes" for correct file format */
-    if (!strEqualPrefix(magic_bytes, "DC2"))
+    if (!strPrefix(magic_bytes, "DC2"))
     {
       level->no_valid_file = TRUE;
 
@@ -5777,8 +5777,8 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level,
       return;
     }
 
-    if (strEqualPrefix(magic_bytes, "DC2Win95") ||
-       strEqualPrefix(magic_bytes, "DC2Win98"))
+    if (strPrefix(magic_bytes, "DC2Win95") ||
+       strPrefix(magic_bytes, "DC2Win98"))
     {
       int position_first_level = 0x00fa;
       int extra_bytes = 4;
@@ -8651,12 +8651,19 @@ void LoadCustomElementDescriptions()
 
 static int getElementFromToken(char *token)
 {
+#if 1
+  char *value = getHashEntry(element_token_hash, token);
+
+  if (value != NULL)
+    return atoi(value);
+#else
   int i;
 
   /* !!! OPTIMIZE THIS BY USING HASH !!! */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
     if (strEqual(token, element_info[i].token_name))
       return i;
+#endif
 
   Error(ERR_WARN, "unknown element token '%s'", token);
 
@@ -8700,9 +8707,12 @@ static int get_token_parameter_value(char *token, char *value_raw)
 
 void InitMenuDesignSettings_Static()
 {
+#if 0
   static SetupFileHash *image_config_hash = NULL;
+#endif
   int i;
 
+#if 0
   if (image_config_hash == NULL)
   {
     image_config_hash = newSetupFileHash();
@@ -8712,6 +8722,7 @@ void InitMenuDesignSettings_Static()
                   image_config[i].token,
                   image_config[i].value);
   }
+#endif
 
 #if 1
   /* always start with reliable default values from static default config */
index bd1666398cde9cd10e8a874aa4cf7b08a72e5167..7a70610eda39e90583ff2840afe54990699eacd3 100644 (file)
@@ -39,7 +39,7 @@
 #define CONFIG_TOKEN_GLOBAL_BUSY               "global.busy"
 
 #define DEBUG_PRINT_INIT_TIMESTAMPS            TRUE
-#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH      5
+#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH      3
 
 
 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
@@ -97,7 +97,7 @@ static void print_init_timestamp(char *message)
   static int counter_nr = 0;
   int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH;
 
-  if (strEqualPrefix(message, "INIT"))
+  if (strPrefix(message, "INIT"))
   {
     if (counter_nr + 1 < max_depth)
     {
@@ -109,19 +109,20 @@ static void print_init_timestamp(char *message)
 
     debug_print_timestamp(counter_nr, NULL);
   }
-  else if (strEqualPrefix(message, "DONE"))
+  else if (strPrefix(message, "DONE"))
   {
     counter_nr--;
 
-    if (counter_nr + 1 < max_depth)
+    if (counter_nr + 1 < max_depth ||
+       (counter_nr == 0 && max_depth == 1))
     {
       last_message = &message[4];
 
       debug_print_timestamp(counter_nr, message);
     }
   }
-  else if (!strEqualPrefix(message, "TIME") ||
-          !strEqualSuffix(message, last_message))
+  else if (!strPrefix(message, "TIME") ||
+          !strSuffix(message, last_message))
   {
     if (counter_nr < max_depth)
       debug_print_timestamp(counter_nr, message);
@@ -306,12 +307,19 @@ static int getFontBitmapID(int font_nr)
 
 static int getFontFromToken(char *token)
 {
+#if 1
+  char *value = getHashEntry(font_token_hash, token);
+
+  if (value != NULL)
+    return atoi(value);
+#else
   int i;
 
   /* !!! OPTIMIZE THIS BY USING HASH !!! */
   for (i = 0; i < NUM_FONTS; i++)
     if (strEqual(token, font_info[i].token_name))
       return i;
+#endif
 
   /* if font not found, use reliable default value */
   return FONT_INITIAL_1;
@@ -1132,15 +1140,31 @@ void InitElementSpecialGraphicInfo()
 
 static int get_graphic_parameter_value(char *value_raw, char *suffix, int type)
 {
-  int i;
-  int x = 0;
-
-  if (type != TYPE_TOKEN)
+  if (type != TYPE_ELEMENT && type != TYPE_GRAPHIC)
     return get_parameter_value(value_raw, suffix, type);
 
   if (strEqual(value_raw, ARG_UNDEFINED))
     return ARG_UNDEFINED_VALUE;
 
+#if 1
+  if (type == TYPE_ELEMENT)
+  {
+    char *value = getHashEntry(element_token_hash, value_raw);
+
+    return (value != NULL ? atoi(value) : EL_UNDEFINED);
+  }
+  else if (type == TYPE_GRAPHIC)
+  {
+    char *value = getHashEntry(graphic_token_hash, value_raw);
+
+    return (value != NULL ? atoi(value) : IMG_UNDEFINED);
+  }
+
+#else
+
+  int i;
+  int x = 0;
+
   /* !!! THIS IS BUGGY !!! NOT SURE IF YOU GET ELEMENT ID OR GRAPHIC ID !!! */
   /* !!! (possible reason why ".clone_from" with elements doesn't work) !!! */
 
@@ -1164,6 +1188,7 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type)
 
     x++;
   }
+#endif
 
   return -1;
 }
@@ -4798,6 +4823,7 @@ void InitElementPropertiesAfterLoading(int engine_version)
 
 static void InitGlobal()
 {
+  int graphic;
   int i;
 
   for (i = 0; i < MAX_NUM_ELEMENTS + 1; i++)
@@ -4815,6 +4841,37 @@ static void InitGlobal()
 #endif
   }
 
+  /* create hash from image config list */
+  image_config_hash = newSetupFileHash();
+  for (i = 0; image_config[i].token != NULL; i++)
+    setHashEntry(image_config_hash,
+                image_config[i].token,
+                image_config[i].value);
+
+  /* create hash from element token list */
+  element_token_hash = newSetupFileHash();
+  for (i = 0; element_name_info[i].token_name != NULL; i++)
+    setHashEntry(element_token_hash,
+                element_name_info[i].token_name,
+                int2str(i, 0));
+
+  /* create hash from graphic token list */
+  graphic_token_hash = newSetupFileHash();
+  for (graphic = 0, i = 0; image_config[i].token != NULL; i++)
+    if (strSuffix(image_config[i].value, ".pcx") ||
+       strSuffix(image_config[i].value, ".wav") ||
+       strEqual(image_config[i].value, UNDEFINED_FILENAME))
+      setHashEntry(graphic_token_hash,
+                  image_config[i].token,
+                  int2str(graphic++, 0));
+
+  /* create hash from font token list */
+  font_token_hash = newSetupFileHash();
+  for (i = 0; font_info[i].token_name != NULL; i++)
+    setHashEntry(font_token_hash,
+                font_info[i].token_name,
+                int2str(i, 0));
+
   /* always start with reliable default values (all elements) */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
     ActiveElement[i] = i;
index bfb2164edd19b85c7ec7058f4bc57e49cb754496..a20948d58d696a8fc0c7df8351753fd5f68bcdbc 100644 (file)
@@ -607,7 +607,7 @@ boolean strEqualN(char *s1, char *s2, int n)
          strncmp(s1, s2, n) == 0);
 }
 
-boolean strEqualPrefix(char *s, char *prefix)
+boolean strPrefix(char *s, char *prefix)
 {
   return (s == NULL && prefix == NULL ? TRUE  :
          s == NULL && prefix != NULL ? FALSE :
@@ -615,7 +615,7 @@ boolean strEqualPrefix(char *s, char *prefix)
          strncmp(s, prefix, strlen(prefix)) == 0);
 }
 
-boolean strEqualSuffix(char *s, char *suffix)
+boolean strSuffix(char *s, char *suffix)
 {
   return (s == NULL && suffix == NULL ? TRUE  :
          s == NULL && suffix != NULL ? FALSE :
@@ -1888,7 +1888,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
              FADE_MODE_DEFAULT);
   }
 #if 1
-  else if (strEqualPrefix(suffix, ".font"))    /* (may also be ".font_xyz") */
+  else if (strPrefix(suffix, ".font"))         /* (may also be ".font_xyz") */
 #else
   else if (strEqualN(suffix, ".font", 5))      /* (may also be ".font_xyz") */
 #endif
index 36544b4d8f8f521844d4016b4013bfe8af92bcc0..29aaee7043fe7b4701c6c2cc5450bec8e99c0b6f 100644 (file)
@@ -108,8 +108,8 @@ char *getStringToLower(char *);
 void setString(char **, char *);
 boolean strEqual(char *, char *);
 boolean strEqualN(char *, char *, int);
-boolean strEqualPrefix(char *, char *);
-boolean strEqualSuffix(char *, char *);
+boolean strPrefix(char *, char *);
+boolean strSuffix(char *, char *);
 
 void GetOptions(char **, void (*print_usage_function)(void));
 
index 571cdbcce7acd6aa496b4290f0dbe25796f35d1e..02a815ab8c02edbf8bf7fbfc8a909664ef03e52b 100644 (file)
 #define TYPE_KEY_X11                   (1 << 5)
 #define TYPE_INTEGER                   (1 << 6)
 #define TYPE_STRING                    (1 << 7)
-#define TYPE_TOKEN                     (1 << 8)
+#define TYPE_ELEMENT                   (1 << 8)
+#define TYPE_GRAPHIC                   (1 << 9)
 
 /* additional values for setup screen */
-#define TYPE_ENTER_SCREEN              (1 << 9)
-#define TYPE_LEAVE_SCREEN              (1 << 10)
-#define TYPE_ENTER_MENU                        (1 << 11)
-#define TYPE_LEAVE_MENU                        (1 << 12)
-#define TYPE_ENTER_LIST                        (1 << 13)
-#define TYPE_LEAVE_LIST                        (1 << 14)
-#define TYPE_EMPTY                     (1 << 15)
-#define TYPE_KEYTEXT                   (1 << 16)
-
-#define TYPE_GHOSTED                   (1 << 17)
-#define TYPE_QUERY                     (1 << 18)
+#define TYPE_ENTER_SCREEN              (1 << 10)
+#define TYPE_LEAVE_SCREEN              (1 << 11)
+#define TYPE_ENTER_MENU                        (1 << 12)
+#define TYPE_LEAVE_MENU                        (1 << 13)
+#define TYPE_ENTER_LIST                        (1 << 14)
+#define TYPE_LEAVE_LIST                        (1 << 15)
+#define TYPE_EMPTY                     (1 << 16)
+#define TYPE_KEYTEXT                   (1 << 17)
+
+#define TYPE_GHOSTED                   (1 << 18)
+#define TYPE_QUERY                     (1 << 19)
 
 /* additional values for internal purposes */
-#define TYPE_BITFIELD                  (1 << 19)
-#define TYPE_ELEMENT                   (1 << 20)
+#define TYPE_BITFIELD                  (1 << 20)
 #define TYPE_CONTENT                   (1 << 21)
 #define TYPE_ELEMENT_LIST              (1 << 22)
 #define TYPE_CONTENT_LIST              (1 << 23)
@@ -61,7 +61,8 @@
                                         TYPE_KEY_X11           | \
                                         TYPE_INTEGER           | \
                                         TYPE_STRING            | \
-                                        TYPE_TOKEN)
+                                        TYPE_ELEMENT           | \
+                                        TYPE_GRAPHIC)
 
 #define TYPE_SKIP_ENTRY                        (TYPE_EMPTY             | \
                                         TYPE_KEY               | \
index 5813fbd6fa09d1d0f63fb9ffab9053f8bd369bb5..4971e8c7c13a25f3fc173df6417feb6c6d9925b0 100644 (file)
@@ -128,6 +128,10 @@ struct MusicInfo       *music_info = NULL;
 struct MusicFileInfo   *music_file_info = NULL;
 struct HelpAnimInfo    *helpanim_info = NULL;
 SetupFileHash          *helptext_info = NULL;
+SetupFileHash         *image_config_hash = NULL;
+SetupFileHash         *element_token_hash = NULL;
+SetupFileHash         *graphic_token_hash = NULL;
+SetupFileHash         *font_token_hash = NULL;
 
 
 /* ------------------------------------------------------------------------- */
@@ -5481,6 +5485,8 @@ struct FontInfo font_info[NUM_FONTS + 1] =
   { "font.game_info"           },
   { "font.info.elements"       },
   { "font.info.levelset"       },
+
+  { NULL                       }
 };
 
 
index bc09a36d9fb4abec2a1e980c43b12ccfa21709c6..7e5ff0dfd85576818dd1419700137c3e64623620 100644 (file)
@@ -2794,6 +2794,10 @@ extern struct MusicInfo         *music_info;
 extern struct MusicFileInfo    *music_file_info;
 extern struct HelpAnimInfo     *helpanim_info;
 extern SetupFileHash           *helptext_info;
+extern SetupFileHash          *image_config_hash;
+extern SetupFileHash          *element_token_hash;
+extern SetupFileHash          *graphic_token_hash;
+extern SetupFileHash          *font_token_hash;
 extern struct ConfigTypeInfo   image_config_suffix[];
 extern struct ConfigTypeInfo   sound_config_suffix[];
 extern struct ConfigTypeInfo   music_config_suffix[];