diff --git a/src/fh_builtins_arith.c b/src/fh_builtins_arith.c index da04faf..c068ef5 100644 --- a/src/fh_builtins_arith.c +++ b/src/fh_builtins_arith.c @@ -185,6 +185,31 @@ static enum fh_error w_greater(struct fh_thread_s *fh, const struct fh_word_s *w return FH_OK; } +static enum fh_error w_within(struct fh_thread_s *fh, const struct fh_word_s *w) +{ + (void) w; + enum fh_error rv; + uint32_t test, low, high; + TRY(ds_pop(fh, &high)); + TRY(ds_pop(fh, &low)); + TRY(ds_pop(fh, &test)); + + // This should work, according to the spec: + // : WITHIN ( test low high -- flag ) OVER - >R - R> U< ; + + // t l h | OVER + // t l h l | - + // t l (h-l) | >r + // t l | R:(h-l) | - + // (t-l) | R:(h-l) | R> + // (t-l) (h-l) | U< + // =within + + bool within = 0; // TODO + + TRY(ds_push(fh, TOBOOL(within))); + return FH_OK; +} static enum fh_error w_u_less(struct fh_thread_s *fh, const struct fh_word_s *w) { @@ -582,5 +607,6 @@ const struct name_and_handler fh_builtins_arith[] = { {"fm/mod", w_fm_mod, 0, 0}, {"sm/rem", w_sm_rem, 0, 0}, {"um/mod", w_um_mod, 0, 0}, + {"within", w_within, 0, 0}, { /* end marker */ } };