diff --git a/src/sfs/sfsPlainFS.pas b/src/sfs/sfsPlainFS.pas
index bda12681ff873e4717f4d3a3bc66a1f68d705cc0..81eb440964a7459bea276e1f401de216d221a0e1 100644 (file)
--- a/src/sfs/sfsPlainFS.pas
+++ b/src/sfs/sfsPlainFS.pas
// file type.
// undefine this and file type will be directory name.
{.$DEFINE SFS_PLAIN_FS_DEBUG_ALLEGRO}
+{.$DEFINE SFS_PLAINFS_FULL}
{$MODE DELPHI}
{.$R-}
unit sfsPlainFS;
SysUtils, Classes, Contnrs, sfs;
-
type
TSFSPlainVolumeType =
- (sfspvNone, sfspvWAD, sfspvPAK, sfspvGRP, sfspvSPE, sfspvWAD2, sfspvALL,
- sfspvDune2, sfspvMAX, sfspvSIN);
+ (sfspvNone,
+ sfspvPAK,
+ sfspvSIN
+ {$IFDEF SFS_PLAINFS_FULL}
+ ,sfspvWAD,
+ sfspvGRP,
+ sfspvSPE,
+ sfspvWAD2,
+ sfspvALL,
+ sfspvDune2,
+ sfspvMAX
+ {$ENDIF}
+ );
TSFSPlainVolume = class (TSFSVolume)
protected
fType: TSFSPlainVolumeType;
procedure PAKReadDirectory ();
+ procedure SINReadDirectory ();
+ {$IFDEF SFS_PLAINFS_FULL}
procedure WADReadDirectory ();
procedure GRPReadDirectory ();
procedure SPEReadDirectory ();
procedure ALLReadDirectory ();
procedure Dune2ReadDirectory ();
procedure MAXReadDirectory ();
- procedure SINReadDirectory ();
+ {$ENDIF}
procedure ReadDirectory (); override;
fLink: TSFSString;
end;
+{$IFDEF SFS_PLAINFS_FULL}
TAllegroProperty = class
name: TSFSString;
ofs: Int64;
size: Integer;
end;
+{$ENDIF}
function ReadMD (st: TStream): Integer;
result := (buf[0] shl 24) or (buf[1] shl 16) or (buf[2] shl 8) or buf[3];
end;
+{$IFDEF SFS_PLAINFS_FULL}
function WADCheckMagic (st: TStream): Boolean;
var
sign: packed array [0..3] of Char;
(dofs+fcnt*16 > st.Size) then exit;
result := true;
end;
+{$ENDIF}
function PAKCheckMagic (st: TStream): Boolean;
var
result := true;
end;
+{$IFDEF SFS_PLAINFS_FULL}
function GRPCheckMagic (st: TStream): Boolean;
var
sign: packed array [0..11] of Char;
(dofs+fcnt > st.Size) then exit;
result := true;
end;
+{$ENDIF}
{ TSFSPlainVolume }
+{$IFDEF SFS_PLAINFS_FULL}
procedure TSFSPlainVolume.WADReadDirectory ();
var
fcnt: LongWord;
Dec(fcnt);
end;
end;
+{$ENDIF}
procedure TSFSPlainVolume.PAKReadDirectory ();
var
end;
end;
+{$IFDEF SFS_PLAINFS_FULL}
procedure TSFSPlainVolume.GRPReadDirectory ();
var
fcnt: LongWord;
if c <> f then
begin
// link can't be linked to itself
- if SFSStrComp(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) = 0 then break;
+ if SFSStrEqu(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) then break;
end;
Inc(c);
end;
Dec(fcnt, 16);
end;
end;
-
+{$ENDIF}
procedure TSFSPlainVolume.ReadDirectory ();
begin
case fType of
- sfspvWAD: WADReadDirectory();
sfspvPAK: PAKReadDirectory();
+ sfspvSIN: SINReadDirectory();
+ {$IFDEF SFS_PLAINFS_FULL}
+ sfspvWAD: WADReadDirectory();
sfspvGRP: GRPReadDirectory();
sfspvSPE: SPEReadDirectory();
sfspvWAD2: WAD2ReadDirectory();
sfspvALL: ALLReadDirectory();
sfspvDune2: Dune2ReadDirectory();
sfspvMAX: MAXReadDirectory();
- sfspvSIN: SINReadDirectory();
+ {$ENDIF}
else raise ESFSError.Create('invalid plain SFS');
end;
end;
function TSFSPlainVolumeFactory.IsMyVolumePrefix (const prefix: TSFSString): Boolean;
begin
result :=
- (SFSStrComp(prefix, 'pak') = 0) or
- //(SFSStrComp(prefix, 'wad') = 0) or // sorry
- (SFSStrComp(prefix, 'wad2') = 0) or
- (SFSStrComp(prefix, 'grp') = 0) or
- (SFSStrComp(prefix, 'spe') = 0) or
- (SFSStrComp(prefix, 'spec') = 0) or
- (SFSStrComp(prefix, 'quake') = 0) or
- (SFSStrComp(prefix, 'doom') = 0) or
- (SFSStrComp(prefix, 'duke3d') = 0) or
- (SFSStrComp(prefix, 'abuse') = 0) or
- (SFSStrComp(prefix, 'allegro') = 0) or
- (SFSStrComp(prefix, 'dune2') = 0) or
- (SFSStrComp(prefix, 'max') = 0) or
- (SFSStrComp(prefix, 'sin') = 0);
+ SFSStrEqu(prefix, 'pak') or
+ SFSStrEqu(prefix, 'sin') or
+ SFSStrEqu(prefix, 'quake')
+ {$IFDEF SFS_PLAINFS_FULL}
+ or
+ SFSStrEqu(prefix, 'wad') or // sorry
+ SFSStrEqu(prefix, 'wad2') or
+ SFSStrEqu(prefix, 'grp') or
+ SFSStrEqu(prefix, 'spe') or
+ SFSStrEqu(prefix, 'spec') or
+ SFSStrEqu(prefix, 'doom') or
+ SFSStrEqu(prefix, 'duke3d') or
+ SFSStrEqu(prefix, 'abuse') or
+ SFSStrEqu(prefix, 'allegro') or
+ SFSStrEqu(prefix, 'dune2') or
+ SFSStrEqu(prefix, 'max')
+ {$ENDIF}
+ ;
end;
procedure TSFSPlainVolumeFactory.Recycle (vol: TSFSVolume);
vt: TSFSPlainVolumeType;
begin
vt := sfspvNone;
- if WADCheckMagic(st) then vt := sfspvWAD
- else if PAKCheckMagic(st) then vt := sfspvPAK
+ if PAKCheckMagic(st) then vt := sfspvPAK
+ else if SINCheckMagic(st) then vt := sfspvSIN
+ {$IFDEF SFS_PLAINFS_FULL}
+ else if WADCheckMagic(st) then vt := sfspvWAD
else if GRPCheckMagic(st) then vt := sfspvGRP
else if SPECheckMagic(st) then vt := sfspvSPE
else if WAD2CheckMagic(st) then vt := sfspvWAD2
//else if ALLCheckMagic(st) then vt := sfspvALL
else if MAXCheckMagic(st) then vt := sfspvMAX
- else if SINCheckMagic(st) then vt := sfspvSIN;
- //else if Dune2CheckMagic(st) then vt := sfspvDune2; // this must be the last!
+ //else if Dune2CheckMagic(st) then vt := sfspvDune2 // this must be the last!
+ {$ENDIF}
+ ;
if vt <> sfspvNone then
begin