summaryrefslogtreecommitdiff
path: root/ipl/progs/icontent.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/icontent.icn')
-rw-r--r--ipl/progs/icontent.icn75
1 files changed, 75 insertions, 0 deletions
diff --git a/ipl/progs/icontent.icn b/ipl/progs/icontent.icn
new file mode 100644
index 0000000..51f461a
--- /dev/null
+++ b/ipl/progs/icontent.icn
@@ -0,0 +1,75 @@
+############################################################################
+#
+# File: icontent.icn
+#
+# Subject: Program to list Icon procedures
+#
+# Author: Robert J. Alexander
+#
+# Date: August 17, 1990
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Builds a list, in Icon comment format, of procedures and records
+# in an Icon source file.
+#
+# Multiple files can be specified as arguments, and will be processed
+# in sequence. A file name of "-" represents the standard input file.
+# If there are no arguments, standard input is processed.
+#
+# usage: icontent <options> <Icon source file>...
+# options: -s sort names alphabetically (default is in
+# order of occurrence)
+# -l list in single column (default is to list
+# in multiple columns)
+#
+
+link options,colmize
+
+procedure main(arg)
+ local opt,linear,Colmize,Sort,namechar,fn,f,names,line,name,type
+ #
+ # Process command line options and file names.
+ #
+ opt := options(arg,"sl")
+ linear := opt["l"]
+ Colmize := if \opt["l"] then proc("!",1) else colmize
+ Sort := if \opt["s"] then sort else 1
+ if *arg = 0 then arg := ["-"] # if no arguments, standard input
+ namechar := &letters ++ &digits ++ "_"
+ #
+ # Loop to process files.
+ #
+ every fn := !arg do {
+ f := if fn == "-" then &input else {
+ if not (fn[-4:0] == ".icn") then fn ||:= ".icn"
+ open(fn) | stop("Can't open input file \"",fn,"\"")
+ }
+ names := []
+ write("# Procedures and Records",
+ if f === &input then "" else " in " || fn,":")
+ #
+ # Loop to process lines of file (in string scanning mode).
+ #
+ while line := read(f) do line ? {
+ if (tab(many(' \t')) | "")\1 &
+ type := (=("procedure" | "record"))\1 &
+ (tab(many(' \t')) | "")\1 & name := tab(many(namechar)) &
+ (tab(many(' \t')) | "")\1 & ="(" then {
+ put(names,name || if type == "procedure" then "()" else ".")
+ }
+ }
+ #
+ # Close this file.
+ #
+ close(&input ~=== f)
+ every write("# ",Colmize(Sort(names),71))
+ }
+ #
+ # End of program.
+ #
+end