Pārlūkot izejas kodu

* Added Read64/Write64

Michaël Van Canneyt 3 gadi atpakaļ
vecāks
revīzija
7097a1030f
2 mainītis faili ar 35 papildinājumiem un 0 dzēšanām
  1. 2 0
      rtl/objpas/classes/classesh.inc
  2. 33 0
      rtl/objpas/classes/streams.inc

+ 2 - 0
rtl/objpas/classes/classesh.inc

@@ -957,10 +957,12 @@ type
     function Read(var Buffer; Count: Longint): Longint; virtual; overload;
     function Read(var Buffer: TBytes; Count: Longint): Longint; overload;
     function Read( Buffer : TBytes; aOffset, Count: Longint): Longint; overload;
+    function Read64( Buffer : TBytes; aOffset, Count: Int64): Int64; overload;
 
     function Write(const Buffer: TBytes; Offset, Count: Longint): Longint; overload;
     function Write(const Buffer: TBytes; Count: Longint): Longint; overload;
     function Write(const Buffer; Count: Longint): Longint; virtual; overload;
+    function Write64(const Buffer: TBytes; Offset, Count: Int64): Int64;
 
     function Seek(Offset: Longint; Origin: Word): Longint; virtual; overload;
     function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; virtual; overload;

+ 33 - 0
rtl/objpas/classes/streams.inc

@@ -40,6 +40,22 @@ begin
   Result:=Read(Buffer[aOffset],Count);
 end;
 
+function TStream.Read64(Buffer: TBytes; aOffset, Count: Int64): Int64;
+
+var
+  r,t: Int64;
+begin
+  t:=0;
+  repeat
+    r:=Count-t;
+    if r>High(Longint) then r:=High(Longint);
+    r:=Read(Buffer[aOffset],r);
+    inc(t,r);
+    inc(aOffset,r);
+  until (t>=Count) or (r<=0);
+  Result:=t;
+end;
+
 function TStream.Write(const Buffer: TBytes; Offset, Count: Longint): Longint;
 begin
   Result:=Write(Buffer[Offset],Count);
@@ -56,6 +72,21 @@ begin
   Result := 0;
 end;
 
+function TStream.Write64(const Buffer: TBytes; Offset, Count: Int64): Int64;
+var
+  w,t: NativeInt;
+begin
+  t:=0;
+  repeat
+    w:=Count-t;
+    if w>High(Longint) then w:=High(Longint);
+    w:=Write(Buffer[OffSet],w);
+    inc(t,w);
+    inc(Offset,W);
+  until (t>=count) or (w<=0);
+  Result:=t;
+end;
+
 
   function TStream.GetPosition: Int64;
 
@@ -402,6 +433,7 @@ function TStream.ReadData(var Buffer: TExtended80Rec; Count: NativeInt): NativeI
 begin
   Result:=ReadMaxSizeData(Buffer,SizeOf(Buffer),Count);
 end;
+
 {$ENDIF}
 
 procedure TStream.ReadBuffer(var Buffer; Count: NativeInt);
@@ -579,6 +611,7 @@ procedure TStream.ReadBufferData(var Buffer: TExtended80Rec; Count: NativeInt);
 begin
   ReadExactSizeData(Buffer,SizeOf(Buffer),Count);
 end;
+
 {$ENDIF}
 
 procedure TStream.WriteBuffer(const Buffer; Count: NativeInt);