1 {$INCLUDE ../shared/a_modes.inc}
8 sfs in '../sfs/sfs.pas',
9 sfsPlainFS in '../sfs/sfsPlainFS.pas',
10 sfsZipFS in '../sfs/sfsZipFS.pas',
11 mempool in '../shared/mempool.pas',
12 xstreams in '../shared/xstreams.pas',
13 xparser in '../shared/xparser.pas',
14 xdynrec in '../shared/xdynrec.pas',
15 xprofiler in '../shared/xprofiler.pas',
16 utils in '../shared/utils.pas',
17 hashtable in '../shared/hashtable.pas',
18 conbuf in '../shared/conbuf.pas',
19 e_log in '../engine/e_log.pas',
20 wadreader in '../shared/wadreader.pas',
21 MAPDEF in '../shared/MAPDEF.pas';
24 // ////////////////////////////////////////////////////////////////////////// //
32 inname: AnsiString = '';
33 outname: AnsiString = '';
34 totext: Integer = -1; // <0: guess; force outname extension
35 sign: packed array[0..3] of AnsiChar;
39 wasbin: Boolean = false;
42 if (ParamCount = 0) then
44 writeln('usage: mapcvt inname outname');
48 inname := ParamStr(1);
49 //writeln('inname: [', inname, ']');
50 if (ParamCount = 1) then
52 outname := forceFilenameExt(ParamStr(1), '');
53 if isWadPath(outname) then
55 outname := SFSReplacePathDelims(g_ExtractFilePathName(outname), '/');
56 if (Length(outname) = 0) then begin writeln('FATAL: can''t guess output name!'); Halt(1); end;
61 outname := ParamStr(2);
62 if StrEquCI1251(getFilenameExt(outname), '.txt') then totext := 1
63 else if StrEquCI1251(getFilenameExt(outname), '.map') then totext := 0
64 else if StrEquCI1251(getFilenameExt(outname), '.dfmap') then totext := 0
65 else if (Length(getFilenameExt(outname)) = 0) then totext := -1
66 else begin writeln('FATAL: can''t guess output format!'); Halt(1); end;
68 //writeln('outname: [', outname, ']; totext=', totext);
70 e_InitWritelnDriver();
71 conbufDumpToStdOut := true;
72 conbufConPrefix := false;
74 writeln('parsing "mapdef.txt"...');
75 //pr := TFileTextParser.Create('mapdef.txt');
76 pr := TStrTextParser.Create(defaultMapDef);
78 dfmapdef := TDynMapDef.Create(pr);
79 except on e: Exception do
81 writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message);
86 writeln('parsing "', inname, '"...');
88 if isWadPath(inname) then
90 wad := TWADFile.Create();
91 wad.ReadFile(g_ExtractWadName(inname));
92 wad.GetMapResource(g_ExtractFilePathName(inname), waddata, waddlen);
93 st := TSFSMemoryChunkStream.Create(waddata, waddlen, true);
98 st := openDiskFileRO(inname);
102 stt := getTimeMicro();
103 map := dfmapdef.parseMap(st, @wasbin);
104 stt := getTimeMicro()-stt;
105 if wasbin then write('binary') else write('text');
106 writeln(' map parsed in ', stt div 1000, '.', stt mod 1000, ' milliseconds');
108 on e: TDynParseException do
110 writeln('ERROR at (', e.tokLine, ',', e.tokCol, '): ', e.message);
115 writeln('ERROR: ', e.message);
120 {$IF DEFINED(D2D_DYNREC_PROFILER)}xdynDumpProfiles();{$ENDIF}
124 if wasbin then begin outname := forceFilenameExt(outname, '.txt'); totext := 1; end
125 else begin outname := forceFilenameExt(outname, '.map'); totext := 0; end;
130 writeln('writing "', outname, '"...');
131 st := createDiskFile(outname);
136 stt := getTimeMicro();
137 map.writeBinTo(lostdata, st);
138 stt := getTimeMicro()-stt;
139 if lostdata then writeln('***WARNING! some data was lost due to binary format limitations!');
145 wr := TFileTextWriter.Create(st);
146 stt := getTimeMicro();
148 stt := getTimeMicro()-stt;
152 writeln(' map written in ', stt div 1000, '.', stt mod 1000, ' milliseconds');