program COLUMNS { Cf. UNIX COLUMN ? Slightly. Expands whitespace of a file so that words align vertically; Std. out. COLUMNS filename [gutter] ; filename is short (8.3) form } ; uses Dos ; const ColMin = 0 ; ColMax = 50 ; Gutter : integer = 2 ; var F : text ; S : string ; FN : PathStr ; N : integer ; J, K : byte ; C, Last : char ; A, B : array [ColMin..ColMax] of byte ; procedure GetScan ; begin Readln(F, S) { N.B. Maximum input line : 255 characters } ; K := ColMin ; Last := #32 ; FillChar(B, SizeOf(B), 0) ; for J := 1 to Length(S) do begin C := S[J] ; if C>#32 then Inc(B[K]) else if Last>#32 then Inc(K) ; Last := C end ; end {GetScan} ; BEGIN ; FN := ParamStr(1) ; if (FN='') or (FN='/?') then begin Writeln('COLUMNS filename [gutter] ; www.merlyn.demon.co.uk >= 2001-06-28') ; HALT(1) end ; if ParamCount>1 then begin Val(ParamStr(2), Gutter, N) ; if N<>0 then begin Writeln('COLUMNS gutter error') ; HALT(2) end ; end ; Assign(F, FN) ; Reset(F) ; FillChar(A, SizeOf(A), 0) ; while not EoF(F) do begin GetScan ; for J := ColMin to ColMax do if B[J]>A[J] then A[J] := B[J] ; end {F} ; Close(F) ; Reset(F) ; while not EoF(F) do begin GetScan ; K := ColMin ; Last := #32 ; for J := 1 to Length(S) do begin C := S[J] ; if C>#32 then Write(C) else if Last>#32 then begin if B[K+1]>0 then Write('':(Gutter+(A[K]-B[K]))) ; Inc(K) end ; Last := C end ; Writeln end {F} ; Close(F) ; END.