Changeset 26 for MemoryStreamEx/UMemoryStreamEx.pas
- Timestamp:
- May 25, 2010, 1:51:46 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
MemoryStreamEx/UMemoryStreamEx.pas
r25 r26 6 6 7 7 uses 8 Classes, DateUtils ;8 Classes, DateUtils, syncobjs; 9 9 10 10 type … … 23 23 procedure WriteCardinal(Data: Cardinal); 24 24 procedure WriteInt64(Data: Int64); 25 procedure WriteString(Data: string); 25 26 procedure WriteShortString(Data: ShortString); 26 27 procedure WriteAnsiString(Data: string); 27 28 procedure WriteUnixTime(Data: TDateTime); 28 procedure WriteStream(Stream: TStream; Count: Integer);29 29 procedure WriteDouble(Value: Double); 30 30 procedure WriteSingle(Value: Single); 31 procedure WriteStream(Stream: TStream; Count: Integer); 32 procedure WriteStreamPart(Stream: TStream; Count: Integer); 31 33 function ReadByte: Byte; 32 34 function ReadWord: Word; 33 35 function ReadCardinal: Cardinal; 34 36 function ReadInt64: Int64; 37 function ReadString: string; 35 38 function ReadShortString: string; 36 39 function ReadAnsiString: string; 40 function ReadStringTerminated(Terminator: string = #0): string; 37 41 function ReadUnixTime: TDateTime; 38 42 function ReadDouble: Double; 39 43 function ReadSingle: Single; 40 44 procedure ReadStream(var Stream: TStream; Count: Integer); 45 procedure ReadStreamPart(var Stream: TStream; Count: Integer); 46 function Sum: Byte; 47 procedure FillByte(Data: Byte; Count: Integer); 41 48 constructor Create; 42 49 property Endianness: TEndianness read FEndianness write SetEndianness; 43 50 end; 44 51 52 { TThreadMemoryStreamEx } 53 54 TThreadMemoryStreamEx = class(TMemoryStreamEx) 55 Lock: TCriticalSection; 56 constructor Create; 57 destructor Destroy; override; 58 end; 59 45 60 implementation 46 61 47 62 { TMemoryStreamEx } 48 49 procedure TMemoryStreamEx.WriteAnsiString(Data: string);50 var51 StringLength: Longint;52 begin53 StringLength := Length(Data);54 Write(StringLength, SizeOf(StringLength));55 Write(Data[1], StringLength);56 end;57 63 58 64 function TMemoryStreamEx.ReadAnsiString: string; … … 67 73 end; 68 74 75 function TMemoryStreamEx.ReadStringTerminated(Terminator: string = #0): string; 76 var 77 Data: Char; 78 I: Integer; 79 OldPosition: Integer; 80 begin 81 OldPosition := Position; 82 Result := ''; 83 I := 1; 84 repeat 85 if Position >= Size then Break; 86 Data := Chr(ReadByte); 87 if Data <> Terminator[I] then Result := Result + Data 88 else Inc(I); 89 until I > Length(Terminator); 90 if not (I > Length(Terminator)) then begin 91 Result := ''; 92 Position := OldPosition; 93 end; 94 end; 95 69 96 function TMemoryStreamEx.ReadByte: Byte; 70 97 begin … … 82 109 ReadBuffer(Result, SizeOf(Int64)); 83 110 if SwapData then Result := Swap(Result); 111 end; 112 113 function TMemoryStreamEx.ReadString:string; 114 begin 115 SetLength(Result, Size - Position); 116 if (Size - Position) > 0 then 117 Read(Result[1], Size - Position) 118 else Result := ''; 84 119 end; 85 120 … … 106 141 end; 107 142 143 procedure TMemoryStreamEx.ReadStreamPart(var Stream:TStream;Count:Integer); 144 var 145 Buffer: array of Byte; 146 begin 147 if Count > 0 then begin 148 SetLength(Buffer, Count); 149 ReadBuffer(Buffer[0], Count); 150 if Stream.Size < (Stream.Position + Count) then 151 Stream.Size := Stream.Position + Count; 152 Stream.Write(Buffer[0], Count); 153 end; 154 end; 155 156 procedure TMemoryStreamEx.WriteStreamPart(Stream:TStream;Count:Integer); 157 var 158 Buffer: array of Byte; 159 begin 160 if Count > Stream.Size then Count := Stream.Size; // Limit max. stream size 161 if Count > 0 then begin 162 SetLength(Buffer, Count); 163 Stream.Read(Buffer[0], Count); 164 Write(Buffer[0], Count); 165 end; 166 end; 167 108 168 constructor TMemoryStreamEx.Create; 109 169 begin … … 124 184 begin 125 185 ReadBuffer(Result, SizeOf(Single)); 186 end; 187 188 function TMemoryStreamEx.Sum: Byte; 189 begin 190 Result := 0; 191 Position := 0; 192 while Position < Size do 193 Result := (Result + ReadByte) and $ff; 194 end; 195 196 procedure TMemoryStreamEx.FillByte(Data:Byte;Count:Integer); 197 var 198 I: Integer; 199 begin 200 for I := 0 to Count - 1 do 201 WriteByte(Data); 126 202 end; 127 203 … … 135 211 begin 136 212 FEndianness := AValue; 137 {$if def FPC_LITTLE_ENDIAN}213 {$if defined(FPC_LITTLE_ENDIAN)} 138 214 SwapData := FEndianness = enBig; 139 {$elseif def FPC_BIG_ENDIAN}215 {$elseif defined(FPC_BIG_ENDIAN)} 140 216 SwapData := FEndianness = enLittle; 141 217 {$endif} 142 218 end; 143 219 220 procedure TMemoryStreamEx.WriteAnsiString(Data: string); 221 var 222 StringLength: Longint; 223 begin 224 StringLength := Length(Data); 225 Write(StringLength, SizeOf(StringLength)); 226 Write(Data[1], StringLength); 227 end; 228 144 229 procedure TMemoryStreamEx.WriteByte(Data: Byte); 145 230 begin … … 157 242 if SwapData then Data := Swap(Data); 158 243 Write(Data, SizeOf(Int64)); 244 end; 245 246 procedure TMemoryStreamEx.WriteString(Data:string); 247 begin 248 if Length(Data) > 0 then 249 Write(Data[1], Length(Data)); 159 250 end; 160 251 … … 202 293 end; 203 294 295 { TThreadMemoryStreamEx } 296 297 constructor TThreadMemoryStreamEx.Create; 298 begin 299 inherited Create; 300 Lock := TCriticalSection.Create; 301 end; 302 303 destructor TThreadMemoryStreamEx.Destroy; 304 begin 305 Lock.Destroy; 306 inherited Destroy; 307 end; 308 204 309 end.
Note:
See TracChangeset
for help on using the changeset viewer.