Skip to content
Permalink
Browse files

Added R, R.MIN, and R.MAX for random numbers

  • Loading branch information
burnsauce committed Nov 16, 2017
1 parent f16a78d commit c9308886166089a70efefec0e26f9faa5d30b6be
Showing with 64 additions and 1 deletion.
  1. +3 −0 src/match_token.rl
  2. +50 −0 src/ops/maths.c
  3. +3 −0 src/ops/maths.h
  4. +1 −1 src/ops/op.c
  5. +3 −0 src/ops/op_enum.h
  6. +2 −0 src/state.c
  7. +2 −0 src/state.h
@@ -148,6 +148,9 @@
"MOD" => { MATCH_OP(E_OP_MOD); };
"RAND" => { MATCH_OP(E_OP_RAND); };
"RRAND" => { MATCH_OP(E_OP_RRAND); };
"R" => { MATCH_OP(E_OP_R); };
"R.MIN" => { MATCH_OP(E_OP_R_MIN); };
"R.MAX" => { MATCH_OP(E_OP_R_MAX); };
"TOSS" => { MATCH_OP(E_OP_TOSS); };
"MIN" => { MATCH_OP(E_OP_MIN); };
"MAX" => { MATCH_OP(E_OP_MAX); };
@@ -21,6 +21,16 @@ static void op_RAND_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_RRAND_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_R_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_R_MIN_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_R_MIN_set(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_R_MAX_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_R_MAX_set(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_TOSS_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_MIN_get(const void *data, scene_state_t *ss, exec_state_t *es,
@@ -112,6 +122,9 @@ const tele_op_t op_DIV = MAKE_GET_OP(DIV , op_DIV_get , 2, true);
const tele_op_t op_MOD = MAKE_GET_OP(MOD , op_MOD_get , 2, true);
const tele_op_t op_RAND = MAKE_GET_OP(RAND , op_RAND_get , 1, true);
const tele_op_t op_RRAND = MAKE_GET_OP(RRAND , op_RRAND_get , 2, true);
const tele_op_t op_R = MAKE_GET_OP(R , op_R_get , 0, true);
const tele_op_t op_R_MIN = MAKE_GET_SET_OP(R.MIN, op_R_MIN_get, op_R_MIN_set, 0, true);
const tele_op_t op_R_MAX = MAKE_GET_SET_OP(R.MAX, op_R_MAX_get, op_R_MAX_set, 0, true);
const tele_op_t op_TOSS = MAKE_GET_OP(TOSS , op_TOSS_get , 0, true);
const tele_op_t op_MIN = MAKE_GET_OP(MIN , op_MIN_get , 2, true);
const tele_op_t op_MAX = MAKE_GET_OP(MAX , op_MAX_get , 2, true);
@@ -236,6 +249,43 @@ static void op_RRAND_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
cs_push(cs, rand() % range + min);
}


static void op_R_get(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
int16_t min = ss->variables.r_min;
int16_t max = ss->variables.r_max;
if (max < min) {
int16_t temp = min;
min = max;
max = temp;
}
int16_t range = max - min + 1;
if (range == 0)
cs_push(cs, min);
else
cs_push(cs, rand() % range + min);
}

static void op_R_MIN_get(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
cs_push(cs, ss->variables.r_min);
}

static void op_R_MIN_set(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
ss->variables.r_min = cs_pop(cs);
}

static void op_R_MAX_get(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
cs_push(cs, ss->variables.r_max);
}

static void op_R_MAX_set(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
ss->variables.r_max = cs_pop(cs);
}

static void op_TOSS_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
cs_push(cs, rand() & 1);
@@ -10,6 +10,9 @@ extern const tele_op_t op_DIV;
extern const tele_op_t op_MOD;
extern const tele_op_t op_RAND;
extern const tele_op_t op_RRAND;
extern const tele_op_t op_R;
extern const tele_op_t op_R_MIN;
extern const tele_op_t op_R_MAX;
extern const tele_op_t op_TOSS;
extern const tele_op_t op_MIN;
extern const tele_op_t op_MAX;
@@ -68,7 +68,7 @@ const tele_op_t *tele_ops[E_OP__LENGTH] = {
&op_MUTE, &op_STATE,

// maths
&op_ADD, &op_SUB, &op_MUL, &op_DIV, &op_MOD, &op_RAND, &op_RRAND, &op_TOSS,
&op_ADD, &op_SUB, &op_MUL, &op_DIV, &op_MOD, &op_RAND, &op_RRAND, &op_R, &op_R_MIN, &op_R_MAX, &op_TOSS,
&op_MIN, &op_MAX, &op_LIM, &op_WRAP, &op_QT, &op_AVG, &op_EQ, &op_NE,
&op_LT, &op_GT, &op_LTE, &op_GTE, &op_NZ, &op_EZ, &op_RSH, &op_LSH, &op_EXP,
&op_ABS, &op_AND, &op_OR, &op_JI, &op_SCALE, &op_N, &op_V, &op_VV, &op_ER,
@@ -121,6 +121,9 @@ typedef enum {
E_OP_MOD,
E_OP_RAND,
E_OP_RRAND,
E_OP_R,
E_OP_R_MIN,
E_OP_R_MAX,
E_OP_TOSS,
E_OP_MIN,
E_OP_MAX,
@@ -36,6 +36,8 @@ void ss_variables_init(scene_state_t *ss) {
.o_max = 63,
.o_wrap = 1,
.q_n = 1,
.r_min = 0,
.r_max = 16383,
.time_act = 1,
.tr_pol = { 1, 1, 1, 1 },
.tr_time = { 100, 100, 100, 100 },
@@ -65,6 +65,8 @@ typedef struct {
int16_t param;
int16_t q[Q_LENGTH];
int16_t q_n;
int16_t r_min;
int16_t r_max;
int16_t scene;
int16_t time;
int16_t time_act;

0 comments on commit c930888

Please sign in to comment.