home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
ilnkxref.icn
< prev
next >
Wrap
Text File
|
2000-08-03
|
3KB
|
109 lines
############################################################################
#
# File: ilnkxref.icn
#
# Subject: Program to produce Icon link cross reference
#
# Author: Robert J. Alexander
#
# Date: August 3, 2000
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# Utility to create cross reference of library files used in Icon
# programs (i.e., those files named in "link" declarations).
#
# ilnkxref [-options] <icon source file>...
#
# options:
#
# -p sort by "popularity"
# -v report progress information
#
############################################################################
#
# Requires: UNIX
#
############################################################################
#
# Links: wrap, options, sort
#
############################################################################
link wrap, options, sort
procedure main(arg)
local comma, f, fill, fn, head, heads, i, libname, line, linesize, maxfile,
maxlib, opt, p, popularity, proctable, root, sep, spaces, verbose, x
#
# Initialize
#
opt := options(arg,"pv")
popularity := opt["p"] # sort by popularity
verbose := opt["v"] # report progress
if *arg = 0 then {
p := open("ls *.icn","rp")
while put(arg,read(p))
close(p)
}
spaces := ' \t'
sep := ' \t,'
proctable := table()
maxlib := maxfile := 0
#
# Gather information from files.
#
every fn := !arg do {
if \verbose then write(&errout,"File: ",fn)
f := open(fn) | stop("Can't open ",fn)
i := 0
every i := find("/",fn)
root := fn[1:find(".",fn,i + 1) | 0]
comma := &null
while line := read(f) do {
line ? {
tab(many(spaces))
if \comma | ="link " then {
if \verbose then write(&errout," ",line)
comma := &null
tab(many(spaces))
until pos(0) | match("#") do {
libname := tab(upto(sep) | 0)
put(\proctable[libname],root) | (proctable[libname] := [root])
maxlib <:= *libname
maxfile <:= *root
tab(many(spaces))
comma := &null
if comma := ="," then tab(many(spaces))
}
}
}
}
close(f)
}
#
# Print the cross reference table.
#
write()
proctable := sort(proctable)
if \popularity then proctable := isort(proctable,popproc)
every x := !proctable do {
head := left(x[1],maxlib + 3)
heads := [left("(" || *x[2] || ")",maxlib + 3),
fill := repl(" ",*head)]
linesize := 78 - *head
every x := !sort(x[2]) do
if write(head,wrap(left(x,maxfile + 2),linesize)) then
head := get(heads)
write(head,wrap())
}
end
procedure popproc(x)
return -*x[2]
end