Mercurial > repos > blastem
annotate config.c @ 2055:c4d066d798c4 segacd
Fix prog RAM banking and Genesis to SCD cycle conversion. Arkagis Escape demo now works
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 18 Jan 2022 23:54:02 -0800 |
parents | 193b804c9845 |
children | bdd83b47d78a |
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" |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
8 #include "paths.h" |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1900
diff
changeset
|
9 #include "config.h" |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 #include <stdio.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 #include <stdlib.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 #include <string.h> |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 |
795
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
14 #ifdef __MINGW64_VERSION_MAJOR |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
15 #define MINGW_W64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR) |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
16 #else |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
17 #define MINGW_W64_VERSION 0 |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
18 #endif |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
19 |
bce97fc0bb8a
Fix mingw-w64 build and cross-compilation
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
766
diff
changeset
|
20 #if defined(_WIN32) && (MINGW_W64_VERSION < 3003) |
741
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
21 char * strtok_r(char * input, char * sep, char ** 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 (input) { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
24 *state = input; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
25 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
26 char * ret = *state; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
27 while (**state && **state != *sep) |
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 ++*state; |
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 if (**state) |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
32 { |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
33 **state = 0; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
34 ++*state; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
35 return ret; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
36 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
37 return NULL; |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
38 } |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
39 #endif |
80a67be1770b
Initial work on Windows port
Michael Pavone <pavone@retrodev.com>
parents:
496
diff
changeset
|
40 |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
41 static 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
|
42 { |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
43 char *config_data, *curline; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 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
|
45 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
|
46 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
|
47 { |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
48 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 config_data = NULL; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 curline = strip_ws(curline); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 int len = strlen(curline); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 if (!len) { |
1783 | 53 (*line)++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 continue; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 if (curline[0] == '#') { |
1783 | 57 (*line)++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 continue; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 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
|
61 if (started) { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
62 return head; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 } |
792
724bbec47f86
Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents:
766
diff
changeset
|
64 fatal_error("unexpected } on line %d\n", *line); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 } |
866
69a6ec208111
Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
859
diff
changeset
|
66 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 char * end = curline + len - 1; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 if (*end == '{') { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 *end = 0; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 curline = strip_ws(curline); |
1783 | 71 (*line)++; |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
72 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
|
73 } else { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 char * val = strip_ws(split_keyval(curline)); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 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
|
76 if (*val) { |
431
440efd7d27a9
Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents:
430
diff
changeset
|
77 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
|
78 } else { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
79 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
|
80 } |
1783 | 81 (*line)++; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 return head; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
87 tern_node *parse_config(char * config_data) |
766
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
88 { |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
89 int line = 1; |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
90 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
|
91 } |
1b2f8280ba81
WIP changes to support reading cart memory map from ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
742
diff
changeset
|
92 |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
93 typedef struct { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
94 char *buf; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
95 uint32_t capacity; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
96 uint32_t size; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
97 uint32_t indent; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
98 } serialize_state; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
99 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
100 static void ensure_buf_capacity(uint32_t ensure, serialize_state *state) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
101 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
102 if (ensure + state->size > state->capacity) { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
103 state->capacity = state->capacity * 2; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
104 state->buf = realloc(state->buf, state->capacity); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
105 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
106 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
107 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
108 static void indent(serialize_state *state) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
109 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
110 memset(state->buf + state->size, '\t', state->indent); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
111 state->size += state->indent; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
112 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
113 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
114 static void serialize_config_int(tern_node *config, serialize_state *state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
115 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
116 static void serialize_iter(char *key, tern_val val, uint8_t valtype, void *data) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
117 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
118 serialize_state *state = data; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
119 uint32_t keylen = strlen(key); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
120 uint32_t vallen = 0; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
121 if (valtype == TVAL_PTR) { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
122 vallen = strlen(val.ptrval); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
123 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
124 ensure_buf_capacity(state->indent + keylen + 2 + vallen, state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
125 state->buf[state->size++] = '\n'; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
126 indent(state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
127 memcpy(state->buf + state->size, key, keylen); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
128 state->size += keylen; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
129 state->buf[state->size++] = ' '; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
130 if (valtype == TVAL_PTR) { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
131 memcpy(state->buf + state->size, val.ptrval, vallen); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
132 state->size += vallen; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
133 } else { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
134 serialize_config_int(val.ptrval, state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
135 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
136 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
137 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
138 static void serialize_config_int(tern_node *config, serialize_state *state) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
139 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
140 ensure_buf_capacity(1, state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
141 state->buf[state->size++] = '{'; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
142 state->indent++; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
143 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
144 tern_foreach(config, serialize_iter, state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
145 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
146 --state->indent; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
147 ensure_buf_capacity(2 + state->indent, state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
148 state->buf[state->size++] = '\n'; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
149 indent(state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
150 state->buf[state->size++] = '}'; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
151 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
152 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
153 char *serialize_config(tern_node *config, uint32_t *size_out) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
154 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
155 serialize_state state = { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
156 .size = 0, |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
157 .capacity = 1024, |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
158 .indent = 0 |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
159 }; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
160 state.buf = malloc(state.capacity); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
161 tern_foreach(config, serialize_iter, &state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
162 //serialize_config_int(config, &state); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
163 *size_out = state.size; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
164 return state.buf; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
165 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
166 |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
167 tern_node *parse_config_file(char *config_path) |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 tern_node * ret = NULL; |
816
7ed55a361e79
Use binary mode for reading shaders and config files so we actually get the number of bytes we expect
Michael Pavone <pavone@retrodev.com>
parents:
799
diff
changeset
|
170 FILE * config_file = fopen(config_path, "rb"); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 if (!config_file) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 goto open_fail; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 long config_size = file_size(config_file); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 if (!config_size) { |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 goto config_empty; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
177 } |
1783 | 178 char *config_data = calloc(config_size + 1, 1); |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 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
|
180 goto config_read_fail; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 } |
796
41f73c76b978
Fix some memory issues
=?UTF-8?q?Higor=20Eur=C3=ADpedes?= <heuripedes@gmail.com>
parents:
795
diff
changeset
|
182 |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 ret = parse_config(config_data); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 config_read_fail: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 free(config_data); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 config_empty: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 fclose(config_file); |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
188 open_fail: |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 return ret; |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 } |
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
192 uint8_t serialize_config_file(tern_node *config, char *path) |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
193 { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
194 FILE *f = fopen(path, "w"); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
195 if (!f) { |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
196 return 0; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
197 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
198 uint32_t buf_size; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
199 char *buffer = serialize_config(config, &buf_size); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
200 uint8_t ret = buf_size == fwrite(buffer, 1, buf_size, f); |
1593
24508cb54f87
Fix a number of other memory errors (mostly leaks again) identified by valgrind
Michael Pavone <pavone@retrodev.com>
parents:
1555
diff
changeset
|
201 free(buffer); |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
202 fclose(f); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
203 return ret; |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
204 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
205 |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
206 tern_node *parse_bundled_config(char *config_name) |
859
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
207 { |
1693
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
208 tern_node *ret = NULL; |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
209 #ifdef CONFIG_PATH |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
210 if (!strcmp("default.cfg", config_name) || !strcmp("blastem.cfg", config_name)) { |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
211 char *confpath = path_append(CONFIG_PATH, config_name); |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
212 ret = parse_config_file(confpath); |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
213 free(confpath); |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
214 } else { |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
215 #endif |
1140
4490c9c12272
Detect system type from filename if header based methods fail. Allow overriding system type from command line.
Michael Pavone <pavone@retrodev.com>
parents:
876
diff
changeset
|
216 uint32_t confsize; |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
217 char *confdata = read_bundled_file(config_name, &confsize); |
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
218 if (confdata) { |
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
219 confdata[confsize] = 0; |
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
220 ret = parse_config(confdata); |
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
221 free(confdata); |
859
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
222 } |
1693
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
223 #ifdef CONFIG_PATH |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
224 } |
ba3fb7a3be6b
Added some Makefile options to build a packaging friendly executable
Michael Pavone <pavone@retrodev.com>
parents:
1599
diff
changeset
|
225 #endif |
859
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
226 return ret; |
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
227 } |
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
228 |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
229 tern_node *load_overrideable_config(char *name, char *bundled_name, uint8_t *used_config_dir) |
1599
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
230 { |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
231 char const *confdir = get_config_dir(); |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
232 char *confpath = NULL; |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
233 tern_node *ret; |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
234 if (confdir) { |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
235 confpath = path_append(confdir, name); |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
236 ret = parse_config_file(confpath); |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
237 } |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
238 free(confpath); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
239 if (used_config_dir) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
240 *used_config_dir = ret != NULL; |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
241 } |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
242 |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
243 if (!ret) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
244 ret = parse_bundled_config(name); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
245 if (!ret) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
246 ret = parse_bundled_config(bundled_name); |
1599
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
247 } |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
248 } |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
249 |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
250 return ret; |
1599
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
251 } |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
252 |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
253 static uint8_t app_config_in_config_dir; |
875
54ffba3768d6
Make menu stuff work on Android (theoretically)
Michael Pavone <pavone@retrodev.com>
parents:
866
diff
changeset
|
254 tern_node *load_config() |
859
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
255 { |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
256 tern_node *ret = load_overrideable_config("blastem.cfg", "default.cfg", &app_config_in_config_dir); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
257 |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
258 if (!ret) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
259 if (get_config_dir()) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
260 fatal_error("Failed to find a config file at %s or in the blastem executable directory\n", get_config_dir()); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
261 } else { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
262 fatal_error("Failed to find a config file in the BlastEm executable directory and the config directory path could not be determined\n"); |
859
46bb673eed4e
Load config file and rom.db from appropriate locations on Android
Michael Pavone <pavone@retrodev.com>
parents:
816
diff
changeset
|
263 } |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
264 } |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
265 return ret; |
430
7f84090ab1cd
Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
266 } |
1485
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
267 |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
268 void persist_config_at(tern_node *app_config, tern_node *to_save, char *fname) |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
269 { |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
270 char*use_exe_dir = tern_find_path_default(app_config, "ui\0config_in_exe_dir\0", (tern_val){.ptrval = "off"}, TVAL_PTR).ptrval; |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
271 char *confpath; |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
272 if (!strcmp(use_exe_dir, "on")) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
273 confpath = path_append(get_exe_dir(), fname); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
274 if (app_config == to_save && app_config_in_config_dir) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
275 //user switched to "portable" configs this session and there is an |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
276 //existing config file in the user-specific config directory |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
277 //delete it so we don't end up loading it next time |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
278 char *oldpath = path_append(get_config_dir(), fname); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
279 delete_file(oldpath); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
280 free(oldpath); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
281 } |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
282 } else { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
283 char const *confdir = get_config_dir(); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
284 if (!confdir) { |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
285 fatal_error("Failed to locate config file directory\n"); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
286 } |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
287 ensure_dir_exists(confdir); |
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
288 confpath = path_append(confdir, fname); |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
289 } |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
290 if (!serialize_config_file(to_save, confpath)) { |
1489
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
291 fatal_error("Failed to write config to %s\n", confpath); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
292 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
293 free(confpath); |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
294 } |
637fbc3b5063
Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents:
1485
diff
changeset
|
295 |
1599
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
296 void persist_config(tern_node *config) |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
297 { |
1852
a4cae960fd08
Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents:
1783
diff
changeset
|
298 persist_config_at(config, config, "blastem.cfg"); |
1599
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
299 } |
1fc61c844ec5
Allow selecting controller type when controllers have an SDL 2 mapping, but heuristics fail to idenify details
Michael Pavone <pavone@retrodev.com>
parents:
1593
diff
changeset
|
300 |
2018
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
301 void delete_custom_config_at(char *fname) |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
302 { |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
303 char *confpath = path_append(get_exe_dir(), fname); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
304 delete_file(confpath); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
305 free(confpath); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
306 confpath = path_append(get_config_dir(), fname); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
307 delete_file(confpath); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
308 free(confpath); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
309 } |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
310 |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
311 void delete_custom_config(void) |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
312 { |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
313 delete_custom_config_at("blastem.cfg"); |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
314 } |
193b804c9845
Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents:
1901
diff
changeset
|
315 |
1485
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
316 char **get_extension_list(tern_node *config, uint32_t *num_exts_out) |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
317 { |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
318 char *ext_filter = strdup(tern_find_path_default(config, "ui\0extensions\0", (tern_val){.ptrval = "bin gen md smd sms gg"}, TVAL_PTR).ptrval); |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
319 uint32_t num_exts = 0, ext_storage = 5; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
320 char **ext_list = malloc(sizeof(char *) * ext_storage); |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
321 char *cur_filter = ext_filter; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
322 while (*cur_filter) |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
323 { |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
324 if (num_exts == ext_storage) { |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
325 ext_storage *= 2; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
326 ext_list = realloc(ext_list, sizeof(char *) * ext_storage); |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
327 } |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
328 ext_list[num_exts++] = cur_filter; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
329 cur_filter = split_keyval(cur_filter); |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
330 } |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
331 *num_exts_out = num_exts; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
332 return ext_list; |
369da70ee2c2
Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents:
1140
diff
changeset
|
333 } |
1555
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
334 |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
335 #define DEFAULT_LOWPASS_CUTOFF 3390 |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
336 uint32_t get_lowpass_cutoff(tern_node *config) |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
337 { |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
338 char * lowpass_cutoff_str = tern_find_path(config, "audio\0lowpass_cutoff\0", TVAL_PTR).ptrval; |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
339 return lowpass_cutoff_str ? atoi(lowpass_cutoff_str) : DEFAULT_LOWPASS_CUTOFF; |
6ce36c3f250b
More audio refactoring in preparation for allowing proper sync to video with dynamic audio rate control
Michael Pavone <pavone@retrodev.com>
parents:
1544
diff
changeset
|
340 } |
1900
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
341 |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
342 tern_node *get_systems_config(void) |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
343 { |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
344 static tern_node *systems; |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
345 if (!systems) { |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
346 systems = parse_bundled_config("systems.cfg"); |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
347 } |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
348 return systems; |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
349 } |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
350 |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
351 tern_node *get_model(tern_node *config, system_type stype) |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
352 { |
1901
5433252329fb
Set version reg and TAS behavior based on model config
Michael Pavone <pavone@retrodev.com>
parents:
1900
diff
changeset
|
353 char *model = tern_find_path_default(config, "system\0model\0", (tern_val){.ptrval = "md1va3"}, TVAL_PTR).ptrval; |
1900
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
354 return tern_find_node(get_systems_config(), model); |
93960907807a
Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents:
1852
diff
changeset
|
355 } |