X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Futils.pas;h=5ef58845df0057b088866ef616bbf1e1f6b3ebcf;hb=ad2c58b32ddcf077c5967b70e104851bb7852ad0;hp=5cd2af8831b8e7a1673338b1895691610f7f463a;hpb=987c4a835a103345b59937e8e1be8524a6228712;p=d2df-sdl.git diff --git a/src/shared/utils.pas b/src/shared/utils.pas index 5cd2af8..5ef5884 100644 --- a/src/shared/utils.pas +++ b/src/shared/utils.pas @@ -104,10 +104,14 @@ function findFileCI (var pathname: AnsiString; lastIsDir: Boolean=false): Boolea // return fixed AnsiString or empty AnsiString function findDiskWad (fname: AnsiString): AnsiString; +// slashes must be normalized! +function isWadNamesEqu (wna, wnb: AnsiString): Boolean; // they throws function openDiskFileRO (pathname: AnsiString): TStream; function createDiskFile (pathname: AnsiString): TStream; +// creates file if necessary +function openDiskFileRW (pathname: AnsiString): TStream; // little endian procedure writeSign (st: TStream; const sign: AnsiString); @@ -278,6 +282,16 @@ implementation uses xstreams; +const wadExtensions: array [0..6] of AnsiString = ( + '.dfz', + '.wad', + '.dfwad', + '.pk3', + '.pak', + '.zip', + '.dfzip' +); + // ////////////////////////////////////////////////////////////////////////// // procedure CopyMemory (Dest: Pointer; Src: Pointer; Len: LongWord); inline; @@ -812,10 +826,13 @@ end; function hasWadExtension (const fn: AnsiString): Boolean; var - ext: AnsiString; + ext, newExt: AnsiString; begin ext := getFilenameExt(fn); - result := StrEquCI1251(ext, '.wad') or StrEquCI1251(ext, '.pk3') or StrEquCI1251(ext, '.zip') or StrEquCI1251(ext, '.dfz'); + result := true; + for newExt in wadExtensions do if (StrEquCI1251(ext, newExt)) then exit; + result := false; + //result := StrEquCI1251(ext, '.wad') or StrEquCI1251(ext, '.pk3') or StrEquCI1251(ext, '.zip') or StrEquCI1251(ext, '.dfz'); end; @@ -825,6 +842,7 @@ begin if not hasWadExtension(result) then result := result+'.wad'; end; + function isWadData (data: Pointer; len: LongWord): Boolean; var p: PChar; begin @@ -1146,7 +1164,27 @@ begin end; -const fileExtensions: array [0..6] of AnsiString = ('.dfz', '.wad', '.dfwad', '.pk3', '.pak', '.zip', '.dfzip'); +function isWadNamesEqu (wna, wnb: AnsiString): Boolean; +var + ext, newExt: AnsiString; + found: Boolean; +begin + result := StrEquCI1251(wna, wnb); + if result then exit; + // check first ext + ext := getFilenameExt(wna); + found := false; + for newExt in wadExtensions do if (StrEquCI1251(ext, newExt)) then begin found := true; break; end; + if not found then exit; + // check second ext + ext := getFilenameExt(wnb); + found := false; + for newExt in wadExtensions do if (StrEquCI1251(ext, newExt)) then begin found := true; break; end; + if not found then exit; + wna := forceFilenameExt(wna, ''); + wnb := forceFilenameExt(wnb, ''); + result := StrEquCI1251(wna, wnb); +end; function findDiskWad (fname: AnsiString): AnsiString; var @@ -1159,7 +1197,7 @@ begin origExt := getFilenameExt(fname); fname := forceFilenameExt(fname, ''); //writeln(' findDiskWad01: fname=<', fname, '>; origExt=<', origExt, '>'); - for newExt in fileExtensions do + for newExt in wadExtensions do begin //writeln(' findDiskWad02: fname=<', fname, '>; origExt=<', origExt, '>; newExt=<', newExt, '>'); if (StrEquCI1251(newExt, origExt)) then @@ -1193,6 +1231,30 @@ begin end; +function openDiskFileRW (pathname: AnsiString): TStream; +var + path: AnsiString; + oldname: AnsiString; +begin + //writeln('*** TRYING R/W FILE "', pathname, '"'); + path := ExtractFilePath(pathname); + if length(path) > 0 then + begin + if not findFileCI(path, true) then raise Exception.Create('can''t create file "'+pathname+'"'); + end; + oldname := pathname; + if findFileCI(oldname) then + begin + //writeln('*** found old file "', oldname, '"'); + result := TFileStream.Create(oldname, fmOpenReadWrite or fmShareDenyWrite); + end + else + begin + result := TFileStream.Create(path+ExtractFileName(pathname), fmCreate); + end; +end; + + procedure writeIntegerLE (st: TStream; vp: Pointer; size: Integer); {$IFDEF ENDIAN_LITTLE} begin