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