summaryrefslogtreecommitdiff
path: root/ipl/progs/delamc.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/delamc.icn')
-rw-r--r--ipl/progs/delamc.icn118
1 files changed, 118 insertions, 0 deletions
diff --git a/ipl/progs/delamc.icn b/ipl/progs/delamc.icn
new file mode 100644
index 0000000..e6c6909
--- /dev/null
+++ b/ipl/progs/delamc.icn
@@ -0,0 +1,118 @@
+############################################################################
+#
+# File: delamc.icn
+#
+# Subject: Program to delaminate file using tab characters
+#
+# Author: Thomas R. Hicks
+#
+# Date: May 28, 1989
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program delaminates standard input into several output
+# files according to the separator characters specified by the
+# string following the -t option. It writes the fields in each
+# line to the corresponding output files as individual lines. If no
+# data occurs in the specified position for a given input line an
+# empty output line is written. This insures that all output files
+# contain the same number of lines as the input file.
+#
+# If - is used as an output file name, the corresponding field
+# is written to the standard output. If the -t option is not used,
+# an ascii horizontal tab character is assumed as the default field
+# separator.
+#
+# The use of delamc is illustrated by the following examples.
+# The command
+#
+# delamc labels opcodes operands
+#
+# writes the fields of standard input, each of which is separated
+# by a tab character, to the output files labels, opcodes, and
+# operands. The command
+#
+# delamc -t: scores names matric ps1 ps2 ps3
+#
+# writes the fields of standard input, each of which are separated
+# by a colon, to the indicated output files. The command
+#
+# delamc -t,: oldata f1 f2
+#
+# separates the fields using either a comma or a colon.
+#
+############################################################################
+#
+# Links: usage
+#
+############################################################################
+
+link usage
+
+procedure main(a)
+ local tabset, fylist, nxtarg
+ if match("-t",a[1]) then { # tab char given
+ tabset := cset(a[1][3:0])
+ pop(a) # get rid of that argument
+ }
+ if 0 = *(fylist := doutfyls(a)) then
+ Usage("delamc [-tc] {outputfile | -} ...")
+ /tabset := cset(&ascii[10]) # tab is default separator
+ delamrc(tabset,fylist) # call main routine
+end
+
+# delamrc - do actual division of input file using tab chars
+#
+procedure delamrc(tabset,fylist)
+ local i, flen, line
+ while line := read() do
+ {
+ i := 1
+ flen := *fylist
+ line ? while (i <= flen) do
+ {
+ if i = flen then
+ write(fylist[i][2],tab(0) | "")
+ else
+ write(fylist[i][2],tab(upto(tabset)) | tab(0) | "")
+ move(1)
+ i +:= 1
+ }
+ }
+end
+
+# doutfyls - process output file arguments; return list
+#
+procedure doutfyls(a)
+ local lst, x, i
+ lst := []
+ i := 1
+ while \a[i] do {
+ if x := llu(a[i],lst) then # already in list
+ lst |||:= [[a[i],lst[x][2]]]
+ else # not in list
+ if a[i] == "-" then # standard out
+ lst |||:= [[a[i],&output]]
+ else # a new file
+ if not (x := open(a[i],"w")) then
+ stop("Cannot open ",a[i]," for output")
+ else lst |||:= [[a[i],x]]
+ i +:= 1
+ }
+ return lst
+end
+
+# llu - lookup file name in output file list
+#
+procedure llu(str,lst)
+ local i
+ i := 1
+ while \lst[i] do {
+ if \lst[i][1] == str then return i
+ i +:= 1
+ }
+end