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.