dropping SDL for the cross-platform version almost done
[dosdemo] / src / cfgopt.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include "cfgopt.h"
6
7 #ifdef NDEBUG
8 /* release build default options */
9 struct options opt = {
10         0,      /* start_scr */
11         1,      /* music */
12         0,      /* mouse */
13         0,      /* sball */
14         0,      /* vsync */
15         0       /* dbginfo */
16 };
17 #else
18 /* debug build default options */
19 struct options opt = {
20         0,      /* start_scr */
21         0,      /* music */
22         1,      /* mouse */
23         0,      /* sball */
24         0,      /* vsync */
25         1       /* dbginfo */
26 };
27 #endif
28
29 int parse_args(int argc, char **argv)
30 {
31         int i;
32         char *scrname = 0;
33
34         for(i=1; i<argc; i++) {
35                 if(argv[i][0] == '-') {
36                         if(strcmp(argv[i], "-music") == 0) {
37                                 opt.music = 1;
38                         } else if(strcmp(argv[i], "-nomusic") == 0) {
39                                 opt.music = 0;
40                         } else if(strcmp(argv[i], "-scr") == 0 || strcmp(argv[i], "-screen") == 0) {
41                                 scrname = argv[++i];
42                         } else if(strcmp(argv[i], "-mouse") == 0) {
43                                 opt.mouse = 1;
44                         } else if(strcmp(argv[i], "-nomouse") == 0) {
45                                 opt.mouse = 0;
46                         } else if(strcmp(argv[i], "-sball") == 0) {
47                                 opt.sball = !opt.sball;
48                         } else if(strcmp(argv[i], "-vsync") == 0) {
49                                 opt.vsync = 1;
50                         } else if(strcmp(argv[i], "-novsync") == 0) {
51                                 opt.vsync = 0;
52                         } else if(strcmp(argv[i], "-dbg") == 0) {
53                                 opt.dbginfo = 1;
54                         } else if(strcmp(argv[i], "-nodbg") == 0) {
55                                 opt.dbginfo = 0;
56 #ifndef MSDOS
57                         } else if(strcmp(argv[i], "-fs") == 0) {
58                                 opt.fullscreen = 1;
59                         } else if(strcmp(argv[i], "-win") == 0) {
60                                 opt.fullscreen = 0;
61                         } else if(strcmp(argv[i], "-scaler-nearest") == 0) {
62                                 opt.scaler = SCALER_NEAREST;
63                         } else if(strcmp(argv[i], "-scaler-linear") == 0) {
64                                 opt.scaler = SCALER_LINEAR;
65 #endif
66                         } else {
67                                 fprintf(stderr, "invalid option: %s\n", argv[i]);
68                                 return -1;
69                         }
70                 } else {
71                         if(scrname) {
72                                 fprintf(stderr, "unexpected option: %s\n", argv[i]);
73                                 return -1;
74                         }
75                         scrname = argv[i];
76                 }
77         }
78
79         if(scrname) {
80                 opt.start_scr = scrname;
81         }
82         return 0;
83 }
84
85 static char *strip_space(char *s)
86 {
87         int len;
88         char *end;
89
90         while(*s && isspace(*s)) ++s;
91         if(!*s) return 0;
92
93         if((end = strrchr(s, '#'))) {
94                 --end;
95         } else {
96                 len = strlen(s);
97                 end = s + len - 1;
98         }
99
100         while(end > s && isspace(*end)) *end-- = 0;
101         return end > s ? s : 0;
102 }
103
104 static int bool_value(char *s)
105 {
106         char *ptr = s;
107         while(*ptr) {
108                 *ptr = tolower(*ptr);
109                 ++ptr;
110         }
111
112         return strcmp(s, "true") == 0 || strcmp(s, "yes") == 0 || strcmp(s, "1") == 0;
113 }
114
115 int load_config(const char *fname)
116 {
117         FILE *fp;
118         char buf[256];
119         int nline = 0;
120
121         if(!(fp = fopen(fname, "rb"))) {
122                 return 0;       /* just ignore missing config files */
123         }
124
125         while(fgets(buf, sizeof buf, fp)) {
126                 char *line, *key, *value;
127
128                 ++nline;
129                 if(!(line = strip_space(buf))) {
130                         continue;
131                 }
132
133                 if(!(value = strchr(line, '='))) {
134                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
135                         return -1;
136                 }
137                 *value++ = 0;
138
139                 if(!(key = strip_space(line)) || !(value = strip_space(value))) {
140                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
141                         return -1;
142                 }
143
144                 if(strcmp(line, "music") == 0) {
145                         opt.music = bool_value(value);
146                 } else if(strcmp(line, "screen") == 0) {
147                         opt.start_scr = strdup(value);
148                 } else if(strcmp(line, "mouse") == 0) {
149                         opt.mouse = bool_value(value);
150                 } else if(strcmp(line, "sball") == 0) {
151                         opt.sball = bool_value(value);
152                 } else if(strcmp(line, "vsync") == 0) {
153                         opt.vsync = bool_value(value);
154                 } else if(strcmp(line, "debug") == 0) {
155                         opt.dbginfo = bool_value(value);
156 #ifndef MSDOS
157                 } else if(strcmp(line, "fullscreen") == 0) {
158                         opt.fullscreen = bool_value(value);
159                 } else if(strcmp(line, "scaler") == 0) {
160                         if(strcmp(value, "linear") == 0) {
161                                 opt.scaler = SCALER_LINEAR;
162                         } else {
163                                 opt.scaler = SCALER_NEAREST;
164                         }
165 #endif
166                 } else {
167                         fprintf(stderr, "%s:%d invalid option: %s\n", fname, nline, line);
168                         return -1;
169                 }
170         }
171         return 0;
172 }