Source file: /~heha/hsn/dos/uninst.zip/UNIXREAD.PAS

{Programmfragment liest Textdatei, egal ob UNIX- oder DOS-Format;
 allerdings hier noch Abbruch bei 1A (^Z) und nicht bei 04 (^D).
 BP7 schneidet zu lange Zeilen einfach ab; d.h. der Zeilenrest geht
 verloren und wird nicht etwa als nächster String bei ReadLn() geliefert.
 Dieses Programm sollte auch mit Delphi 1 und (eigentlich auch) Delphi 2
 funktionieren, da ohne Assembler-Anweisungen}
uses Dos;
var
 S: String;
 f: Text;
 OldInOut: function(var f: TextRec):Integer;
{So sind diese TextRec-Funktionen definiert; Rückgabe=DOS-Fehlercode}

function NewInOut(var f: TextRec):Integer; far;
 var
  n: Integer;			{Laufindex}
 begin
{ WriteLn('Hier');}		{Debug-Output}
  NewInOut:=OldInOut(f);	{Aufruf der originalen Leseroutine}
  for n:=Integer(f.BufPos) to Integer(f.BufEnd)-1 do begin
   case f.BufPtr^[n] of		{Zeichen im neu gefüllten Puffer inspizieren}
    #$0D: Boolean(TextRec(f).UserData[1]):=true;
    #$0A: begin
     if not Boolean(TextRec(f).UserData[1]) then f.BufPtr^[n]:=#$0D;
     Boolean(TextRec(f).UserData[1]):=false;
				{Sonderfall: 0D-0A-0A-0A seien 3 Zeilenenden}
    end;			{... (Beispiel wird zu 0D-0A-0D-0D)}
    else Boolean(TextRec(f).UserData[1]):=false;
   end{case};
  end;
 end;

procedure UnixReset(var f: Text);
 begin
  reset(f);
  @OldInOut:=TextRec(f).InOutFunc;	{alten Funktionszeiger retten}
  TextRec(f).InOutFunc:=@NewInOut;	{neuen Funktionszeiger einsetzen}
  Boolean(TextRec(f).UserData[1]):=false;
 end;

begin
 Assign(f,'test.txt'); UnixReset(f);
 ReadLn(f,S);
 WriteLn('1:',S);		{3 Testzeilen}
 ReadLn(f,S);
 WriteLn('2:',S);
 ReadLn(f,S);
 WriteLn('3:',S);
end.
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded