Diff for /gforth/stuff.fs between versions 1.4 and 1.20

version 1.4, 1996/05/23 15:13:13 version 1.20, 2001/08/07 09:39:30
Line 1 Line 1
 \ miscelleneous words  \ miscelleneous words
   
 \ Copyright (C) 1996 Free Software Foundation, Inc.  \ Copyright (C) 1996,1997,1998,2000 Free Software Foundation, Inc.
   
 \ This file is part of Gforth.  \ This file is part of Gforth.
   
Line 16 Line 16
   
 \ You should have received a copy of the GNU General Public License  \ You should have received a copy of the GNU General Public License
 \ along with this program; if not, write to the Free Software  \ along with this program; if not, write to the Free Software
 \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
   
 ' require alias needs  require glocals.fs
   
   ' require alias needs ( ... "name" -- ... ) \ gforth
   \G An alias for @code{require}; exists on other systems (e.g., Win32Forth).
 \ needs is an F-PC name. we will probably switch to 'needs' in the future  \ needs is an F-PC name. we will probably switch to 'needs' in the future
   
 \ a little more compiler security  \ a little more compiler security
Line 34  AUser CSP Line 37  AUser CSP
   
 \ DMIN and DMAX  \ DMIN and DMAX
   
 : dmin ( d1 d2 -- d ) \ double  : dmin ( d1 d2 -- d ) \ double d-min
     2over 2over d< IF  2swap  THEN 2drop ;  
   
 : dmax ( d1 d2 -- d ) \ double  
     2over 2over d> IF  2swap  THEN 2drop ;      2over 2over d> IF  2swap  THEN 2drop ;
   
 \ shell commands  
   
 0 Value $?  : dmax ( d1 d2 -- d ) \ double d-max
       2over 2over d< IF  2swap  THEN 2drop ;
   
 : system ( addr u -- ) \ gforth  \ shell commands
   
   0 Value $? ( -- n ) \ gforth dollar-question
   \G @code{Value} -- the exit status returned by the most recently executed
   \G @code{system} command.
   
   : system ( c-addr u -- ) \ gforth
   \G Pass the string specified by @var{c-addr u} to the host operating system
   \G for execution in a sub-shell.
     (system) throw TO $? ;      (system) throw TO $? ;
   
 : sh ( "..." -- ) \ gforth  : sh ( "..." -- ) \ gforth
   \G Parse a string and use @code{system} to pass it to the host
   \G operating system for execution in a sub-shell.
     '# parse cr system ;      '# parse cr system ;
   
   \ stuff
   
   : ]L ( compilation: n -- ; run-time: -- n ) \ gforth
       \G equivalent to @code{] literal}
       ] postpone literal ;
   
   : in-dictionary? ( x -- f )
       forthstart dictionary-end within ;
   
   : in-return-stack? ( addr -- f )
       rp0 @ swap - [ forthstart 6 cells + ]L @ u< ;
   
   \ const-does>
   
   : compile-literals ( w*u u -- ; run-time: -- w*u ) recursive
       \ compile u literals, starting with the bottommost one
       ?dup-if
           swap >r 1- compile-literals
           r> POSTPONE literal
       endif ;
   
   : compile-fliterals ( r*u u -- ; run-time: -- w*u ) recursive
       \ compile u fliterals, starting with the bottommost one
       ?dup-if
           { F: r } 1- compile-fliterals
           r POSTPONE fliteral
       endif ;
   
   : (const-does>) ( w*uw r*ur uw ur target "name" -- )
       \ define a colon definition "name" containing w*uw r*ur as
       \ literals and a call to target.
       { uw ur target }
       header docol: cfa, \ start colon def without stack junk
       ur compile-fliterals uw compile-literals
       target compile, POSTPONE exit reveal ;
   
   : const-does> ( run-time: w*uw r*ur uw ur "name" -- )
       \G Defines @var{name} and returns.@sp 0
       \G @var{name} execution: pushes @var{w*uw r*ur}, then performs the
       \G code following the @code{const-does>}.
       here >r 0 POSTPONE literal
       POSTPONE (const-does>)
       POSTPONE ;
       noname : POSTPONE rdrop
       lastxt r> cell+ ! \ patch the literal
   ; immediate
   
   \ !! rewrite slurp-file using slurp-fid
   : slurp-file ( c-addr1 u1 -- c-addr2 u2 )
       \G @var{c-addr1 u1} is the filename, @var{c-addr2 u2} is the file's contents
       r/o bin open-file throw >r
       r@ file-size throw abort" file too large"
       dup allocate throw swap
       2dup r@ read-file throw over <> abort" could not read whole file"
       r> close-file throw ;
   
   : slurp-fid { fid -- addr u }
       \G @var{addr u} is the content of the file @var{fid}
       0 0 begin ( awhole uwhole )
           dup 1024 + dup >r extend-mem ( anew awhole uwhole R: unew )
           rot r@ fid read-file throw ( awhole uwhole uread R: unew )
           r> 2dup =
       while ( awhole uwhole uread unew )
           2drop
       repeat
       - + dup >r resize throw r> ;

Removed from v.1.4  
changed lines
  Added in v.1.20


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