/***********************************************************
* Artsoft Retro-Game Library *
*----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment *
+* (c) 1994-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
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)
}
}
-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);
-
- return buffer;
-}
+ fprintf(stream, "%s", line_chars);
-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)
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);
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 */
/* various string functions */
/* ------------------------------------------------------------------------- */
-char *getPath2(char *path1, char *path2)
+char *getStringCat2WithSeparator(char *s1, char *s2, char *sep)
{
- char *sep = STRING_PATH_SEPARATOR;
- char *complete_path = checked_malloc(strlen(path1) + 1 +
- strlen(path2) + 1);
+ char *complete_string = checked_malloc(strlen(s1) + strlen(sep) +
+ strlen(s2) + 1);
- sprintf(complete_path, "%s%s%s", path1, sep, path2);
+ sprintf(complete_string, "%s%s%s", s1, sep, s2);
- return complete_path;
+ return complete_string;
}
-char *getPath3(char *path1, char *path2, char *path3)
+char *getStringCat3WithSeparator(char *s1, char *s2, char *s3, char *sep)
{
- char *sep = STRING_PATH_SEPARATOR;
- char *complete_path = checked_malloc(strlen(path1) + 1 +
- strlen(path2) + 1 +
- strlen(path3) + 1);
+ char *complete_string = checked_malloc(strlen(s1) + strlen(sep) +
+ strlen(s2) + strlen(sep) +
+ strlen(s3) + 1);
- sprintf(complete_path, "%s%s%s%s%s", path1, sep, path2, sep, path3);
+ sprintf(complete_string, "%s%s%s%s%s", s1, sep, s2, sep, s3);
- return complete_path;
+ return complete_string;
}
char *getStringCat2(char *s1, char *s2)
{
- char *complete_string = checked_malloc(strlen(s1) + strlen(s2) + 1);
+ return getStringCat2WithSeparator(s1, s2, "");
+}
- sprintf(complete_string, "%s%s", s1, s2);
+char *getStringCat3(char *s1, char *s2, char *s3)
+{
+ return getStringCat3WithSeparator(s1, s2, s3, "");
+}
- return complete_string;
+char *getPath2(char *path1, char *path2)
+{
+ return getStringCat2WithSeparator(path1, path2, STRING_PATH_SEPARATOR);
+}
+
+char *getPath3(char *path1, char *path2, char *path3)
+{
+ return getStringCat3WithSeparator(path1, path2, path3, STRING_PATH_SEPARATOR);
}
char *getStringCopy(char *s)
return internal_error;
}
-#if 1
-
void Error(int mode, char *format, ...)
{
static boolean last_line_was_separator = FALSE;
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;
{
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)
{
}
}
-#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 */
{ KSYM_asciitilde, "XK_asciitilde", "~" },
/* special (non-ASCII) keys */
+ { KSYM_degree, "XK_degree", "°" },
{ KSYM_Adiaeresis, "XK_Adiaeresis", "Ä" },
{ KSYM_Odiaeresis, "XK_Odiaeresis", "Ö" },
{ KSYM_Udiaeresis, "XK_Udiaeresis", "Ü" },
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
char getCharFromKey(Key key)
{
char *keyname = getKeyNameFromKey(key);
- char letter = 0;
+ char c = 0;
if (strlen(keyname) == 1)
- letter = keyname[0];
+ c = keyname[0];
else if (strEqual(keyname, "space"))
- letter = ' ';
- else if (strEqual(keyname, "circumflex"))
- letter = '^';
+ c = ' ';
+
+ return c;
+}
+
+char getValidConfigValueChar(char c)
+{
+ if (c == '#' || /* used to mark comments */
+ c == '\\') /* used to mark continued lines */
+ c = 0;
- return letter;
+ return c;
}
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;
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 :
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 :
+ string_has_parameter(value, "fade") ? ANIM_FADE :
+ string_has_parameter(value, "crossfade") ? ANIM_CROSSFADE :
ANIM_DEFAULT);
if (string_has_parameter(value, "reverse"))
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 *);
file_list[list_pos].token = config_list[i].token;
file_list[list_pos].default_filename = config_list[i].value;
+
+#if 0
+ printf("::: '%s' => '%s'\n", config_list[i].token, config_list[i].value);
+#endif
}
}
{
Error(ERR_RETURN_LINE, "-");
Error(ERR_RETURN, "inconsistant config list information:");
- Error(ERR_RETURN, "- should be: %d (according to 'src/conf_gfx.h')",
+ Error(ERR_RETURN, "- should be: %d (according to 'src/conf_xxx.h')",
num_file_list_entries);
- Error(ERR_RETURN, "- found to be: %d (according to 'src/conf_gfx.c')",
+ Error(ERR_RETURN, "- found to be: %d (according to 'src/conf_xxx.c')",
num_file_list_entries_found);
Error(ERR_EXIT, "please fix");
}
+#if 0
+ printf("::: ---------- DONE ----------\n");
+#endif
+
return file_list;
}
char *filename_base = UNDEFINED_FILENAME, *filename_local;
int i, j;
- DrawInitText("Loading artwork config:", 120, FC_GREEN);
+ DrawInitText("Loading artwork config", 120, FC_GREEN);
DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW);
/* always start with reliable default values */
{
char *init_text[] =
{
- "Loading graphics:",
- "Loading sounds:",
- "Loading music:"
+ "Loading graphics",
+ "Loading sounds",
+ "Loading music"
};
ListNode *node;
char *getErrorFilename(char *basename)
{
- return getPath2(getUserDataDir(), basename);
-}
-
-void initErrorFile()
-{
- unlink(program.error_filename);
+ return getPath2(getUserGameDataDir(), basename);
}
-FILE *openErrorFile()
+void openErrorFile()
{
- FILE *error_file = stderr;
+ InitUserDataDirectory();
-#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()
/* the following is only for debugging purpose and normally not used */
/* ------------------------------------------------------------------------- */
+#if DEBUG
+
#define DEBUG_NUM_TIMESTAMPS 3
void debug_print_timestamp(int counter_nr, char *message)
counter[counter_nr][0] = Counter();
if (message)
- printf("%s %.2f seconds\n", message,
+ printf("%s %.3f seconds\n", message,
(float)(counter[counter_nr][0] - counter[counter_nr][1]) / 1000);
- counter[counter_nr][1] = Counter();
+ counter[counter_nr][1] = counter[counter_nr][0];
}
void debug_print_parent_only(char *format, ...)
printf("\n");
}
}
+#endif