program tabulier;

{ ersetzt Blanks durch passende Tabulator-Zeichen.
  Einzelne Blanks werden nicht ersetzt.
  Angehaengte Blanks und Tabulator-Zeichen werden vorher entfernt.
  A.Herrmann 06.07.85 }

const tab:    char=#09;
      cr:     char=#13;
      blank:  char=#32;

var ch: char;
    name1,name2: string[14];
    datei1,datei2: text;
    azeile,nzeile: string[255];
    zz: integer;
    lg: integer;
    i,ii,j: integer;
    k,kk: integer;
    tabflg: boolean;

begin { tabulier }

repeat
writeln; write('Name der Quelldatei = '); readln(name1);
assign(datei1,name1);
{$I-} reset(datei1) {$I+};
if Ioresult<>0 then writeln('Datei ',name1,' nicht gefunden.')
else
    begin
    write('Name der Zieldatei  = ');
    readln(name2);
    assign(datei2,name2);
    rewrite(datei2);
    zz:=0;    { Zeilenzaehler }
    repeat
        readln(datei1,azeile);
        lg:=length(azeile);
        if lg>0 then
            while (lg>1) and (copy(azeile,lg,1) in [blank,tab]) do
                lg:=lg-1;
        i:=1;              { Position in Quellzeile }
        ii:=1;             { dto. auf Bildschirm }
        j:=0;              { Position in Zielzeile }
        while i<=lg do     { Blanks ggf. durch Tabs ersetzen }
            begin
            ch:=copy(azeile,i,1);
            if ch=blank then
                begin
                k:=i; kk:=ii;    { Vorgriffsindizes }
                tabflg:=false;
                while (copy(azeile,k,1)=blank) and not tabflg do
                    begin
                    if (kk mod 8 = 0) then
                        begin
                        j:=j+1;
                        if (kk>ii) then insert(tab,nzeile,j)
                        else insert(blank,nzeile,j);
                        tabflg:=true;
                        i:=k+1; ii:=kk+1;
                        end;
                    k:=k+1; kk:=kk+1;
                    end;
                if not tabflg then
                    while i<k do
                        begin
                        j:=j+1; insert(blank,nzeile,j);
                        i:=i+1; ii:=ii+1;
                        end;
                end
            else
                begin
                j:=j+1; insert(ch,nzeile,j);
                if ch=tab then ii:=ii+(8-((ii-1) mod 8))
                else ii:=ii+1;
                i:=i+1;
                end;
            end;
        delete(nzeile,j+1,255);
        writeln(datei2,nzeile);
{        writeln(nzeile); }
        zz:=zz+1;
        write(cr,zz,'.Zeile');
    until eof(datei1);
    close(datei2);
    writeln; writeln; write('Restart ? (Y/N) ');
    repeat
        read(kbd,ch); writeln(ch);
    until ch in ['Y','y','N','n'];
    end
until ch in ['N','n'];

end. { tabulier }

