ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/prefs.cpp
(Generate patch)

Comparing BasiliskII/src/prefs.cpp (file contents):
Revision 1.6 by cebix, 2000-05-16T17:11:37Z vs.
Revision 1.9 by cebix, 2001-01-04T19:50:22Z

# Line 28 | Line 28
28   #include "prefs.h"
29  
30  
31 < // Common preferences items (those which exist on all platforms)
32 < // Except for "disk", "floppy", "cdrom", "scsiX", "screen", "rom" and "ether",
33 < // these are guaranteed to be in the prefs; "disk", "floppy" and "cdrom" can
34 < // occur multiple times
35 < prefs_desc common_prefs_items[] = {
36 <        {"disk", TYPE_STRING, true},            // Device/file names of Mac volumes (disk.cpp)
37 <        {"floppy", TYPE_STRING, true},          // Device/file names of Mac floppy drives (sony.cpp)
38 <        {"cdrom", TYPE_STRING, true},           // Device/file names of Mac CD-ROM drives (cdrom.cpp)
39 <        {"extfs", TYPE_STRING, false},          // Root path of ExtFS (extfs.cpp)
40 <        {"scsi0", TYPE_STRING, false},          // SCSI targets for Mac SCSI ID 0..6 (scsi_*.cpp)
41 <        {"scsi1", TYPE_STRING, false},
42 <        {"scsi2", TYPE_STRING, false},
43 <        {"scsi3", TYPE_STRING, false},
44 <        {"scsi4", TYPE_STRING, false},
45 <        {"scsi5", TYPE_STRING, false},
46 <        {"scsi6", TYPE_STRING, false},
47 <        {"screen", TYPE_STRING, false},         // Video mode (video.cpp)
48 <        {"seriala", TYPE_STRING, false},        // Device name of Mac serial port A (serial_*.cpp)
49 <        {"serialb", TYPE_STRING, false},        // Device name of Mac serial port B (serial_*.cpp)
50 <        {"ether", TYPE_STRING, false},          // Device name of Mac ethernet adapter (ether_*.cpp)
51 <        {"rom", TYPE_STRING, false},            // Path of ROM file (main_*.cpp)
52 <        {"bootdrive", TYPE_INT16, false},       // Boot drive number (main.cpp)
53 <        {"bootdriver", TYPE_INT16, false},      // Boot driver number (main.cpp)
54 <        {"ramsize", TYPE_INT32, false},         // Size of Mac RAM in bytes (main_*.cpp)
55 <        {"frameskip", TYPE_INT32, false},       // Number of frames to skip in refreshed video modes (video_*.cpp)
56 <        {"modelid", TYPE_INT32, false},         // Mac Model ID (Gestalt Model ID minus 6) (rom_patches.cpp)
57 <        {"cpu", TYPE_INT32, false},                     // CPU type (0 = 68000, 1 = 68010 etc.) (main.cpp)
58 <        {"fpu", TYPE_BOOLEAN, false},           // Enable FPU emulation (main.cpp)
59 <        {"nocdrom", TYPE_BOOLEAN, false},       // Don't install CD-ROM driver (cdrom.cpp/rom_patches.cpp)
60 <        {"nosound", TYPE_BOOLEAN, false},       // Don't enable sound output (audio_*.cpp)
61 <        {"noclipconversion", TYPE_BOOLEAN, false}, // Don't convert clipboard contents (clip_*.cpp)
62 <        {"nogui", TYPE_BOOLEAN, false},         // Disable GUI (main_*.cpp)
63 <        {NULL, TYPE_END, false} // End of list
64 < };
65 <
66 <
67 < // Prefs item are stored in a linked list of these nodes
31 > // Prefs items are stored in a linked list of these nodes
32   struct prefs_node {
33          prefs_node *next;
34          const char *name;
# Line 73 | Line 37 | struct prefs_node {
37   };
38  
39   // List of prefs nodes
40 < static prefs_node *the_prefs;
40 > static prefs_node *the_prefs = NULL;
41 >
42 > // Prototypes
43 > static const prefs_desc *find_prefs_desc(const char *name);
44  
45  
46   /*
47   *  Initialize preferences
48   */
49  
50 < void PrefsInit(void)
50 > void PrefsInit(int argc, char **argv)
51   {
85        // Start with empty list
86        the_prefs = NULL;
87
52          // Set defaults
53 <        SysAddSerialPrefs();
90 <        PrefsAddInt16("bootdriver", 0);
91 <        PrefsAddInt16("bootdrive", 0);
92 <        PrefsAddInt32("ramsize", 8 * 1024 * 1024);
93 <        PrefsAddInt32("frameskip", 6);
94 <        PrefsAddInt32("modelid", 5);    // Mac IIci
95 <        PrefsAddInt32("cpu", 3);                // 68030
96 <        PrefsAddBool("fpu", false);
97 <        PrefsAddBool("nocdrom", false);
98 <        PrefsAddBool("nosound", false);
99 <        PrefsAddBool("noclipconversion", false);
100 <        PrefsAddBool("nogui", false);
53 >        AddPrefsDefaults();
54          AddPlatformPrefsDefaults();
55  
56          // Load preferences from settings file
57          LoadPrefs();
58 +
59 +        // Override prefs with command line arguments
60 +        argc--; argv++;
61 +        for (; argc>0; argc--, argv++) {
62 +
63 +                // Arguments are of the form '--keyword'
64 +                if (strlen(*argv) < 3 || argv[0][0] != '-' || argv[0][1] != '-') {
65 +                        printf("WARNING: Unrecognized argument '%s'\n", *argv);
66 +                        continue;
67 +                }
68 +                const char *keyword = *argv + 2;
69 +                const prefs_desc *d = find_prefs_desc(keyword);
70 +                if (d == NULL) {
71 +                        printf("WARNING: Unrecognized argument '%s'\n", *argv);
72 +                        continue;
73 +                }
74 +
75 +                // Add/replace prefs item
76 +                switch (d->type) {
77 +                        case TYPE_STRING:
78 +                                if (argc < 2) {
79 +                                        printf("WARNING: Argument '%s' must be followed by value\n", *argv);
80 +                                        break;
81 +                                }
82 +                                argc--; argv++;
83 +                                if (d->multiple)
84 +                                        PrefsAddString(keyword, *argv);
85 +                                else
86 +                                        PrefsReplaceString(keyword, *argv);
87 +                                break;
88 +
89 +                        case TYPE_BOOLEAN:
90 +                                if (argc > 1 && argv[1][0] != '-') {
91 +                                        argc--; argv++;
92 +                                        PrefsReplaceBool(keyword, !strcmp(*argv, "true") || !strcmp(*argv, "on"));
93 +                                } else
94 +                                        PrefsReplaceBool(keyword, true);
95 +                                break;
96 +
97 +                        case TYPE_INT32:
98 +                                if (argc < 2) {
99 +                                        printf("WARNING: Argument '%s' must be followed by value\n", *argv);
100 +                                        break;
101 +                                }
102 +                                argc--; argv++;
103 +                                PrefsReplaceInt32(keyword, atoi(*argv));
104 +                                break;
105 +
106 +                        default:
107 +                                break;
108 +                }
109 +        }
110   }
111  
112  
# Line 137 | Line 142 | static const prefs_desc *find_prefs_desc
142          return NULL;
143   }
144  
145 + static const prefs_desc *find_prefs_desc(const char *name)
146 + {
147 +        const prefs_desc *d = find_prefs_desc(name, common_prefs_items);
148 +        if (d == NULL)
149 +                d = find_prefs_desc(name, platform_prefs_items);
150 +        return d;
151 + }
152 +
153  
154   /*
155   *  Set prefs items
# Line 172 | Line 185 | void PrefsAddBool(const char *name, bool
185          add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
186   }
187  
175 void PrefsAddInt16(const char *name, int16 val)
176 {
177        add_data(name, TYPE_INT16, &val, sizeof(int16));
178 }
179
188   void PrefsAddInt32(const char *name, int32 val)
189   {
190          add_data(name, TYPE_INT32, &val, sizeof(int32));
# Line 222 | Line 230 | void PrefsReplaceBool(const char *name,
230                  add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
231   }
232  
225 void PrefsReplaceInt16(const char *name, int16 val)
226 {
227        prefs_node *p = find_node(name, TYPE_INT16);
228        if (p)
229                *(int16 *)(p->data) = val;
230        else
231                add_data(name, TYPE_INT16, &val, sizeof(int16));
232 }
233
233   void PrefsReplaceInt32(const char *name, int32 val)
234   {
235          prefs_node *p = find_node(name, TYPE_INT32);
# Line 263 | Line 262 | bool PrefsFindBool(const char *name)
262                  return false;
263   }
264  
266 int16 PrefsFindInt16(const char *name)
267 {
268        prefs_node *p = find_node(name, TYPE_INT16, 0);
269        if (p)
270                return *(int16 *)(p->data);
271        else
272                return 0;
273 }
274
265   int32 PrefsFindInt32(const char *name)
266   {
267          prefs_node *p = find_node(name, TYPE_INT32, 0);
# Line 339 | Line 329 | void LoadPrefsFromStream(FILE *f)
329                  char *value = p;
330                  int32 i = atol(value);
331  
332 <                // Look for keyword first in common item list, then in platform specific list
333 <                const prefs_desc *desc = find_prefs_desc(keyword, common_prefs_items);
344 <                if (desc == NULL)
345 <                        desc = find_prefs_desc(keyword, platform_prefs_items);
332 >                // Look for keyword first in prefs item list
333 >                const prefs_desc *desc = find_prefs_desc(keyword);
334                  if (desc == NULL) {
335                          printf("WARNING: Unknown preferences keyword '%s'\n", keyword);
336                          continue;
# Line 359 | Line 347 | void LoadPrefsFromStream(FILE *f)
347                          case TYPE_BOOLEAN:
348                                  PrefsReplaceBool(keyword, !strcmp(value, "true"));
349                                  break;
362                        case TYPE_INT16:
363                                PrefsReplaceInt16(keyword, i);
364                                break;
350                          case TYPE_INT32:
351                                  PrefsReplaceInt32(keyword, i);
352                                  break;
# Line 390 | Line 375 | static void write_prefs(FILE *f, const p
375                          case TYPE_BOOLEAN:
376                                  fprintf(f, "%s %s\n", list->name, PrefsFindBool(list->name) ? "true" : "false");
377                                  break;
393                        case TYPE_INT16:
394                                fprintf(f, "%s %d\n", list->name, PrefsFindInt16(list->name));
395                                break;
378                          case TYPE_INT32:
379 <                                fprintf(f, "%s %ld\n", list->name, PrefsFindInt32(list->name));
379 >                                fprintf(f, "%s %d\n", list->name, PrefsFindInt32(list->name));
380                                  break;
381                          default:
382                                  break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines