Adding needs, fixing include to be more like gforth.

This commit is contained in:
Brad Nelson
2022-04-23 23:52:12 -07:00
parent 54d745e798
commit 35a02bc61c
4 changed files with 77 additions and 19 deletions

View File

@ -13,13 +13,68 @@
\ limitations under the License.
( Including Files )
: included ( a n -- )
r/o open-file dup if nip throw else drop then
internals definitions
: dirname ( a n -- )
begin dup while
2dup 1- + c@ [char] / = if exit then 1-
repeat ;
0 value sourcefilename&
0 value sourcefilename#
: sourcefilename ( -- a n ) sourcefilename& sourcefilename# ;
: sourcefilename! ( a n -- ) to sourcefilename# to sourcefilename& ;
: sourcedirname ( -- a n ) sourcefilename dirname ;
: include-file ( fh -- )
dup file-size throw
dup allocate throw
swap 2dup >r >r
rot dup >r read-file throw drop
r> close-file throw
r> r> over >r evaluate
swap over >r
rot read-file throw
r@ swap evaluate
r> free throw ;
: include ( "name" -- ) bl parse included ;
: raw-included ( a n -- )
r/o open-file throw
dup >r include-file
r> close-file throw ;
0 value included-files
: path-join { a a# b b# -- a n }
a# b# + { r# } r# cell+ cell+ allocate throw { r }
2 cells +to r
b c@ [char] / = if 0 to a# then
a r a# cmove b r a# + b# cmove
r# r cell - !
r r# ;
: include+ 2 cells - { a }
included-files a ! a to included-files ;
forth definitions internals
: included ( a n -- )
sourcefilename >r >r
>r >r sourcedirname r> r> path-join 2dup sourcefilename!
['] raw-included catch
dup if ." Error including: " sourcefilename type cr then
sourcefilename& include+
r> r> sourcefilename!
throw ;
: include ( "name" -- ) bl parse included ;
: included? { a n -- f }
sourcedirname a n path-join to n to a
included-files begin dup while
dup cell+ cell+ over cell+ @ a n str= if
a 2 cells - free throw drop -1 exit
then @
repeat
a 2 cells - free throw ;
: required ( a n -- ) 2dup included? if 2drop else included then ;
: needs ( "name" -- ) bl parse required ;
forth