|
|
BSD 4.3
# DELAMC(1)
#
# Delaminate file using tab characters
#
# Thomas R. Hicks
#
# Last modified 7/10/83
#
procedure main(a)
local tabset, inpt, fylist, nxtarg
if (not a[1]) | a[1] == "?" then
Usage()
else if match("-t",a[1]) then # tab char given
tabset := cset(a[1][3:0])
else if ("-" == a[1]) then # standard input specified
inpt := &input
else if not(inpt := open(a[1])) then # file name assumed
{
write(&errout,"Cannot open ",a[1])
Usage()
}
nxtarg := 2
if /inpt then # no file arg yet
{
if not a[2] then
Usage()
else if match("-",a[2]) then # standard input specified
inpt := &input
else if not(inpt := open(a[2])) then # file name assumed
stop("Cannot open ",a[2])
nxtarg := 3
}
if 0 = *(fylist := doutfyls(a,nxtarg)) then
Usage()
/tabset := &ascii[10] # tab is default separator
delamrc(inpt,tabset,fylist) # call main routine
end
# Usage - write usage message
#
procedure Usage()
stop("usage: delamc [-tc] {infile | -} {outputfile | -}...")
end
# delamrc - do actual division of input file using tab chars
#
procedure delamrc(ifd,tabset,fylist)
local i, flen, line
while line := read(ifd) 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,i)
local lst, x
lst := []
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.