X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=e300b9bb50821b6c4115fb0e2a8181af2ea57de5;hb=e77c26313b1a1e3ddd884cdda005cb6758c1a100;hp=88d2e299409024e5eb76c2fa66ecbd4c0b1b57d9;hpb=9cb181e05e485435ef48586dd4f2811ba1e672b3;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 88d2e299..e300b9bb 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -106,7 +106,7 @@ char *int2str(int number, int size) if (size > 20) size = 20; - if (size) + if (size > 0) { sprintf(s, " %09d", number); return &s[strlen(s) - size]; @@ -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 */ @@ -552,6 +557,21 @@ char *getStringCopy(char *s) return s_copy; } +char *getStringCopyN(char *s, int n) +{ + char *s_copy; + int s_len = MAX(0, n); + + if (s == NULL) + return NULL; + + s_copy = checked_malloc(s_len + 1); + strncpy(s_copy, s, s_len); + s_copy[s_len] = '\0'; + + return s_copy; +} + char *getStringToLower(char *s) { char *s_copy = checked_malloc(strlen(s) + 1); @@ -579,6 +599,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 */ @@ -808,7 +836,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); @@ -1782,7 +1810,15 @@ int get_parameter_value(char *value_raw, char *suffix, int type) { result = (strEqual(value, "left") ? ALIGN_LEFT : strEqual(value, "right") ? ALIGN_RIGHT : - strEqual(value, "center") ? ALIGN_CENTER : ALIGN_DEFAULT); + 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")) { @@ -1798,8 +1834,6 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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")) @@ -1811,6 +1845,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 : @@ -1824,7 +1870,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; @@ -1835,6 +1881,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); } @@ -1966,7 +2027,7 @@ 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"); } @@ -1983,11 +2044,11 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, 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_xxx.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_xxx.c')", + Error(ERR_INFO, "- found to be: %d (according to 'src/conf_xxx.c')", num_file_list_entries_found); Error(ERR_EXIT, "please fix"); } @@ -2261,10 +2322,20 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, base_index = i; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> MATCH: '%s', '%s'\n", token, base_prefix); +#endif + if (start_pos + len_base_prefix == len_token) /* exact match */ { exact_match = TRUE; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> EXACT MATCH: '%s', '%s'\n", token, base_prefix); +#endif + add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, extra_file_hash, @@ -2298,10 +2369,20 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, ext1_index = j; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> MATCH: '%s', '%s'\n", token, ext1_suffix); +#endif + if (start_pos + len_ext1_suffix == len_token) /* exact match */ { exact_match = TRUE; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> EXACT MATCH: '%s', '%s'\n", token, ext1_suffix); +#endif + add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, extra_file_hash, @@ -2340,10 +2421,20 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, ext2_index = k; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> MATCH: '%s', '%s'\n", token, ext2_suffix); +#endif + if (start_pos + len_ext2_suffix == len_token) /* exact match */ { exact_match = TRUE; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> EXACT MATCH: '%s', '%s'\n", token, ext2_suffix); +#endif + add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, extra_file_hash, @@ -2382,10 +2473,20 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, ext3_index = l; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> MATCH: '%s', '%s'\n", token, ext3_suffix); +#endif + if (start_pos + len_ext3_suffix == len_token) /* exact match */ { exact_match = TRUE; +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> EXACT MATCH: '%s', '%s'\n", token, ext3_suffix); +#endif + add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, extra_file_hash, @@ -2431,53 +2532,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); @@ -2683,7 +2784,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)) @@ -2805,10 +2906,46 @@ void NotifyUserAboutErrorFile() #if DEBUG -#define DEBUG_NUM_TIMESTAMPS 3 +#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) @@ -2817,10 +2954,11 @@ void debug_print_timestamp(int counter_nr, char *message) counter[counter_nr][0] = Counter(); if (message) - printf("%s %.3f 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_nr][0]; +#endif } void debug_print_parent_only(char *format, ...)