[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]
{
Can someone give me some tips on how to speed up/improve my unit for storing
multiple format data structures in a single file?
I use numerous data types that must be saved, so I came up with a simple
multi format file (MFF <g>) structure. It has a 5 byte Header Id which
designates it a MFF structure, and a 7 byte Program Id which is used to
define which program the file belongs to (I would use 8 byte ProgId, but then
would have to deal with all the triskadekaphobes out there =-> ). The rest
of the file is made up of data packets which start with 2, 2byte word
variables, one denoting the type, the other the size of the following data.
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
unit MFFUnit;
interface
const
HeaderId = 'MFF01';
HeaderIdSize = 5;
ProgIdSize = 7;
type
Arr5 = array[1..5] of char;
Arr7 = array[1..7] of char;
Arr12 = array[1..12] of char;
Str5 = string[5];
Str7 = string[7];
procedure WriteHeader(var F: file; HId: str5; Pid: str7);
procedure ReadHeader(var F: file; var HId: str5; var Pid: str7);
procedure WritePacket(var F: file; FPos: longint; var Dat; DataType,
DataSize: Word);
procedure ReadPacket(var F: file; FPos: longint; var Dat; var DataType,
DataSize: Word);
implementation
procedure WriteHeader;
var
A1: Arr12;
Count: integer;
begin
Seek(F, 0);
FillChar(A1, 12, #0);
for Count := 1 to length(HiD) do A1[Count] := HiD[Count];
for Count := 1 to length(PiD) do A1[Count+5] := PiD[Count];
BlockWrite(F, A1, 12);
end;
procedure ReadHeader;
var
A1: Arr12;
Count: integer;
begin
Seek(F, 0);
Hid[0] := #5;
PiD[0] := #7;
BlockRead(F, A1, 12);
for Count := 1 to 5 do if A1[Count] = #0 then
begin
HiD[0] := Chr(Count-1);
break;
end else HiD[Count] := A1[Count];
for Count := 1 to 7 do if A1[Count+5] = #0 then
begin
PiD[0] := chr(Count-1);
break;
end else PiD[Count] := A1[Count+5];
end;
procedure WritePacket;
begin
Seek(F, FPos);
BlockWrite(F, DataType, 2);
BlockWrite(F, DataSize, 2);
BlockWrite(F, Dat, DataSize);
end;
procedure ReadPacket;
begin
Seek(F, FPos);
BlockRead(F, DataType, 2);
BlockRead(F, DataSize, 2);
BlockRead(F, Dat, DataSize);
end;
end.
[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]