Ich habe einige Anwendungen so geschrieben, daß sie genau das mit bedingter Compilierung schaffen, manche Sprachkonstrukte kann ich eben bei 16 bit nicht verwenden und andere sind wiederum bei 32 bit doof oder bei Linux. Also ich habe das was. Nur compiliert mir das für für 16 bit das originale Turbo-Pascal 7.0 welches ich virtuell im MS-DOS bzw auch in Windows XP (beides in Virtualbox) laufen habe.
Jetzt hatte ich wieder so eine Idee - es geht konkret um Readln/Writeln auf input/output oder auf file. Ich habe mal ein Testprogramm angehängt, wo nur das Prinzip zu sehen ist.
Leider lehnt mir Turbo-Pascal als einziges nur die Zuweisung der Text-Variablen
Code: Alles auswählen
var eingabe: text;
begin
eingabe:=input;
end.
Code: Alles auswählen
procedure ausgabe(datei:text);
begin
writeln(datei, 'Hugo');
end;
Code: Alles auswählen
ausgabe(input)
Code: Alles auswählen
ausgabe(feste_datei)
Nur wollte ich es etwas eleganter und kürzer haben, die Abfrage des Schalters ist mir zu oft (sowohl beim ausgabe-Aufruf als auch noch diverse Male bei readln und writeln auf Dateien oder input/output. Zur Erklärung, das Programm soll auch im Pipelining Modus in Scripts arbeiten.
Nun hatte ich die Idee, Free Pascal 16 Bit zu nehmen. Eine Frage an die Spezialisten: versteht das auch nur die Turbo-Pascal Syntax oder kann ich alle Sprachkonstrukte verwenden?
Nur einfaches Pascal, keine OO, jedenfalls nicht an der Stelle. Und wie compiliert man das? Hat jemand ein einfaches Beispiel? Laufen lassen unter Win XP? Oder muß es unter Win 7-11 sein?
Hoffe habe mein Anliegen deutlich machen können. Und hier mein Beispiel. Den DOS-Schalter setze ich über eine Unit und/oder beim Compiler-Aufruf für WIndows/Linux/DOS.... Natürlich komfortabler im richtigen Programm, das hier ist nur ein Test
Code: Alles auswählen
program FileMix;
var eingabe, ausgabe, protokoll: text;
einname, ausname, zeile: string;
einzahl, auszahl: longint;
einpipe, auspipe: boolean;
procedure hilfe;
begin
writeln(protokoll, 'dateien eingabe.txt ausgabe.txt');
close(protokoll); halt;
end;
procedure open_eingabe;
begin
if einpipe
then begin
einname:='input';
{$IFNDEF DOS} eingabe:=input; {$ENDIF}
end
else begin
assign(eingabe, einname); {$i-} reset(eingabe); {$i+}
if ioresult<>0 then begin
writeln(protokoll, 'Fehler Open Eingabedatei ' + einname); hilfe;
end;
end;
writeln(protokoll, 'Eingabe: ' + einname);
end;
procedure close_eingabe;
begin
if einpipe
then einname:='input'
else begin
{$i-} close(eingabe); {$i+}
if ioresult<>0 then begin
writeln(protokoll, 'Fehler Close Eingabedatei ' + einname); hilfe;
end;
end;
writeln(protokoll, 'Eingabe: ', einzahl, ' Zeilen');
end;
procedure open_ausgabe;
begin
if auspipe
then begin
ausname:='output';
{$IFNDEF DOS} ausgabe:=output; {$ENDIF}
end
else begin
assign(ausgabe, ausname); {$i-} rewrite(ausgabe); {$i+}
if ioresult<>0 then begin
writeln(protokoll, 'Fehler Open Ausgabedatei ' + ausname); hilfe;
end;
end;
writeln(protokoll, 'Ausgabe: ' + ausname);
end;
procedure close_ausgabe;
begin
if auspipe
then ausname:='output'
else begin
{$i-} close(ausgabe); {$i+}
if ioresult<>0 then begin
writeln(protokoll, 'Fehler Close Ausgabedatei ' + ausname); hilfe;
end;
end;
writeln(protokoll, 'Ausgabe: ', auszahl, ' Zeilen');
end;
function myeof: boolean;
begin
{$IFDEF DOS}
if einpipe
then myeof:=eof
else {$ENDIF} myeof:=eof(eingabe);
end;
function myreadln: string;
var myzeile: string;
begin
{$IFDEF DOS} if einpipe
then readln(myzeile)
else {$ENDIF} readln(eingabe, myzeile);
inc(einzahl);
myreadln:=myzeile;
end;
procedure mywriteln(myzeile: string);
begin
{$IFDEF DOS} if auspipe
then writeln(myzeile)
else {$ENDIF} writeln(ausgabe, myzeile);
inc(auszahl);
end;
begin
einzahl:=0; auszahl:=0; einpipe:=false; auspipe:=false;
assign(protokoll, 'protokoll.txt'); rewrite(protokoll);
if paramstr(1)<>''
then einname:=paramstr(1)
else einpipe:=true;
if paramstr(2)<>''
then ausname:=paramstr(2)
else auspipe:=true;
open_eingabe;
open_ausgabe;
zeile:=myreadln;
while not myeof do begin
mywriteln(zeile);
zeile:=myreadln;
end;
mywriteln(zeile);
close_eingabe;
close_ausgabe;
close(protokoll);
end.