color-brad0.f


\ Forth to HTML converter
\ Brad Eckert
\ Revision 0. See bottom for revision history.

\ This ANS Forth program is public domain. It translates ANS Forth to colorized
\ HTML. Hyperlinks to the ANS Forth draft standard are inserted for all ANS
\ standard words. Hyperlinks to user definitions are included.

\ Usage: HTML FileName       Generates HTML file from Forth source
\                            output file is Filename with .HTM extension
\        Q [forth code]      Outputs HTML for 1 line to screen

\ Q is used for debugging. You can use "linenum ?" to show the line number if an
\ ABORT occurs. The HTML is about 10 times as big as the Forth source because of
\ all the links, color changes and whitespace.

\ INCLUDEd files produce corresponding HTML pages. Most browsers get severely
\ bogged down with large files. If you're converting a large Forth program to
\ HTML, try to keep the source files under 500 lines each by splitting long
\ source into multiple INCLUDE files. HTML pages are best viewed with Internet
\ Explorer. Netscape ignores the <code> attribute and is more sluggish with
\ large files.

ONLY FORTH ALSO DEFINITIONS

: undefined ( <name> -- f ) BL WORD FIND NIP 0= ;
undefined +PLACE [IF] : +PLACE 2DUP 2>R COUNT CHARS + SWAP MOVE 2R> C+! ; [THEN]
undefined PLACE  [IF] : PLACE  0 OVER C! +PLACE ;                         [THEN]
undefined FDROP  [IF] : FDROP ;                                           [THEN]
undefined >FLOAT [IF] : >FLOAT DROP C@ [CHAR] 0 [CHAR] 9 1+ WITHIN ;      [THEN]

0 VALUE outf                                    \ output to file
1 VALUE screen-only                             \ screen is for testing
: werr  abort" Error writing file" ;
: out   screen-only IF type    ELSE outf WRITE-FILE werr THEN ;
: outln screen-only IF type cr ELSE outf WRITE-LINE werr THEN ;

WORDLIST CONSTANT hyperlinks
VARIABLE attrib
: /a      ( -- )         attrib @ IF S" </a>" out THEN 0 attrib ! ;
: ,$      ( a len -- )   DUP C, BOUNDS ?DO I C@ C, LOOP ; \ text to dictionary
: text    ( <text> -- )  -1 WORD COUNT -TRAILING ,$ ;
: line    ( a line# -- ) 0 ?DO COUNT + LOOP COUNT out ;   \ output one string
: boiler  ( addr -- )    BEGIN COUNT DUP WHILE 2DUP + >R outln R> REPEAT 2DROP ;

CREATE misctext                                 \ various attribute strings
  text <a style="text-decoration:none" href=
  text <a name="
  text ">
  text <a href="#
  text " style="text-decoration:none">
  text </title></head><body bgcolor="#FFFFEE" text="#808080"><code>
  text <font color="#
  text <font color="#000000"><hr><h1>
  text </h1><hr>
  0 c,

VARIABLE color                                  \ current color
VARIABLE oldcolor -1 oldcolor !                 \ previous color

: fontcolor ( color -- ) BASE @ >R              \ change font color
  misctext 6 line 0 HEX <# # # # # # # #> out
  misctext 2 line       R> BASE ! ;

: col ( color <name> -- )                       \ define a font color
  CREATE , DOES> @ color ! ;

HEX
808080 col unknown
008000 col commentary
CC0000 col numeric
990080 col values
000000 col userwords
009999 col userdefiner
CC00CC col variables
0000FF col core_ws
0000FF col core_ext_ws
0000FF col block_ws
0000FF col double_ws
0000FF col exception_ws
0000FF col facilities_ws
0000FF col file_ws
0000FF col fp_ws
0000FF col local_ws
0000FF col malloc_ws
0000FF col progtools_ws
0000FF col searchord_ws
0000FF col string_ws
DECIMAL

CREATE begin_header                             \ begin of HTML file
  text <html> <head>
  text <meta http-equiv="Content-Type" content="text/html;">
  text <meta name="GENERATOR" content="Forth2HTML 0.0">
  text <title>
  0 C,

CREATE end_header                               \ end of HTML file
  text </code></body>
  text </html>
  0 C,

: setcolor ( -- )                               \ select next color
  color @ DUP oldcolor @ <>
  DROP TRUE \ always select a color so viewed hyperlinks don't change color
  IF DUP fontcolor THEN oldcolor ! ;

VARIABLE bltally
: outh    ( a n -- )                            \ HTMLized text output
  999 bltally !
  BOUNDS ?DO I C@ CASE
     [CHAR] & OF S" &amp;"  out ENDOF
     [CHAR] < OF S" &lt;"   out ENDOF
     [CHAR] > OF S" &gt;"   out ENDOF
     [CHAR] " OF S" &quot;" out ENDOF
     BL       OF bltally @ 0= IF S"  " ELSE S" &nbsp;" THEN out
               1 bltally +!     ENDOF
     I 1 out   0 bltally !
  ENDCASE LOOP ;

: label ( addr len -- ) /a                      \ associate a label with a word
  misctext 1 line outh
  misctext 2 line 1 attrib ! ;

: std    ( word color <string> -- )
  CREATE ' , ' , BL WORD COUNT ,$
  DOES> /a DUP >R  2 CELLS +
  misctext 0 line                              \ begin hyperlink
  BASE @ >R DECIMAL
  COUNT 0 0 2OVER >NUMBER 2DROP D>S
  R> BASE ! CASE                               \ choose file name
      6 OF S" dpans6.htm#"  out ENDOF
      7 OF S" dpans7.htm#"  out ENDOF
      8 OF S" dpans8.htm#"  out ENDOF
      9 OF S" dpans9.htm#"  out ENDOF
     10 OF S" dpans10.htm#" out ENDOF
     11 OF S" dpans11.htm#" out ENDOF
     12 OF S" dpans12.htm#" out ENDOF
     13 OF S" dpans13.htm#" out ENDOF
     14 OF S" dpans14.htm#" out ENDOF
     15 OF S" dpans15.htm#" out ENDOF
     16 OF S" dpans16.htm#" out ENDOF
     17 OF S" dpans17.htm#" out ENDOF
     ABORT" Undefined source file"
  ENDCASE  out s" >" out
  1 attrib !
  R> 2@ SWAP EXECUTE EXECUTE ;                 \ extra attributes

: genHTML ( -- )                                \ generate pending HTML
  PAD COUNT DUP IF setcolor THEN outh /a  0 PAD ! ;

: isnumber? ( addr len -- f )                   \ string converts to number?
  0 0 2SWAP >NUMBER NIP NIP NIP 0= ;

: hparse ( a len char -- a' len' )
  >R 2DUP R@ SKIP R> SCAN BL SCAN
  2SWAP 2 PICK - PAD +PLACE ;

CREATE XPAD 260 CHARS ALLOT                     \ temporary pad for word storage
CREATE EPAD  80 CHARS ALLOT                     \ temporary pad for evaluation

: >XPAD ( -- ) PAD COUNT BL SKIP XPAD PLACE ;   \ move to temporary pad

: hint  ( addr len -- )                         \ interpret one line...
  BEGIN
     0 PAD !  BL hparse PAD C@
  WHILE unknown                                \ default color
     >XPAD XPAD COUNT hyperlinks SEARCH-WORDLIST \ got a hyperlink for this?
     IF DEPTH >R EXECUTE
        R> DEPTH <> ABORT" stack depth change in HTML generator"
     ELSE
        XPAD COUNT BASE @ 10 = IF
           >FLOAT IF FDROP numeric THEN        \ valid float or integer
        ELSE
           isnumber? IF numeric THEN
        THEN
     THEN genHTML
  REPEAT 2DROP
  S" <br>" outln ;                             \ new line

CREATE inbuf 260 CHARS ALLOT
CREATE fn    128 CHARS ALLOT                    \ file name
CREATE fn1   128 CHARS ALLOT                    \ file name backup
CREATE pstr  128 CHARS ALLOT                    \ parsed string storage
CREATE uname  64 CHARS ALLOT                    \ : definition name
0 VALUE inf
VARIABLE nufile                                 \ T if nesting a file
VARIABLE utype                                  \ type of defined word
VARIABLE hstate
VARIABLE linenum

: ofn   ( -- addr len )                         \ output file name
  fn COUNT 2DUP [CHAR] . SCAN NIP - EPAD PLACE
  S" .htm" EPAD +PLACE   EPAD COUNT ;

: hcreate ( addr len -- )
  S" CREATE " EPAD PLACE  EPAD +PLACE
  GET-CURRENT >R hyperlinks SET-CURRENT
  EPAD COUNT EVALUATE    R> SET-CURRENT ;      \ create a hyperlink generator

\ The user defined words use the following data structure:
\ CELL   xt of coloring word
\ STRING name of reference word
\ STRING name of file

: deflink ( addr -- )                           \ make hyperlink from data structure
  DUP @ EXECUTE CELL+                          \ set color
  DUP COUNT + COUNT ofn COMPARE                \ in an external file?
  IF   misctext 0 line DUP COUNT + COUNT out   \ yes, put file name
       S" #" out COUNT outh S" >" out
  ELSE misctext 3 line COUNT outh              \ no, just use the name
       misctext 4 line
  THEN 1 attrib ! ;

: defx  ( a len xt -- a' len' )
  >R genHTML BL hparse >XPAD                   \ output defining word
  XPAD COUNT 2DUP hcreate R> , ,$ ofn ,$
  DOES> deflink ;

: labelnow   genHTML XPAD COUNT label ;
: defdat ['] numeric   defx numeric   labelnow ;
: defvar ['] variables defx variables labelnow ;
: defusr ['] userwords defx userwords labelnow ;
: defval ['] values    defx values    labelnow ;
: defdef ['] userdefiner defx userdefiner labelnow ;

: hstate=0 ( -- )             0 hstate ! ;
: hstate=1 ( -- )             1 hstate ! ;
: skip)  ( a len -- a' len' ) [CHAR] ) hparse ;
: skipw  ( a len -- a' len' ) BL hparse ;
: skip"  ( a len -- a' len' )                   \ copy string to pstr
  genHTML [CHAR] " hparse PAD COUNT 1- pstr PLACE ;

\ ------------------------------------------------------------------------------
\ ":" definitions might be defining words, so they can't be assumed to be defusr
\ types. ":" makes a label and saves the name for later use by ";" which makes
\ a hyperlink or a hyperlink defining word.

:NONAME                                         \ normal : definition
  uname COUNT ['] userwords defx 2DROP  0 PAD !
; CONSTANT normal_def

:NONAME
  uname COUNT 2DUP hcreate ['] userwords , ,$ ofn ,$
  DOES> deflink defdef
; CONSTANT defining_def

: defunk ( a len -- a' len' )                   \ starting unknown definition
  hstate=1  normal_def utype !                 \ save name of : definition
  genHTML skipw userwords PAD COUNT BL SKIP 2DUP uname PLACE label ;

: resunk ( -- )                                 \ resolve unknown defined word
  genHTML utype @ EXECUTE hstate=0 ;

: created ( -- ) hstate @
  IF   defining_def utype !                    \ make ; create a defining word
  ELSE defdat                                  \ not compiling
  THEN ;

\ ------------------------------------------------------------------------------

: header  ( addr len -- )                       \ output big header text
  misctext 7 line outln misctext 8 line ;

: _incfil ( addr -- )                           \ trigger file nesting
  fn COUNT fn1 PLACE COUNT BL SKIP fn place 1 nufile ! ;

: incfile ( a len -- a' len' )                  \ include a file
  genHTML skipw PAD _incfil ;

: "incfil ( a len -- a' len' )                  \ include file from S" filename"
  skipw pstr _incfil ;

: hfill  ( -- len )                             \ read next line of file
  inbuf 256 inf READ-LINE ABORT" Error reading file" ;

: open  ( -- ) cr ." Reading " fn COUNT type ."  at line " linenum @ .
  0 linenum !
  fn COUNT R/O OPEN-FILE ABORT" Error opening source file" to inf ;

: close ( -- ) cr ." closing " fn COUNT type
  inf CLOSE-FILE ABORT" Error closing file" ;

: oopen ( -- )
  ofn W/O CREATE-FILE ABORT" Error creating file" to outf
  begin_header boiler                          \ begin boilerplate
  fn COUNT outln  misctext 5 line              \ title and end boilerplate
  fn COUNT header ;

: HTML          ( <infile> -- )
  0 TO screen-only  0 nufile !                 \ force usage of file
  BL WORD COUNT fn PLACE open oopen            \ open input and output files
  -1 DUP >R outf >R                            \ file nest uses stacks
  hstate=0
  BEGIN
     BEGIN nufile @                            \ nest a file?
        IF   inf outf
             open oopen  outf >R               \ open new files
             0 nufile !
        THEN hfill
     WHILE inbuf SWAP hint 1 linenum +!
     REPEAT DROP
     close fn1 COUNT fn PLACE                  \ restore file name
     DUP -1 <>
     IF   TO outf TO inf FALSE                 \ unnest files
     ELSE TRUE
     THEN
  UNTIL DROP
  BEGIN R> DUP -1 <>                           \ close all output files
  WHILE end_header boiler                      \ finish up HTML
     close-file ABORT" Error closing file"
  REPEAT DROP ;

: q             ( -- ) 1 TO screen-only         \ single line test
  -1 word count inbuf place inbuf count hint ;

\ =============================================================================

: _DEFINITIONS DEFINITIONS ;

hyperlinks SET-CURRENT
\ The following words are not in the ANS standard but are very common.
: VOCABULARY    defusr ;
: DEFER         defusr ;
: INCLUDE       hstate @ 0= IF incfile THEN ;
: FLOAD         hstate @ 0= IF incfile THEN ;
: BINARY        2 BASE ! ;
: OCTAL         8 BASE ! ;
: 0             numeric  ;
: 1             numeric  ;
: -1            numeric  ;

\ The rest is ANS Forth standard

: \             commentary genHTML PAD PLACE  PAD 0 ;

(   NAME                ACTION  COLOR           REFERENCE   )
(   ------------------  ------  --------------  ----------- )
std !                   NOOP    core_ws         6.1.0010
std #                   NOOP    core_ws         6.1.0030
std #>                  NOOP    core_ws         6.1.0040
std #S                  NOOP    core_ws         6.1.0050
std '                   NOOP    core_ws         6.1.0070
std (                   skip)   commentary      6.1.0080
std *                   NOOP    core_ws         6.1.0090
std */                  NOOP    core_ws         6.1.0100
std */MOD               NOOP    core_ws         6.1.0110
std +                   NOOP    core_ws         6.1.0120
std +!                  NOOP    core_ws         6.1.0130
std +LOOP               NOOP    core_ws         6.1.0140
std ,                   NOOP    core_ws         6.1.0150
std -                   NOOP    core_ws         6.1.0160
std .                   NOOP    core_ws         6.1.0180
std ."                  skip"   numeric         6.1.0190
std /                   NOOP    core_ws         6.1.0230
std /MOD                NOOP    core_ws         6.1.0240
std 0<                  NOOP    core_ws         6.1.0250
std 0=                  NOOP    core_ws         6.1.0270
std 1+                  NOOP    core_ws         6.1.0290
std 1-                  NOOP    core_ws         6.1.0300
std 2!                  NOOP    core_ws         6.1.0310
std 2*                  NOOP    core_ws         6.1.0320
std 2/                  NOOP    core_ws         6.1.0330
std 2@                  NOOP    core_ws         6.1.0350
std 2DROP               NOOP    core_ws         6.1.0370
std 2DUP                NOOP    core_ws         6.1.0380
std 2OVER               NOOP    core_ws         6.1.0400
std 2SWAP               NOOP    core_ws         6.1.0430
std :                   defunk  core_ws         6.1.0450
std ;                   resunk  core_ws         6.1.0460
std <                   NOOP    core_ws         6.1.0480
std <#                  NOOP    core_ws         6.1.0490
std =                   NOOP    core_ws         6.1.0530
std >                   NOOP    core_ws         6.1.0540
std >BODY               NOOP    core_ws         6.1.0550
std >IN                 NOOP    core_ws         6.1.0560
std >NUMBER             NOOP    core_ws         6.1.0570
std >R                  NOOP    core_ws         6.1.0580
std ?DUP                NOOP    core_ws         6.1.0630
std @                   NOOP    core_ws         6.1.0650
std ABORT               NOOP    core_ws         6.1.0670
std ABORT"              skip"   numeric         6.1.0680
std ABS                 NOOP    core_ws         6.1.0690
std ACCEPT              NOOP    core_ws         6.1.0695
std ALIGN               NOOP    core_ws         6.1.0705
std ALIGNED             NOOP    core_ws         6.1.0706
std ALLOT               NOOP    core_ws         6.1.0710
std AND                 NOOP    core_ws         6.1.0720
std BASE                NOOP    core_ws         6.1.0750
std BEGIN               NOOP    core_ws         6.1.0760
std BL                  NOOP    numeric         6.1.0770
std C!                  NOOP    core_ws         6.1.0850
std C,                  NOOP    core_ws         6.1.0860
std C@                  NOOP    core_ws         6.1.0870
std CELL+               NOOP    core_ws         6.1.0880
std CELLS               NOOP    core_ws         6.1.0890
std CHAR                NOOP    core_ws         6.1.0895
std CHAR+               NOOP    core_ws         6.1.0897
std CHARS               NOOP    core_ws         6.1.0898
std CONSTANT            defdat  core_ws         6.1.0950
std COUNT               NOOP    core_ws         6.1.0980
std CR                  NOOP    core_ws         6.1.0990
std CREATE              created core_ws         6.1.1000
std DECIMAL             DECIMAL core_ws         6.1.1170
std DEPTH               NOOP    core_ws         6.1.1200
std DO                  NOOP    core_ws         6.1.1240
std DOES>               NOOP    core_ws         6.1.1250
std DROP                NOOP    core_ws         6.1.1260
std DUP                 NOOP    core_ws         6.1.1290
std ELSE                NOOP    core_ws         6.1.1310
std EMIT                NOOP    core_ws         6.1.1320
std ENVIRONMENT?        NOOP    core_ws         6.1.1345
std EVALUATE            NOOP    core_ws         6.1.1360
std EXECUTE             NOOP    core_ws         6.1.1370
std EXIT                NOOP    core_ws         6.1.1380
std FILL                NOOP    core_ws         6.1.1540
std FIND                NOOP    core_ws         6.1.1550
std FM/MOD              NOOP    core_ws         6.1.1561
std HERE                NOOP    core_ws         6.1.1650
std HOLD                NOOP    core_ws         6.1.1670
std I                   NOOP    core_ws         6.1.1680
std IF                  NOOP    core_ws         6.1.1700
std IMMEDIATE           NOOP    core_ws         6.1.1710
std INVERT              NOOP    core_ws         6.1.1720
std J                   NOOP    core_ws         6.1.1730
std KEY                 NOOP    core_ws         6.1.1750
std LEAVE               NOOP    core_ws         6.1.1760
std LITERAL             NOOP    core_ws         6.1.1780
std LOOP                NOOP    core_ws         6.1.1800
std LSHIFT              NOOP    core_ws         6.1.1805
std M*                  NOOP    core_ws         6.1.1810
std MAX                 NOOP    core_ws         6.1.1870
std MIN                 NOOP    core_ws         6.1.1880
std MOD                 NOOP    core_ws         6.1.1890
std MOVE                NOOP    core_ws         6.1.1900
std NEGATE              NOOP    core_ws         6.1.1910
std OR                  NOOP    core_ws         6.1.1980
std OVER                NOOP    core_ws         6.1.1990
std POSTPONE            NOOP    core_ws         6.1.2033
std QUIT                NOOP    core_ws         6.1.2050
std R>                  NOOP    core_ws         6.1.2060
std R@                  NOOP    core_ws         6.1.2070
std RECURSE             NOOP    core_ws         6.1.2120
std REPEAT              NOOP    core_ws         6.1.2140
std ROT                 NOOP    core_ws         6.1.2160
std RSHIFT              NOOP    core_ws         6.1.2162
std S"                  skip"   numeric         6.1.2165
std S>D                 NOOP    core_ws         6.1.2170
std SIGN                NOOP    core_ws         6.1.2210
std SM/REM              NOOP    core_ws         6.1.2214
std SOURCE              NOOP    core_ws         6.1.2216
std SPACE               NOOP    core_ws         6.1.2220
std SPACES              NOOP    core_ws         6.1.2230
std STATE               NOOP    core_ws         6.1.2250
std SWAP                NOOP    core_ws         6.1.2260
std THEN                NOOP    core_ws         6.1.2270
std TYPE                NOOP    core_ws         6.1.2310
std U.                  NOOP    core_ws         6.1.2320
std U<                  NOOP    core_ws         6.1.2340
std UM*                 NOOP    core_ws         6.1.2360
std UM/MOD              NOOP    core_ws         6.1.2370
std UNLOOP              NOOP    core_ws         6.1.2380
std UNTIL               NOOP    core_ws         6.1.2390
std VARIABLE            defvar  core_ws         6.1.2410
std WHILE               NOOP    core_ws         6.1.2430
std WORD                NOOP    core_ws         6.1.2450
std XOR                 NOOP    core_ws         6.1.2490
std [                  hstate=0 core_ws         6.1.2500
std [']                 skipw   numeric         6.1.2510
std [CHAR]              skipw   numeric         6.1.2520
std ]                  hstate=1 core_ws         6.1.2540
std #TIB                NOOP    core_ext_ws     6.2.0060
std .(                  skip)   commentary      6.2.0200
std .R                  NOOP    core_ext_ws     6.2.0210
std 0<>                 NOOP    core_ext_ws     6.2.0260
std 0>                  NOOP    core_ext_ws     6.2.0280
std 2>R                 NOOP    core_ext_ws     6.2.0340
std 2R>                 NOOP    core_ext_ws     6.2.0410
std 2R@                 NOOP    core_ext_ws     6.2.0415
std :NONAME             NOOP    core_ext_ws     6.2.0455
std <>                  NOOP    core_ext_ws     6.2.0500
std ?DO                 NOOP    core_ext_ws     6.2.0620
std AGAIN               NOOP    core_ext_ws     6.2.0700
std C"                  skip"   numeric         6.2.0855
std CASE                NOOP    core_ext_ws     6.2.0873
std COMPILE,            NOOP    core_ext_ws     6.2.0945
std CONVERT             NOOP    core_ext_ws     6.2.0970
std ENDCASE             NOOP    core_ext_ws     6.2.1342
std ENDOF               NOOP    core_ext_ws     6.2.1343
std ERASE               NOOP    core_ext_ws     6.2.1350
std EXPECT              NOOP    core_ext_ws     6.2.1390
std FALSE               NOOP    numeric         6.2.1485
std HEX                 HEX     core_ext_ws     6.2.1660
std MARKER              defusr  core_ext_ws     6.2.1850
std NIP                 NOOP    core_ext_ws     6.2.1930
std OF                  NOOP    core_ext_ws     6.2.1950
std PAD                 NOOP    core_ext_ws     6.2.2000
std PARSE               NOOP    core_ext_ws     6.2.2008
std PICK                NOOP    core_ext_ws     6.2.2030
std QUERY               NOOP    core_ext_ws     6.2.2040
std REFILL              NOOP    core_ext_ws     6.2.2125
std RESTORE-INPUT       NOOP    core_ext_ws     6.2.2148
std ROLL                NOOP    core_ext_ws     6.2.2150
std SAVE-INPUT          NOOP    core_ext_ws     6.2.2182
std SOURCE-ID           NOOP    core_ext_ws     6.2.2218
std SPAN                NOOP    core_ext_ws     6.2.2240
std TIB                 NOOP    core_ext_ws     6.2.2290
std TO                  NOOP    core_ext_ws     6.2.2295
std TRUE                NOOP    numeric         6.2.2298
std TUCK                NOOP    core_ext_ws     6.2.2300
std U.R                 NOOP    core_ext_ws     6.2.2330
std U>                  NOOP    core_ext_ws     6.2.2350
std UNUSED              NOOP    core_ext_ws     6.2.2395
std VALUE               defval  core_ext_ws     6.2.2405
std WITHIN              NOOP    core_ext_ws     6.2.2440
std [COMPILE]           NOOP    core_ext_ws     6.2.2530
std BLK                 NOOP    block_ws        7.6.1.0790
std BLOCK               NOOP    block_ws        7.6.1.0800
std BUFFER              NOOP    block_ws        7.6.1.0820
std FLUSH               NOOP    block_ws        7.6.1.1559
std LOAD                NOOP    block_ws        7.6.1.1790
std SAVE-BUFFERS        NOOP    block_ws        7.6.1.2180
std UPDATE              NOOP    block_ws        7.6.1.2400
std EMPTY-BUFFERS       NOOP    block_ws        7.6.2.1330
std LIST                NOOP    block_ws        7.6.2.1770
std SCR                 NOOP    block_ws        7.6.2.2190
std THRU                NOOP    block_ws        7.6.2.2280
std 2CONSTANT           defdat  double_ws       8.6.1.0360
std 2LITERAL            NOOP    double_ws       8.6.1.0390
std 2VARIABLE           defvar  double_ws       8.6.1.0440
std D+                  NOOP    double_ws       8.6.1.1040
std D-                  NOOP    double_ws       8.6.1.1050
std D.                  NOOP    double_ws       8.6.1.1060
std D.R                 NOOP    double_ws       8.6.1.1070
std D0<                 NOOP    double_ws       8.6.1.1075
std D0=                 NOOP    double_ws       8.6.1.1080
std D2*                 NOOP    double_ws       8.6.1.1090
std D2/                 NOOP    double_ws       8.6.1.1100
std D<                  NOOP    double_ws       8.6.1.1110
std D=                  NOOP    double_ws       8.6.1.1120
std D>S                 NOOP    double_ws       8.6.1.1140
std DABS                NOOP    double_ws       8.6.1.1160
std DMAX                NOOP    double_ws       8.6.1.1210
std DMIN                NOOP    double_ws       8.6.1.1220
std DNEGATE             NOOP    double_ws       8.6.1.1230
std M*/                 NOOP    double_ws       8.6.1.1820
std M+                  NOOP    double_ws       8.6.1.1830
std 2ROT                NOOP    double_ws       8.6.2.0420
std DU<                 NOOP    double_ws       8.6.2.1270
std CATCH               NOOP    exception_ws    9.6.1.0875
std THROW               NOOP    exception_ws    9.6.1.2275
std AT-XY               NOOP    facilities_ws   10.6.1.0742
std KEY?                NOOP    facilities_ws   10.6.1.1755
std PAGE                NOOP    facilities_ws   10.6.1.2005
std EKEY                NOOP    facilities_ws   10.6.2.1305
std EKEY<CHAR           NOOP    facilities_ws   10.6.2.1306
std EKEY?               NOOP    facilities_ws   10.6.2.1307
std EMIT?               NOOP    facilities_ws   10.6.2.1325
std MS                  NOOP    facilities_ws   10.6.2.1905
std TIME&DATE           NOOP    facilities_ws   10.6.2.2292
std BIN                 NOOP    file_ws         11.6.1.0765
std CLOSE-FILE          NOOP    file_ws         11.6.1.0900
std CREATE-FILE         NOOP    file_ws         11.6.1.1010
std DELETE-FILE         NOOP    file_ws         11.6.1.1190
std FILE-POSITION       NOOP    file_ws         11.6.1.1520
std FILE-SIZE           NOOP    file_ws         11.6.1.1522
std INCLUDE-FILE        NOOP    file_ws         11.6.1.1717
std INCLUDED            "incfil file_ws         11.6.1.1718
std OPEN-FILE           NOOP    file_ws         11.6.1.1970
std R/O                 NOOP    file_ws         11.6.1.2054
std R/W                 NOOP    file_ws         11.6.1.2056
std READ-FILE           NOOP    file_ws         11.6.1.2080
std READ-LINE           NOOP    file_ws         11.6.1.2090
std REPOSITION-FILE     NOOP    file_ws         11.6.1.2142
std RESIZE-FILE         NOOP    file_ws         11.6.1.2147
std W/O                 NOOP    file_ws         11.6.1.2425
std WRITE-FILE          NOOP    file_ws         11.6.1.2480
std WRITE-LINE          NOOP    file_ws         11.6.1.2485
std FILE-STATUS         NOOP    file_ws         11.6.2.1524
std FLUSH-FILE          NOOP    file_ws         11.6.2.1560
std RENAME-FILE         NOOP    file_ws         11.6.2.2130
std >FLOAT              NOOP    fp_ws           12.6.1.0558
std D>F                 NOOP    fp_ws           12.6.1.1130
std F!                  NOOP    fp_ws           12.6.1.1400
std F*                  NOOP    fp_ws           12.6.1.1410
std F+                  NOOP    fp_ws           12.6.1.1420
std F-                  NOOP    fp_ws           12.6.1.1425
std F/                  NOOP    fp_ws           12.6.1.1430
std F0<                 NOOP    fp_ws           12.6.1.1440
std F0=                 NOOP    fp_ws           12.6.1.1450
std F<                  NOOP    fp_ws           12.6.1.1460
std F>D                 NOOP    fp_ws           12.6.1.1460
std F@                  NOOP    fp_ws           12.6.1.1472
std FALIGN              NOOP    fp_ws           12.6.1.1479
std FALIGNED            NOOP    fp_ws           12.6.1.1483
std FCONSTANT           defdat  fp_ws           12.6.1.1492
std FDEPTH              NOOP    fp_ws           12.6.1.1497
std FDROP               NOOP    fp_ws           12.6.1.1500
std FDUP                NOOP    fp_ws           12.6.1.1510
std FLITERAL            NOOP    fp_ws           12.6.1.1552
std FLOAT+              NOOP    fp_ws           12.6.1.1555
std FLOATS              NOOP    fp_ws           12.6.1.1556
std FLOOR               NOOP    fp_ws           12.6.1.1558
std FMAX                NOOP    fp_ws           12.6.1.1562
std FMIN                NOOP    fp_ws           12.6.1.1565
std FNEGATE             NOOP    fp_ws           12.6.1.1567
std FOVER               NOOP    fp_ws           12.6.1.1600
std FROT                NOOP    fp_ws           12.6.1.1610
std FROUND              NOOP    fp_ws           12.6.1.1612
std FSWAP               NOOP    fp_ws           12.6.1.1620
std FVARIABLE           defvar  fp_ws           12.6.1.1630
std REPRESENT           NOOP    fp_ws           12.6.1.2143
std DF!                 NOOP    fp_ws           12.6.2.1203
std DF@                 NOOP    fp_ws           12.6.2.1204
std DFALIGN             NOOP    fp_ws           12.6.2.1205
std DFALIGNED           NOOP    fp_ws           12.6.2.1207
std DFLOAT+             NOOP    fp_ws           12.6.2.1208
std DFLOATS             NOOP    fp_ws           12.6.2.1209
std F**                 NOOP    fp_ws           12.6.2.1415
std F.                  NOOP    fp_ws           12.6.2.1427
std FABS                NOOP    fp_ws           12.6.2.1474
std FACOS               NOOP    fp_ws           12.6.2.1476
std FACOSH              NOOP    fp_ws           12.6.2.1477
std FALOG               NOOP    fp_ws           12.6.2.1484
std FASIN               NOOP    fp_ws           12.6.2.1486
std FASINH              NOOP    fp_ws           12.6.2.1487
std FATAN               NOOP    fp_ws           12.6.2.1488
std FATAN2              NOOP    fp_ws           12.6.2.1489
std FATANH              NOOP    fp_ws           12.6.2.1491
std FCOS                NOOP    fp_ws           12.6.2.1493
std FCOSH               NOOP    fp_ws           12.6.2.1494
std FE.                 NOOP    fp_ws           12.6.2.1513
std FEXP                NOOP    fp_ws           12.6.2.1515
std FEXPM1              NOOP    fp_ws           12.6.2.1516
std FLN                 NOOP    fp_ws           12.6.2.1553
std FLNP1               NOOP    fp_ws           12.6.2.1554
std FLOG                NOOP    fp_ws           12.6.2.1557
std FS.                 NOOP    fp_ws           12.6.2.1613
std FSIN                NOOP    fp_ws           12.6.2.1614
std FSINCOS             NOOP    fp_ws           12.6.2.1616
std FSINH               NOOP    fp_ws           12.6.2.1617
std FSQRT               NOOP    fp_ws           12.6.2.1618
std FTAN                NOOP    fp_ws           12.6.2.1625
std FTANH               NOOP    fp_ws           12.6.2.1626
std F~                  NOOP    fp_ws           12.6.2.1640
std PRECISION           NOOP    fp_ws           12.6.2.2035
std SET-PRECISION       NOOP    fp_ws           12.6.2.2200
std SF!                 NOOP    fp_ws           12.6.2.2202
std SF@                 NOOP    fp_ws           12.6.2.2203
std SFALIGN             NOOP    fp_ws           12.6.2.2204
std SFALIGNED           NOOP    fp_ws           12.6.2.2206
std SFLOAT+             NOOP    fp_ws           12.6.2.2207
std SFLOATS             NOOP    fp_ws           12.6.2.2208
std (LOCAL)             NOOP    local_ws        13.6.1.0086
std LOCALS|             NOOP    local_ws        13.6.2.1795
std ALLOCATE            NOOP    malloc_ws       14.6.1.0707
std FREE                NOOP    malloc_ws       14.6.1.1605
std RESIZE              NOOP    malloc_ws       14.6.1.2145
std .S                  NOOP    progtools_ws    15.6.1.0220
std ?                   NOOP    progtools_ws    15.6.1.0600
std DUMP                NOOP    progtools_ws    15.6.1.1280
std SEE                 NOOP    progtools_ws    15.6.1.2194
std WORDS               NOOP    progtools_ws    15.6.1.2465
std ;CODE               resunk  progtools_ws    15.6.2.0470
std AHEAD               NOOP    progtools_ws    15.6.2.0702
std ASSEMBLER           NOOP    progtools_ws    15.6.2.0740
std BYE                 NOOP    progtools_ws    15.6.2.0830
std CODE                defusr  progtools_ws    15.6.2.0930
std CS-PICK             NOOP    progtools_ws    15.6.2.1015
std CS-ROLL             NOOP    progtools_ws    15.6.2.1020
std EDITOR              NOOP    progtools_ws    15.6.2.1300
std FORGET              NOOP    progtools_ws    15.6.2.1580
std [ELSE]              NOOP    progtools_ws    15.6.2.2531
std [IF]                NOOP    progtools_ws    15.6.2.2532
std [THEN]              NOOP    progtools_ws    15.6.2.2533
std DEFINITIONS         NOOP    searchord_ws    16.6.1.1180
std FORTH-WORDLIST      NOOP    searchord_ws    16.6.1.1595
std GET-CURRENT         NOOP    searchord_ws    16.6.1.1643
std GET-ORDER           NOOP    searchord_ws    16.6.1.1647
std SEARCH-WORDLIST     NOOP    searchord_ws    16.6.1.2192
std SET-CURRENT         NOOP    searchord_ws    16.6.1.2195
std SET-ORDER           NOOP    searchord_ws    16.6.1.2197
std WORDLIST            NOOP    searchord_ws    16.6.1.2460
std ALSO                NOOP    searchord_ws    16.6.2.0715
std FORTH               NOOP    searchord_ws    16.6.2.1590
std ONLY                NOOP    searchord_ws    16.6.2.1965
std ORDER               NOOP    searchord_ws    16.6.2.1985
std PREVIOUS            NOOP    searchord_ws    16.6.2.2037
std -TRAILING           NOOP    string_ws       17.6.1.0170
std /STRING             NOOP    string_ws       17.6.1.0245
std BLANK               NOOP    string_ws       17.6.1.0780
std CMOVE               NOOP    string_ws       17.6.1.0910
std CMOVE>              NOOP    string_ws       17.6.1.0920
std COMPARE             NOOP    string_ws       17.6.1.0935
std SEARCH              NOOP    string_ws       17.6.1.2191
std SLITERAL            NOOP    string_ws       17.6.1.2212

_DEFINITIONS

\ Revision history
\ 0. Released to guinea pigs via comp.lang.forth