Lazarus

Free Pascal => General => Topic started by: apeoperaio on April 07, 2021, 03:26:37 pm

Title: TStreamReader (streamex unit) issue
Post by: apeoperaio on April 07, 2021, 03:26:37 pm
TStreamReader.ReadLine seems to fail under specific circumstances.
I created a test to easily reproduce the problem.
The test makes use of a TStream that behaves in a weird, but formally correct way. I created it based on a real experience with the StdIn that I was able to reproduce thanks to pre-existing logging.
I suggest you use the test on Windows otherwise I'm not sure you'll be able to reproduce the problem.

I believe the bug can be fixed by updating VPByte right after FillBuffer is called:

      [...]
      FillBuffer;
      VPByte := @FBuffer[FBufferPosition]; //bugfix
      VPosition := FBufferPosition;
      [...]

Tested with Lazarus 2.0.10 FPC 3.2.0 on Win64
Title: Re: TStreamReader (streamex unit) issue
Post by: apeoperaio on April 09, 2021, 01:59:57 pm
Submitted in the bugtracker as ID 0038734 (https://bugs.freepascal.org/view.php?id=38734)
Title: Re: TStreamReader (streamex unit) issue
Post by: jamie on April 10, 2021, 08:16:33 pm
I looked at the "ReadLine" Method, That code is an absolute mess!

It looks like that was work of a rework , several patch jobs just to get someone's code running..

in the end its still a mess

 also, using a procedure was an unfortunate choice because you have no way to know if the string being returned is a partial due to not having all of the input to complete a line.
   Technically it should return 0 length in that case and some sort of a flag indicating that a partial is waiting..

 Also, it looks like it can get caught between line endings etc..

 Yup, its a real mess. and to top it off, this is a base component for others from the looks of it.

 I do not  know how Delphi's version behaves in cases like this but its a crying shame the way this code is laid out because when I saw you post that it gave me the idea of using it for a project of mine in Delphi because I wrote such a routine not knowing this already existed but after closely examining this one,  I have second thoughts of using it.

 If I knew what the expected results is suppose to be on partial lines in the que than I could rewrite that whole block of code into something more appropriate.


P.S.
  Looking at MSDN and Delphi docs it looks like the ReadLine is suppose to be a Function not a procedure..

  It would be easy to add a function to do this however, the compiler I don't think can tell the difference between a function and procedure if memory serves, it takes the first one it finds and ignores the other.

 Also it seems the unit is missing functionality, maybe a new unit of strictly StreamReader. Write should be created.
TinyPortal © 2005-2018