strncmp(s1, s2, n) == 0);
}
+boolean strPrefix(char *s, char *prefix)
+{
+ return (s == NULL && prefix == NULL ? TRUE :
+ s == NULL && prefix != NULL ? FALSE :
+ s != NULL && prefix == NULL ? FALSE :
+ strncmp(s, prefix, strlen(prefix)) == 0);
+}
+
+boolean strSuffix(char *s, char *suffix)
+{
+ return (s == NULL && suffix == NULL ? TRUE :
+ s == NULL && suffix != NULL ? FALSE :
+ s != NULL && suffix == NULL ? FALSE :
+ strlen(s) < strlen(suffix) ? FALSE :
+ strncmp(&s[strlen(s) - strlen(suffix)], suffix, strlen(suffix)) == 0);
+}
+
/* ------------------------------------------------------------------------- */
/* command line option handling functions */
options.network = FALSE;
options.verbose = FALSE;
options.debug = FALSE;
+ options.debug_x11_sync = FALSE;
#if !defined(PLATFORM_UNIX)
if (*options_left == NULL) /* no options given -- enable verbose mode */
{
options.debug = TRUE;
}
+ else if (strncmp(option, "-debug-x11-sync", option_len) == 0)
+ {
+ options.debug_x11_sync = TRUE;
+ }
else if (strncmp(option, "-execute", option_len) == 0)
{
if (option_arg == NULL)
free(ptr);
}
+void clear_mem(void *ptr, unsigned long size)
+{
+#if defined(PLATFORM_WIN32)
+ /* for unknown reason, memset() sometimes crashes when compiled with MinGW */
+ char *cptr = (char *)ptr;
+
+ while (size--)
+ *cptr++ = 0;
+#else
+ memset(ptr, 0, size);
+#endif
+}
+
/* ------------------------------------------------------------------------- */
/* various helper functions */
if (result == -1)
{
- if (strEqual(s_lower, "false"))
+ if (strEqual(s_lower, "false") ||
+ strEqual(s_lower, "no") ||
+ strEqual(s_lower, "off"))
result = 0;
- else if (strEqual(s_lower, "true"))
+ else if (strEqual(s_lower, "true") ||
+ strEqual(s_lower, "yes") ||
+ strEqual(s_lower, "on"))
result = 1;
else
result = atoi(s);
string_has_parameter(value, "melt") ? FADE_MODE_MELT :
FADE_MODE_DEFAULT);
}
+#if 1
+ else if (strPrefix(suffix, ".font")) /* (may also be ".font_xyz") */
+#else
else if (strEqualN(suffix, ".font", 5)) /* (may also be ".font_xyz") */
+#endif
{
result = gfx.get_font_from_token_function(value);
}
return result;
}
-int get_token_parameter_value(char *token, char *value_raw)
-{
- char *suffix;
-
- if (token == NULL || value_raw == NULL)
- return ARG_UNDEFINED_VALUE;
-
- suffix = strrchr(token, '.');
- if (suffix == NULL)
- suffix = token;
-
-#if 0
- if (strncmp(suffix, ".font", 5) == 0)
- {
- int i;
-
- /* !!! OPTIMIZE THIS BY USING HASH !!! */
- for (i = 0; i < NUM_FONTS; i++)
- if (strEqual(value_raw, font_info[i].token_name))
- return i;
-
- /* if font not found, use reliable default value */
- return FONT_INITIAL_1;
- }
-#endif
-
- return get_parameter_value(value_raw, suffix, TYPE_INTEGER);
-}
-
struct ScreenModeInfo *get_screen_mode_from_string(char *screen_mode_string)
{
static struct ScreenModeInfo screen_mode;
file_list[i].redefined = FALSE;
file_list[i].fallback_to_default = FALSE;
+ file_list[i].default_is_cloned = FALSE;
}
}
printf("::: '%s' => '%s'\n", config_list[i].token, config_list[i].value);
#endif
}
+
+ if (strSuffix(config_list[i].token, ".clone_from"))
+ file_list[list_pos].default_is_cloned = TRUE;
}
num_file_list_entries_found = list_pos + 1;
new_list_entry->redefined = FALSE;
new_list_entry->fallback_to_default = FALSE;
+ new_list_entry->default_is_cloned = FALSE;
read_token_parameters(extra_file_hash, suffix_list, new_list_entry);
}
artwork_info->num_property_mapping_entries = 0;
}
+#if 1
+ if (!GFX_OVERRIDE_ARTWORK(artwork_info->type))
+#else
if (!SETUP_OVERRIDE_ARTWORK(setup, artwork_info->type))
+#endif
{
/* first look for special artwork configured in level series config */
filename_base = getCustomArtworkLevelConfigFilename(artwork_info->type);
+#if 0
+ printf("::: filename_base == '%s' [%s, %s]\n", filename_base,
+ leveldir_current->graphics_set,
+ leveldir_current->graphics_path);
+#endif
+
if (fileExists(filename_base))
LoadArtworkConfigFromFilename(artwork_info, filename_base);
}
basename = file_list_entry->default_filename;
+ /* fail for cloned default artwork that has no default filename defined */
+ if (file_list_entry->default_is_cloned &&
+ strEqual(basename, UNDEFINED_FILENAME))
+ {
+ int error_mode = ERR_WARN;
+
+ /* we can get away without sounds and music, but not without graphics */
+ if (*listnode == NULL && artwork_info->type == ARTWORK_TYPE_GRAPHICS)
+ error_mode = ERR_EXIT;
+
+ Error(error_mode, "token '%s' was cloned and has no default filename",
+ file_list_entry->token);
+
+ return;
+ }
+
/* dynamic artwork has no default filename / skip empty default artwork */
if (basename == NULL || strEqual(basename, UNDEFINED_FILENAME))
return;
error_mode = ERR_EXIT;
Error(error_mode, "cannot load artwork file '%s'", basename);
+
return;
}
}
#if DEBUG
-#define DEBUG_NUM_TIMESTAMPS 3
+#define DEBUG_NUM_TIMESTAMPS 5
#define DEBUG_TIME_IN_MICROSECONDS 0
#if DEBUG_TIME_IN_MICROSECONDS
}
#endif
+char *debug_print_timestamp_get_padding(int padding_size)
+{
+ static char *padding = NULL;
+ int max_padding_size = 100;
+
+ if (padding == NULL)
+ {
+ padding = checked_calloc(max_padding_size + 1);
+ memset(padding, ' ', max_padding_size);
+ }
+
+ return &padding[MAX(0, max_padding_size - padding_size)];
+}
+
void debug_print_timestamp(int counter_nr, char *message)
{
-#if DEBUG_TIME_IN_MICROSECONDS
- static double counter[DEBUG_NUM_TIMESTAMPS][2];
+ int indent_size = 8;
+ int padding_size = 40;
+ float timestamp_interval;
- if (counter_nr >= DEBUG_NUM_TIMESTAMPS)
+ if (counter_nr < 0)
+ Error(ERR_EXIT, "debugging: invalid negative counter");
+ else if (counter_nr >= DEBUG_NUM_TIMESTAMPS)
Error(ERR_EXIT, "debugging: increase DEBUG_NUM_TIMESTAMPS in misc.c");
- counter[counter_nr][0] = Counter_Microseconds();
-
- if (message)
- printf("%s %.3f ms\n", message,
- (counter[counter_nr][0] - counter[counter_nr][1]) / 1000);
+#if DEBUG_TIME_IN_MICROSECONDS
+ static double counter[DEBUG_NUM_TIMESTAMPS][2];
+ char *unit = "ms";
- counter[counter_nr][1] = counter[counter_nr][0];
+ counter[counter_nr][0] = Counter_Microseconds();
#else
static long counter[DEBUG_NUM_TIMESTAMPS][2];
-
- if (counter_nr >= DEBUG_NUM_TIMESTAMPS)
- Error(ERR_EXIT, "debugging: increase DEBUG_NUM_TIMESTAMPS in misc.c");
+ char *unit = "s";
counter[counter_nr][0] = Counter();
+#endif
- if (message)
- printf("%s %.3f s\n", message,
- (float)(counter[counter_nr][0] - counter[counter_nr][1]) / 1000);
-
+ timestamp_interval = counter[counter_nr][0] - counter[counter_nr][1];
counter[counter_nr][1] = counter[counter_nr][0];
-#endif
+
+ if (message)
+ printf("%s%s%s %.3f %s\n",
+ debug_print_timestamp_get_padding(counter_nr * indent_size),
+ message,
+ debug_print_timestamp_get_padding(padding_size - strlen(message)),
+ timestamp_interval / 1000,
+ unit);
}
void debug_print_parent_only(char *format, ...)