X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=c7b8eea400aead264705c4ac9be1b3aa6e678532;hb=55f203a3ec70054fae6ea753c6fc0cc5d3d8a664;hp=9b3f663352d5833598f6fc81885014758e5f05d5;hpb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 9b3f6633..c7b8eea4 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -41,7 +41,7 @@ void fprintf_line(FILE *stream, char *line_string, int line_length) { int i; - for (i=0; i 2147483647) /* yes, this is a kludge */ + i = 2147483647; + + a = checked_malloc(10 + 1); + + sprintf(a, "%d", i); + + return a; +} + /* ------------------------------------------------------------------------- */ /* counter functions */ @@ -243,7 +263,7 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) { unsigned long actual_counter; - while(1) + while (1) { actual_counter = Counter(); @@ -262,48 +282,6 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) /* random generator functions */ /* ------------------------------------------------------------------------- */ -#if 0 -unsigned int SimpleRND(unsigned int max) -{ - return (random_linux_libc(RND_FREE) % max); -} - -unsigned int InitSimpleRND(long seed) -{ - if (seed == NEW_RANDOMIZE) - { - struct timeval current_time; - - gettimeofday(¤t_time, NULL); - seed = (long)current_time.tv_usec; - } - - srandom_linux_libc(RND_FREE, (unsigned int) seed); - - return (unsigned int) seed; -} - -unsigned int RND(unsigned int max) -{ - return (random_linux_libc(RND_GAME) % max); -} - -unsigned int InitRND(long seed) -{ - if (seed == NEW_RANDOMIZE) - { - struct timeval current_time; - - gettimeofday(¤t_time, NULL); - seed = (long)current_time.tv_usec; - } - - srandom_linux_libc(RND_GAME, (unsigned int) seed); - - return (unsigned int) seed; -} -#endif - unsigned int init_random_number(int nr, long seed) { if (seed == NEW_RANDOMIZE) @@ -323,27 +301,10 @@ unsigned int init_random_number(int nr, long seed) return (unsigned int) seed; } -#if 1 -unsigned int get_random_number(int nr, unsigned int max) +unsigned int get_random_number(int nr, int max) { return (max > 0 ? random_linux_libc(nr) % max : 0); } -#else -unsigned int get_random_number(int nr, unsigned int max) -{ - unsigned int rnd = (max > 0 ? random_linux_libc(nr) % max : 0); - - if (nr == 0 && FrameCounter < 2) - printf("::: %d [%d]\n", rnd, FrameCounter); - -#if 0 - if (nr == 0 && FrameCounter < 2 && rnd == 8) - rnd /= 0; -#endif - - return rnd; -} -#endif /* ------------------------------------------------------------------------- */ @@ -539,8 +500,7 @@ char *getStringToLower(char *s) void setString(char **old_value, char *new_value) { - if (*old_value != NULL) - free(*old_value); + checked_free(*old_value); *old_value = getStringCopy(new_value); } @@ -822,7 +782,7 @@ void Error(int mode, char *format, ...) /* ------------------------------------------------------------------------- */ -/* memory allocation functions */ +/* checked memory allocation and freeing functions */ /* ------------------------------------------------------------------------- */ void *checked_malloc(unsigned long size) @@ -859,6 +819,12 @@ void *checked_realloc(void *ptr, unsigned long size) return ptr; } +void checked_free(void *ptr) +{ + if (ptr != NULL) /* this check should be done by free() anyway */ + free(ptr); +} + /* ------------------------------------------------------------------------- */ /* various helper functions */ @@ -1383,8 +1349,8 @@ int get_integer_from_string(char *s) char *s_lower = getStringToLower(s); int result = -1; - for (i=0; number_text[i][0] != NULL; i++) - for (j=0; j < 3; j++) + for (i = 0; number_text[i][0] != NULL; i++) + for (j = 0; j < 3; j++) if (strcmp(s_lower, number_text[i][j]) == 0) result = i; @@ -1518,8 +1484,7 @@ boolean fileHasPrefix(char *basename, char *prefix) static char *basename_lower = NULL; int basename_length, prefix_length; - if (basename_lower != NULL) - free(basename_lower); + checked_free(basename_lower); if (basename == NULL || prefix == NULL) return FALSE; @@ -1541,8 +1506,7 @@ boolean fileHasSuffix(char *basename, char *suffix) static char *basename_lower = NULL; int basename_length, suffix_length; - if (basename_lower != NULL) - free(basename_lower); + checked_free(basename_lower); if (basename == NULL || suffix == NULL) return FALSE; @@ -1559,18 +1523,30 @@ boolean fileHasSuffix(char *basename, char *suffix) return FALSE; } -boolean FileIsGraphic(char *basename) +boolean FileIsGraphic(char *filename) { + char *basename = strrchr(filename, '/'); + + basename = (basename != NULL ? basename + 1 : filename); + return fileHasSuffix(basename, "pcx"); } -boolean FileIsSound(char *basename) +boolean FileIsSound(char *filename) { + char *basename = strrchr(filename, '/'); + + basename = (basename != NULL ? basename + 1 : filename); + return fileHasSuffix(basename, "wav"); } -boolean FileIsMusic(char *basename) +boolean FileIsMusic(char *filename) { + char *basename = strrchr(filename, '/'); + + basename = (basename != NULL ? basename + 1 : filename); + if (FileIsSound(basename)) return TRUE; @@ -1711,11 +1687,11 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, file_list = checked_calloc(num_file_list_entries * sizeof(struct FileInfo)); - for (i=0; suffix_list[i].token != NULL; i++) + for (i = 0; suffix_list[i].token != NULL; i++) num_suffix_list_entries++; /* always start with reliable default values */ - for (i=0; ifilename, filename); /* when file definition found, set all parameters to default values */ - for (i=0; suffix_list[i].token != NULL; i++) + for (i = 0; suffix_list[i].token != NULL; i++) setString(&file_list_entry->parameter[i], suffix_list[i].value); file_list_entry->redefined = TRUE; @@ -1867,7 +1843,7 @@ static void read_token_parameters(SetupFileHash *setup_file_hash, #endif /* check for config tokens that can be build by base token and suffixes */ - for (i=0; suffix_list[i].token != NULL; i++) + for (i = 0; suffix_list[i].token != NULL; i++) { char *token = getStringCat2(file_list_entry->token, suffix_list[i].token); char *value = getHashEntry(setup_file_hash, token); @@ -1904,6 +1880,7 @@ static void add_dynamic_file_list_entry(struct FileInfo **list, new_list_entry = &(*list)[*num_list_entries - 1]; new_list_entry->token = getStringCopy(token); + new_list_entry->default_filename = NULL; new_list_entry->filename = NULL; new_list_entry->parameter = checked_calloc(parameter_array_size); @@ -1948,7 +1925,8 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, int num_ext2_suffixes = artwork_info->num_ext2_suffixes; int num_ext3_suffixes = artwork_info->num_ext3_suffixes; int num_ignore_tokens = artwork_info->num_ignore_tokens; - SetupFileHash *setup_file_hash, *extra_file_hash; + SetupFileHash *setup_file_hash, *valid_file_hash; + SetupFileHash *extra_file_hash, *empty_file_hash; char *known_token_value = KNOWN_TOKEN_VALUE; int i, j, k, l; @@ -1962,26 +1940,42 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; + /* separate valid (defined) from empty (undefined) config token values */ + valid_file_hash = newSetupFileHash(); + empty_file_hash = newSetupFileHash(); + BEGIN_HASH_ITERATION(setup_file_hash, itr) + { + char *value = HASH_ITERATION_VALUE(itr); + + setHashEntry(*value ? valid_file_hash : empty_file_hash, + HASH_ITERATION_TOKEN(itr), value); + } + END_HASH_ITERATION(setup_file_hash, itr) + + /* at this point, we do not need the setup file hash anymore -- free it */ + freeSetupFileHash(setup_file_hash); + /* read parameters for all known config file tokens */ - for (i=0; isizeof_artwork_list_entry); } - if (extra_file_hash != NULL && options.verbose && IS_PARENT_PROCESS()) + if (options.verbose && IS_PARENT_PROCESS()) { SetupFileList *setup_file_list, *list; boolean dynamic_tokens_found = FALSE; boolean unknown_tokens_found = FALSE; + boolean undefined_values_found = (hashtable_count(empty_file_hash) != 0); if ((setup_file_list = loadSetupFileList(filename)) == NULL) Error(ERR_EXIT, "loadSetupFileHash works, but loadSetupFileList fails"); @@ -2250,13 +2245,31 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, Error(ERR_RETURN_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); + + 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_RETURN_LINE, "-"); + } + freeSetupFileList(setup_file_list); } freeSetupFileHash(extra_file_hash); + freeSetupFileHash(empty_file_hash); #if 0 - for (i=0; itype), 150, FC_YELLOW); /* always start with reliable default values */ - for (i=0; idynamic_file_list != NULL) { - for (i=0; inum_dynamic_file_list_entries; i++) + for (i = 0; i < artwork_info->num_dynamic_file_list_entries; i++) { free(artwork_info->dynamic_file_list[i].token); free(artwork_info->dynamic_file_list[i].filename); @@ -2508,7 +2521,7 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) num_file_list_entries); #endif - for(i=0; idynamic_artwork_list[i], dynamic_file_list[i].filename, i); +#if 0 + printf("::: '%s', '0x%08x'\n", + dynamic_file_list[i].filename, + dynamic_file_list[i].default_filename); +#endif + } + #if 0 dumpList(artwork_info->content_list); #endif @@ -2554,7 +2575,7 @@ static void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info, if (*list == NULL) return; - for(i=0; i<*num_list_entries; i++) + for (i = 0; i < *num_list_entries; i++) deleteArtworkListEntry(artwork_info, &(*list)[i]); free(*list);