Annotation of gforth/kernel/require.fs, revision 1.1

1.1     ! anton       1: \ require.fs
        !             2: 
        !             3: \ Copyright (C) 1995-1997 Free Software Foundation, Inc.
        !             4: 
        !             5: \ This file is part of Gforth.
        !             6: 
        !             7: \ Gforth is free software; you can redistribute it and/or
        !             8: \ modify it under the terms of the GNU General Public License
        !             9: \ as published by the Free Software Foundation; either version 2
        !            10: \ of the License, or (at your option) any later version.
        !            11: 
        !            12: \ This program is distributed in the hope that it will be useful,
        !            13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: \ GNU General Public License for more details.
        !            16: 
        !            17: \ You should have received a copy of the GNU General Public License
        !            18: \ along with this program; if not, write to the Free Software
        !            19: \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20: 
        !            21: \ Now: Kernel Module, Reloadable
        !            22: 
        !            23: \ $Id: newrequire.fs,v 1.2 1996/02/28 17:37:20 jeans Exp jeans $
        !            24: 
        !            25: create included-files 0 , 0 , ( pointer to and count of included files )
        !            26: here ," the terminal" dup c@ swap 1 + swap , A, here 2 cells -
        !            27: create image-included-files  1 , A, ( pointer to and count of included files )
        !            28: \ included-files points to ALLOCATEd space, while image-included-files
        !            29: \ points to ALLOTed objects, so it survives a save-system
        !            30: 
        !            31: : loadfilename ( -- a-addr )
        !            32:     \G a-addr 2@ produces the current file name ( c-addr u )
        !            33:     included-files 2@ loadfilename# @ min 2* cells + ;
        !            34: 
        !            35: : sourcefilename ( -- c-addr u ) \ gforth
        !            36:     \G the name of the source file which is currently the input
        !            37:     \G source.  The result is valid only while the file is being
        !            38:     \G loaded.  If the current input source is no (stream) file, the
        !            39:     \G result is undefined.
        !            40:     loadfilename 2@ ;
        !            41: 
        !            42: : sourceline# ( -- u ) \ gforth                sourceline-number
        !            43:     \G the line number of the line that is currently being interpreted
        !            44:     \G from a (stream) file. The first line has the number 1. If the
        !            45:     \G current input source is no (stream) file, the result is
        !            46:     \G undefined.
        !            47:     loadline @ ;
        !            48: 
        !            49: : init-included-files ( -- )
        !            50:     image-included-files 2@ 2* cells save-mem drop ( addr )
        !            51:     image-included-files 2@ nip included-files 2! ;
        !            52: 
        !            53: : included? ( c-addr u -- f ) \ gforth
        !            54:     \G true, iff filename c-addr u is in included-files
        !            55:     included-files 2@ 0
        !            56:     ?do ( c-addr u addr )
        !            57:        dup >r 2@ 2over compare 0=
        !            58:        if
        !            59:            2drop rdrop unloop
        !            60:            true EXIT
        !            61:        then
        !            62:        r> cell+ cell+
        !            63:     loop
        !            64:     2drop drop false ;
        !            65: 
        !            66: : add-included-file ( c-addr u -- ) \ gforth
        !            67:     \G add name c-addr u to included-files
        !            68:     included-files 2@ 2* cells 2 cells extend-mem
        !            69:     2/ cell / included-files 2!
        !            70:     2! ;
        !            71: 
        !            72: : included1 ( i*x file-id c-addr u -- j*x ) \ gforth
        !            73:     \G include the file file-id with the name given by c-addr u
        !            74:     loadfilename# @ >r
        !            75:     save-mem add-included-file ( file-id )
        !            76:     included-files 2@ nip 1- loadfilename# !
        !            77:     ['] include-file catch
        !            78:     r> loadfilename# !
        !            79:     throw ;
        !            80:     
        !            81: : included ( i*x addr u -- j*x ) \ file
        !            82:     open-fpath-file included1 ;
        !            83: 
        !            84: : required ( i*x addr u -- j*x ) \ gforth
        !            85:     \G include the file with the name given by addr u, if it is not
        !            86:     \G included already. Currently this works by comparing the name of
        !            87:     \G the file (with path) against the names of earlier included
        !            88:     \G files; however, it would probably be better to fstat the file,
        !            89:     \G and compare the device and inode. The advantages would be: no
        !            90:     \G problems with several paths to the same file (e.g., due to
        !            91:     \G links) and we would catch files included with include-file and
        !            92:     \G write a require-file.
        !            93:     open-fpath-file 2dup included?
        !            94:     if
        !            95:        2drop close-file throw
        !            96:     else
        !            97:        included1
        !            98:     then ;
        !            99: 
        !           100: \ INCLUDE                                               9may93jaw
        !           101: 
        !           102: : include  ( "file" -- ) \ gforth
        !           103:   name included ;
        !           104: 
        !           105: : require  ( "file" -- ) \ gforth
        !           106:   name required ;
        !           107: 
        !           108: 0 [IF]
        !           109: : \I
        !           110:   here 
        !           111:   0 word count
        !           112:   string,
        !           113:   needsrcs^ @ ! ;
        !           114: 
        !           115: : .modules
        !           116:   cr
        !           117:   needs^ @
        !           118:   BEGIN                dup 
        !           119:   WHILE                dup cell+ count type cr
        !           120:                5 spaces
        !           121:                dup cell+ count + aligned
        !           122:                @ dup IF count type ELSE drop THEN cr
        !           123:                @
        !           124:   REPEAT
        !           125:   drop ;
        !           126: 
        !           127: : loadfilename#>str ( n -- adr len )
        !           128: \ this converts the filenumber into the string
        !           129:   loadfilenamecount @ swap -
        !           130:   needs^ @
        !           131:   swap 0 ?DO dup 0= IF LEAVE THEN @ LOOP 
        !           132:   dup IF cell+ count ELSE drop s" NOT FOUND" THEN ;
        !           133: [THEN]
        !           134: 
        !           135: : loadfilename#>str ( n -- adr len )
        !           136:     included-files 2@ drop swap 2* cells + 2@ ;
        !           137: 
        !           138: : .modules
        !           139:     included-files 2@ 2* cells bounds ?DO
        !           140:        cr I 2@ type  2 cells +LOOP ;  
        !           141: 
        !           142: \ contains tools/newrequire.fs
        !           143: \ \I $Id: newrequire.fs,v 1.2 1996/02/28 17:37:20 jeans Exp jeans $
        !           144: 

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