diff options
Diffstat (limited to 'ipl/progs/ilump.icn')
-rw-r--r-- | ipl/progs/ilump.icn | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/ipl/progs/ilump.icn b/ipl/progs/ilump.icn new file mode 100644 index 0000000..caf9c4a --- /dev/null +++ b/ipl/progs/ilump.icn @@ -0,0 +1,104 @@ +############################################################################ +# +# File: ilump.icn +# +# Subject: Program to lump linked Icon source files +# +# Author: Gregg M. Townsend +# +# Date: November 14, 1994 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# usage: ilump [file...] +# +# ilump copies one or more Icon source files, incorporating recursively +# the source code for files named by "link" directives. This produces a +# standalone source program in one file, which is useful with certain +# profiling and visualization tools. +# +# Searching for link'd source files is similar to the action of Iconc +# under UNIX. If a link'd file is not found in the current directory, +# directories specified by the LPATH environment variable are tried. +# +############################################################################ + + +global path, todo + + +procedure main(args) + local fname + + path := [""] + getenv("LPATH") ? repeat { + tab(many(' ')) + if pos(0) then + break + put(path, tab(upto(' ')|0) || "/") + } + todo := args + if *todo = 0 then + dofile(&input) + while fname := get(todo) do + dofile(newfile(fname)) +end + + +# newfile(fname) -- open and return a file, if it wasn't seen earlier + +procedure newfile(fname) + local f, fullname + static done + initial done := set() + + if member(done, fname) then + fail + insert(done, fname) + if f := open(fullname := !path || fname) then { + write("\n\n\n#", right(" " || fullname, 78, "="), "\n\n\n") + return f + } + else { + write(&errout, "can't open ", fname) + write("\n\n\n#", right(" can't open " || fname, 78, "="), "\n\n\n") + fail + } +end + + +# dofile(f) -- copy one file, stacking file names seen on link directives + +procedure dofile(f) + local line, base + static idset + initial idset := &letters ++ &digits ++ '_' + + while line := read(f) do { + line ? { + tab(many(' \t')) + if ="link" & not any(idset) then { + write("#====== ", line) + repeat { + tab(many(' \t,')) + if pos(0) | ="#" then + break + if ="\"" then + base := tab(upto('"')|0) + else + base := tab(many(idset)) | break + put(todo, base || ".icn") + } + } + else { + write(line) + } + } + } + + close(f) +end |