summaryrefslogtreecommitdiff
path: root/ipl/progs/ilump.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/ilump.icn')
-rw-r--r--ipl/progs/ilump.icn104
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