/* various string functions */
/* ------------------------------------------------------------------------- */
-char *getPath2(char *path1, char *path2)
+char *getStringCat2WithSeparator(char *s1, char *s2, char *sep)
{
- char *sep = STRING_PATH_SEPARATOR;
- char *complete_path = checked_malloc(strlen(path1) + 1 +
- strlen(path2) + 1);
+ char *complete_string = checked_malloc(strlen(s1) + strlen(sep) +
+ strlen(s2) + 1);
- sprintf(complete_path, "%s%s%s", path1, sep, path2);
+ sprintf(complete_string, "%s%s%s", s1, sep, s2);
- return complete_path;
+ return complete_string;
}
-char *getPath3(char *path1, char *path2, char *path3)
+char *getStringCat3WithSeparator(char *s1, char *s2, char *s3, char *sep)
{
- char *sep = STRING_PATH_SEPARATOR;
- char *complete_path = checked_malloc(strlen(path1) + 1 +
- strlen(path2) + 1 +
- strlen(path3) + 1);
+ char *complete_string = checked_malloc(strlen(s1) + strlen(sep) +
+ strlen(s2) + strlen(sep) +
+ strlen(s3) + 1);
- sprintf(complete_path, "%s%s%s%s%s", path1, sep, path2, sep, path3);
+ sprintf(complete_string, "%s%s%s%s%s", s1, sep, s2, sep, s3);
- return complete_path;
+ return complete_string;
}
char *getStringCat2(char *s1, char *s2)
{
- char *complete_string = checked_malloc(strlen(s1) + strlen(s2) + 1);
+ return getStringCat2WithSeparator(s1, s2, "");
+}
- sprintf(complete_string, "%s%s", s1, s2);
+char *getStringCat3(char *s1, char *s2, char *s3)
+{
+ return getStringCat3WithSeparator(s1, s2, s3, "");
+}
- return complete_string;
+char *getPath2(char *path1, char *path2)
+{
+ return getStringCat2WithSeparator(path1, path2, STRING_PATH_SEPARATOR);
+}
+
+char *getPath3(char *path1, char *path2, char *path3)
+{
+ return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR);
}
char *getStringCopy(char *s)
if (mode & ERR_WARN && !options.verbose)
return;
- if (mode == ERR_RETURN_LINE)
+ if (mode == ERR_INFO_LINE)
{
if (!last_line_was_separator)
fprintf_line(program.error_file, format, 79);
{ KSYM_asciitilde, "XK_asciitilde", "~" },
/* special (non-ASCII) keys */
+ { KSYM_degree, "XK_degree", "°" },
{ KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" },
{ KSYM_Odiaeresis, "XK_Odiaeresis", "Ö" },
{ KSYM_Udiaeresis, "XK_Udiaeresis", "Ü" },
char getCharFromKey(Key key)
{
char *keyname = getKeyNameFromKey(key);
- char letter = 0;
+ char c = 0;
if (strlen(keyname) == 1)
- letter = keyname[0];
+ c = keyname[0];
else if (strEqual(keyname, "space"))
- letter = ' ';
- else if (strEqual(keyname, "circumflex"))
- letter = '^';
+ c = ' ';
- return letter;
+ return c;
+}
+
+char getValidConfigValueChar(char c)
+{
+ if (c == '#' || /* used to mark comments */
+ c == '\\') /* used to mark continued lines */
+ c = 0;
+
+ return c;
}
if (strEqual((*node_first)->key, key))
{
- free((*node_first)->key);
+ checked_free((*node_first)->key);
if (destructor_function)
destructor_function((*node_first)->content);
*node_first = (*node_first)->next;
strEqual(value, "up") ? MV_UP :
strEqual(value, "down") ? MV_DOWN : MV_NONE);
}
+ else if (strEqual(suffix, ".align"))
+ {
+ result = (strEqual(value, "left") ? ALIGN_LEFT :
+ strEqual(value, "right") ? ALIGN_RIGHT :
+ strEqual(value, "center") ? ALIGN_CENTER : ALIGN_DEFAULT);
+ }
else if (strEqual(suffix, ".anim_mode"))
{
result = (string_has_parameter(value, "none") ? ANIM_NONE :
string_has_parameter(value, "ce_delay") ? ANIM_CE_DELAY :
string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL :
string_has_parameter(value, "vertical") ? ANIM_VERTICAL :
+ string_has_parameter(value, "centered") ? ANIM_CENTERED :
+ string_has_parameter(value, "fade") ? ANIM_FADE :
+ string_has_parameter(value, "crossfade") ? ANIM_CROSSFADE :
ANIM_DEFAULT);
if (string_has_parameter(value, "reverse"))
!strEqual(&config_list[i].value[len_config_value - 4], ".wav") &&
!strEqual(config_list[i].value, UNDEFINED_FILENAME))
{
- Error(ERR_RETURN, "Configuration directive '%s' -> '%s':",
+ Error(ERR_INFO, "Configuration directive '%s' -> '%s':",
config_list[i].token, config_list[i].value);
Error(ERR_EXIT, "This seems to be no valid definition -- please fix");
}
file_list[list_pos].token = config_list[i].token;
file_list[list_pos].default_filename = config_list[i].value;
+
+#if 0
+ printf("::: '%s' => '%s'\n", config_list[i].token, config_list[i].value);
+#endif
}
}
num_file_list_entries_found = list_pos + 1;
if (num_file_list_entries_found != num_file_list_entries)
{
- Error(ERR_RETURN_LINE, "-");
- Error(ERR_RETURN, "inconsistant config list information:");
- Error(ERR_RETURN, "- should be: %d (according to 'src/conf_gfx.h')",
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "inconsistant config list information:");
+ Error(ERR_INFO, "- should be: %d (according to 'src/conf_xxx.h')",
num_file_list_entries);
- Error(ERR_RETURN, "- found to be: %d (according to 'src/conf_gfx.c')",
+ Error(ERR_INFO, "- found to be: %d (according to 'src/conf_xxx.c')",
num_file_list_entries_found);
Error(ERR_EXIT, "please fix");
}
+#if 0
+ printf("::: ---------- DONE ----------\n");
+#endif
+
return file_list;
}
if (options.debug && dynamic_tokens_found)
{
- Error(ERR_RETURN_LINE, "-");
- Error(ERR_RETURN, "dynamic token(s) found in config file:");
- Error(ERR_RETURN, "- config file: '%s'", filename);
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "dynamic token(s) found in config file:");
+ Error(ERR_INFO, "- config file: '%s'", filename);
for (list = setup_file_list; list != NULL; list = list->next)
{
char *value = getHashEntry(extra_file_hash, list->token);
if (value != NULL && strEqual(value, known_token_value))
- Error(ERR_RETURN, "- dynamic token: '%s'", list->token);
+ Error(ERR_INFO, "- dynamic token: '%s'", list->token);
}
- Error(ERR_RETURN_LINE, "-");
+ Error(ERR_INFO_LINE, "-");
}
if (unknown_tokens_found)
{
- Error(ERR_RETURN_LINE, "-");
- Error(ERR_RETURN, "warning: unknown token(s) found in config file:");
- Error(ERR_RETURN, "- config file: '%s'", filename);
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "warning: unknown token(s) found in config file:");
+ Error(ERR_INFO, "- config file: '%s'", filename);
for (list = setup_file_list; list != NULL; list = list->next)
{
char *value = getHashEntry(extra_file_hash, list->token);
if (value != NULL && !strEqual(value, known_token_value))
- Error(ERR_RETURN, "- dynamic token: '%s'", list->token);
+ Error(ERR_INFO, "- dynamic token: '%s'", list->token);
}
- Error(ERR_RETURN_LINE, "-");
+ Error(ERR_INFO_LINE, "-");
}
if (undefined_values_found)
{
- Error(ERR_RETURN_LINE, "-");
- Error(ERR_RETURN, "warning: undefined values found in config file:");
- Error(ERR_RETURN, "- config file: '%s'", filename);
+ Error(ERR_INFO_LINE, "-");
+ Error(ERR_INFO, "warning: undefined values found in config file:");
+ Error(ERR_INFO, "- config file: '%s'", filename);
for (list = setup_file_list; list != NULL; list = list->next)
{
char *value = getHashEntry(empty_file_hash, list->token);
if (value != NULL)
- Error(ERR_RETURN, "- undefined value for token: '%s'", list->token);
+ Error(ERR_INFO, "- undefined value for token: '%s'", list->token);
}
- Error(ERR_RETURN_LINE, "-");
+ Error(ERR_INFO_LINE, "-");
}
freeSetupFileList(setup_file_list);
char *filename_base = UNDEFINED_FILENAME, *filename_local;
int i, j;
- DrawInitText("Loading artwork config:", 120, FC_GREEN);
+ DrawInitText("Loading artwork config", 120, FC_GREEN);
DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW);
/* always start with reliable default values */
{
char *init_text[] =
{
- "Loading graphics:",
- "Loading sounds:",
- "Loading music:"
+ "Loading graphics",
+ "Loading sounds",
+ "Loading music"
};
ListNode *node;
void openErrorFile()
{
- /* always start with reliable default values */
- program.error_file = stderr;
+ InitUserDataDirectory();
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
if ((program.error_file = fopen(program.error_filename, MODE_WRITE)) == NULL)
fprintf_newline(stderr, "ERROR: cannot open file '%s' for writing!",
program.error_filename);
-#endif
}
void closeErrorFile()
/* the following is only for debugging purpose and normally not used */
/* ------------------------------------------------------------------------- */
-#define DEBUG_NUM_TIMESTAMPS 3
+#if DEBUG
+
+#define DEBUG_NUM_TIMESTAMPS 3
+#define DEBUG_TIME_IN_MICROSECONDS 1
+
+#if DEBUG_TIME_IN_MICROSECONDS
+static double Counter_Microseconds()
+{
+ static struct timeval base_time = { 0, 0 };
+ struct timeval current_time;
+ double counter;
+
+ gettimeofday(¤t_time, NULL);
+
+ /* reset base time in case of wrap-around */
+ if (current_time.tv_sec < base_time.tv_sec)
+ base_time = current_time;
+
+ counter =
+ ((double)(current_time.tv_sec - base_time.tv_sec)) * 1000000 +
+ ((double)(current_time.tv_usec - base_time.tv_usec));
+
+ return counter; /* return microseconds since last init */
+}
+#endif
void debug_print_timestamp(int counter_nr, char *message)
{
+#if DEBUG_TIME_IN_MICROSECONDS
+ static double counter[DEBUG_NUM_TIMESTAMPS][2];
+
+ 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);
+
+ counter[counter_nr][1] = counter[counter_nr][0];
+#else
static long counter[DEBUG_NUM_TIMESTAMPS][2];
if (counter_nr >= DEBUG_NUM_TIMESTAMPS)
counter[counter_nr][0] = Counter();
if (message)
- printf("%s %.2f seconds\n", message,
+ printf("%s %.3f s\n", message,
(float)(counter[counter_nr][0] - counter[counter_nr][1]) / 1000);
- counter[counter_nr][1] = Counter();
+ counter[counter_nr][1] = counter[counter_nr][0];
+#endif
}
void debug_print_parent_only(char *format, ...)
printf("\n");
}
}
+#endif