X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=c06eac4f097f9e32f7031323b4613ba78aad1bf9;hb=2c54d1765fec2db1ab23e2d5b5fba927efa463ce;hp=916ce2bdc4a3fff781f9b546f339adecf39e3443;hpb=ac86d841daa4ecafff3128110a1db109e03fb355;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 916ce2bd..c06eac4f 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -156,6 +156,11 @@ int log_2(unsigned int x) return e; } +boolean getTokenValueFromString(char *string, char **token, char **value) +{ + return getTokenValueFromSetupLine(string, token, value); +} + /* ------------------------------------------------------------------------- */ /* counter functions */ @@ -328,17 +333,8 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) /* random generator functions */ /* ------------------------------------------------------------------------- */ -#if 0 -static int foo = -1; -#endif - unsigned int init_random_number(int nr, long seed) { -#if 0 - if (nr == 0) - foo = 0; -#endif - if (seed == NEW_RANDOMIZE) { #if defined(TARGET_SDL) @@ -358,26 +354,7 @@ unsigned int init_random_number(int nr, long seed) unsigned int get_random_number(int nr, int max) { -#if 0 - if (max > 0) - { - long int rnd_raw = random_linux_libc(nr); - unsigned int rnd = rnd_raw % max; - - if (nr == 0) - { - printf("::: %d: %d [%d MOD %d]\n", foo++, rnd, rnd_raw, max); - } - - return rnd; - } - else - { - return 0; - } -#else return (max > 0 ? random_linux_libc(nr) % max : 0); -#endif } @@ -526,36 +503,45 @@ char *getBasePath(char *filename) /* 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) @@ -598,6 +584,14 @@ boolean strEqual(char *s1, char *s2) strcmp(s1, s2) == 0); } +boolean strEqualN(char *s1, char *s2, int n) +{ + return (s1 == NULL && s2 == NULL ? TRUE : + s1 == NULL && s2 != NULL ? FALSE : + s1 != NULL && s2 == NULL ? FALSE : + strncmp(s1, s2, n) == 0); +} + /* ------------------------------------------------------------------------- */ /* command line option handling functions */ @@ -827,7 +821,7 @@ void Error(int mode, char *format, ...) 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); @@ -1238,6 +1232,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) { KSYM_asciitilde, "XK_asciitilde", "~" }, /* special (non-ASCII) keys */ + { KSYM_degree, "XK_degree", "°" }, { KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" }, { KSYM_Odiaeresis, "XK_Odiaeresis", "Ö" }, { KSYM_Udiaeresis, "XK_Udiaeresis", "Ü" }, @@ -1466,16 +1461,23 @@ Key getKeyFromX11KeyName(char *x11name) 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 c; +} + +char getValidConfigValueChar(char c) +{ + if (c == '#' || /* used to mark comments */ + c == '\\') /* used to mark continued lines */ + c = 0; - return letter; + return c; } @@ -1789,6 +1791,20 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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 : + strEqual(value, "middle") ? ALIGN_CENTER : ALIGN_DEFAULT); + } + else if (strEqual(suffix, ".valign")) + { + result = (strEqual(value, "top") ? VALIGN_TOP : + strEqual(value, "bottom") ? VALIGN_BOTTOM : + strEqual(value, "middle") ? VALIGN_MIDDLE : + strEqual(value, "center") ? VALIGN_MIDDLE : VALIGN_DEFAULT); + } else if (strEqual(suffix, ".anim_mode")) { result = (string_has_parameter(value, "none") ? ANIM_NONE : @@ -1802,6 +1818,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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 : ANIM_DEFAULT); if (string_has_parameter(value, "reverse")) @@ -1813,6 +1830,18 @@ int get_parameter_value(char *value_raw, char *suffix, int type) if (string_has_parameter(value, "static_panel")) result |= ANIM_STATIC_PANEL; } + else if (strEqual(suffix, ".fade_mode")) + { + result = (string_has_parameter(value, "none") ? FADE_MODE_NONE : + string_has_parameter(value, "fade") ? FADE_MODE_FADE : + string_has_parameter(value, "crossfade") ? FADE_MODE_CROSSFADE : + string_has_parameter(value, "melt") ? FADE_MODE_MELT : + FADE_MODE_DEFAULT); + } + else if (strEqualN(suffix, ".font", 5)) /* (may also be ".font_xyz") */ + { + result = gfx.get_font_from_token_function(value); + } else /* generic parameter of type integer or boolean */ { result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE : @@ -1826,7 +1855,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) return result; } -int get_auto_parameter_value(char *token, char *value_raw) +int get_token_parameter_value(char *token, char *value_raw) { char *suffix; @@ -1837,6 +1866,21 @@ int get_auto_parameter_value(char *token, char *value_raw) 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); } @@ -1968,28 +2012,36 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, !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; } @@ -2425,53 +2477,53 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, 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); @@ -2500,7 +2552,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) 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 */ @@ -2577,9 +2629,9 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, { char *init_text[] = { - "Loading graphics:", - "Loading sounds:", - "Loading music:" + "Loading graphics", + "Loading sounds", + "Loading music" }; ListNode *node; @@ -2677,7 +2729,7 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, struct FileInfo *file_list_entry) { #if 0 - printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); + printf("GOT CUSTOM ARTWORK FILE '%s'\n", file_list_entry->filename); #endif if (strEqual(file_list_entry->filename, UNDEFINED_FILENAME)) @@ -2797,10 +2849,48 @@ void NotifyUserAboutErrorFile() /* 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 0 + +#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) @@ -2809,10 +2899,11 @@ void debug_print_timestamp(int counter_nr, char *message) 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, ...) @@ -2831,3 +2922,4 @@ void debug_print_parent_only(char *format, ...) printf("\n"); } } +#endif