Diff for /gforth/kernel/require.fs between versions 1.24 and 1.29

version 1.24, 2003/01/20 19:17:59 version 1.29, 2006/01/31 15:25:44
Line 1 Line 1
 \ require.fs  \ require.fs
   
 \ Copyright (C) 1995,1996,1997,1998,2000 Free Software Foundation, Inc.  \ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc.
   
 \ This file is part of Gforth.  \ This file is part of Gforth.
   
Line 23 Line 23
 create included-files 0 , 0 , ( pointer to and count of included files )  create included-files 0 , 0 , ( pointer to and count of included files )
 \ note: these names must not contain a "/" or "\"; otherwise a part of  \ note: these names must not contain a "/" or "\"; otherwise a part of
 \ that name might be used when expanding "./" (see expandtopic).  \ that name might be used when expanding "./" (see expandtopic).
 here ," *a file*" dup c@ swap 1 + swap  here ," *somewhere*" dup c@ swap 1 + swap
 here ," *a block*" dup c@ swap 1 + swap  , A, here 2 cells -
 here ," *evaluated string*" dup c@ swap 1 + swap  create image-included-files 1 , A, ( pointer to and count of included files )
 here ," *the terminal*" dup c@ swap 1 + swap  
 , A, , A, , A, , A, here 8 cells -  
 create image-included-files 4 , A, ( pointer to and count of included files )  
 \ included-files points to ALLOCATEd space, while image-included-files  \ included-files points to ALLOCATEd space, while image-included-files
 \ points to ALLOTed objects, so it survives a save-system  \ points to ALLOTed objects, so it survives a save-system
   
Line 77  create image-included-files 4 , A, ( poi Line 74  create image-included-files 4 , A, ( poi
   
 has? new-input [IF]  has? new-input [IF]
 : included1 ( i*x file-id c-addr u -- j*x ) \ gforth  : included1 ( i*x file-id c-addr u -- j*x ) \ gforth
     \G Include the file file-id with the name given by @var{c-addr u}.  \G Include the file file-id with the name given by @var{c-addr u}.
     save-mem 2dup add-included-file ( file-id )      save-mem 2dup add-included-file
     ['] include-file2 catch      includefilename 2@ 2>r 2dup includefilename 2!
     throw ;      ['] read-loop execute-parsing-named-file
       2r> includefilename 2! ;
 [ELSE]  [ELSE]
 : included1 ( i*x file-id c-addr u -- j*x ) \ gforth  : included1 ( i*x file-id c-addr u -- j*x ) \ gforth
 \G Include the file file-id with the name given by @var{c-addr u}.  \G Include the file file-id with the name given by @var{c-addr u}.
     loadfilename 2@ 2>r      save-mem 2dup loadfilename>r
     save-mem 2dup loadfilename 2!      includefilename 2@ 2>r 2dup includefilename 2!
     add-included-file ( file-id )      add-included-file ( file-id )
     ['] include-file2 catch      ['] include-file2 catch
     2r> loadfilename 2!      2r> includefilename 2! r>loadfilename
     throw ;      throw ;
 [THEN]  [THEN]
   
 : included ( i*x c-addr u -- j*x ) \ file  : included2 ( i*x c-addr u -- j*x ) \ file
     \G @code{include-file} the file whose name is given by the string  
     \G @var{c-addr u}.  
     open-fpath-file throw included1 ;      open-fpath-file throw included1 ;
   
 : required ( i*x addr u -- j*x ) \ gforth  : required2 ( i*x addr u -- i*x ) \ gforth
     \G @code{include-file} the file with the name given by @var{addr  
     \G u}, if it is not @code{included} (or @code{required})  
     \G already. Currently this works by comparing the name of the file  
     \G (with path) against the names of earlier included files.  
     \ however, it may be better to fstat the file,      \ however, it may be better to fstat the file,
     \ and compare the device and inode. The advantages would be: no      \ and compare the device and inode. The advantages would be: no
     \ problems with several paths to the same file (e.g., due to      \ problems with several paths to the same file (e.g., due to
Line 118  has? new-input [IF] Line 110  has? new-input [IF]
   
 : include  ( ... "file" -- ... ) \ gforth  : include  ( ... "file" -- ... ) \ gforth
     \G @code{include-file} the file @var{file}.      \G @code{include-file} the file @var{file}.
     name included ;      name included2 ;
   
 : require  ( ... "file" -- ... ) \ gforth  : require  ( ... "file" -- ... ) \ gforth
     \G @code{include-file} @var{file} only if it is not included already.      \G @code{include-file} @var{file} only if it is not included already.
     name required ;      name required2 ;
   
   \ we go through execute-parsing to get nicer output on errors
   
   : included ( i*x c-addr u -- j*x ) \ file
       \G @code{include-file} the file whose name is given by the string
       \G @var{c-addr u}.
       ['] include execute-parsing ;
   
   : required ( i*x addr u -- i*x ) \ gforth
       \G @code{include-file} the file with the name given by @var{addr
       \G u}, if it is not @code{included} (or @code{required})
       \G already. Currently this works by comparing the name of the file
       \G (with path) against the names of earlier included files.
       ['] require execute-parsing ;
   
 \ : \I  \ : \I
 \   here   \   here 
Line 151  has? new-input [IF] Line 157  has? new-input [IF]
   
 : .included ( -- ) \ gforth  : .included ( -- ) \ gforth
     \G list the names of the files that have been @code{included}      \G list the names of the files that have been @code{included}
     included-files 2@ .strings ;      included-files 2@ 2 cells under+ 1- .strings ;

Removed from v.1.24  
changed lines
  Added in v.1.29


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