X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibgame%2Fmisc.c;h=a810b6d11072c89d0389712014ae6b54cfb3063f;hb=4dba06ad2079d7f9df56ec5512c6d27a0cf8c18e;hp=685311b94918d900c91ac7a493da25a100903b89;hpb=0bc034af5fcbf709be96723aff7ec5bc0c3c7baf;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 685311b9..a810b6d1 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -52,6 +52,12 @@ void printf_line(char *line_string, int line_length) fprintf_line(stdout, line_string, line_length); } +void printf_line_with_prefix(char *prefix, char *line_string, int line_length) +{ + fprintf(stdout, "%s", prefix); + fprintf_line(stdout, line_string, line_length); +} + /* int2str() returns a number converted to a string; the used memory is static, but will be overwritten by later calls, @@ -464,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); @@ -559,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 */ @@ -577,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 @@ -619,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 '-' */ @@ -637,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) { @@ -736,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); @@ -1027,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) @@ -1051,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) @@ -1187,16 +1255,16 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) /* more ASCII keys */ { KSYM_bracketleft, "XK_bracketleft", "[" }, - { KSYM_backslash, "XK_backslash", "backslash" }, + { KSYM_backslash, "XK_backslash", "\\" }, { KSYM_bracketright,"XK_bracketright", "]" }, - { KSYM_asciicircum, "XK_asciicircum", "circumflex" }, + { KSYM_asciicircum, "XK_asciicircum", "^" }, { KSYM_underscore, "XK_underscore", "_" }, { KSYM_grave, "XK_grave", "grave" }, { KSYM_quoteleft, "XK_quoteleft", "quote left" }, { KSYM_braceleft, "XK_braceleft", "brace left" }, { KSYM_bar, "XK_bar", "bar" }, { KSYM_braceright, "XK_braceright", "brace right" }, - { KSYM_asciitilde, "XK_asciitilde", "ascii tilde" }, + { KSYM_asciitilde, "XK_asciitilde", "~" }, /* special (non-ASCII) keys */ { KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" }, @@ -1226,8 +1294,13 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode) sprintf(name_buffer, "%c", '0' + (char)(key - KSYM_0)); else if (key >= KSYM_KP_0 && key <= KSYM_KP_9) sprintf(name_buffer, "keypad %c", '0' + (char)(key - KSYM_KP_0)); +#if 1 + else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST) + sprintf(name_buffer, "F%d", (int)(key - KSYM_FKEY_FIRST + 1)); +#else else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST) sprintf(name_buffer, "function F%d", (int)(key - KSYM_FKEY_FIRST + 1)); +#endif else if (key == KSYM_UNDEFINED) strcpy(name_buffer, "(undefined)"); else @@ -1294,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; @@ -1349,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; @@ -1431,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; @@ -1471,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); @@ -1494,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; @@ -1531,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) @@ -1547,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); @@ -1623,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; @@ -1743,31 +1816,40 @@ 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) - { - result = (string_has_parameter(value, "none") ? ANIM_NONE : - string_has_parameter(value, "loop") ? ANIM_LOOP : - string_has_parameter(value, "linear") ? ANIM_LINEAR : - string_has_parameter(value, "pingpong") ? ANIM_PINGPONG : - string_has_parameter(value, "pingpong2") ? ANIM_PINGPONG2 : - string_has_parameter(value, "random") ? ANIM_RANDOM : - string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL : - string_has_parameter(value, "vertical") ? ANIM_VERTICAL : + else if (strEqual(suffix, ".anim_mode")) + { + result = (string_has_parameter(value, "none") ? ANIM_NONE : + string_has_parameter(value, "loop") ? ANIM_LOOP : + string_has_parameter(value, "linear") ? ANIM_LINEAR : + string_has_parameter(value, "pingpong") ? ANIM_PINGPONG : + string_has_parameter(value, "pingpong2") ? ANIM_PINGPONG2 : + 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); if (string_has_parameter(value, "reverse")) result |= ANIM_REVERSE; + + if (string_has_parameter(value, "opaque_player")) + result |= ANIM_OPAQUE_PLAYER; + + if (string_has_parameter(value, "static_panel")) + result |= ANIM_STATIC_PANEL; } 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); @@ -1849,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); @@ -1862,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) @@ -1874,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); @@ -2040,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; @@ -2093,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) @@ -2322,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; @@ -2339,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); } @@ -2356,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); } @@ -2406,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); @@ -2462,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); } @@ -2503,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; @@ -2527,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 @@ -2590,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;