world's saddest console
[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,      /* sball */
13         1,      /* vsync */
14         0       /* dbginfo */
15 };
16 #else
17 /* debug build default options */
18 struct options opt = {
19         0,      /* start_scr */
20         0,      /* music */
21         0,      /* sball */
22         1,      /* vsync */
23         1       /* dbginfo */
24 };
25 #endif
26
27 int parse_args(int argc, char **argv)
28 {
29         int i;
30         char *scrname = 0;
31
32         for(i=1; i<argc; i++) {
33                 if(argv[i][0] == '-') {
34                         if(strcmp(argv[i], "-music") == 0) {
35                                 opt.music = 1;
36                         } else if(strcmp(argv[i], "-nomusic") == 0) {
37                                 opt.music = 0;
38                         } else if(strcmp(argv[i], "-scr") == 0 || strcmp(argv[i], "-screen") == 0) {
39                                 scrname = argv[++i];
40                         } else if(strcmp(argv[i], "-sball") == 0) {
41                                 opt.sball = !opt.sball;
42                         } else if(strcmp(argv[i], "-vsync") == 0) {
43                                 opt.vsync = 1;
44                         } else if(strcmp(argv[i], "-novsync") == 0) {
45                                 opt.vsync = 0;
46                         } else if(strcmp(argv[i], "-dbg") == 0) {
47                                 opt.dbginfo = 1;
48                         } else if(strcmp(argv[i], "-nodbg") == 0) {
49                                 opt.dbginfo = 0;
50                         } else {
51                                 fprintf(stderr, "invalid option: %s\n", argv[i]);
52                                 return -1;
53                         }
54                 } else {
55                         if(scrname) {
56                                 fprintf(stderr, "unexpected option: %s\n", argv[i]);
57                                 return -1;
58                         }
59                         scrname = argv[i];
60                 }
61         }
62
63         if(scrname) {
64                 opt.start_scr = scrname;
65         }
66         return 0;
67 }
68
69 static char *strip_space(char *s)
70 {
71         int len;
72         char *end;
73
74         while(*s && isspace(*s)) ++s;
75         if(!*s) return 0;
76
77         if((end = strrchr(s, '#'))) {
78                 --end;
79         } else {
80                 len = strlen(s);
81                 end = s + len - 1;
82         }
83
84         while(end > s && isspace(*end)) *end-- = 0;
85         return end > s ? s : 0;
86 }
87
88 static int bool_value(char *s)
89 {
90         char *ptr = s;
91         while(*ptr) {
92                 *ptr = tolower(*ptr);
93                 ++ptr;
94         }
95
96         return strcmp(s, "true") == 0 || strcmp(s, "yes") == 0 || strcmp(s, "1") == 0;
97 }
98
99 int load_config(const char *fname)
100 {
101         FILE *fp;
102         char buf[256];
103         int nline = 0;
104
105         if(!(fp = fopen(fname, "rb"))) {
106                 return 0;       /* just ignore missing config files */
107         }
108
109         while(fgets(buf, sizeof buf, fp)) {
110                 char *line, *key, *value;
111
112                 ++nline;
113                 if(!(line = strip_space(buf))) {
114                         continue;
115                 }
116
117                 if(!(value = strchr(line, '='))) {
118                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
119                         return -1;
120                 }
121                 *value++ = 0;
122
123                 if(!(key = strip_space(line)) || !(value = strip_space(value))) {
124                         fprintf(stderr, "%s:%d invalid key/value pair\n", fname, nline);
125                         return -1;
126                 }
127
128                 if(strcmp(line, "music") == 0) {
129                         opt.music = bool_value(value);
130                 } else if(strcmp(line, "screen") == 0) {
131                         opt.start_scr = strdup(value);
132                 } else if(strcmp(line, "sball") == 0) {
133                         opt.sball = bool_value(value);
134                 } else if(strcmp(line, "vsync") == 0) {
135                         opt.vsync = bool_value(value);
136                 } else if(strcmp(line, "debug") == 0) {
137                         opt.dbginfo = bool_value(value);
138                 } else {
139                         fprintf(stderr, "%s:%d invalid option: %s\n", fname, nline, line);
140                         return -1;
141                 }
142         }
143         return 0;
144 }