--- BasiliskII/src/prefs.cpp 1999/10/03 14:16:25 1.1.1.1 +++ BasiliskII/src/prefs.cpp 2009/07/23 19:19:14 1.18 @@ -1,7 +1,7 @@ /* * prefs.cpp - Preferences handling * - * Basilisk II (C) 1997-1999 Christian Bauer + * Basilisk II (C) 1997-2008 Christian Bauer * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,40 +28,7 @@ #include "prefs.h" -// Common preferences items (those which exist on all platforms) -// Except for "disk", "floppy", "cdrom", "scsiX", "screen", "rom" and "ether", -// these are guaranteed to be in the prefs; "disk", "floppy" and "cdrom" can -// occur multiple times -prefs_desc common_prefs_items[] = { - {"disk", TYPE_STRING, true}, // Device/file names of Mac volumes (disk.cpp) - {"floppy", TYPE_STRING, true}, // Device/file names of Mac floppy drives (sony.cpp) - {"cdrom", TYPE_STRING, true}, // Device/file names of Mac CD-ROM drives (cdrom.cpp) - {"scsi0", TYPE_STRING, false}, // SCSI targets for Mac SCSI ID 0..6 (scsi_*.cpp) - {"scsi1", TYPE_STRING, false}, - {"scsi2", TYPE_STRING, false}, - {"scsi3", TYPE_STRING, false}, - {"scsi4", TYPE_STRING, false}, - {"scsi5", TYPE_STRING, false}, - {"scsi6", TYPE_STRING, false}, - {"screen", TYPE_STRING, false}, // Video mode (video.cpp) - {"seriala", TYPE_STRING, false}, // Device name of Mac serial port A (serial_*.cpp) - {"serialb", TYPE_STRING, false}, // Device name of Mac serial port B (serial_*.cpp) - {"ether", TYPE_STRING, false}, // Device name of Mac ethernet adapter (ether_*.cpp) - {"rom", TYPE_STRING, false}, // Path of ROM file (main_*.cpp) - {"bootdrive", TYPE_INT16, false}, // Boot drive number (main_*.cpp) - {"bootdriver", TYPE_INT16, false}, // Boot driver number (main_*.cpp) - {"ramsize", TYPE_INT32, false}, // Size of Mac RAM in bytes (main_*.cpp) - {"frameskip", TYPE_INT32, false}, // Number of frames to skip in refreshed video modes (video_*.cpp) - {"modelid", TYPE_INT32, false}, // Mac Model ID (Gestalt Model ID minus 6) (rom_patches.cpp) - {"fpu", TYPE_BOOLEAN, false}, // Enable FPU emulation (main_*.cpp) - {"nocdrom", TYPE_BOOLEAN, false}, // Don't install CD-ROM driver (cdrom.cpp/rom_patches.cpp) - {"nosound", TYPE_BOOLEAN, false}, // Don't enable sound output (audio_*.cpp) - {"nogui", TYPE_BOOLEAN, false}, // Disable GUI (main_*.cpp) - {NULL, TYPE_END, false} // End of list -}; - - -// Prefs item are stored in a linked list of these nodes +// Prefs items are stored in a linked list of these nodes struct prefs_node { prefs_node *next; const char *name; @@ -70,33 +37,95 @@ struct prefs_node { }; // List of prefs nodes -static prefs_node *the_prefs; +static prefs_node *the_prefs = NULL; + +// Prototypes +static const prefs_desc *find_prefs_desc(const char *name); /* * Initialize preferences */ -void PrefsInit(void) +void PrefsInit(const char *vmdir, int &argc, char **&argv) { - // Start with empty list - the_prefs = NULL; - // Set defaults - SysAddSerialPrefs(); - PrefsAddInt16("bootdriver", 0); - PrefsAddInt16("bootdrive", 0); - PrefsAddInt32("ramsize", 8 * 1024 * 1024); - PrefsAddInt32("frameskip", 6); - PrefsAddInt32("modelid", 5); // Mac IIci - PrefsAddBool("fpu", false); - PrefsAddBool("nocdrom", false); - PrefsAddBool("nosound", false); - PrefsAddBool("nogui", false); + AddPrefsDefaults(); AddPlatformPrefsDefaults(); // Load preferences from settings file - LoadPrefs(); + LoadPrefs(vmdir); + + // Override prefs with command line options + for (int i=1; i= argc) { + fprintf(stderr, "Option '%s' must be followed by a value\n", option); + continue; + } + const char *value = argv[i]; + argv[i] = NULL; + + // Add/replace prefs item + switch (d->type) { + case TYPE_STRING: + if (d->multiple) + PrefsAddString(keyword, value); + else + PrefsReplaceString(keyword, value); + break; + + case TYPE_BOOLEAN: { + if (!strcmp(value, "true") || !strcmp(value, "on") || !strcmp(value, "yes")) + PrefsReplaceBool(keyword, true); + else if (!strcmp(value, "false") || !strcmp(value, "off") || !strcmp(value, "no")) + PrefsReplaceBool(keyword, false); + else + fprintf(stderr, "Value for option '%s' must be 'true' or 'false'\n", option); + break; + } + + case TYPE_INT32: + PrefsReplaceInt32(keyword, atoi(value)); + break; + + default: + break; + } + } + + // Remove processed arguments + for (int i=1; i i) { + k -= i; + for (int j=i+k; jtype != TYPE_END) { + if (list->help) { + const char *typestr, *defstr; + char numstr[32]; + switch (list->type) { + case TYPE_STRING: + typestr = "STRING"; + defstr = PrefsFindString(list->name); + if (defstr == NULL) + defstr = "none"; + break; + case TYPE_BOOLEAN: + typestr = "BOOL"; + if (PrefsFindBool(list->name)) + defstr = "true"; + else + defstr = "false"; + break; + case TYPE_INT32: + typestr = "NUMBER"; + sprintf(numstr, "%d", PrefsFindInt32(list->name)); + defstr = numstr; + break; + default: + typestr = ""; + defstr = "none"; + break; + } + printf(" --%s %s\n %s [default=%s]\n", list->name, typestr, list->help, defstr); + } + list++; + } +} + +void PrefsPrintUsage(void) +{ + printf("\nGeneral options:\n"); + print_options(common_prefs_items); + printf("\nPlatform-specific options:\n"); + print_options(platform_prefs_items); + printf("\nBoolean options are specified as '--OPTION true|on|yes' or\n'--OPTION false|off|no'.\n"); } @@ -132,6 +217,14 @@ static const prefs_desc *find_prefs_desc return NULL; } +static const prefs_desc *find_prefs_desc(const char *name) +{ + const prefs_desc *d = find_prefs_desc(name, common_prefs_items); + if (d == NULL) + d = find_prefs_desc(name, platform_prefs_items); + return d; +} + /* * Set prefs items @@ -167,11 +260,6 @@ void PrefsAddBool(const char *name, bool add_data(name, TYPE_BOOLEAN, &b, sizeof(bool)); } -void PrefsAddInt16(const char *name, int16 val) -{ - add_data(name, TYPE_INT16, &val, sizeof(int16)); -} - void PrefsAddInt32(const char *name, int32 val) { add_data(name, TYPE_INT32, &val, sizeof(int32)); @@ -217,15 +305,6 @@ void PrefsReplaceBool(const char *name, add_data(name, TYPE_BOOLEAN, &b, sizeof(bool)); } -void PrefsReplaceInt16(const char *name, int16 val) -{ - prefs_node *p = find_node(name, TYPE_INT16); - if (p) - *(int16 *)(p->data) = val; - else - add_data(name, TYPE_INT16, &val, sizeof(int16)); -} - void PrefsReplaceInt32(const char *name, int32 val) { prefs_node *p = find_node(name, TYPE_INT32); @@ -258,15 +337,6 @@ bool PrefsFindBool(const char *name) return false; } -int16 PrefsFindInt16(const char *name) -{ - prefs_node *p = find_node(name, TYPE_INT16, 0); - if (p) - return *(int16 *)(p->data); - else - return 0; -} - int32 PrefsFindInt32(const char *name) { prefs_node *p = find_node(name, TYPE_INT32, 0); @@ -330,16 +400,12 @@ void LoadPrefsFromStream(FILE *f) // Skip whitespace until value while (isspace(*p)) p++; - if (*p == 0) - continue; char *keyword = line; char *value = p; int32 i = atol(value); - // Look for keyword first in common item list, then in platform specific list - const prefs_desc *desc = find_prefs_desc(keyword, common_prefs_items); - if (desc == NULL) - desc = find_prefs_desc(keyword, platform_prefs_items); + // Look for keyword first in prefs item list + const prefs_desc *desc = find_prefs_desc(keyword); if (desc == NULL) { printf("WARNING: Unknown preferences keyword '%s'\n", keyword); continue; @@ -356,9 +422,6 @@ void LoadPrefsFromStream(FILE *f) case TYPE_BOOLEAN: PrefsReplaceBool(keyword, !strcmp(value, "true")); break; - case TYPE_INT16: - PrefsReplaceInt16(keyword, i); - break; case TYPE_INT32: PrefsReplaceInt32(keyword, i); break; @@ -387,11 +450,8 @@ static void write_prefs(FILE *f, const p case TYPE_BOOLEAN: fprintf(f, "%s %s\n", list->name, PrefsFindBool(list->name) ? "true" : "false"); break; - case TYPE_INT16: - fprintf(f, "%s %d\n", list->name, PrefsFindInt16(list->name)); - break; case TYPE_INT32: - fprintf(f, "%s %ld\n", list->name, PrefsFindInt32(list->name)); + fprintf(f, "%s %d\n", list->name, PrefsFindInt32(list->name)); break; default: break;