xref: /freebsd/stand/ficl/softwords/softcore.fr (revision 26a58599a09a6181e0f5abe624021865a0c23186)
1ca987d46SWarner Losh\ ** ficl/softwords/softcore.fr
2ca987d46SWarner Losh\ ** FICL soft extensions
3ca987d46SWarner Losh\ ** John Sadler (john_sadler@alum.mit.edu)
4ca987d46SWarner Losh\ ** September, 1998
5ca987d46SWarner Losh\
6ca987d46SWarner Losh
7ca987d46SWarner Losh\ ** Ficl USER variables
8ca987d46SWarner Losh\ ** See words.c for primitive def'n of USER
9ca987d46SWarner Losh\ #if FICL_WANT_USER
10ca987d46SWarner Loshvariable nUser  0 nUser !
11ca987d46SWarner Losh: user   \ name ( -- )
12ca987d46SWarner Losh    nUser dup @ user 1 swap +! ;
13ca987d46SWarner Losh
14ca987d46SWarner Losh\ #endif
15ca987d46SWarner Losh
16ca987d46SWarner Losh\ ** ficl extras
17ca987d46SWarner Losh\ EMPTY cleans the parameter stack
18ca987d46SWarner Losh: empty   ( xn..x1 -- ) depth 0 ?do drop loop ;
19ca987d46SWarner Losh\ CELL- undoes CELL+
20ca987d46SWarner Losh: cell-   ( addr -- addr )  [ 1 cells ] literal -  ;
21ca987d46SWarner Losh: -rot   ( a b c -- c a b )  2 -roll ;
22ca987d46SWarner Losh
23ca987d46SWarner Losh\ ** CORE
24ca987d46SWarner Losh: abs   ( x -- x )
25ca987d46SWarner Losh    dup 0< if negate endif ;
26ca987d46SWarner Loshdecimal 32 constant bl
27ca987d46SWarner Losh
28ca987d46SWarner Losh: space   ( -- )     bl emit ;
29ca987d46SWarner Losh
30ca987d46SWarner Losh: spaces  ( n -- )   0 ?do space loop ;
31ca987d46SWarner Losh
32ca987d46SWarner Losh: abort"
33ca987d46SWarner Losh    state @ if
34ca987d46SWarner Losh        postpone if
35ca987d46SWarner Losh        postpone ."
36ca987d46SWarner Losh        postpone cr
37ca987d46SWarner Losh        -2
38ca987d46SWarner Losh        postpone literal
39ca987d46SWarner Losh        postpone throw
40ca987d46SWarner Losh        postpone endif
41ca987d46SWarner Losh    else
42ca987d46SWarner Losh	    [char] " parse
43ca987d46SWarner Losh        rot if
44ca987d46SWarner Losh            type
45ca987d46SWarner Losh            cr
46ca987d46SWarner Losh            -2 throw
47ca987d46SWarner Losh        else
48ca987d46SWarner Losh            2drop
49ca987d46SWarner Losh        endif
50ca987d46SWarner Losh    endif
51ca987d46SWarner Losh; immediate
52ca987d46SWarner Losh
53ca987d46SWarner Losh
54ca987d46SWarner Losh\ ** CORE EXT
55ca987d46SWarner Losh0  constant false
56ca987d46SWarner Loshfalse invert constant true
57ca987d46SWarner Losh: <>   = 0= ;
58ca987d46SWarner Losh: 0<>  0= 0= ;
59ca987d46SWarner Losh: compile,  , ;
60ca987d46SWarner Losh: convert   char+ 65535 >number drop ;  \ cribbed from DPANS A.6.2.0970
61ca987d46SWarner Losh: erase   ( addr u -- )    0 fill ;
62ca987d46SWarner Loshvariable span
63ca987d46SWarner Losh: expect  ( c-addr u1 -- ) accept span ! ;
64ca987d46SWarner Losh\ see marker.fr for MARKER implementation
65ca987d46SWarner Losh: nip     ( y x -- x )     swap drop ;
66ca987d46SWarner Losh: tuck    ( y x -- x y x)  swap over ;
67ca987d46SWarner Losh: within  ( test low high -- flag )   over - >r - r>  u<  ;
68ca987d46SWarner Losh
69*cd56ababSToomas Soome: u.r ( n +n -- )
70*cd56ababSToomas Soome  swap 0 <# #s #>
71*cd56ababSToomas Soome  rot over - dup 0< if
72*cd56ababSToomas Soome    drop else spaces
73*cd56ababSToomas Soome  then
74*cd56ababSToomas Soome  type space ;
75ca987d46SWarner Losh
76ca987d46SWarner Losh\ ** LOCAL EXT word set
77ca987d46SWarner Losh\ #if FICL_WANT_LOCALS
78ca987d46SWarner Losh: locals|  ( name...name | -- )
79ca987d46SWarner Losh    begin
80ca987d46SWarner Losh        bl word   count
81ca987d46SWarner Losh        dup 0= abort" where's the delimiter??"
82ca987d46SWarner Losh        over c@
83ca987d46SWarner Losh        [char] | - over 1- or
84ca987d46SWarner Losh    while
85ca987d46SWarner Losh        (local)
86ca987d46SWarner Losh    repeat 2drop   0 0 (local)
87ca987d46SWarner Losh; immediate
88ca987d46SWarner Losh
89ca987d46SWarner Losh: local  ( name -- )  bl word count (local) ;  immediate
90ca987d46SWarner Losh
91ca987d46SWarner Losh: 2local  ( name -- ) bl word count (2local) ; immediate
92ca987d46SWarner Losh
93ca987d46SWarner Losh: end-locals  ( -- )  0 0 (local) ;  immediate
94ca987d46SWarner Losh
95ca987d46SWarner Losh\ #endif
96ca987d46SWarner Losh
97ca987d46SWarner Losh\ ** TOOLS word set...
98ca987d46SWarner Losh: ?     ( addr -- )  @ . ;
99*cd56ababSToomas Soome
100*cd56ababSToomas SoomeVariable /dump
101*cd56ababSToomas Soome
102*cd56ababSToomas Soome: i' ( R:w R:w2 -- R:w R:w2 w )
103*cd56ababSToomas Soome  r> r> r> dup >r swap >r swap >r ;
104*cd56ababSToomas Soome
105*cd56ababSToomas Soome: .4 ( addr -- addr' )
106*cd56ababSToomas Soome    4 0 DO  -1 /dump +!  /dump @ 0<
107*cd56ababSToomas Soome        IF 3 spaces  ELSE  dup c@ 0 <# # # #> type space  THEN
108*cd56ababSToomas Soome    char+ LOOP ;
109*cd56ababSToomas Soome
110*cd56ababSToomas Soome: .chars ( addr -- )
111*cd56ababSToomas Soome    /dump @ over + swap
112*cd56ababSToomas Soome    ?DO I c@ dup 127 bl within
113*cd56ababSToomas Soome        IF  drop [char] .  THEN  emit
114*cd56ababSToomas Soome    LOOP ;
115*cd56ababSToomas Soome
116*cd56ababSToomas Soome: .line ( addr -- )
117*cd56ababSToomas Soome  dup .4 space .4 ." - " .4 space .4 drop  16 /dump +!  space .chars ;
118*cd56ababSToomas Soome
119*cd56ababSToomas Soome: dump  ( addr u -- ) \ tools dump
120*cd56ababSToomas Soome    cr base @ >r hex        \ save base on return stack
121*cd56ababSToomas Soome    0 ?DO  I' I - 16 min /dump !
122*cd56ababSToomas Soome        dup 8 u.r ." : " dup .line cr 16 +
123*cd56ababSToomas Soome        16 +LOOP
124*cd56ababSToomas Soome    drop r> base ! ;
125ca987d46SWarner Losh
126ca987d46SWarner Losh\ ** SEARCH+EXT words and ficl helpers
127ca987d46SWarner Losh\ BRAND-WORDLIST is a helper for ficl-named-wordlist. Usage idiom:
128ca987d46SWarner Losh\   wordlist dup create , brand-wordlist
129ca987d46SWarner Losh\ gets the name of the word made by create and applies it to the wordlist...
130ca987d46SWarner Losh: brand-wordlist  ( wid -- )   last-word >name drop wid-set-name ;
131ca987d46SWarner Losh
132ca987d46SWarner Losh: ficl-named-wordlist  \ ( hash-size name -- ) run: ( -- wid )
133ca987d46SWarner Losh    ficl-wordlist dup create , brand-wordlist does> @ ;
134ca987d46SWarner Losh
135ca987d46SWarner Losh: wordlist   ( -- )
136ca987d46SWarner Losh    1 ficl-wordlist ;
137ca987d46SWarner Losh
138ca987d46SWarner Losh\ FICL-SET-CURRENT sets the compile wordlist and pushes the previous value
139ca987d46SWarner Losh: ficl-set-current   ( wid -- old-wid )
140ca987d46SWarner Losh    get-current swap set-current ;
141ca987d46SWarner Losh
142ca987d46SWarner Losh\ DO_VOCABULARY handles the DOES> part of a VOCABULARY
143ca987d46SWarner Losh\ When executed, new voc replaces top of search stack
144ca987d46SWarner Losh: do-vocabulary   ( -- )
145ca987d46SWarner Losh    does>  @ search> drop >search ;
146ca987d46SWarner Losh
147ca987d46SWarner Losh: ficl-vocabulary   ( nBuckets name -- )
148ca987d46SWarner Losh    ficl-named-wordlist do-vocabulary ;
149ca987d46SWarner Losh
150ca987d46SWarner Losh: vocabulary   ( name -- )
151ca987d46SWarner Losh    1 ficl-vocabulary ;
152ca987d46SWarner Losh
153ca987d46SWarner Losh\ PREVIOUS drops the search order stack
154ca987d46SWarner Losh: previous  ( --  )  search> drop ;
155ca987d46SWarner Losh
156ca987d46SWarner Losh\ HIDDEN vocabulary is a place to keep helper words from cluttering the namespace
157ca987d46SWarner Losh\ USAGE:
158ca987d46SWarner Losh\ hide
159ca987d46SWarner Losh\ <definitions to hide>
160ca987d46SWarner Losh\ set-current
161ca987d46SWarner Losh\ <words that use hidden defs>
162ca987d46SWarner Losh\ previous ( pop HIDDEN off the search order )
163ca987d46SWarner Losh
164ca987d46SWarner Losh1 ficl-named-wordlist hidden
165ca987d46SWarner Losh: hide     hidden dup >search ficl-set-current ;
166ca987d46SWarner Losh
167ca987d46SWarner Losh\ ALSO dups the search stack...
168ca987d46SWarner Losh: also   ( -- )
169ca987d46SWarner Losh    search> dup >search >search ;
170ca987d46SWarner Losh
171ca987d46SWarner Losh\ FORTH drops the top of the search stack and pushes FORTH-WORDLIST
172ca987d46SWarner Losh: forth   ( -- )
173ca987d46SWarner Losh    search> drop
174ca987d46SWarner Losh    forth-wordlist >search ;
175ca987d46SWarner Losh
176ca987d46SWarner Losh\ ONLY sets the search order to a default state
177ca987d46SWarner Losh: only   ( -- )
178ca987d46SWarner Losh    -1 set-order ;
179ca987d46SWarner Losh
180ca987d46SWarner Losh\ ORDER displays the compile wid and the search order list
181ca987d46SWarner Loshhide
182ca987d46SWarner Losh: list-wid ( wid -- )
183ca987d46SWarner Losh    dup wid-get-name   ( wid c-addr u )
184ca987d46SWarner Losh    ?dup if
185ca987d46SWarner Losh        type drop
186ca987d46SWarner Losh    else
187ca987d46SWarner Losh        drop ." (unnamed wid) " x.
188ca987d46SWarner Losh    endif cr
189ca987d46SWarner Losh;
190ca987d46SWarner Loshset-current   \ stop hiding words
191ca987d46SWarner Losh
192ca987d46SWarner Losh: order   ( -- )
193ca987d46SWarner Losh    ." Search:" cr
194ca987d46SWarner Losh    get-order  0 ?do 3 spaces list-wid loop cr
195ca987d46SWarner Losh   ." Compile: " get-current list-wid cr
196ca987d46SWarner Losh;
197ca987d46SWarner Losh
198ca987d46SWarner Losh: debug  ' debug-xt ; immediate
199ca987d46SWarner Losh: on-step   ." S: " .s cr ;
200ca987d46SWarner Losh
201ca987d46SWarner Losh
202ca987d46SWarner Losh\ Submitted by lch.
203ca987d46SWarner Losh: strdup ( c-addr length -- c-addr2 length2 ior )
204ca987d46SWarner Losh	0 locals| addr2 length c-addr | end-locals
205ca987d46SWarner Losh	length 1 + allocate
206ca987d46SWarner Losh	0= if
207ca987d46SWarner Losh		to addr2
208ca987d46SWarner Losh		c-addr addr2 length move
209ca987d46SWarner Losh		addr2 length 0
210ca987d46SWarner Losh	else
211ca987d46SWarner Losh		0  -1
212ca987d46SWarner Losh	endif
213ca987d46SWarner Losh	;
214ca987d46SWarner Losh
215ca987d46SWarner Losh: strcat ( 2:a 2:b -- 2:new-a )
216ca987d46SWarner Losh	0 locals|  b-length b-u b-addr a-u a-addr | end-locals
217ca987d46SWarner Losh	b-u  to b-length
218ca987d46SWarner Losh	b-addr a-addr a-u + b-length  move
219ca987d46SWarner Losh	a-addr a-u b-length +
220ca987d46SWarner Losh	;
221ca987d46SWarner Losh
222ca987d46SWarner Losh: strcpy ( 2:a 2:b -- 2:new-a )
223ca987d46SWarner Losh	locals| b-u b-addr a-u a-addr | end-locals
224ca987d46SWarner Losh	a-addr 0  b-addr b-u  strcat
225ca987d46SWarner Losh	;
226ca987d46SWarner Losh
227938cae32SToomas Soome: xemit ( xchar -- )
228938cae32SToomas Soome 	dup 0x80 u< if emit exit then \ special case ASCII
229938cae32SToomas Soome 	0 swap 0x3F
230938cae32SToomas Soome 	begin 2dup u> while
231938cae32SToomas Soome 		2/ >r dup 0x3F and 0x80 or swap 6 rshift r>
232938cae32SToomas Soome 	repeat 0x7F xor 2* or
233938cae32SToomas Soome 	begin dup 0x80 u< 0= while emit repeat drop
234938cae32SToomas Soome 	;
235ca987d46SWarner Losh
236ca987d46SWarner Loshprevious   \ lose hidden words from search order
237ca987d46SWarner Losh
238ca987d46SWarner Losh\ ** E N D   S O F T C O R E . F R
239ca987d46SWarner Losh
240