← ST-Computer 06 / 1989

Tabs nach Wunsch

Programmierpraxis

Bei der Version 2.0 des ST PASCAL plus findet man neben dem bekannten TOS-Editor auch einen neuen GEM-Editor, der in manchen FĂ€llen sicher vorteilhafter ist, z.B. aufgrund der Möglichkeit Blöcke zu markieren. Ein weiterer Vorteil ist die variable TabgrĂ¶ĂŸe, was die Strukturierung von Pascalprogrammen erleichtert, wenn z.B. ein Wert von 2 oder 3 angegeben wird.

Liest man das Handbuch nicht aufmerksam (wie ich), erlebt man dann eine unangenehme Überraschung, sieht man sich den Quelltext mit einem TOS-Editor an: Die schöne Strukturierung ist hin, da das Betriebssystem, wie im Handbuch vermerkt, eine TabgrĂ¶ĂŸe von 8 erwartet und bei jedem ‘TAB’ ($09) auf die nĂ€chste 8er Tabposition schiebt. Um solche “durcheinandergebrachten” Quelltexte wieder in die ursprĂŒngliche Form zu bringen, habe ich ein kleines Pascalprogramm geschrieben, das in einem Quelltext alle ‘TABs’ findet und durch die richtige Anzahl Leerzeichen ersetzt.

Die Prozedur scr_mask bedarf wohl keiner großen ErklĂ€rung, sie erstellt nur die Bildschirmmaske fĂŒr die Eingabe. Die Eingabe selbst erfolgt in der Funktion prm_input, die den Wert FALSE liefert, wenn der Benutzer das Programm verlassen möchte, ohne daß eine Datei geĂ€ndert wird. Als Eingaben werden die Dateinamen der zu Ă€ndernden Datei und der Zieldatei erwartet, außerdem die TabgrĂ¶ĂŸe, die man im GEM-Editor eingestellt hatte. Die Eingabeschleife wird solange durchlaufen, bis die Eingaben in Ordnung sind. Wird sie mit ESC verlassen, wird das Programm abgebrochen, sonst wird mit den eingegebenen Parametern chn_file aufgerufen.

Diese Prozedur geht die Quelldatei Zeile fĂŒr Zeile durch, wobei sie prĂŒft, ob in einer Zeile TAB-Codes enthalten sind. Wenn ja, wird chn_str aufgerufen, die die TAB-Codes einer Zeile durch die entsprechende Anzahl SPACEs ersetzt, so daß der Quelltext wieder in die alte Form gebracht wird. Bei der Berechnung dieser Anzahl geht das Programm folgendermaßen vor: Zuerst wird die Position des TAB-Codes bestimmt, dann die Differenz zur nĂ€chsten Tabulatorposition berechnet, schließlich daraus ein String mit Leerzeichen generiert, der anstelle des TAB-Codes eingefĂŒgt wird.

In der Zieldatei liegt der Quelltext dann wieder in der ursprĂŒnglichen Form, wie er mit dem GEM-Editor erstellt wurde, vor.

program correct;

{              Filecorrector                     }
{            von Oliver KrÀmer                   }
{ Àndert mit dem GEM-Editor des CCD Pascal       }
{ erstellte Source-Files, die mit einer anderen  } 
{ TabgrĂ¶ĂŸe als 8 ediert wurden.                  }
{ Geschrieben mit ST Pascal plus.                }

var ts      : integer;
    fn1,fn2 : string;

{$I vt52.pas}

function getkey:char; 
    gemdos($08);

procedure chn_str(t:integer; var s : string); 
var i,n,p   : integer; 
    s1      : string;
begin
    repeat
        p:=0;
        p:=pos(chr($09),s); 
        if p<>0 then 
            begin
                delete(s,p,1); 
                n:=t-(p-1) mod t; 
                s1:=’';
                for i:=1 to n do insert(' ' ,s1,1);
                insert(s1,s,p); 
            end; 
    until p=0; 
end;

procedure scr_mask; 
begin 
    clrscr; 
    rvs_on;
    writeln('F I L E C O R R E C T O R':50,’':30); 
    rvs_off; 
    gotoxy(10,8);
    writeln('Zu Àndernde Datei:'); 
    gotoxy(10,9);
    writeln(' Zieldatei:');
    gotoxy(10,11);
    writeln('eingestellte TabgrĂ¶ĂŸe:'); 
end;

function prm_input(var f1,f2:string;var t:integer):boolean;
var c       : char;
begin 
    repeat 
        repeat
            gotoxy(30,8); end_of_line; 
            readln(f1);
            gotoxy(30,9); end_of_line; 
            readln(f2); 
        until (f1<>f2); 
        gotoxy(33,11); end_of_line; 
        readln(t); 
        gotoxy(15,13);
        write('Eingabe OK ? (J/N/ESC) '); 
        c:=getkey; 
    until not (c in ['n','N']); 
    prm_input:=c<>chr(27); 
end;

procedure chn_file(f1,f2:string; t:integer); 
var dat1,dat2   : text;
    i           : integer;
    c           : char;
    l           : string[255];
begin
    gotoxy (10,15);
    writeln('Bitte etwas Geduld ...'); 
    io_check(false); 
    reset(dat1,f1); 
    if io_result=0 then 
    begin
        rewrite(dat2,f2); 
        while not eof(dat1) do 
        begin
            readln(dat1,l);
            if pos(chr($09),1)<>0 then chn_str(t,l);
            writeln(dat2,l); 
        end;
        close(dat1); close(dat2); 
        gotoxy(10,17); 
        write('OK. <TASTE> '); 
        c:=getkey; 
    end 
    else 
    begin
        gotoxy (10,17);
        writeln('Fehler beim Öffnen der Quelldatei!!');
    end;
end;

begin
    scr_mask;
    if prm_input(fn1,fn2,ts) then 
        chn_file(fn1,fn2,ts);
end.
Oliver KrÀmer