Tabs nach Wunsch

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
Aus: ST-Computer 06 / 1989, Seite 92

Links

Copyright-Bestimmungen: siehe Über diese Seite