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.11 by cebix, 2001-04-01T12:11:42Z

# Line 1 | Line 1
1   /*
2   *  prefs.cpp - Preferences handling
3   *
4 < *  Basilisk II (C) 1997-2000 Christian Bauer
4 > *  Basilisk II (C) 1997-2001 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 <        {"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 options
60 +        for (int i=1; i<argc; i++) {
61 +
62 +                // Options are of the form '--keyword'
63 +                const char *option = argv[i];
64 +                if (strlen(option) < 3 || option[0] != '-' || option[1] != '-')
65 +                        continue;
66 +                const char *keyword = option + 2;
67 +
68 +                // Find descriptor for keyword
69 +                const prefs_desc *d = find_prefs_desc(keyword);
70 +                if (d == NULL)
71 +                        continue;
72 +                argv[i] = NULL;
73 +
74 +                // Get value
75 +                i++;
76 +                if (i >= argc) {
77 +                        fprintf(stderr, "Option '%s' must be followed by a value\n", option);
78 +                        continue;
79 +                }
80 +                const char *value = argv[i];
81 +                argv[i] = NULL;
82 +
83 +                // Add/replace prefs item
84 +                switch (d->type) {
85 +                        case TYPE_STRING:
86 +                                if (d->multiple)
87 +                                        PrefsAddString(keyword, value);
88 +                                else
89 +                                        PrefsReplaceString(keyword, value);
90 +                                break;
91 +
92 +                        case TYPE_BOOLEAN: {
93 +                                if (!strcmp(value, "true") || !strcmp(value, "on") || !strcmp(value, "yes"))
94 +                                        PrefsReplaceBool(keyword, true);
95 +                                else if (!strcmp(value, "false") || !strcmp(value, "off") || !strcmp(value, "no"))
96 +                                        PrefsReplaceBool(keyword, false);
97 +                                else
98 +                                        fprintf(stderr, "Value for option '%s' must be 'true' or 'false'\n", option);
99 +                                break;
100 +                        }
101 +
102 +                        case TYPE_INT32:
103 +                                PrefsReplaceInt32(keyword, atoi(value));
104 +                                break;
105 +
106 +                        default:
107 +                                break;
108 +                }
109 +        }
110 +
111 +        // Remove processed arguments
112 +        for (int i=1; i<argc; i++) {
113 +                int k;
114 +                for (k=i; k<argc; k++)
115 +                        if (argv[k] != NULL)
116 +                                break;
117 +                if (k > i) {
118 +                        k -= i;
119 +                        for (int j=i+k; j<argc; j++)
120 +                                argv[j-k] = argv[j];
121 +                        argc -= k;
122 +                }
123 +        }
124   }
125  
126  
# Line 124 | Line 143 | void PrefsExit(void)
143  
144  
145   /*
146 + *  Print preferences options help
147 + */
148 +
149 + static void print_options(const prefs_desc *list)
150 + {
151 +        while (list->type != TYPE_END) {
152 +                if (list->help) {
153 +                        const char *typestr, *defstr;
154 +                        char numstr[32];
155 +                        switch (list->type) {
156 +                                case TYPE_STRING:
157 +                                        typestr = "STRING";
158 +                                        defstr = PrefsFindString(list->name);
159 +                                        if (defstr == NULL)
160 +                                                defstr = "none";
161 +                                        break;
162 +                                case TYPE_BOOLEAN:
163 +                                        typestr = "BOOL";
164 +                                        if (PrefsFindBool(list->name))
165 +                                                defstr = "true";
166 +                                        else
167 +                                                defstr = "false";
168 +                                        break;
169 +                                case TYPE_INT32:
170 +                                        typestr = "NUMBER";
171 +                                        sprintf(numstr, "%d", PrefsFindInt32(list->name));
172 +                                        defstr = numstr;
173 +                                        break;
174 +                                default:
175 +                                        typestr = "<unknown>";
176 +                                        defstr = "none";
177 +                                        break;
178 +                        }
179 +                        printf("  --%s %s\n    %s [default=%s]\n", list->name, typestr, list->help, defstr);
180 +                }
181 +                list++;
182 +        }
183 + }
184 +
185 + void PrefsPrintUsage(void)
186 + {
187 +        printf("\nGeneral options:\n");
188 +        print_options(common_prefs_items);
189 +        printf("\nPlatform-specific options:\n");
190 +        print_options(platform_prefs_items);
191 +        printf("\nBoolean options are specified as '--OPTION true|on|yes' or\n'--OPTION false|off|no'.\n");
192 + }
193 +
194 +
195 + /*
196   *  Find preferences descriptor by keyword
197   */
198  
# Line 137 | Line 206 | static const prefs_desc *find_prefs_desc
206          return NULL;
207   }
208  
209 + static const prefs_desc *find_prefs_desc(const char *name)
210 + {
211 +        const prefs_desc *d = find_prefs_desc(name, common_prefs_items);
212 +        if (d == NULL)
213 +                d = find_prefs_desc(name, platform_prefs_items);
214 +        return d;
215 + }
216 +
217  
218   /*
219   *  Set prefs items
# Line 172 | Line 249 | void PrefsAddBool(const char *name, bool
249          add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
250   }
251  
175 void PrefsAddInt16(const char *name, int16 val)
176 {
177        add_data(name, TYPE_INT16, &val, sizeof(int16));
178 }
179
252   void PrefsAddInt32(const char *name, int32 val)
253   {
254          add_data(name, TYPE_INT32, &val, sizeof(int32));
# Line 222 | Line 294 | void PrefsReplaceBool(const char *name,
294                  add_data(name, TYPE_BOOLEAN, &b, sizeof(bool));
295   }
296  
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
297   void PrefsReplaceInt32(const char *name, int32 val)
298   {
299          prefs_node *p = find_node(name, TYPE_INT32);
# Line 263 | Line 326 | bool PrefsFindBool(const char *name)
326                  return false;
327   }
328  
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
329   int32 PrefsFindInt32(const char *name)
330   {
331          prefs_node *p = find_node(name, TYPE_INT32, 0);
# Line 339 | Line 393 | void LoadPrefsFromStream(FILE *f)
393                  char *value = p;
394                  int32 i = atol(value);
395  
396 <                // Look for keyword first in common item list, then in platform specific list
397 <                const prefs_desc *desc = find_prefs_desc(keyword, common_prefs_items);
344 <                if (desc == NULL)
345 <                        desc = find_prefs_desc(keyword, platform_prefs_items);
396 >                // Look for keyword first in prefs item list
397 >                const prefs_desc *desc = find_prefs_desc(keyword);
398                  if (desc == NULL) {
399                          printf("WARNING: Unknown preferences keyword '%s'\n", keyword);
400                          continue;
# Line 359 | Line 411 | void LoadPrefsFromStream(FILE *f)
411                          case TYPE_BOOLEAN:
412                                  PrefsReplaceBool(keyword, !strcmp(value, "true"));
413                                  break;
362                        case TYPE_INT16:
363                                PrefsReplaceInt16(keyword, i);
364                                break;
414                          case TYPE_INT32:
415                                  PrefsReplaceInt32(keyword, i);
416                                  break;
# Line 390 | Line 439 | static void write_prefs(FILE *f, const p
439                          case TYPE_BOOLEAN:
440                                  fprintf(f, "%s %s\n", list->name, PrefsFindBool(list->name) ? "true" : "false");
441                                  break;
393                        case TYPE_INT16:
394                                fprintf(f, "%s %d\n", list->name, PrefsFindInt16(list->name));
395                                break;
442                          case TYPE_INT32:
443 <                                fprintf(f, "%s %ld\n", list->name, PrefsFindInt32(list->name));
443 >                                fprintf(f, "%s %d\n", list->name, PrefsFindInt32(list->name));
444                                  break;
445                          default:
446                                  break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines