X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fsfs%2FsfsPlainFS.pas;h=b658388b072f311af0bcd78b811375154f0e58ee;hb=844441154d1220d6c83f75043300c2851ec87109;hp=bda12681ff873e4717f4d3a3bc66a1f68d705cc0;hpb=74b8cc24c941b92453f71fa9c912db10119acf81;p=d2df-sdl.git diff --git a/src/sfs/sfsPlainFS.pas b/src/sfs/sfsPlainFS.pas index bda1268..b658388 100644 --- a/src/sfs/sfsPlainFS.pas +++ b/src/sfs/sfsPlainFS.pas @@ -18,6 +18,7 @@ // 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; @@ -28,17 +29,29 @@ uses 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 (); @@ -46,7 +59,7 @@ type procedure ALLReadDirectory (); procedure Dune2ReadDirectory (); procedure MAXReadDirectory (); - procedure SINReadDirectory (); + {$ENDIF} procedure ReadDirectory (); override; @@ -66,7 +79,7 @@ type implementation uses - xstreams; + xstreams, utils; type @@ -76,11 +89,13 @@ type fLink: TSFSString; end; +{$IFDEF SFS_PLAINFS_FULL} TAllegroProperty = class name: TSFSString; ofs: Int64; size: Integer; end; +{$ENDIF} function ReadMD (st: TStream): Integer; @@ -92,6 +107,7 @@ begin 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; @@ -106,6 +122,7 @@ begin (dofs+fcnt*16 > st.Size) then exit; result := true; end; +{$ENDIF} function PAKCheckMagic (st: TStream): Boolean; var @@ -137,6 +154,7 @@ begin result := true; end; +{$IFDEF SFS_PLAINFS_FULL} function GRPCheckMagic (st: TStream): Boolean; var sign: packed array [0..11] of Char; @@ -221,9 +239,11 @@ begin (dofs+fcnt > st.Size) then exit; result := true; end; +{$ENDIF} { TSFSPlainVolume } +{$IFDEF SFS_PLAINFS_FULL} procedure TSFSPlainVolume.WADReadDirectory (); var fcnt: LongWord; @@ -246,6 +266,7 @@ begin Dec(fcnt); end; end; +{$ENDIF} procedure TSFSPlainVolume.PAKReadDirectory (); var @@ -291,6 +312,7 @@ begin end; end; +{$IFDEF SFS_PLAINFS_FULL} procedure TSFSPlainVolume.GRPReadDirectory (); var fcnt: LongWord; @@ -386,7 +408,7 @@ begin if c <> f then begin // link can't be linked to itself - if SFSStrComp(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) = 0 then break; + if StrEquCI1251(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) then break; end; Inc(c); end; @@ -594,20 +616,22 @@ begin 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; @@ -626,7 +650,7 @@ begin kill := false; try try - fs := TFileStream.Create(fFileName, fmOpenRead or fmShareDenyWrite); + fs := TFileStream.Create(fFileName, fmOpenRead or {fmShareDenyWrite}fmShareDenyNone); kill := true; except fs := fFileStream; @@ -644,7 +668,7 @@ begin kill := false; try try - fs := TFileStream.Create(fFileName, fmOpenRead or fmShareDenyWrite); + fs := TFileStream.Create(fFileName, fmOpenRead or {fmShareDenyWrite}fmShareDenyNone); kill := true; except fs := fFileStream; @@ -667,20 +691,24 @@ 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); + StrEquCI1251(prefix, 'pak') or + StrEquCI1251(prefix, 'sin') or + StrEquCI1251(prefix, 'quake') + {$IFDEF SFS_PLAINFS_FULL} + or + StrEquCI1251(prefix, 'wad') or // sorry + StrEquCI1251(prefix, 'wad2') or + StrEquCI1251(prefix, 'grp') or + StrEquCI1251(prefix, 'spe') or + StrEquCI1251(prefix, 'spec') or + StrEquCI1251(prefix, 'doom') or + StrEquCI1251(prefix, 'duke3d') or + StrEquCI1251(prefix, 'abuse') or + StrEquCI1251(prefix, 'allegro') or + StrEquCI1251(prefix, 'dune2') or + StrEquCI1251(prefix, 'max') + {$ENDIF} + ; end; procedure TSFSPlainVolumeFactory.Recycle (vol: TSFSVolume); @@ -693,15 +721,18 @@ var 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 @@ -723,6 +754,6 @@ var initialization pakf := TSFSPlainVolumeFactory.Create(); SFSRegisterVolumeFactory(pakf); -finalization - SFSUnregisterVolumeFactory(pakf); +//finalization +// SFSUnregisterVolumeFactory(pakf); end.