Disable mixing of DMA and FIFO messages in the Solaris ESP kernel module.
[openbios.git] / forth / lib / vocabulary.fs
blobfaa75ea875dd733a94176636ed9da68c5ae8b0b3
1 \ tag: vocabulary implementation for openbios
2 \
3 \ Copyright (C) 2003 Stefan Reinauer
4 \
5 \ See the file "COPYING" for further information about
6 \ the copyright and warranty status of this work.
7 \
9 \
10 \ this is an implementation of DPANS94 wordlists (SEARCH EXT)
14 16 constant #vocs
15 create vocabularies #vocs cells allot \ word lists
16 ['] vocabularies to context
18 : search-wordlist ( c-addr u wid -- 0 | xt 1 | xt -1 )
19 \ Find the definition identified by the string c-addr u in the word
20 \ list identified by wid. If the definition is not found, return zero.
21 \ If the definition is found, return its execution token xt and
22 \ one (1) if the definition is immediate, minus-one (-1) otherwise.
23 find-wordlist
25 true over immediate? if
26 negate
27 then
28 else
29 2drop false
30 then
33 : wordlist ( -- wid )
34 \ Creates a new empty word list, returning its word list identifier
35 \ wid. The new word list may be returned from a pool of preallocated
36 \ word lists or may be dynamically allocated in data space. A system
37 \ shall allow the creation of at least 8 new word lists in addition
38 \ to any provided as part of the system.
39 here 0 ,
42 : get-order ( -- wid1 .. widn n )
43 #order @ 0 ?do
44 #order @ i - 1- cells context + @
45 loop
46 #order @
49 : set-order ( wid1 .. widn n -- )
50 dup -1 = if
51 drop forth-last 1 \ push system default word list and number of lists
52 then
53 dup #order !
54 0 ?do
55 i cells context + !
56 loop
59 : order ( -- )
60 \ display word lists in the search order in their search order sequence
61 \ from the first searched to last searched. Also display word list into
62 \ which new definitions will be placed.
64 get-order 0 ?do
65 ." wordlist " i (.) type 2e emit space u. cr
66 loop
67 cr ." definitions: " current @ u. cr
71 : previous ( -- )
72 \ Transform the search order consisting of widn, ... wid2, wid1 (where
73 \ wid1 is searched first) into widn, ... wid2. An ambiguous condition
74 \ exists if the search order was empty before PREVIOUS was executed.
75 get-order nip 1- set-order
79 : do-vocabulary ( -- ) \ implementation factor
80 does>
81 @ >r ( ) ( R: widnew )
82 get-order swap drop ( wid1 ... widn-1 n )
83 r> swap set-order
86 : discard ( x1 .. xu u - ) \ implementation factor
87 0 ?do
88 drop
89 loop
92 : vocabulary ( >name -- )
93 wordlist create , do-vocabulary
96 : also ( -- )
97 get-order over swap 1+ set-order
100 : only ( -- )
101 -1 set-order also
104 only
106 \ create forth forth-wordlist , do-vocabulary
107 create forth get-order over , discard do-vocabulary
109 : findw ( c-addr -- c-addr 0 | w 1 | w -1 )
110 0 ( c-addr 0 )
111 #order @ 0 ?do
112 over count ( c-addr 0 c-addr' u )
113 i cells context + @ ( c-addr 0 c-addr' u wid )
114 search-wordlist ( c-addr 0; 0 | w 1 | w -1 )
115 ?dup if ( c-addr 0; w 1 | w -1 )
116 2swap 2drop leave ( w 1 | w -1 )
117 then ( c-addr 0 )
118 loop ( c-addr 0 | w 1 | w -1 )
121 : get-current ( -- wid )
122 current @
125 : set-current ( wid -- )
126 current !
129 : definitions ( -- )
130 \ Make the compilation word list the same as the first word list in
131 \ the search order. Specifies that the names of subsequent definitions
132 \ will be placed in the compilation word list.
133 \ Subsequent changes in the search order will not affect the
134 \ compilation word list.
135 context @ set-current
138 : forth-wordlist ( -- wid )
139 forth-last
142 : #words ( -- )
143 0 last
144 begin
145 @ ?dup
146 while
147 swap 1+ swap
148 repeat
153 true to vocabularies?