summaryrefslogtreecommitdiff
path: root/jefs.fs
diff options
context:
space:
mode:
Diffstat (limited to 'jefs.fs')
-rw-r--r--jefs.fs20
1 files changed, 18 insertions, 2 deletions
diff --git a/jefs.fs b/jefs.fs
index 9132f15..458d324 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -157,6 +157,10 @@ decimal
: rover [ r13 pop, r12 pop, r10 pop, r10 push, r12 push, r10 push, r13 push, ] ;
: rswap [ r13 pop, r12 pop, r10 pop, r12 push, r10 push, r13 push, ] ;
+\ ans ref impl
+: 2swap rot >r rot r> ;
+: 2over >r >r 2dup r> r> 2swap ;
+
: exit ret, ; immediate
\ \ DO LOOP {{{
@@ -388,8 +392,20 @@ make line-buffer line-buffer-length allot
: argv ( n -- a u ) 1+ cells rs0 @ + @ dup strlen ; \ segfaults if n>=argc
: environ argc 2 + cells rs0 @ + ;
-: ->= ( zstr -- a u ) dup begin dup c@ [ char = ] literal <> while 1+ repeat dup >r swap - r> swap ; \ i dont think the stack wrngling at the end is right
-: (env) ( envptr -- name-a name-u val-a val-u ) ;
+: env-name ( envptr -- a u )
+ dup begin dup c@ [ char = ] literal <> while 1+ repeat
+ 2dup swap - nip ;
+: (env) ( envptr -- val-a val-u name-a name-u )
+ dup begin dup c@ [ char = ] literal <> while 1+ repeat
+ ( name length ) 2dup swap - rot swap
+ ( value length ) >r >r 1+ dup strlen r> r> ; \ +1 to go past '='
+: env. environ begin dup @ 0<> while
+ dup @ (env) type ." =" type cr cell+ repeat ;
+
+: env ( a u -- a? u|0 ) environ begin dup @ 0<> while
+ dup >r @ env-name 2over s=
+ if 2drop r> @ (env) 2drop exit then
+ cr r> cell+ repeat ;
\ }}}
\ TERMINAL CONTROL {{{