version 1.11, 2000/08/17 12:46:59
|
version 1.35, 2010/05/13 09:48:45
|
Line 1
|
Line 1
|
\ require.fs |
\ require.fs |
|
|
\ Copyright (C) 1995,1996,1997,1998 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., 675 Mass Ave, Cambridge, MA 02139, USA. |
|
|
|
\ Now: Kernel Module, Reloadable |
\ Now: Kernel Module, Reloadable |
|
|
create included-files 0 , 0 , ( pointer to and count of included files ) |
create included-files 0 , 0 , ( pointer to and count of included files ) |
\ here ," ./the terminal" dup c@ swap 1 + swap , A, here 2 cells - |
\ note: these names must not contain a "/" or "\"; otherwise a part of |
\ ./ is confusing for the search path stuff! There should be never a . |
\ that name might be used when expanding "./" (see expandtopic). |
\ in sourcefilename.... |
here ," *somewhere*" dup c@ swap 1 + swap |
here ," #terminal#" dup c@ swap 1 + swap , A, here 2 cells - |
, A, here 2 cells - |
create image-included-files 1 , A, ( pointer to and count of included files ) |
create image-included-files 1 , 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 |
|
|
: loadfilename ( -- a-addr ) \ gforth-internal |
|
\G @i{a-addr} @code{2@@} produces the current file name ( @i{c-addr u} ) |
|
included-files 2@ loadfilename# @ min 2* cells + ; |
|
|
|
: sourcefilename ( -- c-addr u ) \ gforth |
: sourcefilename ( -- c-addr u ) \ gforth |
\G The name of the source file which is currently the input |
\G The name of the source file which is currently the input |
\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 61 create image-included-files 1 , A, ( po
|
Line 56 create image-included-files 1 , A, ( po
|
\G @file{./foo.fs} |
\G @file{./foo.fs} |
included-files 2@ 0 |
included-files 2@ 0 |
?do ( c-addr u addr ) |
?do ( c-addr u addr ) |
dup >r 2@ 2over compare 0= |
dup >r 2@ 2over str= |
if |
if |
2drop rdrop unloop |
2drop rdrop unloop |
true EXIT |
true EXIT |
Line 77 create image-included-files 1 , A, ( po
|
Line 72 create image-included-files 1 , A, ( po
|
2! ; |
2! ; |
|
|
: 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# @ >r |
save-mem 2dup add-included-file |
save-mem add-included-file ( file-id ) |
includefilename 2@ 2>r 2dup includefilename 2! |
included-files 2@ nip 1- loadfilename# ! |
['] read-loop execute-parsing-named-file |
['] include-file catch |
2r> includefilename 2! ; |
r> loadfilename# ! |
|
throw ; |
|
|
|
: included ( 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 @code{include-file} the file whose name is given by the string |
\G @var{c-addr u}. |
\G @var{c-addr u}. |
open-fpath-file throw included1 ; |
open-fpath-file throw included1 ; |
|
|
: required ( i*x addr u -- j*x ) \ gforth |
: required ( i*x addr u -- i*x ) \ gforth |
\G @code{include-file} the file with the name given by @var{addr |
\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 u}, if it is not @code{included} (or @code{required}) |
\G already. Currently this works by comparing the name of the file |
\G already. Currently this works by comparing the name of the file |
Line 117 create image-included-files 1 , A, ( po
|
Line 110 create image-included-files 1 , A, ( po
|
\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 required ; |
|
|
0 [IF] |
\ : \I |
: \I |
\ here |
here |
\ 0 word count |
0 word count |
\ string, |
string, |
\ needsrcs^ @ ! ; |
needsrcs^ @ ! ; |
|
|
\ : .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} |
\ cr |
cr |
\ needs^ @ |
needs^ @ |
\ BEGIN dup |
BEGIN dup |
\ WHILE dup cell+ count type cr |
WHILE dup cell+ count type cr |
\ 5 spaces |
5 spaces |
\ dup cell+ count + aligned |
dup cell+ count + aligned |
\ @ dup IF count type ELSE drop THEN cr |
@ dup IF count type ELSE drop THEN cr |
\ @ |
@ |
\ REPEAT |
REPEAT |
\ drop ; |
drop ; |
|
|
: .strings ( addr u -- ) \ gforth |
: loadfilename#>str ( n -- adr len ) |
\G list the strings from an array of string descriptors at addr |
\ this converts the filenumber into the string |
\G with u entries, one per line. |
loadfilenamecount @ swap - |
2* cells bounds ?DO |
needs^ @ |
cr I 2@ type 2 cells +LOOP ; |
swap 0 ?DO dup 0= IF LEAVE THEN @ LOOP |
|
dup IF cell+ count ELSE drop s" NOT FOUND" THEN ; |
|
[THEN] |
|
|
|
: loadfilename#>str ( n -- adr len ) |
|
included-files 2@ drop swap 2* cells + 2@ ; |
|
|
|
: .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@ 2* cells bounds ?DO |
included-files 2@ 2 cells under+ 1- .strings ; |
cr I 2@ type 2 cells +LOOP ; |
|
|
|
\ contains tools/newrequire.fs |
|
\ \I $Id$ |
|
|
|