/* 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
{
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)
{
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)
{
#if defined(TARGET_SDL)
SDL_Delay(milliseconds_delay);
-#elif defined(TARGET_ALLEGRO)
- rest(milliseconds_delay);
#else
struct timeval delay;
/* 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);
return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR);
}
-char *getStringCopy(char *s)
+char *getStringCopy(const char *s)
{
char *s_copy;
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);
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;
/* 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;
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();
exit(0);
}
+ else if (strncmp(option, "-version", option_len) == 0 ||
+ strncmp(option, "-V", option_len) == 0)
+ {
+ print_version_function();
+
+ exit(0);
+ }
else if (strncmp(option, "-display", option_len) == 0)
{
if (option_arg == NULL)
/* 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);
}
{ KSYM_braceright, "XK_braceright", "brace right" },
{ KSYM_asciitilde, "XK_asciitilde", "~" },
- /* special (non-ASCII) keys */
+ /* special (non-ASCII) keys (ISO-Latin-1) */
{ KSYM_degree, "XK_degree", "°" },
{ KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" },
{ KSYM_Odiaeresis, "XK_Odiaeresis", "Ö" },
{ KSYM_udiaeresis, "XK_udiaeresis", "ü" },
{ KSYM_ssharp, "XK_ssharp", "sharp s" },
+#if defined(TARGET_SDL2)
+ /* special (non-ASCII) keys (UTF-8, for reverse mapping only) */
+ { KSYM_degree, "XK_degree", "\xc2\xb0" },
+ { KSYM_Adiaeresis, "XK_Adiaeresis", "\xc3\x84" },
+ { KSYM_Odiaeresis, "XK_Odiaeresis", "\xc3\x96" },
+ { KSYM_Udiaeresis, "XK_Udiaeresis", "\xc3\x9c" },
+ { KSYM_adiaeresis, "XK_adiaeresis", "\xc3\xa4" },
+ { KSYM_odiaeresis, "XK_odiaeresis", "\xc3\xb6" },
+ { KSYM_udiaeresis, "XK_udiaeresis", "\xc3\xbc" },
+ { KSYM_ssharp, "XK_ssharp", "\xc3\x9f" },
+
+ /* other keys (for reverse mapping only) */
+ { KSYM_space, "XK_space", " " },
+#endif
+
#if defined(TARGET_SDL2)
/* keypad keys are not in numerical order in SDL2 */
{ KSYM_KP_0, "XK_KP_0", "keypad 0" },
return FALSE;
}
+#if defined(TARGET_SDL)
+static boolean FileCouldBeArtwork(char *basename)
+{
+ return (!strEqual(basename, ".") &&
+ !strEqual(basename, "..") &&
+ !fileHasSuffix(basename, "txt") &&
+ !fileHasSuffix(basename, "conf"));
+}
+#endif
+
boolean FileIsGraphic(char *filename)
{
char *basename = getBaseNamePtr(filename);
#if defined(TARGET_SDL)
- return (!fileHasSuffix(basename, "txt") &&
- !fileHasSuffix(basename, "conf"));
+ return FileCouldBeArtwork(basename);
#else
return fileHasSuffix(basename, "pcx");
#endif
char *basename = getBaseNamePtr(filename);
#if defined(TARGET_SDL)
- return (!fileHasSuffix(basename, "txt") &&
- !fileHasSuffix(basename, "conf"));
+ return FileCouldBeArtwork(basename);
#else
return fileHasSuffix(basename, "wav");
#endif
char *basename = getBaseNamePtr(filename);
#if defined(TARGET_SDL)
- return (!fileHasSuffix(basename, "txt") &&
- !fileHasSuffix(basename, "conf"));
+ return FileCouldBeArtwork(basename);
#else
if (FileIsSound(basename))
return TRUE;
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()
#if DEBUG
-#define DEBUG_PRINT_INIT_TIMESTAMPS TRUE
+#define DEBUG_PRINT_INIT_TIMESTAMPS FALSE
#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH 10
#define DEBUG_NUM_TIMESTAMPS 10