annotate config.c @ 2235:93918a6a8ab7

Initial support for Sega multi-tap
author Michael Pavone <pavone@retrodev.com>
date Tue, 13 Sep 2022 20:08:26 -0700
parents ee6d30c56eeb
children 0a107b2d5837
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1693
diff changeset
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
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1693
diff changeset
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
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1693
diff changeset
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
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1693
diff changeset
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++;
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
143
1489
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
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1693
diff changeset
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 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
242
1852
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
2158
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
253 static tern_node *dupe_tree(tern_node *head)
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
254 {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
255 if (!head) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
256 return head;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
257 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
258 tern_node *out = calloc(1, sizeof(tern_node));
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
259 out->left = dupe_tree(head->left);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
260 out->right = dupe_tree(head->right);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
261 out->el = head->el;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
262 out->valtype = head->valtype;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
263 if (out->el) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
264 out->straight.next = dupe_tree(head->straight.next);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
265 } else if (out->valtype == TVAL_NODE) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
266 out->straight.value.ptrval = dupe_tree(head->straight.value.ptrval);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
267 } else if (out->valtype == TVAL_PTR) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
268 out->straight.value.ptrval = strdup(head->straight.value.ptrval);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
269 } else {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
270 out->straight.value = head->straight.value;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
271 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
272 return out;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
273 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
274
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
275 static void migrate_pads(char *key, tern_val val, uint8_t valtype, void *data)
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
276 {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
277 tern_node **pads = data;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
278 if (valtype != TVAL_NODE) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
279 return;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
280 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
281 tern_node *existing = tern_find_node(*pads, key);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
282 if (existing) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
283 return;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
284 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
285 *pads = tern_insert_node(*pads, key, dupe_tree(val.ptrval));
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
286 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
287
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
288 #define CONFIG_VERSION 4
2158
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
289 static tern_node *migrate_config(tern_node *config, int from_version)
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
290 {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
291 tern_node *def_config = parse_bundled_config("default.cfg");
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
292 switch(from_version)
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
293 {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
294 case 0: {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
295 //Add CD image formats to ui.extensions
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
296 uint32_t num_exts;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
297 char **ext_list = get_extension_list(config, &num_exts);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
298 char *old = num_exts ? ext_list[0] : NULL;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
299 uint32_t new_size = num_exts + 2;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
300 uint8_t need_cue = 1, need_iso = 1;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
301 for (uint32_t i = 0; i < num_exts; i++)
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
302 {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
303 if (!strcmp(ext_list[i], "cue")) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
304 need_cue = 0;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
305 new_size--;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
306 } else if (!strcmp(ext_list[i], "iso")) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
307 need_iso = 0;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
308 new_size--;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
309 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
310 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
311 if (new_size != num_exts) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
312 ext_list = realloc(ext_list, sizeof(char*) * new_size);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
313 if (need_cue) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
314 ext_list[num_exts++] = "cue";
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
315 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
316 if (need_iso) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
317 ext_list[num_exts++] = "iso";
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
318 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
319 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
320 char *combined = alloc_join(new_size, (char const **)ext_list, ' ');
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
321 config = tern_insert_path(config, "ui\0extensions\0", (tern_val){.ptrval = combined}, TVAL_PTR);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
322 //Copy default pad configs if missing
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
323 tern_node *pads = tern_find_path(config, "bindings\0pads\0", TVAL_NODE).ptrval;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
324 tern_node *def_pads = tern_find_path(def_config, "bindings\0pads\0", TVAL_NODE).ptrval;
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
325 tern_foreach(def_pads, migrate_pads, &pads);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
326 config = tern_insert_path(config, "bindings\0pads\0", (tern_val){.ptrval = pads}, TVAL_NODE);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
327 }
2162
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
328 case 1: {
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
329 char *l_bind = tern_find_path(config, "bindings\0keys\0l\0", TVAL_PTR).ptrval;
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
330 if (!l_bind) {
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
331 config = tern_insert_path(config, "bindings\0keys\0l\0", (tern_val){.ptrval = strdup("ui.load_state")}, TVAL_PTR);
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
332 }
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
333 }
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
334 case 2: {
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
335 tern_node *sms = tern_find_node(config, "sms");
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
336 char *model = tern_find_path_default(sms, "system\0model\0", (tern_val){.ptrval = "md1va3"}, TVAL_PTR).ptrval;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
337 char *io1 = tern_find_path_default(sms, "io\0devices\0""1\0", (tern_val){.ptrval = "gamepad2.1"}, TVAL_PTR).ptrval;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
338 char *io2 = tern_find_path_default(sms, "io\0devices\0""1\0", (tern_val){.ptrval = "gamepad2.2"}, TVAL_PTR).ptrval;
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
339 sms = tern_insert_path(sms, "system\0model\0", (tern_val){.ptrval = strdup(model)}, TVAL_PTR);
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
340 sms = tern_insert_path(sms, "io\0devices\0""1\0", (tern_val){.ptrval = strdup(io1)}, TVAL_PTR);
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
341 sms = tern_insert_path(sms, "io\0devices\0""2\0", (tern_val){.ptrval = strdup(io2)}, TVAL_PTR);
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
342 config = tern_insert_node(config, "sms", sms);
2162
1270fe86eb89 Add Quick Load binding
Michael Pavone <pavone@retrodev.com>
parents: 2158
diff changeset
343 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
344 case 3: {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
345 char *tap11 = tern_find_path_default(config, "io\0sega_multitap.1\0""1\0", (tern_val){.ptrval = "gamepad6.2"}, TVAL_PTR).ptrval;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
346 char *tap12 = tern_find_path_default(config, "io\0sega_multitap.1\0""2\0", (tern_val){.ptrval = "gamepad6.3"}, TVAL_PTR).ptrval;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
347 char *tap13 = tern_find_path_default(config, "io\0sega_multitap.1\0""3\0", (tern_val){.ptrval = "gamepad6.4"}, TVAL_PTR).ptrval;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
348 char *tap14 = tern_find_path_default(config, "io\0sega_multitap.1\0""4\0", (tern_val){.ptrval = "gamepad6.5"}, TVAL_PTR).ptrval;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
349 config = tern_insert_path(config, "io\0sega_multitap.1\0""1\0", (tern_val){.ptrval = strdup(tap11)}, TVAL_PTR);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
350 config = tern_insert_path(config, "io\0sega_multitap.1\0""2\0", (tern_val){.ptrval = strdup(tap12)}, TVAL_PTR);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
351 config = tern_insert_path(config, "io\0sega_multitap.1\0""3\0", (tern_val){.ptrval = strdup(tap13)}, TVAL_PTR);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
352 config = tern_insert_path(config, "io\0sega_multitap.1\0""4\0", (tern_val){.ptrval = strdup(tap14)}, TVAL_PTR);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2202
diff changeset
353 }
2158
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
354 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
355 char buffer[16];
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
356 sprintf(buffer, "%d", CONFIG_VERSION);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
357 return tern_insert_ptr(config, "version", strdup(buffer));
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
358 }
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
359
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
360 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
361 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
362 {
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
363 tern_node *ret = load_overrideable_config("blastem.cfg", "default.cfg", &app_config_in_config_dir);
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
364
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
365 if (!ret) {
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
366 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
367 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
368 } else {
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
369 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
370 }
430
7f84090ab1cd Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
371 }
2158
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
372 int config_version = atoi(tern_find_ptr_default(ret, "version", "0"));
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
373 if (config_version < CONFIG_VERSION) {
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
374 migrate_config(ret, config_version);
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
375 }
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
376 return ret;
430
7f84090ab1cd Add config file parser and default config file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
377 }
1485
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
378
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
379 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
380 {
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
381 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
382 char *confpath;
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
383 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
384 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
385 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
386 //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
387 //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
388 //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
389 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
390 delete_file(oldpath);
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
391 free(oldpath);
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
392 }
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
393 } else {
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
394 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
395 if (!confdir) {
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
396 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
397 }
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
398 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
399 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
400 }
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
401 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
402 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
403 }
637fbc3b5063 Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents: 1485
diff changeset
404 free(confpath);
637fbc3b5063 Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents: 1485
diff changeset
405 }
637fbc3b5063 Added code to persist config back to a file
Michael Pavone <pavone@retrodev.com>
parents: 1485
diff changeset
406
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
407 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
408 {
1852
a4cae960fd08 Allow config file to be saved with executable for "portable" setups
Michael Pavone <pavone@retrodev.com>
parents: 1783
diff changeset
409 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
410 }
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
411
2018
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
412 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
413 {
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
414 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
415 delete_file(confpath);
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
416 free(confpath);
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
417 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
418 delete_file(confpath);
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
419 free(confpath);
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
420 }
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
421
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
422 void delete_custom_config(void)
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
423 {
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
424 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
425 }
193b804c9845 Add a UI button to reset config to defaults
Michael Pavone <pavone@retrodev.com>
parents: 1901
diff changeset
426
1485
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
427 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
428 {
2158
bdd83b47d78a Implement config file migrations and add iso and cue to extension list
Michael Pavone <pavone@retrodev.com>
parents: 2018
diff changeset
429 char *ext_filter = strdup(tern_find_path_default(config, "ui\0extensions\0", (tern_val){.ptrval = "bin gen md smd sms gg cue iso"}, TVAL_PTR).ptrval);
1485
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
430 uint32_t num_exts = 0, ext_storage = 5;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
431 char **ext_list = malloc(sizeof(char *) * ext_storage);
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
432 char *cur_filter = ext_filter;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
433 while (*cur_filter)
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
434 {
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
435 if (num_exts == ext_storage) {
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
436 ext_storage *= 2;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
437 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
438 }
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
439 ext_list[num_exts++] = cur_filter;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
440 cur_filter = split_keyval(cur_filter);
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
441 }
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
442 *num_exts_out = num_exts;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
443 return ext_list;
369da70ee2c2 Filter file list in Nuklear UI
Michael Pavone <pavone@retrodev.com>
parents: 1140
diff changeset
444 }
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
445
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
446 #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
447 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
448 {
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
449 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
450 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
451 }
1900
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
452
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
453 tern_node *get_systems_config(void)
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
454 {
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
455 static tern_node *systems;
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
456 if (!systems) {
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
457 systems = parse_bundled_config("systems.cfg");
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
458 }
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
459 return systems;
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
460 }
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
461
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
462 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
463 {
2202
ee6d30c56eeb Add separate model/IO selection settings for SMS/GG
Michael Pavone <pavone@retrodev.com>
parents: 2162
diff changeset
464 char *model = tern_find_path_default(config, stype == SYSTEM_SMS ? "sms\0system\0model\0" : "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
465 return tern_find_node(get_systems_config(), model);
93960907807a Added UI for selecting configured model
Michael Pavone <pavone@retrodev.com>
parents: 1852
diff changeset
466 }