! 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
