make readtxt2 work with pipes
authorplugwash <plugwash@p10link.net>
Fri, 17 Aug 2012 01:12:50 +0000 (01:12 +0000)
committerplugwash <plugwash@p10link.net>
Fri, 17 Aug 2012 01:12:50 +0000 (01:12 +0000)
git-svn-id: file:///svnroot/lcore/trunk@120 b1de8a11-f9be-4011-bde0-cc7ace90066a

readtxt2.pas

index ee657367ea6ae7e43804b16033cc173943888fd4..12bea5afed8cceeccd92590e58671ab1bf0a7b83 100644 (file)
@@ -44,6 +44,7 @@ type
     currenteol,preveol:integer;\r
     fileeof,reachedeof:boolean;\r
     eoltype:integer;\r
+    procedure checkandread;\r
   end;\r
 \r
 implementation\r
@@ -54,7 +55,7 @@ begin
   sourcestream := asourcestream;\r
   destroysourcestream := adestroysourcestream;\r
 \r
-  if sourcestream.Position >= sourcestream.size then fileeof := true;\r
+  //if sourcestream.Position >= sourcestream.size then fileeof := true;\r
   bufpointer := bufsize;\r
 end;\r
 \r
@@ -64,6 +65,16 @@ begin
 end;\r
 \r
 \r
+procedure treadtxt.checkandread;\r
+begin\r
+  if bufpointer >= numread then begin\r
+    numread := sourcestream.read(buf,bufsize);\r
+    bufpointer := 0;\r
+    if numread = 0 then fileeof := true;\r
+      \r
+  end;\r
+end;\r
+\r
 function treadtxt.readline;\r
 var\r
   a,b,c,d:integer;\r
@@ -71,11 +82,7 @@ begin
 \r
   result := '';\r
   repeat\r
-    if bufpointer >= bufsize then begin\r
-      numread := sourcestream.read(buf,bufsize);\r
-      bufpointer := 0;\r
-      if sourcestream.Position >= sourcestream.size then fileeof := true;\r
-    end;\r
+    checkandread;\r
     b := numread-1;\r
 \r
     {core search loop begin}\r
@@ -96,7 +103,8 @@ begin
       setlength(result,c+b);\r
       move(buf[bufpointer],result[c+1],b);\r
       bufpointer := numread;\r
-      if numread < bufsize then begin\r
+      if fileeof then begin\r
+        {we reached the end of the file, return what we have}\r
         reachedeof := true;\r
         exit;\r
       end;\r
@@ -133,8 +141,8 @@ end;
 \r
 function treadtxt.eof:boolean;\r
 begin\r
-\r
-  result := ((bufpointer >= bufsize) and fileeof) or reachedeof;\r
+  checkandread;\r
+  result := ((bufpointer >= numread) and fileeof) or reachedeof;\r
 end;\r
 \r
 destructor treadtxt.destroy;\r