File:
[gforth] /
gforth /
ans-report.fs
Revision
1.13:
download - view:
text,
annotated -
select for diffs
Sat Dec 31 15:46:07 2005 UTC (17 years, 3 months ago) by
anton
Branches:
MAIN
CVS tags:
HEAD
updated the copyright year on many files
added FSF copyright header to complex.fs fft.fs regexp-test.fs regexp.fs
added fsl-util.fs to update-copyright-blacklist
\ report words used from the various wordsets
\ Copyright (C) 1996,1998,1999,2003,2005 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
\ of the License, or (at your option) any later version.
\ This program is distributed in the hope that it will be useful,
\ but WITHOUT ANY WARRANTY; without even the implied warranty of
\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\ 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., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
\ Use this program like this:
\ include it, then the program you want to check; then say print-ans-report
\ e.g., start it with
\ gforth ans-report.fs myprog.fs -e "print-ans-report bye"
\ Caveats:
\ Note that this program just checks which words are used, not whether
\ they are used in an ANS Forth conforming way!
\ Some words are defined in several wordsets in the standard. This
\ program reports them for only one of the wordsets, and not
\ necessarily the one you expect.
\ This program uses Gforth internals and won't be easy to port
\ to other systems.
\ !! ignore struct-voc stuff (dummy, [then] etc.).
vocabulary ans-report-words ans-report-words definitions
: wordset ( "name" -- )
latestxt >body
create
0 , \ link to next wordset
0 0 2, \ array of nfas
( lastlinkp ) latest swap ! \ set link ptr of last wordset
;
wordlist constant wordsets wordsets set-current
create CORE 0 , 0 0 2,
wordset CORE-EXT
wordset BLOCK
wordset BLOCK-EXT
wordset DOUBLE
wordset DOUBLE-EXT
wordset EXCEPTION
wordset EXCEPTION-EXT
wordset FACILITY
wordset FACILITY-EXT
wordset FILE
wordset FILE-EXT
wordset FLOAT
wordset FLOAT-EXT
wordset LOCAL
wordset LOCAL-EXT
wordset MEMORY
wordset SEARCH
wordset SEARCH-EXT
wordset STRING
wordset TOOLS
wordset TOOLS-EXT
wordset non-ANS
ans-report-words definitions
: answord ( "name wordset pronounciation" -- )
\ check the documentaion of an ans word
name { D: wordname }
name { D: wordset }
name { D: pronounciation }
wordname find-name
?dup-if
sp@ cell nextname create drop
wordset wordsets search-wordlist 0= abort" wordlist unknown" ,
endif ;
table constant answords answords set-current
warnings @ warnings off
include ./answords.fs
warnings !
ans-report-words definitions
: add-unless-present ( nt addr -- )
\ add nt to array described by addr 2@, unless it contains nt
>r ( nt )
r@ 2@ bounds
u+do ( nt )
dup i @ =
if
drop rdrop UNLOOP EXIT
endif
cell
+loop
r@ 2@ cell extend-mem r> 2!
( nt addr ) ! ;
: note-name ( nt -- )
\ remember name in the appropriate wordset, unless already there
\ or the word is defined in the checked program
dup [ here ] literal > \ word defined by the application
over locals-buffer dup 1000 + within or \ or a local
if
drop EXIT
endif
sp@ cell answords search-wordlist ( nt xt true | nt false )
if \ ans word
>body @ >body
else \ non-ans word
[ get-order wordsets swap 1+ set-order ] non-ANS [ previous ]
endif
( nt wordset ) cell+ add-unless-present ;
: find¬e-name ( c-addr u -- nt/0 )
\ find-name replacement. Takes note of all the words used.
lookup @ (search-wordlist) dup
if
dup note-name
endif ;
: replace-word ( xt cfa -- )
\ replace word at cfa with xt. !! This is quite general-purpose
\ and should migrate elsewhere.
\ the following no longer works with primitive-centric hybrid threading:
\ dodefer: over code-address!
\ >body ! ;
dup @ docol: <> -12 and throw \ for colon defs only
>body ['] branch xt>threaded over !
cell+ >r >body r> ! ;
: print-names ( endaddr startaddr -- )
space 1 -rot
u+do ( pos )
i @ name>string nip 1+ { len }
len + ( newpos )
dup cols 4 - >= if
cr space drop len 1+
endif
i @ .name
cell +loop
drop ;
forth definitions
ans-report-words
: print-ans-report ( -- )
cr
." The program uses the following words" cr
[ get-order wordsets swap 1+ set-order ] [(')] core [ previous ]
begin
dup 0<>
while
dup >r name>int >body dup @ swap cell+ 2@ dup
if
." from " r@ .name ." :" cr
bounds print-names cr
else
2drop
endif
rdrop
repeat
drop ;
\ the following sequence "' replace-word forth execute" is necessary
\ to restore the default search order without effect on the "used
\ word" lists
' find¬e-name ' find-name ' replace-word forth execute
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>