Browse Source

* fixed seekeof() so that it doesn't move the current possition in the
file anymore (merged)
* seekeof() now only regards #26 as EOF marker if EOF_CTRLZ is defined
(just like eof()) (merged)
* very tiny optimization to read_array_as_pchar

Jonas Maebe 24 years ago
parent
commit
c98f73e0d5
1 changed files with 67 additions and 7 deletions
  1. 67 7
      rtl/inc/text.inc

+ 67 - 7
rtl/inc/text.inc

@@ -17,15 +17,16 @@
 
 
   EOF_CTRLZ       Is Ctrl-Z (#26) a EOF mark for textfiles
   EOF_CTRLZ       Is Ctrl-Z (#26) a EOF mark for textfiles
   SHORT_LINEBREAK Use short Linebreaks #10 instead of #10#13
   SHORT_LINEBREAK Use short Linebreaks #10 instead of #10#13
+  MAC_LINEBREAK   Use Mac Linebreaks: #13 instead of #10 or #10#13
 
 
   SHORT_LINEBREAK is defined in the Linux system unit (syslinux.pp)
   SHORT_LINEBREAK is defined in the Linux system unit (syslinux.pp)
+
 }
 }
 
 
 {****************************************************************************
 {****************************************************************************
                     subroutines For TextFile handling
                     subroutines For TextFile handling
 ****************************************************************************}
 ****************************************************************************}
 
 
-
 Procedure FileCloseFunc(Var t:TextRec);
 Procedure FileCloseFunc(Var t:TextRec);
 Begin
 Begin
   Do_Close(t.Handle);
   Do_Close(t.Handle);
@@ -275,6 +276,9 @@ End;
 
 
 
 
 Function SeekEof (Var t : Text) : Boolean;
 Function SeekEof (Var t : Text) : Boolean;
+var
+  oldfilepos, oldbufpos, oldbufend, reads: longint;
+  isdevice: boolean;
 Begin
 Begin
   If (InOutRes<>0) then
   If (InOutRes<>0) then
    exit(true);
    exit(true);
@@ -286,22 +290,71 @@ Begin
       InOutRes:=103;
       InOutRes:=103;
      exit(true);
      exit(true);
    end;
    end;
+  { try to save the current position in the file, seekeof() should not move }
+  { the current file position (JM)                                          }
+  oldbufpos := TextRec(t).BufPos;
+  oldbufend := TextRec(t).BufEnd;
+  reads := 0;
+  oldfilepos := -1;
+  isdevice := Do_IsDevice(TextRec(t).handle);
   repeat
   repeat
     If TextRec(t).BufPos>=TextRec(t).BufEnd Then
     If TextRec(t).BufPos>=TextRec(t).BufEnd Then
      begin
      begin
+       { signal that the we will have to do a seek }
+       inc(reads);
+       if not isdevice and
+          (reads = 1) then
+         begin
+           oldfilepos := Do_FilePos(TextRec(t).handle) - TextRec(t).BufEnd;
+           InOutRes:=0;
+         end;
        FileFunc(TextRec(t).InOutFunc)(TextRec(t));
        FileFunc(TextRec(t).InOutFunc)(TextRec(t));
        If TextRec(t).BufPos>=TextRec(t).BufEnd Then
        If TextRec(t).BufPos>=TextRec(t).BufEnd Then
-        exit(true);
+        begin
+          { if we only did a read in which we didn't read anything, the }
+          { old buffer is still valid and we can simply restore the     }
+          { pointers (JM)                                               }
+          dec(reads);
+          SeekEof := true;
+          break;
+        end;
      end;
      end;
     case TextRec(t).Bufptr^[TextRec(t).BufPos] of
     case TextRec(t).Bufptr^[TextRec(t).BufPos] of
-         #26 : exit(true);
+{$ifdef EOF_CTRLZ}
+         #26 : 
+           begin
+             SeekEof := true;
+             break;
+           end;
+{$endif EOF_CTRLZ}
      #10,#13,
      #10,#13,
       #9,' ' : ;
       #9,' ' : ;
     else
     else
-     exit(false);
+     begin
+       SeekEof := false;
+       break;
+     end;
     end;
     end;
-    inc(TextRec(t).BufPos);
+   inc(TextRec(t).BufPos);
   until false;
   until false;
+  { restore file position if not working with a device }
+  if not isdevice then
+    { if we didn't modify the buffer, simply restore the BufPos and BufEnd  }
+    { (the latter becuase it's now probably set to zero because nothing was }
+    {  was read anymore)                                                    }
+    if (reads = 0) then
+      begin
+        TextRec(t).BufPos:=oldbufpos;
+        TextRec(t).BufEnd:=oldbufend;
+      end
+    { otherwise return to the old filepos and reset the buffer }
+    else
+      begin
+        do_seek(TextRec(t).handle,oldfilepos);
+        InOutRes:=0;
+        FileFunc(TextRec(t).InOutFunc)(TextRec(t));
+        TextRec(t).BufPos:=oldbufpos;
+      end;
 End;
 End;
 
 
 
 
@@ -882,7 +935,7 @@ var
   len: longint;
   len: longint;
 Begin
 Begin
   len := ReadPCharLen(f,pchar(@s),high(s)+1);
   len := ReadPCharLen(f,pchar(@s),high(s)+1);
-  if len < high(s)+1 then
+  if len <= high(s) then
     s[len] := #0;
     s[len] := #0;
 End;
 End;
 
 
@@ -1184,7 +1237,14 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.14  2001-08-23 14:28:36  jonas
+  Revision 1.15  2001-09-25 16:34:59  jonas
+    * fixed seekeof() so that it doesn't move the current possition in the
+      file anymore (merged)
+    * seekeof() now only regards #26 as EOF marker if EOF_CTRLZ is defined
+      (just like eof()) (merged)
+    * very tiny optimization to read_array_as_pchar
+
+  Revision 1.14  2001/08/23 14:28:36  jonas
     + tempcreate/ref/delete nodes (allows the use of temps in the
     + tempcreate/ref/delete nodes (allows the use of temps in the
       resulttype and first pass)
       resulttype and first pass)
     * made handling of read(ln)/write(ln) processor independent
     * made handling of read(ln)/write(ln) processor independent