CoreForth-0

common/core.ft.md


variable base

: -rot          rot rot ;
: 2drop         drop drop ;

: 2c@           c@ swap c@ swap ;
: +!            dup @ rot + swap ! ;
: -!            dup @ rot - swap ! ;


: /             /mod nip ;
: umod          u/mod drop ;
: mod           /mod drop ;
: >             swap < ;
: u>            swap u< ;
: <>            = invert ;
: <=            > invert ;
: >=            < invert ;
: within        over - >r - r> u< ;

: s>d           dup 0< ;
: d>s           drop ;

: umin          2dup u> if swap then drop ;
: umax          2dup u< if swap then drop ;
: min           2dup > if swap then drop ;
: max           2dup < if swap then drop ;
: bounds        over + swap ;

: 2@            dup cell+ @ swap @ ;
: 2!            swap over ! cell+ ! ;
: i!            2dup h! swap #16 rshift swap 2+ h! ;

: 2over         >r >r 2dup r> r> 2swap ;

: uppercase     dup $61 $7B within $20 and xor ;
: /string       rot over + -rot - ;
: 1/string      1- swap 1+ swap ;
: count         dup 1+ swap c@ ;
: ci@=          c@ uppercase swap c@ uppercase = ;
: cappend       1 over +! dup c@ + c! ;
: digit?        dup $39 > $80 2*  and +
                dup $A0 2* > $83 2* 1+ and -
                $30 - dup base @ u< ;
: separator?    $27 = ;

: fill          swap >r swap begin r@ 0>
                  while 2dup c! 1+ r> 1- >r
                repeat
                rdrop 2drop ;
: cmove         >r begin r@ 0> while
                  over c@ over c! 1+ swap 1+ swap
                  r> 1- >r
                repeat rdrop 2drop ;
: cmove>        >r swap r@ + swap r@ + begin r@ 0> while
                  swap 1- swap 1- over c@ over c!
                  r> 1- >r
                repeat rdrop 2drop ;
: hmove         >r begin r@ 0> while
                  over h@ over h! 2+ swap 2+ swap
                  r> 2- >r
                repeat rdrop 2drop ;
: wmove          >r begin r@ 0> while
                  over @ over ! cell+ swap cell+ swap
                  r> cell- >r
                repeat rdrop 2drop ;

: move          >r 2dup $3 and swap $3 and r@ $3 and or or
                0= if r> wmove exit then
                2dup $1 and swap $1 and r@ $1 and or or
                0= if r> hmove exit then
                2dup < if r> cmove> else r> cmove then ;

: binary        #2 base ! ;
: octal         #8 base ! ;
: decimal       #10 base ! ;
: hex           #16 base ! ;

variable (source-id)
variable (sink-id)
: source-id     (source-id) @ ;
: sink-id       (sink-id) @ ;

: @cell+        ( a -- a' n ) dup cell+ swap @ ;
: depth         s0 sp@ - /cell 1- ;

: (do)          swap r> -rot >r >r >r ;
: i             rp@ cell+ @ ;
: j             rp@ 3 cells + @ ;
: unloop        r> rdrop rdrop >r ;
: (loop)        r> r> 1+ dup r@ =
                if drop rdrop true else >r false then
                swap >r ;
: (+loop)       r> r> rot tuck + swap 0> if dup r@ 1- > else dup r@ < then
                if drop rdrop true else >r false then
                swap >r ;
: leave         unloop rdrop ;