X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=8a7c94d60acd22985fb44830cd165acf05a34732;hp=ae4b5d78e797c470863e88e09313172700eeca0d;hb=abe44529b439ad39b4d8dbf19cbd67c9b9844279;hpb=a7c06161253796a30a0237a7f5a044f459c8cf35 diff --git a/src/libgame/misc.c b/src/libgame/misc.c index ae4b5d78..8a7c94d6 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -1,15 +1,13 @@ -/*********************************************************** -* Artsoft Retro-Game Library * -*----------------------------------------------------------* -* (c) 1994-2006 Artsoft Entertainment * -* Holger Schemel * -* Detmolder Strasse 189 * -* 33604 Bielefeld * -* Germany * -* e-mail: info@artsoft.org * -*----------------------------------------------------------* -* misc.c * -***********************************************************/ +// ============================================================================ +// Artsoft Retro-Game Library +// ---------------------------------------------------------------------------- +// (c) 1995-2014 by Artsoft Entertainment +// Holger Schemel +// info@artsoft.org +// http://www.artsoft.org/ +// ---------------------------------------------------------------------------- +// misc.c +// ============================================================================ #include #include @@ -223,18 +221,6 @@ boolean getTokenValueFromString(char *string, char **token, char **value) /* counter functions */ /* ------------------------------------------------------------------------- */ -#if defined(PLATFORM_MSDOS) -volatile unsigned int counter = 0; - -void increment_counter() -{ - counter++; -} - -END_OF_FUNCTION(increment_counter); -#endif - - /* maximal allowed length of a command line option */ #define MAX_OPTION_LEN 256 @@ -245,20 +231,7 @@ static unsigned int getCurrentMS() { return SDL_GetTicks(); } - -#else /* !TARGET_SDL */ - -#if defined(PLATFORM_UNIX) -static unsigned int getCurrentMS() -{ - struct timeval current_time; - - gettimeofday(¤t_time, NULL); - - return current_time.tv_sec * 1000 + current_time.tv_usec / 1000; -} -#endif /* PLATFORM_UNIX */ -#endif /* !TARGET_SDL */ +#endif static unsigned int mainCounter(int mode) { @@ -295,50 +268,18 @@ static unsigned int mainCounter(int mode) return counter_ms; /* return milliseconds since last init */ } - -#else /* !TARGET_SDL */ - -#if defined(PLATFORM_UNIX) -static unsigned int mainCounter(int mode) -{ - static struct timeval base_time = { 0, 0 }; - struct timeval current_time; - unsigned int counter_ms; - - gettimeofday(¤t_time, NULL); - - /* reset base time in case of counter initializing or wrap-around */ - if (mode == INIT_COUNTER || current_time.tv_sec < base_time.tv_sec) - base_time = current_time; - - counter_ms = (current_time.tv_sec - base_time.tv_sec) * 1000 - + (current_time.tv_usec - base_time.tv_usec) / 1000; - - return counter_ms; /* return milliseconds since last init */ -} -#endif /* PLATFORM_UNIX */ -#endif /* !TARGET_SDL */ +#endif #endif void InitCounter() /* set counter back to zero */ { -#if !defined(PLATFORM_MSDOS) mainCounter(INIT_COUNTER); -#else - LOCK_VARIABLE(counter); - LOCK_FUNCTION(increment_counter); - install_int_ex(increment_counter, BPS_TO_TIMER(100)); -#endif } unsigned int Counter() /* get milliseconds since last call of InitCounter() */ { -#if !defined(PLATFORM_MSDOS) return mainCounter(READ_COUNTER); -#else - return (counter * 10); -#endif } static void sleep_milliseconds(unsigned int milliseconds_delay) @@ -362,8 +303,6 @@ static void sleep_milliseconds(unsigned int milliseconds_delay) { #if defined(TARGET_SDL) SDL_Delay(milliseconds_delay); -#elif defined(TARGET_ALLEGRO) - rest(milliseconds_delay); #else struct timeval delay; @@ -474,7 +413,7 @@ unsigned int get_random_number(int nr, int max) /* system info functions */ /* ------------------------------------------------------------------------- */ -#if !defined(PLATFORM_MSDOS) && !defined(PLATFORM_ANDROID) +#if !defined(PLATFORM_ANDROID) static char *get_corrected_real_name(char *real_name) { char *real_name_new = checked_malloc(MAX_USERNAME_LEN + 1); @@ -708,7 +647,7 @@ char *getPath3(char *path1, char *path2, char *path3) return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR); } -char *getStringCopy(char *s) +char *getStringCopy(const char *s) { char *s_copy; @@ -721,7 +660,7 @@ char *getStringCopy(char *s) return s_copy; } -char *getStringCopyN(char *s, int n) +char *getStringCopyN(const char *s, int n) { char *s_copy; int s_len = MAX(0, n); @@ -736,7 +675,18 @@ char *getStringCopyN(char *s, int n) return s_copy; } -char *getStringToLower(char *s) +char *getStringCopyNStatic(const char *s, int n) +{ + static char *s_copy = NULL; + + checked_free(s_copy); + + s_copy = getStringCopyN(s, n); + + return s_copy; +} + +char *getStringToLower(const char *s) { char *s_copy = checked_malloc(strlen(s) + 1); char *s_ptr = s_copy; @@ -813,7 +763,9 @@ boolean strSuffixLower(char *s, char *suffix) /* command line option handling functions */ /* ------------------------------------------------------------------------- */ -void GetOptions(char *argv[], void (*print_usage_function)(void)) +void GetOptions(char *argv[], + void (*print_usage_function)(void), + void (*print_version_function)(void)) { char *ro_base_path = RO_BASE_PATH; char *rw_base_path = RW_BASE_PATH; @@ -910,7 +862,9 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) option_len = strlen(option); if (strEqual(option, "-")) + { Error(ERR_EXIT_HELP, "unrecognized option '%s'", option); + } else if (strncmp(option, "-help", option_len) == 0) { print_usage_function(); @@ -988,10 +942,6 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) { options.serveronly = TRUE; } - else if (strncmp(option, "-verbose", option_len) == 0) - { - options.verbose = TRUE; - } else if (strncmp(option, "-debug", option_len) == 0) { options.debug = TRUE; @@ -1000,6 +950,17 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) { options.debug_x11_sync = TRUE; } + else if (strncmp(option, "-verbose", option_len) == 0) + { + options.verbose = TRUE; + } + else if (strncmp(option, "-version", option_len) == 0 || + strncmp(option, "-V", option_len) == 0) + { + print_version_function(); + + exit(0); + } else if (strPrefix(option, "-D")) { #if 1 @@ -1057,15 +1018,17 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) /* error handling functions */ /* ------------------------------------------------------------------------- */ +#define MAX_INTERNAL_ERROR_SIZE 1024 + /* used by SetError() and GetError() to store internal error messages */ -static char internal_error[1024]; /* this is bad */ +static char internal_error[MAX_INTERNAL_ERROR_SIZE]; void SetError(char *format, ...) { va_list ap; va_start(ap, format); - vsprintf(internal_error, format, ap); + vsnprintf(internal_error, MAX_INTERNAL_ERROR_SIZE, format, ap); va_end(ap); } @@ -3737,6 +3700,9 @@ void openErrorFile() Error(ERR_WARN, "cannot open file '%s' for writing: %s", program.error_filename, strerror(errno)); } + + /* error output should be unbuffered so it is not truncated in a crash */ + setbuf(program.error_file, NULL); } void closeErrorFile()