--- gforth/kernel/require.fs 2000/09/06 08:47:15 1.13 +++ gforth/kernel/require.fs 2007/12/31 18:40:26 1.33 @@ -1,12 +1,12 @@ \ require.fs -\ Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,1998,2000,2003,2006 Free Software Foundation, Inc. \ This file is part of Gforth. \ Gforth is free software; you can redistribute it and/or \ 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. \ This program is distributed in the hope that it will be useful, @@ -15,24 +15,19 @@ \ GNU General Public License for more details. \ You should have received a copy of the GNU General Public License -\ along with this program; if not, write to the Free Software -\ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. \ Now: Kernel Module, Reloadable create included-files 0 , 0 , ( pointer to and count of included files ) -\ here ," ./the terminal" dup c@ swap 1 + swap , A, here 2 cells - -\ ./ is confusing for the search path stuff! There should be never a . -\ in sourcefilename.... -here ," #terminal#" dup c@ swap 1 + swap , A, here 2 cells - -create image-included-files 1 , A, ( pointer to and count of included files ) +\ note: these names must not contain a "/" or "\"; otherwise a part of +\ that name might be used when expanding "./" (see expandtopic). +here ," *somewhere*" dup c@ swap 1 + swap +, A, here 2 cells - +create image-included-files 1 , A, ( pointer to and count of included files ) \ included-files points to ALLOCATEd space, while image-included-files \ 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 \G The name of the source file which is currently the input \G source. The result is valid only while the file is being @@ -61,7 +56,7 @@ create image-included-files 1 , A, ( po \G @file{./foo.fs} included-files 2@ 0 ?do ( c-addr u addr ) - dup >r 2@ 2over compare 0= + dup >r 2@ 2over str= if 2drop rdrop unloop true EXIT @@ -77,20 +72,18 @@ create image-included-files 1 , A, ( po 2! ; : 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}. - loadfilename# @ >r - save-mem add-included-file ( file-id ) - included-files 2@ nip 1- loadfilename# ! - ['] include-file catch - r> loadfilename# ! - throw ; - +\G Include the file file-id with the name given by @var{c-addr u}. + save-mem 2dup add-included-file + includefilename 2@ 2>r 2dup includefilename 2! + ['] read-loop execute-parsing-named-file + 2r> includefilename 2! ; + : 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 ; -: 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 u}, if it is not @code{included} (or @code{required}) \G already. Currently this works by comparing the name of the file @@ -136,26 +129,12 @@ create image-included-files 1 , A, ( po \ REPEAT \ drop ; -\ : loadfilename#>str ( n -- adr len ) -\ \ this converts the filenumber into the string -\ loadfilenamecount @ swap - -\ needs^ @ -\ swap 0 ?DO dup 0= IF LEAVE THEN @ LOOP -\ dup IF cell+ count ELSE drop s" NOT FOUND" THEN ; - -: loadfilename#>str ( n -- adr len ) - included-files 2@ drop swap 2* cells + 2@ ; - : .strings ( addr u -- ) \ gforth \G list the strings from an array of string descriptors at addr \G with u entries, one per line. - included-files 2@ 2* cells bounds ?DO + 2* cells bounds ?DO cr I 2@ type 2 cells +LOOP ; : .included ( -- ) \ gforth \G list the names of the files that have been @code{included} - included-files 2@ .strings ; - -\ contains tools/newrequire.fs -\ \I $Id: require.fs,v 1.13 2000/09/06 08:47:15 anton Exp $ - + included-files 2@ 2 cells under+ 1- .strings ;