2013-07-06 04:37:13 +00:00
|
|
|
/*
|
2013-06-11 07:08:15 +00:00
|
|
|
* Apple // emulator for Linux: Preferences file maintenance
|
|
|
|
*
|
|
|
|
* Copyright 1994 Alexander Jean-Claude Bottema
|
|
|
|
* Copyright 1995 Stephen Lee
|
|
|
|
* Copyright 1997, 1998 Aaron Culliney
|
|
|
|
* Copyright 1998, 1999, 2000 Michael Deutschmann
|
|
|
|
*
|
|
|
|
* This software package is subject to the GNU General Public License
|
2013-07-06 04:37:13 +00:00
|
|
|
* version 2 or later (your choice) as published by the Free Software
|
2013-06-11 07:08:15 +00:00
|
|
|
* Foundation.
|
|
|
|
*
|
2013-07-06 04:37:13 +00:00
|
|
|
* THERE ARE NO WARRANTIES WHATSOEVER.
|
2013-06-11 07:08:15 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define _GNU_SOURCE
|
|
|
|
|
2014-01-23 04:42:34 +00:00
|
|
|
#include "common.h"
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
#define PRM_NONE 0
|
|
|
|
#define PRM_SPEED 1
|
2013-10-06 08:31:58 +00:00
|
|
|
#define PRM_ALTSPEED 101
|
2013-07-06 04:37:13 +00:00
|
|
|
#define PRM_MODE 2
|
|
|
|
#define PRM_DISK_PATH 3
|
|
|
|
#define PRM_HIRES_COLOR 4
|
2013-12-07 06:55:00 +00:00
|
|
|
#define PRM_VOLUME 5
|
2013-07-06 04:37:13 +00:00
|
|
|
#define PRM_JOY_INPUT 6
|
2014-01-04 22:24:55 +00:00
|
|
|
#define PRM_VIDEO_MODE 7
|
2013-12-28 21:54:26 +00:00
|
|
|
#define PRM_JOY_KPAD_CALIBRATE 11
|
2013-07-06 04:37:13 +00:00
|
|
|
#define PRM_ROM_PATH 12
|
2014-03-26 06:42:05 +00:00
|
|
|
#define PRM_CAPSLOCK 102
|
2013-06-11 07:08:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
char system_path[SYSSIZE];
|
|
|
|
char disk_path[DISKSIZE];
|
|
|
|
|
2014-10-19 19:54:03 +00:00
|
|
|
#warning FIXME TODO : completely excise deprecated apple_mode stuff
|
|
|
|
int apple_mode = 2/*IIE_MODE*/;
|
2014-03-30 17:41:28 +00:00
|
|
|
a2_video_mode_t a2_video_mode = VIDEO_1X;
|
2014-11-09 21:13:27 +00:00
|
|
|
joystick_mode_t joy_mode = JOY_PCJOY;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-12-28 21:54:26 +00:00
|
|
|
static char *config_filename = NULL;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
|
|
|
struct match_table
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
2013-06-11 07:08:15 +00:00
|
|
|
const char *tag;
|
|
|
|
int value;
|
2013-07-06 04:37:13 +00:00
|
|
|
};
|
2013-06-11 07:08:15 +00:00
|
|
|
|
|
|
|
static const struct match_table prefs_table[] =
|
|
|
|
{
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "speed", PRM_SPEED },
|
2013-10-06 08:31:58 +00:00
|
|
|
{ "altspeed", PRM_ALTSPEED },
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "mode", PRM_MODE },
|
|
|
|
{ "path", PRM_DISK_PATH },
|
|
|
|
{ "disk path", PRM_DISK_PATH },
|
|
|
|
{ "disk_path", PRM_DISK_PATH },
|
|
|
|
{ "path", PRM_DISK_PATH },
|
|
|
|
{ "color", PRM_HIRES_COLOR },
|
2014-01-04 22:24:55 +00:00
|
|
|
{ "video", PRM_VIDEO_MODE },
|
2013-12-07 06:55:00 +00:00
|
|
|
{ "volume", PRM_VOLUME },
|
2014-03-26 06:42:05 +00:00
|
|
|
{ "caps_lock", PRM_CAPSLOCK },
|
|
|
|
{ "caps lock", PRM_CAPSLOCK },
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "joystick", PRM_JOY_INPUT },
|
2013-12-28 21:54:26 +00:00
|
|
|
{ "keypad joystick parms", PRM_JOY_KPAD_CALIBRATE },
|
|
|
|
{ "keypad_joystick_parms", PRM_JOY_KPAD_CALIBRATE },
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "system path", PRM_ROM_PATH },
|
|
|
|
{ "system_path", PRM_ROM_PATH },
|
|
|
|
{ 0, PRM_NONE }
|
2013-06-11 07:08:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const struct match_table color_table[] =
|
|
|
|
{
|
2013-12-07 06:55:00 +00:00
|
|
|
{ "black/white", COLOR_NONE },
|
|
|
|
/*{ "lazy color", LAZY_COLOR }, deprecated*/
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "color", COLOR },
|
2013-12-07 06:55:00 +00:00
|
|
|
/*{ "lazy interpolated", LAZY_INTERP }, deprecated*/
|
|
|
|
{ "interpolated", COLOR_INTERP },
|
2013-07-06 04:37:13 +00:00
|
|
|
{ "off", 0 },
|
|
|
|
{ "on", COLOR },
|
|
|
|
{ 0, COLOR }
|
2013-06-11 07:08:15 +00:00
|
|
|
};
|
|
|
|
|
2014-01-04 22:24:55 +00:00
|
|
|
static const struct match_table video_table[] =
|
|
|
|
{
|
|
|
|
{ "1X", VIDEO_1X },
|
|
|
|
{ "2X", VIDEO_2X },
|
|
|
|
{ "Fullscreen", VIDEO_FULLSCREEN },
|
|
|
|
{ 0, VIDEO_1X }
|
|
|
|
};
|
|
|
|
|
2013-12-07 06:55:00 +00:00
|
|
|
static const struct match_table volume_table[] =
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-12-07 06:55:00 +00:00
|
|
|
{ "0", 0 },
|
|
|
|
{ "1", 1 },
|
|
|
|
{ "2", 2 },
|
|
|
|
{ "3", 3 },
|
|
|
|
{ "4", 4 },
|
|
|
|
{ "5", 5 },
|
|
|
|
{ "6", 6 },
|
|
|
|
{ "7", 7 },
|
|
|
|
{ "8", 8 },
|
|
|
|
{ "9", 9 },
|
|
|
|
{ "10", 10 },
|
|
|
|
{ 0, 10 },
|
2013-06-11 07:08:15 +00:00
|
|
|
};
|
|
|
|
|
2014-03-26 06:42:05 +00:00
|
|
|
static const struct match_table capslock_table[] =
|
|
|
|
{
|
|
|
|
{ "0", 0 },
|
|
|
|
{ "1", 1 },
|
|
|
|
};
|
|
|
|
|
2013-06-11 07:08:15 +00:00
|
|
|
static const struct match_table joy_input_table[] =
|
|
|
|
{
|
2014-11-09 21:13:27 +00:00
|
|
|
{ "pc joystick", JOY_PCJOY },
|
2013-12-07 06:55:00 +00:00
|
|
|
#ifdef KEYPAD_JOYSTICK
|
|
|
|
{ "joy keypad", JOY_KPAD },
|
|
|
|
{ "joy_keypad", JOY_KPAD },
|
|
|
|
#endif
|
2014-11-09 21:13:27 +00:00
|
|
|
{ 0, JOY_PCJOY }
|
2013-06-11 07:08:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Find the number assigned to KEYWORD in a match table PARADIGM. If no match,
|
2013-07-06 04:37:13 +00:00
|
|
|
* then the value associated with the terminating entry is used as a
|
2013-06-11 07:08:15 +00:00
|
|
|
* default. */
|
2013-10-06 08:31:58 +00:00
|
|
|
static int match(const struct match_table *paradigm, const char *keyword)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-07-06 04:37:13 +00:00
|
|
|
while (paradigm->tag && strcasecmp(paradigm->tag, keyword))
|
|
|
|
{
|
|
|
|
paradigm++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return paradigm->value;
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
/* Reverse match -- find a keyword associated with number KEY in
|
|
|
|
* PARADIGM. The first match is used -- synonym keywords appearing later
|
2013-06-11 07:08:15 +00:00
|
|
|
* in the table are not chosen.
|
|
|
|
*
|
2013-07-06 04:37:13 +00:00
|
|
|
* A null is returned for no match.
|
2013-06-11 07:08:15 +00:00
|
|
|
*/
|
2013-07-06 04:37:13 +00:00
|
|
|
static const char *reverse_match(const struct match_table *paradigm, int key)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-07-06 04:37:13 +00:00
|
|
|
while (paradigm->tag && key != paradigm->value)
|
|
|
|
{
|
|
|
|
paradigm++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return paradigm->tag;
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
/* Eat leading and trailing whitespace of string X. The old string is
|
|
|
|
* overwritten and a new pointer is returned.
|
2013-06-11 07:08:15 +00:00
|
|
|
*/
|
2013-10-06 08:31:58 +00:00
|
|
|
static char * clean_string(char *x)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-07-06 04:37:13 +00:00
|
|
|
size_t y;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
/* Leading white space */
|
|
|
|
while (isspace(*x))
|
|
|
|
{
|
|
|
|
x++;
|
|
|
|
}
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
/* Trailing white space */
|
|
|
|
y = strlen(x);
|
|
|
|
while (y && x[y--] == ' ')
|
|
|
|
{
|
|
|
|
}
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
x[y] = 0;
|
|
|
|
|
|
|
|
return x;
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Load the configuration. Must be called *once* at start. */
|
2013-10-06 08:31:58 +00:00
|
|
|
void load_settings(void)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-07-06 04:37:13 +00:00
|
|
|
/* set system defaults before user defaults. */
|
|
|
|
strcpy(disk_path, "./disks");
|
|
|
|
strcpy(system_path, "./rom");
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-03-26 06:42:05 +00:00
|
|
|
const char *apple2cfg = getenv("APPLE2IXCFG");
|
|
|
|
if (apple2cfg) {
|
|
|
|
config_filename = strdup(apple2cfg);
|
|
|
|
} else {
|
2013-07-06 04:37:13 +00:00
|
|
|
const char *homedir;
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
homedir = getenv("HOME");
|
|
|
|
config_filename = malloc(strlen(homedir) + 9);
|
|
|
|
strcpy(config_filename, homedir);
|
|
|
|
strcat(config_filename, "/.apple2");
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
/* config_filename is left allocated for convinence in
|
|
|
|
* save_settings */
|
|
|
|
}
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
|
|
|
char *buffer = 0;
|
|
|
|
size_t size = 0;
|
|
|
|
|
2014-03-26 06:42:05 +00:00
|
|
|
FILE *config_file = fopen(config_filename, "r");
|
2013-07-06 04:37:13 +00:00
|
|
|
if (config_file == NULL)
|
|
|
|
{
|
2014-03-23 21:25:28 +00:00
|
|
|
ERRLOG(
|
2013-07-06 04:37:13 +00:00
|
|
|
"Warning. Cannot open the .apple2 system defaults file.\n"
|
|
|
|
"Make sure it's readable in your home directory.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (getline(&buffer, &size, config_file) != -1)
|
|
|
|
{
|
|
|
|
char *parameter;
|
|
|
|
char *argument;
|
|
|
|
|
|
|
|
/* Split line between parameter and argument */
|
|
|
|
|
|
|
|
parameter = buffer;
|
|
|
|
argument = strchr(buffer, '=');
|
|
|
|
argument[0] = 0;
|
|
|
|
argument++;
|
|
|
|
|
|
|
|
parameter = clean_string(parameter);
|
|
|
|
argument = clean_string(argument);
|
|
|
|
|
2013-10-06 08:31:58 +00:00
|
|
|
int main_match = match(prefs_table, parameter);
|
|
|
|
switch (main_match)
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
|
|
|
case PRM_NONE:
|
2014-03-23 21:25:28 +00:00
|
|
|
ERRLOG("Unrecognized config parameter `%s'", parameter);
|
2013-07-06 04:37:13 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case PRM_SPEED:
|
2013-10-06 08:31:58 +00:00
|
|
|
case PRM_ALTSPEED:
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
2013-10-06 08:31:58 +00:00
|
|
|
double x = strtod(argument, NULL);
|
|
|
|
if (x > CPU_SCALE_FASTEST)
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
2013-10-06 08:31:58 +00:00
|
|
|
x = CPU_SCALE_FASTEST;
|
2013-07-06 04:37:13 +00:00
|
|
|
}
|
2013-10-06 08:31:58 +00:00
|
|
|
else if (x < CPU_SCALE_SLOWEST)
|
|
|
|
{
|
|
|
|
x = CPU_SCALE_SLOWEST;
|
|
|
|
}
|
|
|
|
if (main_match == PRM_SPEED)
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
2013-10-06 08:31:58 +00:00
|
|
|
cpu_scale_factor = x;
|
2013-07-06 04:37:13 +00:00
|
|
|
}
|
2013-10-06 08:31:58 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
cpu_altscale_factor = x;
|
|
|
|
}
|
|
|
|
break;
|
2013-07-06 04:37:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
case PRM_DISK_PATH:
|
|
|
|
strncpy(disk_path, argument, DISKSIZE);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PRM_HIRES_COLOR:
|
|
|
|
color_mode = match(color_table, argument);
|
|
|
|
break;
|
|
|
|
|
2014-01-04 22:24:55 +00:00
|
|
|
case PRM_VIDEO_MODE:
|
|
|
|
a2_video_mode = match(video_table, argument);
|
|
|
|
break;
|
|
|
|
|
2013-12-07 06:55:00 +00:00
|
|
|
case PRM_VOLUME:
|
|
|
|
sound_volume = match(volume_table, argument);
|
2013-07-06 04:37:13 +00:00
|
|
|
break;
|
|
|
|
|
2014-03-26 06:42:05 +00:00
|
|
|
case PRM_CAPSLOCK:
|
|
|
|
caps_lock = match(capslock_table, argument) ? true : false;
|
|
|
|
break;
|
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
case PRM_JOY_INPUT:
|
|
|
|
joy_mode = match(joy_input_table, argument);
|
|
|
|
break;
|
|
|
|
|
2013-12-28 21:54:26 +00:00
|
|
|
#ifdef KEYPAD_JOYSTICK
|
|
|
|
case PRM_JOY_KPAD_CALIBRATE:
|
|
|
|
joy_step = strtol(argument, &argument, 10);
|
2013-07-06 04:37:13 +00:00
|
|
|
if (joy_step < 1)
|
|
|
|
{
|
|
|
|
joy_step = 1;
|
|
|
|
}
|
2013-12-29 05:48:42 +00:00
|
|
|
else if (joy_step > 255)
|
2013-07-06 04:37:13 +00:00
|
|
|
{
|
2013-12-28 21:54:26 +00:00
|
|
|
joy_step = 255;
|
2013-07-06 04:37:13 +00:00
|
|
|
}
|
2013-12-29 05:48:42 +00:00
|
|
|
|
2014-10-19 19:54:03 +00:00
|
|
|
joy_auto_recenter = strtol(argument, &argument, 10);
|
2013-12-29 05:48:42 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
break;
|
2013-12-28 21:54:26 +00:00
|
|
|
#endif
|
2013-07-06 04:37:13 +00:00
|
|
|
|
|
|
|
case PRM_ROM_PATH:
|
|
|
|
strncpy(system_path, argument, SYSSIZE);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-15 07:24:51 +00:00
|
|
|
FREE(buffer);
|
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
fclose(config_file);
|
|
|
|
}
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Save the configuration */
|
2013-11-27 20:43:58 +00:00
|
|
|
bool save_settings(void)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2013-12-28 22:28:04 +00:00
|
|
|
FILE *config_file = NULL;
|
|
|
|
|
|
|
|
LOG("Saving preferences...");
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-03-23 21:25:28 +00:00
|
|
|
#define PREFS_ERRPRINT() \
|
|
|
|
ERRLOG( \
|
|
|
|
"Cannot open the .apple2/apple2.cfg system defaults file for writing.\n" \
|
|
|
|
"Make sure it has rw permission in your home directory.")
|
|
|
|
|
2013-11-27 20:43:58 +00:00
|
|
|
#define ERROR_SUBMENU_H 9
|
|
|
|
#define ERROR_SUBMENU_W 40
|
2014-06-21 21:33:23 +00:00
|
|
|
#ifdef INTERFACE_CLASSIC
|
2014-06-22 06:08:07 +00:00
|
|
|
int ch = -1;
|
2013-11-27 20:43:58 +00:00
|
|
|
char submenu[ERROR_SUBMENU_H][ERROR_SUBMENU_W+1] =
|
|
|
|
//1. 5. 10. 15. 20. 25. 30. 35. 40.
|
|
|
|
{ "||||||||||||||||||||||||||||||||||||||||",
|
|
|
|
"| |",
|
|
|
|
"| |",
|
|
|
|
"| OOPS, could not open or write to the |",
|
|
|
|
"| .apple2/apple2.cfg file in your HOME |",
|
|
|
|
"| directory ... |",
|
|
|
|
"| |",
|
|
|
|
"| |",
|
|
|
|
"||||||||||||||||||||||||||||||||||||||||" };
|
2014-06-21 21:33:23 +00:00
|
|
|
#endif
|
2013-11-27 20:43:58 +00:00
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
config_file = fopen(config_filename, "w");
|
|
|
|
if (config_file == NULL)
|
2013-06-11 07:08:15 +00:00
|
|
|
{
|
2014-03-23 21:25:28 +00:00
|
|
|
PREFS_ERRPRINT();
|
|
|
|
#ifdef INTERFACE_CLASSIC
|
2013-11-27 20:43:58 +00:00
|
|
|
c_interface_print_submenu_centered(submenu[0], ERROR_SUBMENU_W, ERROR_SUBMENU_H);
|
2014-06-22 06:08:07 +00:00
|
|
|
while ((ch = c_mygetch(1)) == -1)
|
2013-11-27 20:43:58 +00:00
|
|
|
{
|
|
|
|
}
|
2014-03-23 21:25:28 +00:00
|
|
|
#endif
|
2013-11-27 20:43:58 +00:00
|
|
|
return false;
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
|
|
|
|
2013-12-28 21:54:26 +00:00
|
|
|
bool anErr = false;
|
2013-11-27 20:43:58 +00:00
|
|
|
int err = fprintf(config_file,
|
2013-10-06 08:31:58 +00:00
|
|
|
"speed = %0.2lf\n"
|
|
|
|
"altspeed = %0.2lf\n"
|
2013-07-06 04:37:13 +00:00
|
|
|
"disk path = %s\n"
|
|
|
|
"color = %s\n"
|
2014-01-04 22:24:55 +00:00
|
|
|
"video = %s\n"
|
2013-12-07 06:55:00 +00:00
|
|
|
"volume = %s\n"
|
2014-03-26 06:42:05 +00:00
|
|
|
"caps lock = %s\n"
|
2013-07-06 04:37:13 +00:00
|
|
|
"joystick = %s\n"
|
|
|
|
"system path = %s\n",
|
2013-10-06 08:31:58 +00:00
|
|
|
cpu_scale_factor,
|
|
|
|
cpu_altscale_factor,
|
2013-07-06 04:37:13 +00:00
|
|
|
disk_path,
|
|
|
|
reverse_match(color_table, color_mode),
|
2014-01-04 22:24:55 +00:00
|
|
|
reverse_match(video_table, a2_video_mode),
|
2013-12-07 06:55:00 +00:00
|
|
|
reverse_match(volume_table, sound_volume),
|
2014-03-26 06:42:05 +00:00
|
|
|
reverse_match(capslock_table, (int)caps_lock),
|
2013-07-06 04:37:13 +00:00
|
|
|
reverse_match(joy_input_table, joy_mode),
|
|
|
|
system_path);
|
2013-12-28 21:54:26 +00:00
|
|
|
anErr = anErr || (err < 0);
|
2013-11-27 20:43:58 +00:00
|
|
|
|
2013-12-28 21:54:26 +00:00
|
|
|
#ifdef KEYPAD_JOYSTICK
|
|
|
|
err = fprintf(config_file,
|
2014-10-19 19:54:03 +00:00
|
|
|
"keypad joystick parms = %d %u\n", joy_step, joy_auto_recenter ? 1 : 0);
|
2013-12-28 21:54:26 +00:00
|
|
|
#endif
|
|
|
|
anErr = anErr || (err < 0);
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2013-12-28 21:54:26 +00:00
|
|
|
if (anErr)
|
2013-11-27 20:43:58 +00:00
|
|
|
{
|
2014-03-23 21:25:28 +00:00
|
|
|
PREFS_ERRPRINT();
|
|
|
|
#ifdef INTERFACE_CLASSIC
|
2013-11-27 20:43:58 +00:00
|
|
|
c_interface_print_submenu_centered(submenu[0], ERROR_SUBMENU_W, ERROR_SUBMENU_H);
|
|
|
|
while ((ch = c_mygetch(1)) == -1)
|
|
|
|
{
|
|
|
|
}
|
2014-03-23 21:25:28 +00:00
|
|
|
#endif
|
2013-11-27 20:43:58 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-07-06 04:37:13 +00:00
|
|
|
fclose(config_file);
|
2013-11-27 20:43:58 +00:00
|
|
|
|
|
|
|
return true;
|
2013-06-11 07:08:15 +00:00
|
|
|
}
|
2013-11-27 20:43:58 +00:00
|
|
|
|