X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=ec16eeee4568f1b7c95a23b5d810a64c1edfcad9;hb=1786288765edb99711ec0eb06520969879d62cc2;hp=26c338ca20279567276b92a87524994f85f54096;hpb=35dd23cea816adff3891d62ea47aec6aa0aba990;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 26c338ca..ec16eeee 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -1,7 +1,7 @@ /*********************************************************** * Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1994-2002 Artsoft Entertainment * +* (c) 1994-2006 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -50,53 +50,6 @@ static void vfprintf_newline(FILE *stream, char *format, va_list ap) fprintf(stream, "%s", newline); } -static void vprintf_error_ext(char *format, va_list ap, boolean print_newline) -{ - FILE *error_file = openErrorFile(); /* this returns at least 'stderr' */ - - if (print_newline) - vfprintf_newline(error_file, format, ap); - else - vfprintf(error_file, format, ap); - - if (error_file != stderr) /* do not close stream 'stderr' */ - fclose(error_file); -} - -static void vprintf_error(char *format, va_list ap) -{ - vprintf_error_ext(format, ap, FALSE); -} - -static void vprintf_error_newline(char *format, va_list ap) -{ - vprintf_error_ext(format, ap, TRUE); -} - -static void printf_error(char *format, ...) -{ - if (format) - { - va_list ap; - - va_start(ap, format); - vprintf_error(format, ap); - va_end(ap); - } -} - -static void printf_error_newline(char *format, ...) -{ - if (format) - { - va_list ap; - - va_start(ap, format); - vprintf_error_newline(format, ap); - va_end(ap); - } -} - static void fprintf_newline(FILE *stream, char *format, ...) { if (format) @@ -109,26 +62,14 @@ static void fprintf_newline(FILE *stream, char *format, ...) } } -static char *get_line_string(char *line_chars, int line_length) +void fprintf_line(FILE *stream, char *line_chars, int line_length) { - static char *buffer = NULL; - int line_chars_length = strlen(line_chars); int i; - if (buffer != NULL) - checked_free(buffer); - - buffer = checked_malloc(line_chars_length * line_length + 1); - for (i = 0; i < line_length; i++) - strcpy(&buffer[i * line_chars_length], line_chars); + fprintf(stream, "%s", line_chars); - return buffer; -} - -void fprintf_line(FILE *stream, char *line_chars, int line_length) -{ - fprintf_newline(stream, get_line_string(line_chars, line_length)); + fprintf_newline(stream, ""); } void printf_line(char *line_chars, int line_length) @@ -136,11 +77,6 @@ void printf_line(char *line_chars, int line_length) fprintf_line(stdout, line_chars, line_length); } -void printf_line_error(char *line_chars, int line_length) -{ - printf_error_newline(get_line_string(line_chars, line_length)); -} - void printf_line_with_prefix(char *prefix, char *line_chars, int line_length) { fprintf(stdout, "%s", prefix); @@ -514,38 +450,6 @@ char *getRealName() return real_name; } -char *getHomeDir() -{ - static char *dir = NULL; - -#if defined(PLATFORM_WIN32) - if (dir == NULL) - { - dir = checked_malloc(MAX_PATH + 1); - - if (!SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, dir))) - strcpy(dir, "."); - } -#elif defined(PLATFORM_UNIX) - if (dir == NULL) - { - if ((dir = getenv("HOME")) == NULL) - { - struct passwd *pwd; - - if ((pwd = getpwuid(getuid())) != NULL) - dir = getStringCopy(pwd->pw_dir); - else - dir = "."; - } - } -#else - dir = "."; -#endif - - return dir; -} - /* ------------------------------------------------------------------------- */ /* path manipulation functions */ @@ -886,8 +790,6 @@ char *GetError() return internal_error; } -#if 1 - void Error(int mode, char *format, ...) { static boolean last_line_was_separator = FALSE; @@ -900,7 +802,7 @@ void Error(int mode, char *format, ...) if (mode == ERR_RETURN_LINE) { if (!last_line_was_separator) - printf_line_error(format, 79); + fprintf_line(program.error_file, format, 79); last_line_was_separator = TRUE; @@ -920,23 +822,25 @@ void Error(int mode, char *format, ...) { va_list ap; - printf_error("%s%s: ", program.command_basename, process_name); + fprintf(program.error_file, "%s%s: ", program.command_basename, + process_name); if (mode & ERR_WARN) - printf_error("warning: "); + fprintf(program.error_file, "warning: "); va_start(ap, format); - vprintf_error_newline(format, ap); + vfprintf_newline(program.error_file, format, ap); va_end(ap); } if (mode & ERR_HELP) - printf_error_newline("%s: Try option '--help' for more information.", - program.command_basename); + fprintf_newline(program.error_file, + "%s: Try option '--help' for more information.", + program.command_basename); if (mode & ERR_EXIT) - printf_error_newline("%s%s: aborting", - program.command_basename, process_name); + fprintf_newline(program.error_file, "%s%s: aborting", + program.command_basename, process_name); if (mode & ERR_EXIT) { @@ -947,87 +851,6 @@ void Error(int mode, char *format, ...) } } -#else - -void Error(int mode, char *format, ...) -{ - static boolean last_line_was_separator = FALSE; - char *process_name = ""; - FILE *error = stderr; - char *newline = "\n"; - - /* display warnings only when running in verbose mode */ - if (mode & ERR_WARN && !options.verbose) - return; - - if (mode == ERR_RETURN_LINE) - { - if (!last_line_was_separator) - fprintf_line(error, format, 79); - - last_line_was_separator = TRUE; - - return; - } - - last_line_was_separator = FALSE; - -#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS) - newline = "\r\n"; - - if ((error = openErrorFile()) == NULL) - { - printf("Cannot write to error output file!%s", newline); - - program.exit_function(1); - } -#endif - - if (mode & ERR_SOUND_SERVER) - process_name = " sound server"; - else if (mode & ERR_NETWORK_SERVER) - process_name = " network server"; - else if (mode & ERR_NETWORK_CLIENT) - process_name = " network client **"; - - if (format) - { - va_list ap; - - fprintf(error, "%s%s: ", program.command_basename, process_name); - - if (mode & ERR_WARN) - fprintf(error, "warning: "); - - va_start(ap, format); - vfprintf(error, format, ap); - va_end(ap); - - fprintf(error, "%s", newline); - } - - if (mode & ERR_HELP) - fprintf(error, "%s: Try option '--help' for more information.%s", - program.command_basename, newline); - - if (mode & ERR_EXIT) - fprintf(error, "%s%s: aborting%s", - program.command_basename, process_name, newline); - - if (error != stderr) - fclose(error); - - if (mode & ERR_EXIT) - { - if (mode & ERR_FROM_SERVER) - exit(1); /* child process: normal exit */ - else - program.exit_function(1); /* main process: clean up stuff */ - } -} - -#endif - /* ------------------------------------------------------------------------- */ /* checked memory allocation and freeing functions */ @@ -1414,13 +1237,8 @@ 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 @@ -1726,7 +1544,7 @@ void deleteNodeFromList(ListNode **node_first, char *key, if (strEqual((*node_first)->key, key)) { - free((*node_first)->key); + checked_free((*node_first)->key); if (destructor_function) destructor_function((*node_first)->content); *node_first = (*node_first)->next; @@ -1943,6 +1761,12 @@ int get_parameter_value(char *value_raw, char *suffix, int type) strEqual(value, "up") ? MV_UP : strEqual(value, "down") ? MV_DOWN : MV_NONE); } + else if (strEqual(suffix, ".align")) + { + result = (strEqual(value, "left") ? ALIGN_LEFT : + strEqual(value, "right") ? ALIGN_RIGHT : + strEqual(value, "center") ? ALIGN_CENTER : ALIGN_DEFAULT); + } else if (strEqual(suffix, ".anim_mode")) { result = (string_has_parameter(value, "none") ? ANIM_NONE : @@ -1956,6 +1780,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type) string_has_parameter(value, "ce_delay") ? ANIM_CE_DELAY : string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL : string_has_parameter(value, "vertical") ? ANIM_VERTICAL : + string_has_parameter(value, "centered") ? ANIM_CENTERED : ANIM_DEFAULT); if (string_has_parameter(value, "reverse")) @@ -1994,6 +1819,48 @@ int get_auto_parameter_value(char *token, char *value_raw) 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; + char *screen_mode_string_x = strchr(screen_mode_string, 'x'); + char *screen_mode_string_copy; + char *screen_mode_string_pos_w; + char *screen_mode_string_pos_h; + + if (screen_mode_string_x == NULL) /* invalid screen mode format */ + return NULL; + + screen_mode_string_copy = getStringCopy(screen_mode_string); + + screen_mode_string_pos_w = screen_mode_string_copy; + screen_mode_string_pos_h = strchr(screen_mode_string_copy, 'x'); + *screen_mode_string_pos_h++ = '\0'; + + screen_mode.width = atoi(screen_mode_string_pos_w); + screen_mode.height = atoi(screen_mode_string_pos_h); + + return &screen_mode; +} + +void get_aspect_ratio_from_screen_mode(struct ScreenModeInfo *screen_mode, + int *x, int *y) +{ + float aspect_ratio = (float)screen_mode->width / (float)screen_mode->height; + float aspect_ratio_new; + int i = 1; + + do + { + *x = i * aspect_ratio + 0.000001; + *y = i; + + aspect_ratio_new = (float)*x / (float)*y; + + i++; + } + while (aspect_ratio_new != aspect_ratio && *y < screen_mode->height); +} + static void FreeCustomArtworkList(struct ArtworkListInfo *, struct ListNodeInfo ***, int *); @@ -2861,25 +2728,22 @@ void FreeCustomArtworkLists(struct ArtworkListInfo *artwork_info) char *getErrorFilename(char *basename) { - return getPath2(getUserDataDir(), basename); + return getPath2(getUserGameDataDir(), basename); } -void initErrorFile() +void openErrorFile() { - unlink(program.error_filename); -} + InitUserDataDirectory(); -FILE *openErrorFile() -{ - FILE *error_file = stderr; - -#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS) - if ((error_file = fopen(program.error_filename, MODE_APPEND)) == NULL) - fprintf_newline(stderr, "ERROR: cannot open file '%s' for appending!", + if ((program.error_file = fopen(program.error_filename, MODE_WRITE)) == NULL) + fprintf_newline(stderr, "ERROR: cannot open file '%s' for writing!", program.error_filename); -#endif +} - return error_file; +void closeErrorFile() +{ + if (program.error_file != stderr) /* do not close stream 'stderr' */ + fclose(program.error_file); } void dumpErrorFile()