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.2 by cebix, 1999-10-19T17:41:18Z vs.
Revision 1.9 by cebix, 2001-01-04T19:50:22Z

# Line 1 | Line 1
1   /*
2   *  prefs.cpp - Preferences handling
3   *
4 < *  Basilisk II (C) 1997-1999 Christian Bauer
4 > *  Basilisk II (C) 1997-2000 Christian Bauer
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
# 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 <        {"fpu", TYPE_BOOLEAN, false},           // Enable FPU emulation (main_*.cpp)
58 <        {"nocdrom", TYPE_BOOLEAN, false},       // Don't install CD-ROM driver (cdrom.cpp/rom_patches.cpp)
59 <        {"nosound", TYPE_BOOLEAN, false},       // Don't enable sound output (audio_*.cpp)
60 <        {"nogui", TYPE_BOOLEAN, false},         // Disable GUI (main_*.cpp)
61 <        {NULL, TYPE_END, false} // End of list
62 < };
63 <
64 <
65 < // 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 71 | 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   {
83        // Start with empty list
84        the_prefs = NULL;
85
52          // Set defaults
53 <        SysAddSerialPrefs();
88 <        PrefsAddInt16("bootdriver", 0);
89 <        PrefsAddInt16("bootdrive", 0);
90 <        PrefsAddInt32("ramsize", 8 * 1024 * 1024);
91 <        PrefsAddInt32("frameskip", 6);
92 <        PrefsAddInt32("modelid", 5);    // Mac IIci
93 <        PrefsAddBool("fpu", false);
94 <        PrefsAddBool("nocdrom", false);
95 <        PrefsAddBool("nosound", false);
96 <        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 133 | 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 168 | Line 185 | void PrefsAddBool(const char *name, bool
185          add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
186   }
187  
171 void PrefsAddInt16(const char *name, int16 val)
172 {
173        add_data(name, TYPE_INT16, &val, sizeof(int16));
174 }
175
188   void PrefsAddInt32(const char *name, int32 val)
189   {
190          add_data(name, TYPE_INT32, &val, sizeof(int32));
# Line 218 | Line 230 | void PrefsReplaceBool(const char *name,
230                  add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
231   }
232  
221 void PrefsReplaceInt16(const char *name, int16 val)
222 {
223        prefs_node *p = find_node(name, TYPE_INT16);
224        if (p)
225                *(int16 *)(p->data) = val;
226        else
227                add_data(name, TYPE_INT16, &val, sizeof(int16));
228 }
229
233   void PrefsReplaceInt32(const char *name, int32 val)
234   {
235          prefs_node *p = find_node(name, TYPE_INT32);
# Line 259 | Line 262 | bool PrefsFindBool(const char *name)
262                  return false;
263   }
264  
262 int16 PrefsFindInt16(const char *name)
263 {
264        prefs_node *p = find_node(name, TYPE_INT16, 0);
265        if (p)
266                return *(int16 *)(p->data);
267        else
268                return 0;
269 }
270
265   int32 PrefsFindInt32(const char *name)
266   {
267          prefs_node *p = find_node(name, TYPE_INT32, 0);
# Line 331 | Line 325 | void LoadPrefsFromStream(FILE *f)
325  
326                  // Skip whitespace until value
327                  while (isspace(*p)) p++;
334                if (*p == 0)
335                        continue;
328                  char *keyword = line;
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);
342 <                if (desc == NULL)
343 <                        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 357 | Line 347 | void LoadPrefsFromStream(FILE *f)
347                          case TYPE_BOOLEAN:
348                                  PrefsReplaceBool(keyword, !strcmp(value, "true"));
349                                  break;
360                        case TYPE_INT16:
361                                PrefsReplaceInt16(keyword, i);
362                                break;
350                          case TYPE_INT32:
351                                  PrefsReplaceInt32(keyword, i);
352                                  break;
# Line 388 | 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;
391                        case TYPE_INT16:
392                                fprintf(f, "%s %d\n", list->name, PrefsFindInt16(list->name));
393                                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