Diff for /gforth/see.fs between versions 1.9 and 1.14

version 1.9, 1995/11/07 18:06:59 version 1.14, 1996/08/26 10:07:21
Line 25 Line 25
   
 \ Ideas:        Level should be a stack  \ Ideas:        Level should be a stack
   
   require termsize.fs
   
 decimal  decimal
   
 \ Screen format words                                   16may93jaw  \ Screen format words                                   16may93jaw
Line 56  DEFER nlcount ' noop IS nlcount Line 58  DEFER nlcount ' noop IS nlcount
                 XPos @ Level @ = ?Exit                  XPos @ Level @ = ?Exit
                 C-Formated @ IF                  C-Formated @ IF
                 C-Output @                  C-Output @
                 IF C-Clearline @ IF 80 XPos @ - spaces                  IF C-Clearline @ IF cols XPos @ - spaces
                                  ELSE cr THEN                                   ELSE cr THEN
                 1 YPos +! 0 XPos !                  1 YPos +! 0 XPos !
                 Level @ spaces                  Level @ spaces
Line 64  DEFER nlcount ' noop IS nlcount Line 66  DEFER nlcount ' noop IS nlcount
   
 : warp?         ( len -- len )  : warp?         ( len -- len )
                 nlflag @ IF (nl) nlflag off THEN                  nlflag @ IF (nl) nlflag off THEN
                 XPos @ over + 79 u> IF (nl) THEN ;                  XPos @ over + cols u>= IF (nl) THEN ;
   
 : ctype         ( adr len -- )  : ctype         ( adr len -- )
                 warp? dup XPos +! C-Output @ IF type ELSE 2drop THEN ;                  warp? dup XPos +! C-Output @ IF type ELSE 2drop THEN ;
Line 200  VARIABLE C-Pass Line 202  VARIABLE C-Pass
 : ahead? ( n -- flag ) 0> ;  : ahead? ( n -- flag ) 0> ;
   
 : c-(compile)  : c-(compile)
         Display? IF s" POSTPONE " Com# .string      Display?
                     dup @ look 0= ABORT" SEE: No valid XT"      IF
                     cell+ count $1F and 0 .string bl cemit          s" POSTPONE " Com# .string
                  THEN          dup @ look 0= ABORT" SEE: No valid XT"
         cell+ ;          name>string 0 .string bl cemit
       THEN
       cell+ ;
   
 : c-lit  : c-lit
     Display? IF      Display? IF
Line 455  CREATE C-Table Line 459  CREATE C-Table
         ' f@local# A,       ' c-f@local# A,          ' f@local# A,       ' c-f@local# A,
         ' laddr# A,         ' c-laddr# A,          ' laddr# A,         ' c-laddr# A,
         ' lp+!# A,          ' c-lp+!# A,          ' lp+!# A,          ' c-lp+!# A,
         ' (s") A,           ' c-s" A,          ' (s") A,           ' c-s" A,
         ' (.") A,           ' c-." A,          ' (.") A,           ' c-." A,
         ' "lit A,           ' c-c" A,          ' "lit A,           ' c-c" A,
         ' leave A,          ' c-leave A,          comp' leave drop A, ' c-leave A,
         ' ?leave A,         ' c-?leave A,          comp' ?leave drop A, ' c-?leave A,
         ' (do) A,           ' c-do A,          ' (do) A,           ' c-do A,
         ' (?do) A,          ' c-?do A,          ' (?do) A,          ' c-?do A,
         ' (for) A,          ' c-for A,          ' (for) A,          ' c-for A,
Line 491  CREATE C-Table Line 495  CREATE C-Table
         WHILE   2 pick <>          WHILE   2 pick <>
         WHILE   2 cells +          WHILE   2 cells +
         REPEAT          REPEAT
         nip cell+ @ EXECUTE          nip cell+ perform
         true          true
         ELSE          ELSE
         2drop drop false          2drop drop false
Line 531  CREATE C-Table Line 535  CREATE C-Table
         Branches on ;          Branches on ;
   
 : makepass ( a-addr -- )  : makepass ( a-addr -- )
         c-stop off      c-stop off
         BEGIN      BEGIN
                 analyse          analyse
                 c-stop @          c-stop @
         UNTIL drop ;      UNTIL drop ;
   
 DEFER dosee  Defer xt-see-xt ( xt -- )
   \ this one is just a forward declaration for indirect recursion
 : dopri .name ." is primitive" cr ;  
 : dovar ." Variable " .name cr ;  : .defname ( xt c-addr u -- )
 : douse ." User " .name cr ;      rot look
 : docon  dup cell+ (name>) >body @ . ." Constant " .name cr ;      if ( c-addr u nfa )
 : doval  dup cell+ (name>) >body @ . ." Value " .name cr ;          -rot type space .name
 : dodef ." Defer " dup >r .name cr      else
     r@ cell+ (name>) >body @ look          drop ." noname " type
     0= ABORT" SEE: No valid xt in deferred word"      then
     dup dosee cr      space ;
     ." ' " .name r> ." IS " .name cr ;  
 : dodoe ." Create " dup .name cr  Defer discode ( addr -- )
         S" DOES> " Com# .string XPos @ Level ! name>  \  hook for the disassembler: disassemble code at addr (as far as the
         >does-code dup C-Pass @ DebugMode = IF ScanMode c-pass ! EXIT THEN  \  disassembler thinks is sensible)
         ScanMode c-pass ! dup makepass  :noname ( addr -- )
         DisplayMode c-pass ! makepass ;      drop ." ..." ;
 : doali here @ .name ." Alias " .name cr  IS discode
         here @ dosee ;  
 : docol S" : " Com# .string  : seecode ( xt -- )
         dup cell+ count $1F and 2 pick wordinfo .string bl cemit bl cemit      dup s" Code" .defname
         ( XPos @ ) 2 Level !      >body discode
         name> >body      ."  end-code" cr ;
         C-Pass @ DebugMode = IF ScanMode c-pass ! EXIT THEN  : seevar ( xt -- )
         ScanMode c-pass ! dup makepass      s" Variable" .defname cr ;
         DisplayMode c-pass ! makepass ;  : seeuser ( xt -- )
       s" User" .defname cr ;
 create wordtypes  : seecon ( xt -- )
         Pri# ,   ' dopri A,      dup >body ?
         Var# ,   ' dovar A,      s" Constant" .defname cr ;
         Con# ,   ' docon A,  : seevalue ( xt -- )
         Val# ,   ' doval A,      dup >body ?
         Def# ,   ' dodef A,      s" Value" .defname cr ;
         Doe# ,   ' dodoe A,  : seedefer ( xt -- )
         Ali# ,   ' doali A,      dup >body @ xt-see-xt cr
         Col# ,   ' docol A,      dup s" Defer" .defname cr
         Use# ,   ' douse A,      >name dup ??? = if
         0 ,          drop ." lastxt >body !"
       else
 : (dosee) ( lfa -- )          ." IS " .name cr
         dup dup cell+ c@ >r      then ;
         wordinfo  : see-threaded ( addr -- )
         wordtypes      C-Pass @ DebugMode = IF
         BEGIN dup @ dup          ScanMode c-pass !
         WHILE 2 pick = IF cell+ @ nip EXECUTE          EXIT
                           r> dup 32 and IF ."  immediate" THEN      THEN
                                  64 and IF ."  restrict" THEN EXIT THEN      ScanMode c-pass ! dup makepass
               2 cells +      DisplayMode c-pass ! makepass ;
         REPEAT  : seedoes ( xt -- )
         2drop rdrop      dup s" create" .defname cr
         .name ." Don't know how to handle" cr ;      S" DOES> " Com# .string XPos @ Level !
       >does-code see-threaded ;
 ' (dosee) IS dosee  : seecol ( xt -- )
       dup s" :" .defname cr
 : xtc ( xt -- )       \ do see at xt      2 Level !
         Look 0= ABORT" SEE: No valid XT"      >body see-threaded ;
         cr c-init  : seefield ( xt -- )
         dosee ;      dup >body ." 0 " ? ." 0 0 "
       s" Field" .defname cr ;
 : see   name sfind 0= IF ." Word unknown" cr exit THEN  
         xtc ;  : xt-see ( xt -- )
       cr c-init
 : lfc   cr c-init cell+ dosee ;      dup >does-code
 : nfc   cr c-init dosee ;      if
           seedoes EXIT
       then
       dup forthstart u<
       if
           seecode EXIT
       then
       dup >code-address
       CASE
           docon: of seecon endof
           docol: of seecol endof
           dovar: of seevar endof
           douser: of seeuser endof
           dodefer: of seedefer endof
           dofield: of seefield endof
           over >body of seecode endof
           2drop abort" unknown word type"
       ENDCASE ;
   
   : (xt-see-xt) ( xt -- )
       xt-see cr ." lastxt" ;
   ' (xt-see-xt) is xt-see-xt
   
   : (.immediate) ( xt -- )
       ['] execute = if
           ."  immediate"
       then ;
   
   : name-see ( nfa -- )
       dup name>int >r
       dup name>comp 
       over r@ =
       if \ normal or immediate word
           swap xt-see (.immediate)
       else
           r@ ['] compile-only-error =
           if \ compile-only word
               swap xt-see (.immediate) ."  compile-only"
           else \ interpret/compile word
               r@ xt-see-xt cr
               swap xt-see-xt cr
               ." interpret/compile " over .name (.immediate)
           then
       then
       rdrop drop ;
   
   : see ( "name" -- ) \ tools
       name find-name dup 0=
       IF
           drop -&13 bounce
       THEN
       name-see ;
   
   

Removed from v.1.9  
changed lines
  Added in v.1.14


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>