From 0a625a8852bbcc1f1636c2c59e928552c33ad47d Mon Sep 17 00:00:00 2001 From: kitty Date: Fri, 13 Mar 2026 16:30:22 +1100 Subject: 2swap, 2over, env --- jefs.fs | 20 ++++++++++++++++++-- 1 file 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 {{{ -- cgit v1.2.3