From 94ad9986cb2935bfd3466bd58ec01e61fa290cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sun, 21 Nov 2021 14:12:35 +0100 Subject: [PATCH] WIP within --- src/fh_builtins_arith.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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 */ } };