X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Ftools%2Fmapcvt.dpr;h=de1c0a36427acbfc0d0d6e84b07ea8c8230228f7;hb=58722c153faad833472ba181784dcde8cf65152e;hp=cd02ab9b5d1c4fdf259d4bd281345745eb6bdccb;hpb=2b04301f4303668096c37c21e06af70930f55b7f;p=d2df-sdl.git diff --git a/src/tools/mapcvt.dpr b/src/tools/mapcvt.dpr index cd02ab9..de1c0a3 100644 --- a/src/tools/mapcvt.dpr +++ b/src/tools/mapcvt.dpr @@ -1,13 +1,22 @@ {$INCLUDE ../shared/a_modes.inc} -{$APPTYPE CONSOLE} +{$IFDEF WINDOWS} + {$APPTYPE CONSOLE} +{$ENDIF} uses SysUtils, Classes, + sfs in '../sfs/sfs.pas', + sfsPlainFS in '../sfs/sfsPlainFS.pas', + sfsZipFS in '../sfs/sfsZipFS.pas', xstreams in '../shared/xstreams.pas', xparser in '../shared/xparser.pas', xdynrec in '../shared/xdynrec.pas', xprofiler in '../shared/xprofiler.pas', utils in '../shared/utils.pas', + hashtable in '../shared/hashtable.pas', + conbuf in '../shared/conbuf.pas', + e_log in '../engine/e_log.pas', + wadreader in '../shared/wadreader.pas', MAPDEF in '../shared/MAPDEF.pas'; @@ -23,6 +32,9 @@ var outname: AnsiString = ''; totext: Integer = -1; // <0: guess; force outname extension sign: packed array[0..3] of AnsiChar; + wad: TWADFile = nil; + waddata: Pointer; + waddlen: Integer; begin if (ParamCount = 0) then begin @@ -35,6 +47,11 @@ begin if (ParamCount = 1) then begin outname := forceFilenameExt(ParamStr(1), ''); + if isWadPath(outname) then + begin + outname := SFSReplacePathDelims(g_ExtractFilePathName(outname), '/'); + if (Length(outname) = 0) then begin writeln('FATAL: can''t guess output name!'); Halt(1); end; + end; end else begin @@ -47,6 +64,10 @@ begin end; //writeln('outname: [', outname, ']; totext=', totext); + e_InitWritelnDriver(); + conbufDumpToStdOut := true; + conbufConPrefix := false; + writeln('parsing "mapdef.txt"...'); //pr := TFileTextParser.Create('mapdef.txt'); pr := TStrTextParser.Create(defaultMapDef); @@ -60,7 +81,20 @@ begin end; writeln('parsing "', inname, '"...'); - st := openDiskFileRO(inname); + + if isWadPath(inname) then + begin + wad := TWADFile.Create(); + wad.ReadFile(g_ExtractWadName(inname)); + wad.GetMapResource(g_ExtractFilePathName(inname), waddata, waddlen); + st := TSFSMemoryChunkStream.Create(waddata, waddlen, true); + wad.Free(); + end + else + begin + st := openDiskFileRO(inname); + end; + st.ReadBuffer(sign, 4); st.position := 0; if (sign[0] = 'M') and (sign[1] = 'A') and (sign[2] = 'P') and (sign[3] = #1) then @@ -70,7 +104,8 @@ begin stt := curTimeMicro(); map := dfmapdef.parseBinMap(st); stt := curTimeMicro()-stt; - writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds'); + writeln('binary map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds'); + st.Free(); end else begin @@ -81,7 +116,7 @@ begin stt := curTimeMicro(); map := dfmapdef.parseMap(pr); stt := curTimeMicro()-stt; - writeln('text map parsed in ', stt div 1000, '.', stt mod 1000, ' microseconds'); + writeln('text map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds'); except on e: Exception do begin writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message); @@ -91,6 +126,8 @@ begin pr.Free(); end; + {$IF DEFINED(D2D_DYNREC_PROFILER)}xdynDumpProfiles();{$ENDIF} + assert(totext >= 0); writeln('writing "', outname, '"...'); @@ -101,7 +138,7 @@ begin stt := curTimeMicro(); map.writeBinTo(st); stt := curTimeMicro()-stt; - writeln('binary map written in ', stt div 1000, '.', stt mod 1000, ' microseconds'); + writeln('binary map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds'); end else begin @@ -110,7 +147,7 @@ begin stt := curTimeMicro(); map.writeTo(wr); stt := curTimeMicro()-stt; - writeln('text map written in ', stt div 1000, '.', stt mod 1000, ' microseconds'); + writeln('text map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds'); wr.Free(); end; end.