← 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