ソースを参照

* more compatibility fixes for objects unit

carl 23 年 前
コミット
4cfe3217c0
1 ファイル変更42 行追加26 行削除
  1. 42 26
      rtl/inc/objects.pp

+ 42 - 26
rtl/inc/objects.pp

@@ -980,6 +980,10 @@ END;
 
 CONSTRUCTOR TStream.Init;
 BEGIN
+  Status := StOK;
+  ErrorInfo := 0;
+  StreamSize := 0;
+  Position := 0;
   TPCompatible := DefaultTPCompatible;
 END;
 
@@ -1073,7 +1077,7 @@ END;
 {---------------------------------------------------------------------------}
 PROCEDURE TStream.Reset;
 BEGIN
-   Status := 0;                                       { Clear status }
+   Status := stOK;                                       { Clear status }
    ErrorInfo := 0;                                    { Clear error info }
 END;
 
@@ -1390,23 +1394,29 @@ PROCEDURE TDosStream.Read (Var Buf; Count: Sw_Word);
 VAR BytesMoved: Sw_Word; 
     DosStreamError : Word;
 BEGIN
-   { Assume status is StOK }
-   Status := StOk;
-   If (Position + Count > StreamSize) Then            { Insufficient data }
-     Error(stReadError, 0);                           { Read beyond end!!! }
-   If (Handle = InvalidHandle) Then 
-     Error(stReadError, 103);                         { File not open }
-   BlockRead(FileInfo, Buf, Count, BytesMoved);       { Read from file }
-   DosStreamError := IOResult;
-   If ((DosStreamError<>0) OR (BytesMoved<>Count)) Then 
-    Begin  { Error was detected }
-      BytesMoved := 0;                                { Clear bytes moved }
-      If (DosStreamError <> 0) Then
-         Error(stReadError, DosStreamError)           { Specific read error }
-      Else Error(stReadError, 0);                     { Non specific error }
+   If Status = StOK then
+     Begin
+        If (Position + Count > StreamSize) Then            { Insufficient data }
+          Error(stReadError, 0);                           { Read beyond end!!! }
+        If (Handle = InvalidHandle) Then 
+          Error(stReadError, 103);                         { File not open }
+        BlockRead(FileInfo, Buf, Count, BytesMoved);       { Read from file }
+        DosStreamError := IOResult;
+        If ((DosStreamError<>0) OR (BytesMoved<>Count)) Then 
+           Begin  { Error was detected }
+             BytesMoved := 0;                              { Clear bytes moved }
+             If (DosStreamError <> 0) Then
+                Error(stReadError, DosStreamError)         { Specific read error }
+             Else 
+                Error(stReadError, 0);                     { Non specific error }
+           End;
+        Inc(Position, BytesMoved);                         { Adjust position }
+     End;
+   { If there was already an error, or an error was just 
+     generated, fill the vuffer with NULL
+   }
+   If Status <> StOK then
      FillChar(Buf, Count, #0);                        { Error clear buffer }
-    End;
-   Inc(Position, BytesMoved);                         { Adjust position }
 END;
 
 {--TDosStream---------------------------------------------------------------}
@@ -1416,8 +1426,9 @@ PROCEDURE TDosStream.Write (Var Buf; Count: Sw_Word);
 VAR BytesMoved: Sw_Word; 
     DosStreamError : Word;
 BEGIN
-   { Assume status is StOk }
-   Status := StOK;
+   { If status is not OK, simply exit }
+   if Status <> StOK then
+     exit;
    If (Handle = InvalidHandle) Then 
     Error(stWriteError, 103);                    { File not open }
    BlockWrite(FileInfo, Buf, Count, BytesMoved); { Write to file }
@@ -1478,8 +1489,8 @@ PROCEDURE TBufStream.Flush;
 VAR W: Sw_Word;
     DosStreamError : Word;
 BEGIN
-   { Assume status is StOK }
-   Status := StOK;
+   If Status <> StOK then
+      exit;
    If (LastMode=2) AND (BufPtr<>0) Then Begin         { Must update file }
      If (Handle = InvalidHandle) Then DosStreamError := 103  { File is not open }
        Else 
@@ -1536,8 +1547,11 @@ PROCEDURE TBufStream.Read (Var Buf; Count: Sw_Word);
 VAR Success: Integer; W, Bw: Sw_Word; P: PByteArray;
     DosStreamError : Word;
 BEGIN
-   { Assume status is StOK }
-   Status := StOK;
+   If Status <> StOk then
+     begin
+       FillChar(P^, Count, #0);                       { Error clear buffer }
+       exit;
+     end;
    If (Position + Count > StreamSize) Then            { Read pas stream end }
      Error(stReadError, 0);                           { Call stream error }
    If (Handle = InvalidHandle) Then Error(stReadError, 103);     { File not open }
@@ -1581,8 +1595,7 @@ PROCEDURE TBufStream.Write (Var Buf; Count: Sw_Word);
 VAR Success: Integer; W: Sw_Word; P: PByteArray;
     DosStreamError : Word;
 BEGIN
-   { Assume status is StOK }
-   Status := StOK;
+   if Status <> StOK then exit;                       { Exit if error     }
    If (Handle = InvalidHandle) Then Error(stWriteError, 103);    { File not open }
    If (LastMode=1) Then Flush;                        { Flush read buffer }
    LastMode := 2;                                     { Now set write mode }
@@ -2888,7 +2901,10 @@ END;
 END.
 {
   $Log$
-  Revision 1.14  2002-10-30 22:44:44  carl
+  Revision 1.15  2002-10-31 12:47:30  carl
+    * more compatibility fixes for objects unit
+
+  Revision 1.14  2002/10/30 22:44:44  carl
     * Bugfix for error checking
     - DosStreamError is no longer global (bugfix 2043)