version 1.29, 2006/01/31 15:25:44
|
version 1.35, 2010/05/13 09:48:45
|
Line 1
|
Line 1
|
\ require.fs |
\ require.fs |
|
|
\ Copyright (C) 1995,1996,1997,1998,2000,2003 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1996,1997,1998,2000,2003,2006,2007 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
\ Gforth is free software; you can redistribute it and/or |
\ Gforth is free software; you can redistribute it and/or |
\ modify it under the terms of the GNU General Public License |
\ modify it under the terms of the GNU General Public License |
\ as published by the Free Software Foundation; either version 2 |
\ as published by the Free Software Foundation, either version 3 |
\ of the License, or (at your option) any later version. |
\ of the License, or (at your option) any later version. |
|
|
\ This program is distributed in the hope that it will be useful, |
\ This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
\ GNU General Public License for more details. |
\ GNU General Public License for more details. |
|
|
\ 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, see http://www.gnu.org/licenses/. |
\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
|
|
\ Now: Kernel Module, Reloadable |
\ Now: Kernel Module, Reloadable |
|
|
Line 34 create image-included-files 1 , A, ( poi
|
Line 33 create image-included-files 1 , A, ( poi
|
\G source. The result is valid only while the file is being |
\G source. The result is valid only while the file is being |
\G loaded. If the current input source is no (stream) file, the |
\G loaded. If the current input source is no (stream) file, the |
\G result is undefined. In Gforth, the result is valid during the |
\G result is undefined. In Gforth, the result is valid during the |
\G whole seesion (but not across @code{savesystem} etc.). |
\G whole session (but not across @code{savesystem} etc.). |
loadfilename 2@ ; |
loadfilename 2@ ; |
|
|
: sourceline# ( -- u ) \ gforth sourceline-number |
: sourceline# ( -- u ) \ gforth sourceline-number |
Line 72 create image-included-files 1 , A, ( poi
|
Line 71 create image-included-files 1 , A, ( poi
|
2/ cell / included-files 2! |
2/ cell / included-files 2! |
2! ; |
2! ; |
|
|
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 |
save-mem 2dup add-included-file |
includefilename 2@ 2>r 2dup includefilename 2! |
includefilename 2@ 2>r 2dup includefilename 2! |
['] read-loop execute-parsing-named-file |
['] read-loop execute-parsing-named-file |
2r> includefilename 2! ; |
2r> includefilename 2! ; |
[ELSE] |
|
: 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}. |
|
save-mem 2dup loadfilename>r |
|
includefilename 2@ 2>r 2dup includefilename 2! |
|
add-included-file ( file-id ) |
|
['] include-file2 catch |
|
2r> includefilename 2! r>loadfilename |
|
throw ; |
|
[THEN] |
|
|
|
: included2 ( i*x c-addr u -- j*x ) \ file |
: 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}. |
open-fpath-file throw included1 ; |
open-fpath-file throw included1 ; |
|
|
: required2 ( i*x addr u -- i*x ) \ gforth |
: 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. |
\ 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 110 has? new-input [IF]
|
Line 104 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 included2 ; |
name included ; |
|
|
: 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 required2 ; |
name required ; |
|
|
\ 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 |