# DELAMC # # Delaminate file using tab characters # # Thomas R. Hicks # # Last modified 2/9/86 by Ralph E. Griswold # procedure main(a) local tabset, fylist, nxtarg if match("-t",a[1]) then # tab char given tabset := cset(a[1][3:0]) if 0 = *(fylist := doutfyls(a)) then Usage() /tabset := cset(&ascii[10]) # tab is default separator delamrc(tabset,fylist) # call main routine end # Usage - write usage message # procedure Usage() stop("usage: delamc [-tc] {outputfile | -} ...") 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 := 2 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