X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=a810b6d11072c89d0389712014ae6b54cfb3063f;hb=4dba06ad2079d7f9df56ec5512c6d27a0cf8c18e;hp=970dc77e95a76a78e1176bd25c1b8bb64f75c0d7;hpb=caa7c617a9ffc31ac6b4a20d7046235c409671ca;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 970dc77e..a810b6d1 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -470,7 +470,7 @@ static char *getLastPathSeparatorPtr(char *filename) return last_separator; } -static char *getBaseNamePtr(char *filename) +char *getBaseNamePtr(char *filename) { char *last_separator = getLastPathSeparatorPtr(filename); @@ -565,6 +565,14 @@ void setString(char **old_value, char *new_value) *old_value = getStringCopy(new_value); } +boolean strEqual(char *s1, char *s2) +{ + return (s1 == NULL && s2 == NULL ? TRUE : + s1 == NULL && s2 != NULL ? FALSE : + s1 != NULL && s2 == NULL ? FALSE : + strcmp(s1, s2) == 0); +} + /* ------------------------------------------------------------------------- */ /* command line option handling functions */ @@ -583,9 +591,9 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) in an application package directory -- do not try to use this directory as the program data directory (Mac OS X handles this correctly anyway) */ - if (strcmp(ro_base_path, ".") == 0) + if (strEqual(ro_base_path, ".")) ro_base_path = program.command_basepath; - if (strcmp(rw_base_path, ".") == 0) + if (strEqual(rw_base_path, ".")) rw_base_path = program.command_basepath; #endif @@ -625,7 +633,7 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) strcpy(option_str, option); /* copy argument into buffer */ option = option_str; - if (strcmp(option, "--") == 0) /* stop scanning arguments */ + if (strEqual(option, "--")) /* stop scanning arguments */ break; if (strncmp(option, "--", 2) == 0) /* treat '--' like '-' */ @@ -643,7 +651,7 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) option_len = strlen(option); - if (strcmp(option, "-") == 0) + if (strEqual(option, "-")) Error(ERR_EXIT_HELP, "unrecognized option '%s'", option); else if (strncmp(option, "-help", option_len) == 0) { @@ -742,6 +750,45 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) /* when doing batch processing, always enable verbose mode (warnings) */ options.verbose = TRUE; } +#if 1 +#if DEBUG +#if defined(TARGET_SDL) + else if (strncmp(option, "-SDL_ListModes", option_len) == 0) + { + SDL_Rect **modes; + int i; + + SDL_Init(SDL_INIT_VIDEO); + + /* get available fullscreen/hardware modes */ + modes=SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_HWSURFACE); + + /* check if there are any modes available */ + if (modes == (SDL_Rect **)0) + { + printf("No modes available!\n"); + + exit(-1); + } + + /* check if our resolution is restricted */ + if (modes == (SDL_Rect **)-1) + { + printf("All resolutions available.\n"); + } + else + { + /* print valid modes */ + printf("Available Modes:\n"); + for(i = 0; modes[i]; i++) + printf(" %d x %d\n", modes[i]->w, modes[i]->h); + } + + exit(0); + } +#endif +#endif +#endif else if (*option == '-') { Error(ERR_EXIT_HELP, "unrecognized option '%s'", option_str); @@ -1033,17 +1080,27 @@ boolean getFileChunk(FILE *file, char *chunk_name, int *chunk_size, return (feof(file) || ferror(file) ? FALSE : TRUE); } -void putFileChunk(FILE *file, char *chunk_name, int chunk_size, - int byte_order) +int putFileChunk(FILE *file, char *chunk_name, int chunk_size, + int byte_order) { + int num_bytes = 0; + /* write chunk name */ - fputs(chunk_name, file); + if (file != NULL) + fputs(chunk_name, file); + + num_bytes += strlen(chunk_name); if (chunk_size >= 0) { /* write chunk size */ - putFile32BitInteger(file, chunk_size, byte_order); + if (file != NULL) + putFile32BitInteger(file, chunk_size, byte_order); + + num_bytes += 4; } + + return num_bytes; } int getFileVersion(FILE *file) @@ -1057,17 +1114,22 @@ int getFileVersion(FILE *file) version_build); } -void putFileVersion(FILE *file, int version) +int putFileVersion(FILE *file, int version) { - int version_major = VERSION_MAJOR(version); - int version_minor = VERSION_MINOR(version); - int version_patch = VERSION_PATCH(version); - int version_build = VERSION_BUILD(version); + if (file != NULL) + { + int version_major = VERSION_MAJOR(version); + int version_minor = VERSION_MINOR(version); + int version_patch = VERSION_PATCH(version); + int version_build = VERSION_BUILD(version); + + fputc(version_major, file); + fputc(version_minor, file); + fputc(version_patch, file); + fputc(version_build, file); + } - fputc(version_major, file); - fputc(version_minor, file); - fputc(version_patch, file); - fputc(version_build, file); + return 4; } void ReadBytesFromFile(FILE *file, byte *buffer, unsigned long bytes) @@ -1305,7 +1367,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) i = 0; do { - if (strcmp(translate_key[i].name, *name) == 0) + if (strEqual(translate_key[i].name, *name)) { key = translate_key[i].key; break; @@ -1360,7 +1422,7 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) do { - if (strcmp(name_ptr, translate_key[i].x11name) == 0) + if (strEqual(name_ptr, translate_key[i].x11name)) { key = translate_key[i].key; break; @@ -1442,9 +1504,9 @@ char getCharFromKey(Key key) if (strlen(keyname) == 1) letter = keyname[0]; - else if (strcmp(keyname, "space") == 0) + else if (strEqual(keyname, "space")) letter = ' '; - else if (strcmp(keyname, "circumflex") == 0) + else if (strEqual(keyname, "circumflex")) letter = '^'; return letter; @@ -1482,14 +1544,14 @@ int get_integer_from_string(char *s) for (i = 0; number_text[i][0] != NULL; i++) for (j = 0; j < 3; j++) - if (strcmp(s_lower, number_text[i][j]) == 0) + if (strEqual(s_lower, number_text[i][j])) result = i; if (result == -1) { - if (strcmp(s_lower, "false") == 0) + if (strEqual(s_lower, "false")) result = 0; - else if (strcmp(s_lower, "true") == 0) + else if (strEqual(s_lower, "true")) result = 1; else result = atoi(s); @@ -1505,9 +1567,9 @@ boolean get_boolean_from_string(char *s) char *s_lower = getStringToLower(s); boolean result = FALSE; - if (strcmp(s_lower, "true") == 0 || - strcmp(s_lower, "yes") == 0 || - strcmp(s_lower, "on") == 0 || + if (strEqual(s_lower, "true") || + strEqual(s_lower, "yes") || + strEqual(s_lower, "on") || get_integer_from_string(s) == 1) result = TRUE; @@ -1542,7 +1604,7 @@ void deleteNodeFromList(ListNode **node_first, char *key, if (node_first == NULL || *node_first == NULL) return; - if (strcmp((*node_first)->key, key) == 0) + if (strEqual((*node_first)->key, key)) { free((*node_first)->key); if (destructor_function) @@ -1558,7 +1620,7 @@ ListNode *getNodeFromKey(ListNode *node_first, char *key) if (node_first == NULL) return NULL; - if (strcmp(node_first->key, key) == 0) + if (strEqual(node_first->key, key)) return node_first; else return getNodeFromKey(node_first->next, key); @@ -1634,7 +1696,7 @@ boolean fileHasSuffix(char *basename, char *suffix) if (basename_length > suffix_length + 1 && basename_lower[basename_length - suffix_length - 1] == '.' && - strcmp(&basename_lower[basename_length - suffix_length], suffix) == 0) + strEqual(&basename_lower[basename_length - suffix_length], suffix)) return TRUE; return FALSE; @@ -1754,14 +1816,14 @@ int get_parameter_value(char *value_raw, char *suffix, int type) char *value = getStringToLower(value_raw); int result = 0; /* probably a save default value */ - if (strcmp(suffix, ".direction") == 0) + if (strEqual(suffix, ".direction")) { - result = (strcmp(value, "left") == 0 ? MV_LEFT : - strcmp(value, "right") == 0 ? MV_RIGHT : - strcmp(value, "up") == 0 ? MV_UP : - strcmp(value, "down") == 0 ? MV_DOWN : MV_NONE); + result = (strEqual(value, "left") ? MV_LEFT : + strEqual(value, "right") ? MV_RIGHT : + strEqual(value, "up") ? MV_UP : + strEqual(value, "down") ? MV_DOWN : MV_NONE); } - else if (strcmp(suffix, ".anim_mode") == 0) + else if (strEqual(suffix, ".anim_mode")) { result = (string_has_parameter(value, "none") ? ANIM_NONE : string_has_parameter(value, "loop") ? ANIM_LOOP : @@ -1771,6 +1833,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) string_has_parameter(value, "random") ? ANIM_RANDOM : string_has_parameter(value, "ce_value") ? ANIM_CE_VALUE : string_has_parameter(value, "ce_score") ? ANIM_CE_SCORE : + string_has_parameter(value, "ce_delay") ? ANIM_CE_DELAY : string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL : string_has_parameter(value, "vertical") ? ANIM_VERTICAL : ANIM_DEFAULT); @@ -1786,7 +1849,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) } else /* generic parameter of type integer or boolean */ { - result = (strcmp(value, ARG_UNDEFINED) == 0 ? ARG_UNDEFINED_VALUE : + result = (strEqual(value, ARG_UNDEFINED) ? ARG_UNDEFINED_VALUE : type == TYPE_INTEGER ? get_integer_from_string(value) : type == TYPE_BOOLEAN ? get_boolean_from_string(value) : ARG_UNDEFINED_VALUE); @@ -1868,8 +1931,8 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, int len_suffix = strlen(suffix_list[j].token); if (len_suffix < len_config_token && - strcmp(&config_list[i].token[len_config_token - len_suffix], - suffix_list[j].token) == 0) + strEqual(&config_list[i].token[len_config_token - len_suffix], + suffix_list[j].token)) { setString(&file_list[list_pos].default_parameter[j], config_list[i].value); @@ -1881,7 +1944,7 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, /* the following tokens are no file definitions, but other config tokens */ for (j = 0; ignore_tokens[j] != NULL; j++) - if (strcmp(config_list[i].token, ignore_tokens[j]) == 0) + if (strEqual(config_list[i].token, ignore_tokens[j])) is_file_entry = FALSE; if (is_file_entry) @@ -1893,9 +1956,9 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, break; /* simple sanity check if this is really a file definition */ - if (strcmp(&config_list[i].value[len_config_value - 4], ".pcx") != 0 && - strcmp(&config_list[i].value[len_config_value - 4], ".wav") != 0 && - strcmp(config_list[i].value, UNDEFINED_FILENAME) != 0) + if (!strEqual(&config_list[i].value[len_config_value - 4], ".pcx") && + !strEqual(&config_list[i].value[len_config_value - 4], ".wav") && + !strEqual(config_list[i].value, UNDEFINED_FILENAME)) { Error(ERR_RETURN, "Configuration directive '%s' -> '%s':", config_list[i].token, config_list[i].value); @@ -2059,6 +2122,10 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, if (filename == NULL) return; +#if 0 + printf("LoadArtworkConfigFromFilename '%s' ...\n", filename); +#endif + if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; @@ -2112,7 +2179,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, { char *value = HASH_ITERATION_VALUE(itr); - if (strcmp(value, known_token_value) != 0) + if (!strEqual(value, known_token_value)) setHashEntry(extra_file_hash, HASH_ITERATION_TOKEN(itr), value); } END_HASH_ITERATION(valid_file_hash, itr) @@ -2341,7 +2408,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, BEGIN_HASH_ITERATION(extra_file_hash, itr) { - if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) == 0) + if (strEqual(HASH_ITERATION_VALUE(itr), known_token_value)) dynamic_tokens_found = TRUE; else unknown_tokens_found = TRUE; @@ -2358,7 +2425,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, { char *value = getHashEntry(extra_file_hash, list->token); - if (value != NULL && strcmp(value, known_token_value) == 0) + if (value != NULL && strEqual(value, known_token_value)) Error(ERR_RETURN, "- dynamic token: '%s'", list->token); } @@ -2375,7 +2442,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, { char *value = getHashEntry(extra_file_hash, list->token); - if (value != NULL && strcmp(value, known_token_value) != 0) + if (value != NULL && !strEqual(value, known_token_value)) Error(ERR_RETURN, "- dynamic token: '%s'", list->token); } @@ -2425,10 +2492,6 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) char *filename_base = UNDEFINED_FILENAME, *filename_local; int i, j; -#if 0 - printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); -#endif - DrawInitText("Loading artwork config:", 120, FC_GREEN); DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW); @@ -2481,7 +2544,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) filename_local = getCustomArtworkConfigFilename(artwork_info->type); - if (filename_local != NULL && strcmp(filename_base, filename_local) != 0) + if (filename_local != NULL && !strEqual(filename_base, filename_local)) LoadArtworkConfigFromFilename(artwork_info, filename_local); } @@ -2522,7 +2585,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, basename = file_list_entry->default_filename; /* dynamic artwork has no default filename / skip empty default artwork */ - if (basename == NULL || strcmp(basename, UNDEFINED_FILENAME) == 0) + if (basename == NULL || strEqual(basename, UNDEFINED_FILENAME)) return; file_list_entry->fallback_to_default = TRUE; @@ -2546,7 +2609,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, } /* check if the old and the new artwork file are the same */ - if (*listnode && strcmp((*listnode)->source_filename, filename) == 0) + if (*listnode && strEqual((*listnode)->source_filename, filename)) { /* The old and new artwork are the same (have the same filename and path). This usually means that this artwork does not exist in this artwork set @@ -2609,7 +2672,7 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); #endif - if (strcmp(file_list_entry->filename, UNDEFINED_FILENAME) == 0) + if (strEqual(file_list_entry->filename, UNDEFINED_FILENAME)) { deleteArtworkListEntry(artwork_info, listnode); return;