Mercurial > repos > blastem
annotate config.c @ 783:e64975fc5f98
Fix stateview build and fix Makefile to use /bin/echo since builtin echo does not always support -e
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 21 Jul 2015 00:52:21 -0700 |
parents | 1b2f8280ba81 |
children | 724bbec47f86 bce97fc0bb8a |
rev | line source |
---|---|
467
140af5509ce7
Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents:
431
diff
changeset
|
1 /* |
140af5509ce7
Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents:
431
diff
changeset
|
2 Copyright 2013 Michael Pavone |
495
39cad98d2789
Allow OpenGL support to be disabled at compile time. Move generic utility functions out of config.c
Mike Pavone <pavone@retrodev.com>
parents:
467
diff
changeset
|
3 This file is part of BlastEm. |
467
140af5509ce7
Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents:
431
diff
changeset
|
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. |
140af5509ce7
Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents:
431
diff
changeset
|
5 */ |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 #include "tern.h" |
495
39cad98d2789
Allow OpenGL support to be disabled at compile time. Move generic utility functions out of config.c
Mike Pavone <pavone@retrodev.com>
parents:
467
diff
changeset
|
7 #include "util.h" |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 #include <stdio.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 #include <stdlib.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 #include <string.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 |
741
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
12 #ifdef _WIN32 |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
13 char * strtok_r(char * input, char * sep, char ** state) |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
14 { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
15 if (input) { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
16 *state = input; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
17 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
18 char * ret = *state; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
19 while (**state && **state != *sep) |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
20 { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
21 ++*state; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
22 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
23 if (**state) |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
24 { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
25 **state = 0; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
26 ++*state; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
27 return ret; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
28 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
29 return NULL; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
30 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
31 #endif |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
32 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
33 tern_node * parse_config_int(char **state, int started, int *line) |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
35 char *config_data, *curline; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 tern_node * head = NULL; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
37 config_data = started ? NULL : *state; |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
38 while ((curline = strtok_r(config_data, "\n", state))) |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
40 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 config_data = NULL; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 curline = strip_ws(curline); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 int len = strlen(curline); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 if (!len) { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
45 *line++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 continue; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 if (curline[0] == '#') { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
49 *line++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 continue; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 if (curline[0] == '}') { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
53 if (started) { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
54 return head; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 } |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
56 fprintf(stderr, "unexpected } on line %d\n", *line); |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
57 exit(1); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 } |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
59 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 char * end = curline + len - 1; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 if (*end == '{') { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 *end = 0; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 curline = strip_ws(curline); |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
64 *line++; |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
65 head = tern_insert_node(head, curline, parse_config_int(state, 1, line)); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 } else { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 char * val = strip_ws(split_keyval(curline)); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 char * key = curline; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
69 if (*val) { |
431
440efd7d27a9
Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents:
430
diff
changeset
|
70 head = tern_insert_ptr(head, key, strdup(val)); |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
71 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
72 fprintf(stderr, "Key %s is missing a value on line %d\n", key, *line); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 } |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
74 *line++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 return head; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
80 tern_node * parse_config(char * config_data) |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
81 { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
82 int line = 1; |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
83 return parse_config_int(&config_data, 0, &line); |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
84 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
85 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 tern_node * parse_config_file(char * config_path) |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 tern_node * ret = NULL; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 FILE * config_file = fopen(config_path, "r"); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 if (!config_file) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 goto open_fail; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 long config_size = file_size(config_file); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 if (!config_size) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 goto config_empty; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 char * config_data = malloc(config_size); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 if (fread(config_data, 1, config_size, config_file) != config_size) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 goto config_read_fail; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 ret = parse_config(config_data); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 config_read_fail: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 free(config_data); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 config_empty: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 fclose(config_file); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
106 open_fail: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 return ret; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
110 tern_node * load_config() |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 { |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
112 char * exe_dir; |
742
2e1b3b258523
Make Windows port a little less half-assed
Michael Pavone <pavone@retrodev.com>
parents:
741
diff
changeset
|
113 char * home = get_home_dir(); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 if (!home) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 goto load_in_app_dir; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 char * path = alloc_concat(home, "/.config/blastem/blastem.cfg"); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
118 tern_node * ret = parse_config_file(path); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
119 if (ret) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
120 goto success; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
121 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 free(path); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 load_in_app_dir: |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
124 exe_dir = get_exe_dir(); |
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
125 if (!exe_dir) { |
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
126 goto no_config; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 } |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
128 path = alloc_concat(exe_dir, "/default.cfg"); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 ret = parse_config_file(path); |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
130 free(path); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
131 success: |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
132 if (ret) { |
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
133 return ret; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } |
496
6fc71114d145
Extract function to determine executable directory from load_config so it can be used elsewhere
Mike Pavone <pavone@retrodev.com>
parents:
495
diff
changeset
|
135 no_config: |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
136 fputs("Failed to find a config file in ~/.config/blastem/blastem.cfg or in the blastem executable directory\n", stderr); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 exit(1); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 |