X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=f94cc376097e2e040d790c43c784c34bb0d524ae;hb=6d06ba238902736bb99714dc8122bb32a286577a;hp=7a780511fde0a6743c6c00c74cede00d30dde723;hpb=5c94351c5b8a12d8615b447b6275dd2f68615be4;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 7a780511..f94cc376 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]; @@ -557,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); @@ -584,6 +599,31 @@ 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); +} + +boolean strEqualPrefix(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 strEqualSuffix(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 */ @@ -910,6 +950,19 @@ void checked_free(void *ptr) 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 */ @@ -1509,9 +1562,13 @@ int get_integer_from_string(char *s) 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); @@ -1827,9 +1884,14 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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 (strEqual(suffix, ".font")) +#if 1 + else if (strEqualPrefix(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); } @@ -1846,35 +1908,6 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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; @@ -2298,10 +2331,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, @@ -2335,10 +2378,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, @@ -2377,10 +2430,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, @@ -2419,10 +2482,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,