home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
delamc.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
3KB
|
119 lines
############################################################################
#
# 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