170e47fffac74a7c27e570a9bb90137e51d6ef06
[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 #endif
62                         } else {
63                                 fprintf(stderr, "invalid option: %s\n", argv[i]);
64                                 return -1;
65                         }
66                 } else {
67                         if(scrname) {
68                                 fprintf(stderr, "unexpected option: %s\n", argv[i]);
69                                 return -1;
70                         }
71                         scrname = argv[i];
72                 }
73         }
74
75         if(scrname) {
76                 opt.start_scr = scrname;
77         }
78         return 0;
79 }
80
81 static char *strip_space(char *s)
82 {
83         int len;
84         char *end;
85
86         while(*s && isspace(*s)) ++s;
87         if(!*s) return 0;
88
89         if((end = strrchr(s, '#'))) {
90                 --end;
91         } else {
92                 len = strlen(s);
93                 end = s + len - 1;
94         }
95
96         while(end > s && isspace(*end)) *end-- = 0;
97         return end > s ? s : 0;
98 }
99
100 static int bool_value(char *s)
101 {
102         char *ptr = s;
103         while(*ptr) {
104                 *ptr = tolower(*ptr);
105                 ++ptr;
106         }
107
108         return strcmp(s, "true") == 0 || strcmp(s, "yes") == 0 || strcmp(s, "1") == 0;
109 }
110
111 int load_config(const char *fname)
112 {
113         FILE *fp;
114         char buf[256];
115         int nline = 0;
116
117         if(!(fp = fopen(fname, "rb"))) {
118                 return 0;       /* just ignore missing config files */
119         }
120
121         while(fgets(buf, sizeof buf, fp)) {
122                 char *line, *key, *value;
123
124                 ++nline;
125                 if(!(line = strip_space(buf))) {
126                         continue;
127                 }
128
129                 if(!(value = strchr(line, '='))) {
130                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
131                         return -1;
132                 }
133                 *value++ = 0;
134
135                 if(!(key = strip_space(line)) || !(value = strip_space(value))) {
136                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
137                         return -1;
138                 }
139
140                 if(strcmp(line, "music") == 0) {
141                         opt.music = bool_value(value);
142                 } else if(strcmp(line, "screen") == 0) {
143                         opt.start_scr = strdup(value);
144                 } else if(strcmp(line, "mouse") == 0) {
145                         opt.mouse = bool_value(value);
146                 } else if(strcmp(line, "sball") == 0) {
147                         opt.sball = bool_value(value);
148                 } else if(strcmp(line, "vsync") == 0) {
149                         opt.vsync = bool_value(value);
150                 } else if(strcmp(line, "debug") == 0) {
151                         opt.dbginfo = bool_value(value);
152 #ifndef MSDOS
153                 } else if(strcmp(line, "fullscreen") == 0) {
154                         opt.fullscreen = bool_value(value);
155 #endif
156                 } else {
157                         fprintf(stderr, "%s:%d invalid option: %s\n", fname, nline, line);
158                         return -1;
159                 }
160         }
161         return 0;
162 }