File:
[gforth] /
gforth /
kernel /
require.fs
Revision
1.7:
download - view:
text,
annotated -
select for diffs
Fri Apr 16 22:19:54 1999 UTC (24 years, 5 months ago) by
crook
Branches:
MAIN
CVS tags:
HEAD
.cvsignore -- added a couple of other files I was tired of seeing flagged
by CVS
README -- added references to a couple more .fs files that are part of
the gforth distribution
blocks.fs -- fixed a bug in UPDATED? and added glossary entries for all
words.
colorize.fs -- fixed a bug that was introduced by a dictionary
structure change between 0.3.0 and 0.4.0 (I think.. it used to work
on 0.3.0 and I compared the color WORDS with the normal WORDS and found
some dirrerences
doc/gforth.1 -- minor tweaks to man page. I now think that I'd like to
be able to auto-generate the man page from what is now Chapter 3 of the
manual. That's in line with GNU's general attitude towards man pages..
doc/gforth.ds -- added stuff about blocks, revamped Chapter 3 and other
miscellaneous changes.
kernel/comp.fs -- glossary tweaks
kernel/require.fs -- glossary tweaks
1: \ require.fs
2:
3: \ Copyright (C) 1995,1996,1997,1998 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: create included-files 0 , 0 , ( pointer to and count of included files )
24: here ," ./the terminal" dup c@ swap 1 + swap , A, here 2 cells -
25: create image-included-files 1 , A, ( pointer to and count of included files )
26: \ included-files points to ALLOCATEd space, while image-included-files
27: \ points to ALLOTed objects, so it survives a save-system
28:
29: : loadfilename ( -- a-addr )
30: \G a-addr 2@ produces the current file name ( c-addr u )
31: included-files 2@ loadfilename# @ min 2* cells + ;
32:
33: : sourcefilename ( -- c-addr u ) \ gforth
34: \G The name of the source file which is currently the input
35: \G source. The result is valid only while the file is being
36: \G loaded. If the current input source is no (stream) file, the
37: \G result is undefined.
38: loadfilename 2@ ;
39:
40: : sourceline# ( -- u ) \ gforth sourceline-number
41: \G The line number of the line that is currently being interpreted
42: \G from a (stream) file. The first line has the number 1. If the
43: \G current input source is not a (stream) file, the result is
44: \G undefined.
45: loadline @ ;
46:
47: : init-included-files ( -- ) \ gforth
48: \G Clear the list of earlier included files.
49: image-included-files 2@ 2* cells save-mem drop ( addr )
50: image-included-files 2@ nip included-files 2! ;
51:
52: : included? ( c-addr u -- f ) \ gforth
53: \G True only if the file @var{c-addr u} is in the list of earlier
54: \G included files. If the file has been loaded, it may have been
55: \G specified as, say, foo.fs and found somewhere on the Forth
56: \G search path. To return true from @code{included?}, you must
57: \G specify the exact path to the file, even if that is
58: \G @code{./foo.fs}
59: included-files 2@ 0
60: ?do ( c-addr u addr )
61: dup >r 2@ 2over compare 0=
62: if
63: 2drop rdrop unloop
64: true EXIT
65: then
66: r> cell+ cell+
67: loop
68: 2drop drop false ;
69:
70: : add-included-file ( c-addr u -- ) \ gforth
71: \G add name c-addr u to included-files
72: included-files 2@ 2* cells 2 cells extend-mem
73: 2/ cell / included-files 2!
74: 2! ;
75:
76: : included1 ( i*x file-id c-addr u -- j*x ) \ gforth
77: \G Include the file file-id with the name given by @var{c-addr u}.
78: loadfilename# @ >r
79: save-mem add-included-file ( file-id )
80: included-files 2@ nip 1- loadfilename# !
81: ['] include-file catch
82: r> loadfilename# !
83: throw ;
84:
85: : included ( i*x c-addr u -- j*x ) \ file
86: \G @code{include-file} the file whose name is given by the string
87: \G @var{c-addr u}.
88: open-fpath-file throw included1 ;
89:
90: : required ( i*x addr u -- j*x ) \ gforth
91: \G @code{include-file} the file with the name given by @var{addr
92: \G u}, if it is not @code{included} (or @code{required})
93: \G already. Currently this works by comparing the name of the file
94: \G (with path) against the names of earlier included files.
95: \ however, it may be better to fstat the file,
96: \ and compare the device and inode. The advantages would be: no
97: \ problems with several paths to the same file (e.g., due to
98: \ links) and we would catch files included with include-file and
99: \ write a require-file.
100: open-fpath-file throw 2dup included?
101: if
102: 2drop close-file throw
103: else
104: included1
105: then ;
106:
107: \ INCLUDE 9may93jaw
108:
109: : include ( ... "file" -- ... ) \ gforth
110: \G @code{include-file} the file @var{file}.
111: name included ;
112:
113: : require ( ... "file" -- ... ) \ gforth
114: \G @code{include-file} @var{file} only if it is not included already.
115: name required ;
116:
117: 0 [IF]
118: : \I
119: here
120: 0 word count
121: string,
122: needsrcs^ @ ! ;
123:
124: : .modules
125: cr
126: needs^ @
127: BEGIN dup
128: WHILE dup cell+ count type cr
129: 5 spaces
130: dup cell+ count + aligned
131: @ dup IF count type ELSE drop THEN cr
132: @
133: REPEAT
134: drop ;
135:
136: : loadfilename#>str ( n -- adr len )
137: \ this converts the filenumber into the string
138: loadfilenamecount @ swap -
139: needs^ @
140: swap 0 ?DO dup 0= IF LEAVE THEN @ LOOP
141: dup IF cell+ count ELSE drop s" NOT FOUND" THEN ;
142: [THEN]
143:
144: : loadfilename#>str ( n -- adr len )
145: included-files 2@ drop swap 2* cells + 2@ ;
146:
147: : .modules
148: included-files 2@ 2* cells bounds ?DO
149: cr I 2@ type 2 cells +LOOP ;
150:
151: \ contains tools/newrequire.fs
152: \ \I $Id: require.fs,v 1.7 1999/04/16 22:19:54 crook Exp $
153:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>