ref: c2b49cf4a44111c4f554e3bb1443c66c5526ea11
parent: fc5f354c10d966d56eaf8f3d0ff07f3cc0db6db6
author: cancel <cancel@cancel.fm>
date: Sat Dec 29 12:46:28 EST 2018
Remove need to specify lowercase char for alpha operators
--- a/sim.c
+++ b/sim.c
@@ -220,25 +220,6 @@
return val;
}
-#define ORCA_EXPAND_SOLO_OPER_CHARS(_oper_char, _oper_name) \
- Orca_oper_char_##_oper_name = _oper_char,
-#define ORCA_EXPAND_DUAL_OPER_CHARS(_upper_oper_char, _lower_oper_char, \
- _oper_name) \
- Orca_oper_upper_char_##_oper_name = _upper_oper_char, \
- Orca_oper_lower_char_##_oper_name = _lower_oper_char,
-#define ORCA_EXPAND_MOVM_OPER_CHARS(_upper_oper_char, _lower_oper_char, \
- _oper_name, _delta_y, _delta_x) \
- Orca_oper_upper_char_##_oper_name = _upper_oper_char, \
- Orca_oper_lower_char_##_oper_name = _lower_oper_char,
-#define ORCA_DEFINE_OPER_CHARS(_solo_defs, _dual_defs, _movm_defs) \
- enum Orca_oper_chars { \- _solo_defs(ORCA_EXPAND_SOLO_OPER_CHARS) \
- _dual_defs(ORCA_EXPAND_DUAL_OPER_CHARS) \
- _movm_defs(ORCA_EXPAND_MOVM_OPER_CHARS) \
- };
-#define ORCA_DECLARE_OPERATORS(_solo_defs, _dual_defs, _movm_defs) \
- ORCA_DEFINE_OPER_CHARS(_solo_defs, _dual_defs, _movm_defs)
-
#define OPER_PHASE_COMMON_ARGS \
Glyph *const restrict gbuffer, Mark *const restrict mbuffer, \
Usz const height, Usz const width, Usz const y, Usz const x, \
@@ -334,7 +315,7 @@
//////// Operators
-#define ORCA_SOLO_OPERATORS(_) \
+#define ORCA_UNIQUE_OPERATORS(_) \
_('!', keys) \ _('#', comment) \ _('*', bang) \@@ -341,38 +322,33 @@
_(':', midi) \ _('=', osc)-#define ORCA_DUAL_OPERATORS(_) \
- _('A', 'a', add) \- _('B', 'b', banger) \- _('C', 'c', clock) \- _('D', 'd', delay) \- _('F', 'f', if) \- _('G', 'g', generator) \- _('H', 'h', halt) \- _('I', 'i', increment) \- _('J', 'j', jump) \- _('K', 'k', kill) \- _('L', 'l', loop) \- _('M', 'm', modulo) \- _('O', 'o', offset) \- _('P', 'p', push) \- _('Q', 'q', query) \- _('R', 'r', random) \- _('T', 't', track) \- _('U', 'u', uturn) \- _('V', 'v', variable) \- _('X', 'x', teleport) \- _('Z', 'z', zig)+#define ORCA_ALPHA_OPERATORS(_) \
+ _('A', add) \+ _('B', banger) \+ _('C', clock) \+ _('D', delay) \+ _('E', movement) \+ _('F', if) \+ _('G', generator) \+ _('H', halt) \+ _('I', increment) \+ _('J', jump) \+ _('K', kill) \+ _('L', loop) \+ _('M', modulo) \+ _('N', movement) \+ _('O', offset) \+ _('P', push) \+ _('Q', query) \+ _('R', random) \+ _('S', movement) \+ _('T', track) \+ _('U', uturn) \+ _('V', variable) \+ _('W', movement) \+ _('X', teleport) \+ _('Z', zig)-#define ORCA_MOVEMENT_OPERATORS(_) \
- _('N', 'n', north, -1, 0) \- _('E', 'e', east, 0, 1) \- _('S', 's', south, 1, 0) \- _('W', 'w', west, 0, -1)-
-ORCA_DECLARE_OPERATORS(ORCA_SOLO_OPERATORS, ORCA_DUAL_OPERATORS,
- ORCA_MOVEMENT_OPERATORS)
-
#define MOVEMENT_CASES \
'N' : case 'n' : case 'E' : case 'e' : case 'S' : case 's' : case 'W' \
: case 'w'
@@ -387,14 +363,22 @@
Isz delta_y, delta_x;
switch (glyph_lowered_unsafe(This_oper_char)) {-#define EXPAND_MOV_CASE(_glyph_upper, _glyph_lower, _oper_name, _delta_y, \
- _delta_x) \
- case _glyph_lower: \
- delta_y = _delta_y; \
- delta_x = _delta_x; \
+ case 'n':
+ delta_y = -1;
+ delta_x = 0;
break;
- ORCA_MOVEMENT_OPERATORS(EXPAND_MOV_CASE)
-#undef ExPAND_MOV_CASE
+ case 'e':
+ delta_y = 0;
+ delta_x = 1;
+ break;
+ case 's':
+ delta_y = 1;
+ delta_x = 0;
+ break;
+ case 'w':
+ delta_y = 0;
+ delta_x = -1;
+ break;
default:
// could cause strict aliasing problem, maybe
delta_y = 0;
@@ -1068,25 +1052,19 @@
//////// Run simulation
-#define SIM_EXPAND_SOLO_PHASE_0(_oper_char, _oper_name) \
+#define SIM_EXPAND_UNIQUE(_oper_char, _oper_name) \
case _oper_char: \
oper_behavior_##_oper_name(gbuf, mbuf, height, width, iy, ix, tick_number, \
&extras, cell_flags, glyph_char); \
break;
-#define SIM_EXPAND_DUAL_PHASE_0(_upper_oper_char, _lower_oper_char, \
- _oper_name) \
+#define SIM_EXPAND_ALPHA(_upper_oper_char, _oper_name) \
case _upper_oper_char: \
- case _lower_oper_char: \
+ case ((char)(_upper_oper_char | (1 << 5))): \
oper_behavior_##_oper_name(gbuf, mbuf, height, width, iy, ix, tick_number, \
&extras, cell_flags, glyph_char); \
break;
-#define SIM_EXPAND_MOVM_PHASE_0(_upper_oper_char, _lower_oper_char, \
- _oper_name, _delta_y, _delta_x) \
- case _upper_oper_char: \
- case _lower_oper_char:
-
void orca_run(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width,
Usz tick_number, Bank* bank, Oevent_list* oevent_list,
Piano_bits piano_bits) {@@ -1111,12 +1089,8 @@
continue;
Mark cell_flags = mark_row[ix] & (Mark_flag_lock | Mark_flag_sleep);
switch (glyph_char) {- ORCA_SOLO_OPERATORS(SIM_EXPAND_SOLO_PHASE_0)
- ORCA_DUAL_OPERATORS(SIM_EXPAND_DUAL_PHASE_0)
-
- ORCA_MOVEMENT_OPERATORS(SIM_EXPAND_MOVM_PHASE_0)
- oper_behavior_movement(gbuf, mbuf, height, width, iy, ix, tick_number,
- &extras, cell_flags, glyph_char);
+ ORCA_UNIQUE_OPERATORS(SIM_EXPAND_UNIQUE)
+ ORCA_ALPHA_OPERATORS(SIM_EXPAND_ALPHA)
break;
}
}
--
⑨