\ implementation of EXECUTE-PARSING
\ This file is in the public domain. NO WARRANTY.
\ execute-parsing ( ... c-addr u xt - ... )
\
\ Make c-addr u the current input source, execute xt ( ... -- ... ),
\ then restore the previous input source.
\
\ This word is used like this:
\
\ s" test" ' create execute-parsing
\
\ and this would be equivalent to
\
\ create test
\
\ It can be used to provide the input-stream input of a parsing word
\ without consuming the input stream of the calling word.
\ this implementation copies the string to be parsed elsewhere (while
\ EVALUATE is required to work in-place)
\ The program uses the following words
\ from CORE :
\ Constant : execute source >in ! drop ; >r 1+ r> swap dup chars + r@ move
\ rot [']
\ from BLOCK :
\ evaluate
\ from BLOCK-EXT :
\ \
\ from EXCEPTION :
\ throw catch
\ from FILE :
\ ( S"
\ from MEMORY :
\ allocate free
\ from SEARCH :
\ wordlist get-current set-current get-order set-order
\ from SEARCH-EXT :
\ previous
wordlist constant execute-parsing-wordlist
get-current execute-parsing-wordlist set-current
\ X is prepended to the string, then the string is EVALUATEd
: X ( xt -- )
previous execute
source >in ! drop ; immediate \ skip remaining input
set-current
: >order ( wid -- )
>r get-order 1+ r> swap set-order ;
: execute-parsing ( ... c-addr u xt -- ... )
>r dup >r
dup 2 chars + allocate throw >r \ construct the string to be EVALUATEd
s" X " r@ swap chars move
r@ 2 chars + swap chars move
r> r> 2 + r> rot dup >r rot ( xt c-addr1 u1 r: c-addr1 )
execute-parsing-wordlist >order \ make sure the right X is executed
['] evaluate catch \ now EVALUATE the string
r> free throw throw ; \ cleanup
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>