! COMPRESS utility: squeeze several columns into a single page.

%begin
%include "inc:util.imp"

%integer top=3      {blank lines at top of page}
%integer bot=3      {blank lines at bottom of page}
%integer page=66    {printing lines per page}
%integer cols=2     {number of columns}
%integer col=39     {printing chars per column}
%integer margin=2   {inter-column margin}
%integer left=0     {left-hand margin}
%integer wide

%constinteger   wrap=16_80000000  {over-long lines (ignore otherwise)}
%constinteger ignore=16_40000000  {discard spurious blank lines}

%integer bools=wrap+ignore
%string(255)fi,fo

  defineparam("Input file",fi,pamnodefault)
  defineparam("Output file",fo,pamnewgroup!pamnodefault)
  defineintparam("Top margin",top,0)
  defineintparam("Bot margin",bot,0)
  defineintparam("Left margin",left,0)
  defineintparam("Page size (lines per page)",page,0)
  defineintparam("Columns",cols,0)
  defineintparam("Width of each column",col,0)
  defineintparam("Margin between columns",margin,0)
  definebooleanparams("WRap,Ignore",bools,0)
  processparameters(cliparam)
  openinput(1,fi)
  openoutput(1,fo)
  wide = cols*col+margin*(cols-1)
  
%begin
%bytearray b(1:page,1:wide)
%integer xbase,x,y,nls,k

  %routine clear page
    %for y = 1,1,page %cycle
      b(y,x) = ' ' %for x = 1,1,wide
    %repeat
    xbase = 0; x = 1; y = 1
  %end

  %routine print page
  %owninteger blank = 0
  %integer i
    blank = blank+top
    %for y = 1,1,page %cycle
      i = wide; i = i-1 %while i>0 %and b(y,i)=' '; x = i
      %unless x=0 %start
        newlines(blank); blank = 0
        spaces(left); printsymbol(b(y,i)) %for i = 1,1,x
      %finish
      blank = blank+1
    %repeat
    blank = blank+bot
  %end

  %routine do(%integer k)
    %if k=nl %start
      nls = nls+1; %returnif nls>2 %and bools&ignore#0
      x = 1; y = y+1; %returnif y<=page
      y = 1; xbase = xbase+margin+col
      print page %and clear page %if xbase>wide
      %return
    %finish
    nls = 0
    %if k=9 %start
      x = x+1 %until x&7=1
    %elseif k=8
      x = x-1 %if x>1
    %elseif k=13
      x = 1
    %else
      %if x>col %start
        %returnif bools&wrap=0
        do(nl)
      %finish
      b(y,x+xbase) = k; x = x+1
    %finish
  %end
     
  %onevent 9 %start
    print page; newline; %stop
  %finish

  nls = 0
  clear page
  %cycle
    readsymbol(k); do(k)
  %repeat
%end
%end
