mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
initial import of openbios--main--1.0--patch-26
git-svn-id: svn://coreboot.org/openbios/openbios-devel@1 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
155
forth/lib/vocabulary.fs
Normal file
155
forth/lib/vocabulary.fs
Normal file
@@ -0,0 +1,155 @@
|
||||
\ tag: vocabulary implementation for openbios
|
||||
\
|
||||
\ Copyright (C) 2003 Stefan Reinauer
|
||||
\
|
||||
\ See the file "COPYING" for further information about
|
||||
\ the copyright and warranty status of this work.
|
||||
\
|
||||
|
||||
\
|
||||
\ this is an implementation of DPANS94 wordlists (SEARCH EXT)
|
||||
\
|
||||
|
||||
|
||||
16 constant #vocs
|
||||
create vocabularies #vocs cells allot \ word lists
|
||||
['] vocabularies to context
|
||||
|
||||
: search-wordlist ( c-addr u wid -- 0 | xt 1 | xt -1 )
|
||||
\ Find the definition identified by the string c-addr u in the word
|
||||
\ list identified by wid. If the definition is not found, return zero.
|
||||
\ If the definition is found, return its execution token xt and
|
||||
\ one (1) if the definition is immediate, minus-one (-1) otherwise.
|
||||
find-wordlist
|
||||
if
|
||||
true over immediate? if
|
||||
negate
|
||||
then
|
||||
else
|
||||
2drop false
|
||||
then
|
||||
;
|
||||
|
||||
: wordlist ( -- wid )
|
||||
\ Creates a new empty word list, returning its word list identifier
|
||||
\ wid. The new word list may be returned from a pool of preallocated
|
||||
\ word lists or may be dynamically allocated in data space. A system
|
||||
\ shall allow the creation of at least 8 new word lists in addition
|
||||
\ to any provided as part of the system.
|
||||
here 0 ,
|
||||
;
|
||||
|
||||
: get-order ( -- wid1 .. widn n )
|
||||
#order @ 0 ?do
|
||||
#order @ i - 1- cells context + @
|
||||
loop
|
||||
#order @
|
||||
;
|
||||
|
||||
: set-order ( wid1 .. widn n -- )
|
||||
dup -1 = if
|
||||
drop forth-last 1 \ push system default word list and number of lists
|
||||
then
|
||||
dup #order !
|
||||
0 ?do
|
||||
i cells context + !
|
||||
loop
|
||||
;
|
||||
|
||||
: order ( -- )
|
||||
\ display word lists in the search order in their search order sequence
|
||||
\ from the first searched to last searched. Also display word list into
|
||||
\ which new definitions will be placed.
|
||||
cr
|
||||
get-order 0 ?do
|
||||
." wordlist " i (.) type 2e emit space . cr
|
||||
loop
|
||||
cr ." definitions: " current @ . cr
|
||||
;
|
||||
|
||||
|
||||
: previous ( -- )
|
||||
\ Transform the search order consisting of widn, ... wid2, wid1 (where
|
||||
\ wid1 is searched first) into widn, ... wid2. An ambiguous condition
|
||||
\ exists if the search order was empty before PREVIOUS was executed.
|
||||
get-order nip 1- set-order
|
||||
;
|
||||
|
||||
|
||||
: do-vocabulary ( -- ) \ implementation factor
|
||||
does>
|
||||
@ >r ( ) ( R: widnew )
|
||||
get-order swap drop ( wid1 ... widn-1 n )
|
||||
r> swap set-order
|
||||
;
|
||||
|
||||
: discard ( x1 .. xu u - ) \ implementation factor
|
||||
0 ?do
|
||||
drop
|
||||
loop
|
||||
;
|
||||
|
||||
: vocabulary ( >name -- )
|
||||
wordlist create , do-vocabulary
|
||||
;
|
||||
|
||||
: also ( -- )
|
||||
get-order over swap 1+ set-order
|
||||
;
|
||||
|
||||
: only ( -- )
|
||||
-1 set-order also
|
||||
;
|
||||
|
||||
only
|
||||
|
||||
\ create forth forth-wordlist , do-vocabulary
|
||||
create forth get-order over , discard do-vocabulary
|
||||
|
||||
: findw ( c-addr -- c-addr 0 | w 1 | w -1 )
|
||||
0 ( c-addr 0 )
|
||||
#order @ 0 ?do
|
||||
over count ( c-addr 0 c-addr' u )
|
||||
i cells context + @ ( c-addr 0 c-addr' u wid )
|
||||
search-wordlist ( c-addr 0; 0 | w 1 | w -1 )
|
||||
?dup if ( c-addr 0; w 1 | w -1 )
|
||||
2swap 2drop leave ( w 1 | w -1 )
|
||||
then ( c-addr 0 )
|
||||
loop ( c-addr 0 | w 1 | w -1 )
|
||||
;
|
||||
|
||||
: get-current ( -- wid )
|
||||
current @
|
||||
;
|
||||
|
||||
: set-current ( wid -- )
|
||||
current !
|
||||
;
|
||||
|
||||
: definitions ( -- )
|
||||
\ Make the compilation word list the same as the first word list in
|
||||
\ the search order. Specifies that the names of subsequent definitions
|
||||
\ will be placed in the compilation word list.
|
||||
\ Subsequent changes in the search order will not affect the
|
||||
\ compilation word list.
|
||||
context @ set-current
|
||||
;
|
||||
|
||||
: forth-wordlist ( -- wid )
|
||||
forth-last
|
||||
;
|
||||
|
||||
: #words ( -- )
|
||||
0 last
|
||||
begin
|
||||
@ ?dup
|
||||
while
|
||||
swap 1+ swap
|
||||
repeat
|
||||
|
||||
cr
|
||||
;
|
||||
|
||||
true to vocabularies?
|
||||
|
||||
|
||||
Reference in New Issue
Block a user