| 
Immediate FALSE. Used to comment out sections of code.
 IMMEDIATE so it can be inside definitions.
 | 
  toolbelt   immediate constant 
    | 
Search the dictionary for _name_. If _name_ is found,
 return TRUE; otherwise return FALSE. Immediate for use in
 definitions.
   
[DEFINED] word       ( -- nfa|0 ) immediate does check for the word using find (so it does not throw like
 ')and puts it on stack. As it is immediate it does work in compile-mode
 too, so it places its argument in the cs-stack then. This is most
 useful with a directly following
 [IF]clause, so that sth. likean
 [IFDEF] wordcan be simulated through[DEFINED] word [IF]
 : [DEFINED] BL WORD FIND NIP ; IMMEDIATE
 | 
  toolbelt   immediate primitive 
    | 
Search the dictionary for _name_. If _name_ is found,
 return FALSE; otherwise return TRUE. Immediate for use in
 definitions.
 
 see
 [DEFINED] | 
  toolbelt   immediate primitive 
    | 
Identical to `0=`, used for program clarity to reverse the
 result of a previous test.
 
 WARNING: PFE's NOT uses bitwise complement
 INVERTinstead of the logical complement
 0=, sothat loading TOOLBELT will change semantics.
 ... this difference in semantics has caused dpans94 to
 depracate the word. Only if TRUE is -1 it would be identical
 but not all words return -1 for true.
 | 
  toolbelt   ordinary primitive 
    | 
Add the low-order byte of _n_ to the byte at _addr_,
 removing both from the stack.
 | 
  toolbelt   ordinary primitive 
    | 
Reset the dictionary to a predefined golden state,
 discarding all definitions and releasing all allocated
 data space beyond that state.
 | 
  toolbelt   ordinary primitive 
    | 
create a vocabulary of that name. If the named vocabulary
 is called later, it will run
 ((VOCABULARY)), therebyputting it into the current search order.
 Special pfe-extensions are accessible via
 
 CASE-SENSITIVE-VOCandSEARCH-ALSO-VOC simulate:
   : VOCABULARY  CREATE ALLOT-WORDLIST
        DOES> ( the ((VOCABULARY)) runtime )
          CONTEXT ! 
   ; IMMEDIATE
 | 
  toolbelt   ordinary primitive 
    | 
Convert _str len_ to range for DO-loop.
  : BOUNDS  ( str len -- str+len str )  OVER + SWAP ;
 | 
  toolbelt   ordinary primitive 
    | 
Store 0 at _addr_. See `ON`.
   : OFF  ( addr -- )  0 SWAP ! ;
 | 
  toolbelt   ordinary primitive 
    | 
Store -1 at _addr_. See `OFF`.
   : ON  ( addr -- )  -1 SWAP ! ;
 | 
  toolbelt   ordinary primitive 
    | 
Append string _str len_ to the counted string at _addr_.
 AKA `+PLACE`.
  : APPEND   2DUP 2>R  COUNT +  SWAP MOVE ( ) 2R> C+! ;
 | 
  toolbelt   ordinary primitive 
    | 
Append _char_ to the counted string at _addr_.
  : APPEND-CHAR   DUP >R  COUNT  DUP 1+ R> C!  +  C! ;
 | 
  toolbelt   ordinary primitive 
    | 
Place the string _str len_ at _addr_, formatting it as a
 counted string.
  : PLACE  2DUP 2>R  1+ SWAP  MOVE  2R> C! ;
 : PLACE  2DUP C!   1+ SWAP CMOVE ;
 | 
  toolbelt   ordinary primitive 
    | 
Store a string in data space as a counted string.
  : STRING, HERE  OVER 1+  ALLOT  PLACE ;
 | 
  toolbelt   ordinary primitive 
    ," no special info, see general notes 
  toolbelt   immediate primitive 
    | 
Copy third element on the stack onto top of stack.
  : THIRD   2 PICK ;
 | 
  toolbelt   ordinary primitive 
    | 
Copy fourth element on the stack onto top of stack.
  : FOURTH  3 PICK ;
 | 
  toolbelt   ordinary primitive 
    | 
Copy top three elements on the stack onto top of stack.
  : 3DUP   THIRD THIRD THIRD ;
 or
  : 3DUP  3 PICK 3 PICK 3 PICK ;
 | 
  toolbelt   ordinary primitive 
    | 
Drop the top three elements from the stack.
  : 3DROP   DROP 2DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
Drop the third and fourth elements from the stack.
  : 2NIP   2SWAP 2DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
The second element on the return stack.
  : R'@   S" 2R@ DROP " EVALUATE ; IMMEDIATE
 | 
  toolbelt   ordinary primitive 
    | 
Given `p ANDIF q THEN`,  _q_ will not be performed if
 _p_ is false.
  : ANDIF  S" DUP IF DROP " EVALUATE ; IMMEDIATE
 | 
  toolbelt   compiling primitive 
    | 
Given `p ORIF q THEN`,  _q_ will not be performed if
 _p_ is true.
  : ORIF   S" DUP 0= IF DROP " EVALUATE ; IMMEDIATE
 | 
  toolbelt   compiling primitive 
    | 
Look for a particular character in the specified string.
  : SCAN     
    >R  BEGIN  DUP WHILE  OVER C@ R@ -
        WHILE  1 /STRING  REPEAT THEN
    R> DROP ;
ie.
 scan for first occurence of c in string
    : SCAN >R BEGIN DUP OVER C@ R@ = 0= OR WHILE 
                    1- SWAP 1- SWAP REPEAT R> DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
Advance past leading characters in the specified string.
  : SKIP     
   >R  BEGIN  DUP WHILE  OVER C@ R@ =
        WHILE  1 /STRING  REPEAT THEN
    R> DROP ;
ie.
 skip leading characters c
    : SKIP  >R BEGIN DUP OVER C@ R@ = OR WHILE 
                    1- SWAP 1- SWAP REPEAT R> DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
Look for a particular character in the string from the
 back toward the front.
  : BACK     
    >R  BEGIN  DUP WHILE
        1-  2DUP + C@  R@ =
    UNTIL 1+ THEN
    R> DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
Split a character string _a m_ at place given by _a+i m-i_.
 Called "cut-split" because "slash-split" is a tongue
 twister.
  : /SPLIT  DUP >R  2SWAP  R> - ;
 | 
  toolbelt   ordinary primitive 
    | 
Test char for white space.
  : IS-WHITE   33 - 0< ;
 | 
  toolbelt   ordinary primitive 
    | 
Trim white space from end of string.
  : TRIM    
    BEGIN  DUP WHILE
        1-  2DUP + C@ IS-WHITE NOT
    UNTIL 1+ THEN ;
 | 
  toolbelt   ordinary primitive 
    | 
Look for white space from start of string
  : BL-SCAN 
    BEGIN  DUP WHILE  OVER C@ IS-WHITE NOT
    WHILE  1 /STRING  REPEAT THEN ;
 | 
  toolbelt   ordinary primitive 
    | 
Skip over white space at start of string.
  : BL-SKIP 
    BEGIN  DUP WHILE  OVER C@ IS-WHITE
    WHILE  1 /STRING  REPEAT THEN ;
 | 
  toolbelt   ordinary primitive 
    | 
Check start of string.
  : STARTS?   DUP >R  2OVER  R> MIN  COMPARE 0= ;
 | 
  toolbelt   ordinary primitive 
    | 
Check end of string.
  : ENDS?   DUP >R  2OVER  DUP R> - /STRING  COMPARE 0= ;
 | 
  toolbelt   ordinary primitive 
    | 
Test _char_ for digit [0-9].
  : IS-DIGIT   [CHAR] 0 -  10 U< ;
 | 
  toolbelt   ordinary primitive 
    | 
Test _char_ for alphabetic [A-Za-z].
  : IS-ALPHA  32 OR  [CHAR] a -  26 U< ;
 | 
  toolbelt   ordinary primitive 
    | 
Test _char_ for alphanumeric [A-Za-z0-9].
  : IS-ALNUM  
    DUP IS-ALPHA  ORIF  DUP IS-DIGIT  THEN  NIP ;
 | 
  toolbelt   ordinary primitive 
    | 
Backspace character.
  8 CONSTANT #BACKSPACE-CHAR
 | 
  toolbelt   ordinary constant 
    | 
Preferred width of line in source files.  Suit yourself.
  62 VALUE    #CHARS/LINE
 | 
  toolbelt   ordinary constant 
    | 
End-of-line character.  13 for Mac and DOS, 10 for Unix.
  13 CONSTANT #EOL-CHAR
 | 
  toolbelt   ordinary constant 
    | 
Tab character.
  9 CONSTANT #TAB-CHAR
 | 
  toolbelt   ordinary constant 
    | 
Largest usable signed integer.
  TRUE 1 RSHIFT        CONSTANT MAX-N
 | 
  toolbelt   ordinary constant 
    P4_OCoN ("SIGN-BIT",		(1 << (sizeof(p4cell)-1))),
    | 
Address units (i.e. bytes) in a cell.
  1 CELLS CONSTANT CELL
 | 
  toolbelt   ordinary constant 
    P4_OCoN ("-CELL",			- sizeof(p4cell)),
    | 
Split the next line from the string.
  : SPLIT-NEXT-LINE 
    2DUP #EOL-CHAR SCAN  
    DUP >R  1 /STRING  2SWAP R> - ;
FIXME: inform Neil Bawd that this is probablynot what he wanted. replace /STRING with /SPLIT here.
 | 
  toolbelt   ordinary primitive 
    | 
Copy next line above current line.
  : VIEW-NEXT-LINE 
    2OVER 2DUP #EOL-CHAR SCAN NIP - ;
 | 
  toolbelt   ordinary primitive 
    | 
Promiscuous variable.
  VARIABLE OUT
 | 
  toolbelt   threadstate variable 
    | 
Get the next word across line breaks as a character
 string. _len_ will be 0 at end of file.
  : NEXT-WORD         
    BEGIN   BL WORD COUNT      ( str len )
        DUP IF EXIT THEN
        REFILL
    WHILE  2DROP ( ) REPEAT ;  
 | 
  toolbelt   ordinary primitive 
    | 
Get the next word on the line as a character string.
 If it's a single character, use it as the delimiter to
 get a phrase.
  : LEXEME             
    BL WORD ( addr) DUP C@ 1 =
        IF  CHAR+ C@ WORD  THEN
    COUNT ;
 | 
  toolbelt   ordinary primitive 
    | 
Get the next word in the input stream as a hex
 single-number literal.  (Adopted from Open Firmware.)
  : H#  ( "hexnumber" -- n )  \  Simplified for easy porting.
    0 0 BL WORD COUNT                  
    BASE @ >R  HEX  >NUMBER  R> BASE !
        ABORT" Not Hex " 2DROP          ( n)
    STATE @ IF  POSTPONE LITERAL  THEN
    ; IMMEDIATE
 | 
  toolbelt   immediate primitive 
    | 
Ignore the rest of the input stream.
  : \\   BEGIN  -1 PARSE  2DROP  REFILL 0= UNTIL ;
 | 
  toolbelt   ordinary primitive 
    | 
Check for file access error.
  \ : FILE-CHECK    ( n -- )  THROW ;
 : FILE-CHECK      ( n -- )  ABORT" File Access Error " ;
 | 
  toolbelt   ordinary primitive 
    | 
Check for memory allocation error.
  \ : MEMORY-CHECK  ( n -- )  THROW ;
 : MEMORY-CHECK    ( n -- )  ABORT" Memory Allocation Error " ;
 | 
  toolbelt   ordinary primitive 
    | 
Increment the value at _addr_.
  : ++  ( addr -- )  1 SWAP +! ;
 | 
  toolbelt   ordinary primitive 
    | 
Fetch the value _x_ from _addr_, and increment the address
 by one cell.
  : @+  ( addr -- addr' x )  DUP CELL+ SWAP  @ ;
 | 
  toolbelt   ordinary primitive 
    | 
Store the value _x_ into _addr_, and increment the address
 by one cell.
  : !+  ( addr x -- addr' )  OVER !  CELL+ ;
 | 
  toolbelt   ordinary primitive 
    'th no special info, see general notes 
  toolbelt   compiling primitive 
    | 
Convert _n_ to characters, without punctuation, as for `.`
 (dot), returning the address and length of the resulting
 string.
  : (.)  ( n -- addr u )  DUP ABS 0 <# #S ROT SIGN #> ;
 | 
  toolbelt   ordinary primitive 
    | 
Decrement address by one cell
  : CELL-  ( addr -- addr' )  CELL - ;
 | 
  toolbelt   ordinary primitive 
    | 
Emit _char_ _n_ times.
  : EMITS             ( n char -- )
    SWAP 0 ?DO  DUP EMIT  LOOP DROP ;
 | 
  toolbelt   ordinary primitive 
    | 
The high half of the value.
  : HIWORD  ( xxyy -- xx )  16 RSHIFT ;
 | 
  toolbelt   ordinary primitive 
    | 
The low half of the value.
  : LOWORD  ( xxyy -- yy )  65535 AND ;
 | 
  toolbelt   ordinary primitive 
    | 
Rewind the file.
  : REWIND-FILE       ( file-id -- ior )
    0 0 ROT REPOSITION-FILE ;
 | 
  toolbelt   ordinary primitive 
    ENVIRONMENT
    ENVIRONMENT TOOLBELT-EXT no special info, see general notes 
  toolbelt   ordinary constant