Tom Schneider wrote:
One of my programs, which I have used with many compilers in the past, started an odd behavior as soon as I compiled with GPC. I rooted down to what the cause was and found this:
EOF is not true on a reset empty file.
<snip>
Is this standard behavior for Pascal? I thought that if you reset an file, it would be at eof. Where else could it be?
There is a little tricky point here: the standard requires read from text file to give eoln and a space character before eof. So GPC runtime adds a newline before eof if original file contained no newline. That was wrong for empty file. The following patch should fix the problem (apply it relatively to gpc-20041218/p directory):
--- rts/files.pas.bb 2005-01-30 00:55:45.498296856 +0100 +++ rts/files.pas 2005-01-30 00:55:51.371404008 +0100 @@ -1259,7 +1259,10 @@ end;
procedure ReadBuffer (f: GPC_FDR); +var WasRead: boolean; begin + WasRead := not f^.Status.Unread; + f^.Status.Unread := false; f^.BufPos := 0; if f^.ReadFunc <> nil then begin @@ -1277,7 +1280,8 @@ it prevents detecting whether there actually is an EOLn in the file. } if f^.BufSize <> 0 then f^.Status.LastEOLn := f^.BufPtr^[f^.BufSize - 1] = NewLine - else if ((RTSOptions and ro_SP_EOLn) <> 0) and f^.Status.Text and not f^.Status.LastEOLn then + else if ((RTSOptions and ro_SP_EOLn) <> 0) and f^.Status.Text + and not f^.Status.LastEOLn and WasRead then begin f^.Status.LastEOLn := True; f^.BufPtr^[0] := NewLine; @@ -1716,7 +1720,6 @@ n: SizeType; begin if not CheckReadableNotEOF (f) then Exit; - f^.Status.Unread := False; f^.Status.Undef := False; f^.Status.LGet := False; { @@ this different treatment is suspicious }