summaryrefslogtreecommitdiff
path: root/ipl/progs/colm.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/colm.icn')
-rw-r--r--ipl/progs/colm.icn131
1 files changed, 131 insertions, 0 deletions
diff --git a/ipl/progs/colm.icn b/ipl/progs/colm.icn
new file mode 100644
index 0000000..d1ac42c
--- /dev/null
+++ b/ipl/progs/colm.icn
@@ -0,0 +1,131 @@
+############################################################################
+#
+# File: colm.icn
+#
+# Subject: Program to arrange data into columns
+#
+# Author: Robert J. Alexander
+#
+# Date: December 5, 1989
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Program to arrange a number of data items, one per line, into
+# multiple columns. Items are arranged in column-wise order, that is,
+# the sequence runs down the first column, then down the second, etc.
+#
+# If a null line appears in the input stream, it signifies a break in
+# the list, and the following line is taken as a title for the
+# following data items. No title precedes the initial sequence of
+# items.
+#
+# Usage:
+#
+# colm [-w line_width] [-s space_between] [-m min_width]
+# [-t tab_width] [-x] [-d] [file ...]
+#
+# The parameters are:
+#
+# line_width: the maximum width allowed for output lines
+# (default: 80).
+# space_between: minimum number of spaces between items
+# (default: 2).
+# min_width: minimum width to be printed for each entry
+# (default: no minimum).
+# tab_width: tab width used to entab output lines.
+# (default: no tabs).
+# -x print items in row-wise order rather than
+# column-wise.
+# -d (distribute) distribute columns throughout available width.
+#
+# The command "colm -h" generates "help" text.
+#
+# This is a general utility, but it was written and tailored for a
+# specific purpose:
+#
+# This utility was written to rearrange the file name list from the
+# Macintosh Programmer's Workshop "Files" command into a more
+# convenient format. "Files" lists file names in a single column.
+# This program takes the list produced by "Files" and outputs a
+# multi-column list. The names are listed vertically within each
+# column, and the column width is computed dynamically depending upon
+# the sizes of the names listed. A recommendation is to create a
+# command file "lc" (List in Columns) as follows:
+#
+# Files {"Parameters"} | colm
+#
+# The output from the Files command is "piped" to the "colm" program
+# (this program), which prints its list in the current window.
+#
+# By putting both the "lc" command file and the "colm" program into
+# your {MPW}Tools folder, "lc" can be conveniently issued as a command
+# at any time, using the same parameters as the "Files" command.
+
+link options, colmize
+
+procedure main(arg)
+ local usage, help, opt, rowwise, distribute, maxcols, space, minwidth
+ local tabwidth, f, entries, entry
+ #
+ # Define usage and help strings.
+ #
+ usage := "_
+ Usage:\tcolm [-w line_width] [-s space_between] [-m min_width]\n_
+ \t\t[-t tab_width] [-x] [file ...]\n_
+ \tcolm -h for help"
+ help := "_
+ \tline_width:\tthe maximum width allowed for output lines\n_
+ \t\t\t(default: 80).\n_
+ \tspace_between:\tminimum number of spaces between items\n_
+ \t\t\t(default: 2).\n_
+ \tmin_width:\tminimum width to be printed for each entry\n_
+ \t\t\t(default: no minimum).\n_
+ \ttab_width:\ttab width used to print output lines.\n_
+ \t\t\t(default: no tabs).\n_
+ \t-x\t\tprint items in row-wise order rather than\n_
+ \t\t\tcolumn-wise.\n_
+ \t-d (distribute)\tdistribute columns throughout available width."
+ #
+ # Process command line options.
+ #
+ opt := options(arg,"hxdw+s+m+t+")
+ if \opt["h"] then write(usage,"\n\n",help) & exit()
+ rowwise := opt["x"]
+ distribute := opt["d"]
+ maxcols := \opt["w"] | 80
+ space := \opt["s"] | 2
+ minwidth := \opt["m"] | 0
+ tabwidth := (\opt["t"] | 0) + 1
+ if tabwidth = 1 then entab := 1
+ if *arg = 0 then arg := [&input]
+ #
+ # Loop to process input files.
+ #
+ while f := get(arg) do {
+ f := (&input === f) | open(f) | stop("Can't open ",f)
+ #
+ # Loop to process input groups (separated by empty lines).
+ #
+ repeat {
+ entries := []
+ #
+ # Loop to build a list of non-empty lines of an input file.
+ #
+ while entry := "" ~== read(f) do {
+ put(entries,entry)
+ }
+ #
+ # Now write the data in columns.
+ #
+ every write(entab(colmize(entries,maxcols,space,minwidth,
+ rowwise,distribute),tabwidth))
+ write("\n",read(f)) | break # print the title line, if any
+ }
+ close(f)
+ write()
+ }
+end