[Lazarus] Getting eof from standard input

Mark Morgan Lloyd markMLl.lazarus at telemetry.co.uk
Sat Dec 15 18:50:50 CET 2012


I've got a program here which works fine on Linux but has started to 
fail on Windows after running fine for years. This doesn't appear to 
depend on the version of Lazarus, version of FPC or version of Windows, 
but since I've now got the source in local svn I can see that the 
earliest version I checked in (r1) works while the next one (r2) doesn't.

Once the message loop is running the program does this to see if there's 
anything to be piped into it from the command line:

   IF ParamCount = 0 THEN BEGIN          (* Case (1) or (2) *)
     debug('No parameters (case 1 or 2)');
     TRY
       AssignFile(input, '');            (* Standard input               *)
{ IOCHECKS OFF }
       Reset(input);
{ IOCHECKS ON }
       debug('Reset() -> ' + IntToStr(IOResult));
       TRY
         IF modifiedEof(input) THEN BEGIN (* Case (1)    *)
           debug('At EOF (case 1)');

where

   FUNCTION modifiedEof(VAR f: TEXT): BOOLEAN;

   BEGIN
(*$IFDEF UNIX   *)
     IF IsATTY(f) = 0 THEN BEGIN
       debug('stdin is not a TTY');
{$IOCHECKS OFF }
       RESULT:= Eof(f);
{$IOCHECKS ON }
       debug('Eof() -> ' + IntToStr(IOResult))
     END ELSE BEGIN
       debug('stdin is a TTY');
       RESULT:= TRUE
     END;
(*$ELSE         *)
{ IOCHECKS OFF }
     RESULT:= Eof(f);
{ IOCHECKS ON }
     debug('Eof() -> ' + IntToStr(IOResult))
(*$ENDIF        *)
   END { modifiedEof } ;

This used to work, but what I'm now seeing is that when running on 
Windows it hangs at that Eof() until it sees ^Z<cr>

I think that I've managed to eliminate all code changes, i.e. I don't 
think there's anything in a .pas file that's causing the problem. The 
one thing that did happen however was that r2 got modified by a later 
version of Lazarus than I usually allow near this program, so I had to 
back out of various SynEdit (etc.) properties that it had added to the 
forms.

Is there anything stored in non-Pascal files that could cause this sort 
of problem?

Alternatively, does Windows have anything equivalent to IsATTY() or 
Do_IsDevice() that I could use as a guard around the failing Eof()?

-- 
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk

[Opinions above are the author's, not those of his employers or colleagues]




More information about the Lazarus mailing list