Skip to content

Commit d80ca55

Browse files
committed
define quirks and defaults once
1 parent 2a63597 commit d80ca55

File tree

2 files changed

+27
-25
lines changed

2 files changed

+27
-25
lines changed

shared/profiles.cc

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,14 @@ static struct { uint32_t key; struct profile value; } *profile_map = NULL;
1515
/* Track which path we loaded profiles.ini from */
1616
static char loaded_profiles_path[512] = "";
1717

18-
/* Quirk field descriptor table — single source of truth for INI keys */
18+
/* Quirk field descriptor table — generated from QUIRK_FIELDS X-macro in quirks.h */
1919
static const struct {
2020
const char *name;
2121
size_t offset;
2222
} quirk_fields[] = {
23-
{ "load_store_quirk", offsetof(struct quirks, load_store_quirk) },
24-
{ "shift_quirk", offsetof(struct quirks, shift_quirk) },
25-
{ "jump_quirk", offsetof(struct quirks, jump_quirk) },
26-
{ "logic_vf_quirk", offsetof(struct quirks, logic_vf_quirk) },
27-
{ "i_overflow_quirk", offsetof(struct quirks, i_overflow_quirk) },
28-
{ "draw_flag_quirk", offsetof(struct quirks, draw_flag_quirk) },
29-
{ "vwrap", offsetof(struct quirks, vwrap) },
30-
{ "hwrap", offsetof(struct quirks, hwrap) },
23+
#define QUIRK_X_ENTRY(name, default_val) { #name, offsetof(struct quirks, name) },
24+
QUIRK_FIELDS(QUIRK_X_ENTRY)
25+
#undef QUIRK_X_ENTRY
3126
};
3227
#define NUM_QUIRK_FIELDS (sizeof(quirk_fields) / sizeof(quirk_fields[0]))
3328

shared/quirks.h

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
11
#ifndef QUIRKS_H
22
#define QUIRKS_H
33

4+
/*
5+
* X-macro list of all quirk fields.
6+
* Format: X(field_name, default_value)
7+
* This is the single source of truth — the struct, defaults,
8+
* and INI field table are all generated from this list.
9+
*/
10+
#define QUIRK_FIELDS(X) \
11+
X(load_store_quirk, 1) \
12+
X(shift_quirk, 1) \
13+
X(jump_quirk, 0) \
14+
X(logic_vf_quirk, 0) \
15+
X(i_overflow_quirk, 0) \
16+
X(draw_flag_quirk, 0) \
17+
X(vwrap, 1) \
18+
X(hwrap, 0)
19+
20+
421
struct quirks {
5-
bool load_store_quirk;
6-
bool shift_quirk;
7-
bool jump_quirk; /* BNNN: use VX instead of V0 for offset */
8-
bool logic_vf_quirk; /* 8XY1/2/3: set VF=0 */
9-
bool i_overflow_quirk; /* I+VX overflow sets VF (FX1E quirk) */
10-
bool draw_flag_quirk; /* draw_flag reset behavior */
11-
bool vwrap; /* vertical wrapping */
12-
bool hwrap; /* horizontal wrapping */
22+
#define QUIRK_X_FIELD(name, default_val) bool name;
23+
QUIRK_FIELDS(QUIRK_X_FIELD)
24+
#undef QUIRK_X_FIELD
1325
};
1426

1527
/* Get default quirks */
1628
static inline struct quirks quirks_get_defaults(void) {
1729
struct quirks defaults;
18-
defaults.load_store_quirk = 1;
19-
defaults.shift_quirk = 1;
20-
defaults.jump_quirk = 0;
21-
defaults.logic_vf_quirk = 0;
22-
defaults.i_overflow_quirk = 0;
23-
defaults.draw_flag_quirk = 0;
24-
defaults.vwrap = 1;
25-
defaults.hwrap = 0;
30+
#define QUIRK_X_DEFAULT(name, default_val) defaults.name = default_val;
31+
QUIRK_FIELDS(QUIRK_X_DEFAULT)
32+
#undef QUIRK_X_DEFAULT
2633
return defaults;
2734
}
2835

0 commit comments

Comments
 (0)