Browse Source

Remove need to specify lowercase char for alpha operators

master
cancel 6 years ago
parent
commit
c2b49cf4a4
  1. 120
      sim.c

120
sim.c

@ -220,25 +220,6 @@ Usz usz_clamp(Usz val, Usz min, Usz max) {
return val; 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 \ #define OPER_PHASE_COMMON_ARGS \
Glyph *const restrict gbuffer, Mark *const restrict mbuffer, \ Glyph *const restrict gbuffer, Mark *const restrict mbuffer, \
Usz const height, Usz const width, Usz const y, Usz const x, \ Usz const height, Usz const width, Usz const y, Usz const x, \
@ -334,44 +315,39 @@ Usz usz_clamp(Usz val, Usz min, Usz max) {
//////// Operators //////// Operators
#define ORCA_SOLO_OPERATORS(_) \ #define ORCA_UNIQUE_OPERATORS(_) \
_('!', keys) \ _('!', keys) \
_('#', comment) \ _('#', comment) \
_('*', bang) \ _('*', bang) \
_(':', midi) \ _(':', midi) \
_('=', osc) _('=', osc)
#define ORCA_DUAL_OPERATORS(_) \ #define ORCA_ALPHA_OPERATORS(_) \
_('A', 'a', add) \ _('A', add) \
_('B', 'b', banger) \ _('B', banger) \
_('C', 'c', clock) \ _('C', clock) \
_('D', 'd', delay) \ _('D', delay) \
_('F', 'f', if) \ _('E', movement) \
_('G', 'g', generator) \ _('F', if) \
_('H', 'h', halt) \ _('G', generator) \
_('I', 'i', increment) \ _('H', halt) \
_('J', 'j', jump) \ _('I', increment) \
_('K', 'k', kill) \ _('J', jump) \
_('L', 'l', loop) \ _('K', kill) \
_('M', 'm', modulo) \ _('L', loop) \
_('O', 'o', offset) \ _('M', modulo) \
_('P', 'p', push) \ _('N', movement) \
_('Q', 'q', query) \ _('O', offset) \
_('R', 'r', random) \ _('P', push) \
_('T', 't', track) \ _('Q', query) \
_('U', 'u', uturn) \ _('R', random) \
_('V', 'v', variable) \ _('S', movement) \
_('X', 'x', teleport) \ _('T', track) \
_('Z', 'z', zig) _('U', uturn) \
_('V', variable) \
#define ORCA_MOVEMENT_OPERATORS(_) \ _('W', movement) \
_('N', 'n', north, -1, 0) \ _('X', teleport) \
_('E', 'e', east, 0, 1) \ _('Z', zig)
_('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 \ #define MOVEMENT_CASES \
'N' : case 'n' : case 'E' : case 'e' : case 'S' : case 's' : case 'W' \ 'N' : case 'n' : case 'E' : case 'e' : case 'S' : case 's' : case 'W' \
@ -387,14 +363,22 @@ BEGIN_OPERATOR(movement)
Isz delta_y, delta_x; Isz delta_y, delta_x;
switch (glyph_lowered_unsafe(This_oper_char)) { switch (glyph_lowered_unsafe(This_oper_char)) {
#define EXPAND_MOV_CASE(_glyph_upper, _glyph_lower, _oper_name, _delta_y, \ case 'n':
_delta_x) \ delta_y = -1;
case _glyph_lower: \ delta_x = 0;
delta_y = _delta_y; \ break;
delta_x = _delta_x; \ 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; break;
ORCA_MOVEMENT_OPERATORS(EXPAND_MOV_CASE)
#undef ExPAND_MOV_CASE
default: default:
// could cause strict aliasing problem, maybe // could cause strict aliasing problem, maybe
delta_y = 0; delta_y = 0;
@ -1068,25 +1052,19 @@ END_OPERATOR
//////// Run simulation //////// Run simulation
#define SIM_EXPAND_SOLO_PHASE_0(_oper_char, _oper_name) \ #define SIM_EXPAND_UNIQUE(_oper_char, _oper_name) \
case _oper_char: \ case _oper_char: \
oper_behavior_##_oper_name(gbuf, mbuf, height, width, iy, ix, tick_number, \ oper_behavior_##_oper_name(gbuf, mbuf, height, width, iy, ix, tick_number, \
&extras, cell_flags, glyph_char); \ &extras, cell_flags, glyph_char); \
break; break;
#define SIM_EXPAND_DUAL_PHASE_0(_upper_oper_char, _lower_oper_char, \ #define SIM_EXPAND_ALPHA(_upper_oper_char, _oper_name) \
_oper_name) \
case _upper_oper_char: \ 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, \ oper_behavior_##_oper_name(gbuf, mbuf, height, width, iy, ix, tick_number, \
&extras, cell_flags, glyph_char); \ &extras, cell_flags, glyph_char); \
break; 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, void orca_run(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width,
Usz tick_number, Bank* bank, Oevent_list* oevent_list, Usz tick_number, Bank* bank, Oevent_list* oevent_list,
Piano_bits piano_bits) { Piano_bits piano_bits) {
@ -1111,12 +1089,8 @@ void orca_run(Gbuffer gbuf, Mbuffer mbuf, Usz height, Usz width,
continue; continue;
Mark cell_flags = mark_row[ix] & (Mark_flag_lock | Mark_flag_sleep); Mark cell_flags = mark_row[ix] & (Mark_flag_lock | Mark_flag_sleep);
switch (glyph_char) { switch (glyph_char) {
ORCA_SOLO_OPERATORS(SIM_EXPAND_SOLO_PHASE_0) ORCA_UNIQUE_OPERATORS(SIM_EXPAND_UNIQUE)
ORCA_DUAL_OPERATORS(SIM_EXPAND_DUAL_PHASE_0) ORCA_ALPHA_OPERATORS(SIM_EXPAND_ALPHA)
ORCA_MOVEMENT_OPERATORS(SIM_EXPAND_MOVM_PHASE_0)
oper_behavior_movement(gbuf, mbuf, height, width, iy, ix, tick_number,
&extras, cell_flags, glyph_char);
break; break;
} }
} }

Loading…
Cancel
Save