! TAB
! Replaces tabs in the input file with the appropriate number of spaces,
! and/or introduces tabs into the output file to compress spaces.
! By default tabs are removed and replaced with spaces up to the next
! multiple of 8 columns. Setting TABIN=0 leaves tabs alone.
! By default TABOUT=0, so the output will contain no tabs except those
! which might have been let in when TABIN=0. Setting TABOUT to a nonzero
! value causes multiple spaces to be compressed by replacing them with tabs
! assuming that these would advance the "carriage" to the next multiple of
! TABOUT columns.
! RWT 07/12/90
begin
option "-nodiag-nocheck"
include "inc:util.imp"
string (255)infile="",outfile=""
integer intab=8,outtab=0
constinteger tab=9,cr=13,strip=0,leave=1,add=2
byte crs=strip
integer spaces=0,inpos=0,outpos=0,k
routine put(integer k)
if k=' ' then spaces = spaces+1 elsestart
if outtab>1 and spaces>1 start
while spaces+outpos>=outtab cycle
printsymbol(tab); spaces = spaces-outtab+outpos; outpos = 0
repeat
finish
while spaces>0 cycle
spaces = spaces-1
printsymbol(' '); outpos = outpos+1
outpos = 0 if outpos>=outtab
repeat
printsymbol(k); outpos = outpos+1
outpos = 0 if outpos>=outtab or k<32
finish
end
on 3,9 start
if event_event=3 start
selectoutput(0)
printstring("DETAB: "); printstring(event_message); newline
finish
stop
finish
defineparam("infile",infile,pamnodefault)
defineparam("outfile",outfile,pamnewgroup)
defineintparam("intab",intab,0)
defineintparam("outtab",outtab,0)
defineenumparam("StripCR,LeaveCR,AddCR",crs,0)
processparameters(cliparam)
outfile = infile if outfile=""
openinput(1,infile); openoutput(1,outfile)
selectinput(1); selectoutput(1)
cycle
readsymbol(k)
if k<32 start
if k=tab and intab#0 start
put(' ') and inpos = inpos+1 until inpos>=intab
elseif k=cr
put(cr) if crs=leave
elseif k=nl
put(cr) if crs=add; put(nl)
finishelse put(k)
inpos = 0
else
put(k); inpos = inpos+1; inpos = 0 if inpos>=intab
finish
repeat
end