|
@@ -6,34 +6,34 @@ uses
|
|
|
SysUtils, Classes, watparser, watscanner, wasmmodule, wasmbinwriter,
|
|
|
wasmnormalize;
|
|
|
|
|
|
-procedure Traverse(p: TWatScanner);
|
|
|
-begin
|
|
|
- while p.Next do begin
|
|
|
- write(p.token,' ', p.resText);
|
|
|
- if p.token = weInstr then
|
|
|
- write('; inst = $', IntToHex(p.instrCode,2))
|
|
|
- else if p.token = weError then begin
|
|
|
- writeln('offset = ',p.ofs,' ',p.resText);
|
|
|
- break;
|
|
|
- end;
|
|
|
- writeln;
|
|
|
+type
|
|
|
+ TAsmParams = record
|
|
|
+ SrcFile : string;
|
|
|
+ Reloc : Boolean;
|
|
|
+ DstObjFile : string;
|
|
|
end;
|
|
|
+
|
|
|
+procedure DefaultParams(out p: TAsmParams);
|
|
|
+begin
|
|
|
+ p.SrcFile := '';
|
|
|
+ p.Reloc := true;
|
|
|
+ p.DstObjFile := '';
|
|
|
end;
|
|
|
|
|
|
-procedure WriteBin(const fndst: string; m: TWasmModule; WriteReloc: Boolean);
|
|
|
+procedure WriteBin(const p: TAsmParams; m: TWasmModule);
|
|
|
var
|
|
|
f : TFileStream;
|
|
|
begin
|
|
|
- f := TFileStream.Create(fndst, fmCreate);
|
|
|
+ f := TFileStream.Create(p.DstObjFile, fmCreate);
|
|
|
try
|
|
|
Normalize(m);
|
|
|
- WriteModule(m, f, WriteReloc, WriteReloc);
|
|
|
+ WriteModule(m, f, p.Reloc, p.Reloc);
|
|
|
finally
|
|
|
f.Free;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-procedure Run(const fn: string; const doTraverse: Boolean; doReloc: Boolean);
|
|
|
+procedure Run(const prm: TAsmParams);
|
|
|
var
|
|
|
st : TFileStream;
|
|
|
s : string;
|
|
@@ -41,22 +41,18 @@ var
|
|
|
m : TWasmModule;
|
|
|
err : string;
|
|
|
begin
|
|
|
- st := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
|
|
|
+ st := TFileStream.Create(prm.SrcFile, fmOpenRead or fmShareDenyNone);
|
|
|
p := TWatScanner.Create;
|
|
|
try
|
|
|
SetLength(s, st.Size);
|
|
|
if length(s)>0 then st.Read(s[1], length(s));
|
|
|
p.SetSource(s);
|
|
|
- if doTraverse then begin
|
|
|
- Traverse(p);
|
|
|
- Exit;
|
|
|
- end;
|
|
|
m := TWasmModule.Create;
|
|
|
try
|
|
|
if not ParseModule(p, m, err) then
|
|
|
writeln('Error: ', err)
|
|
|
else
|
|
|
- WriteBin( ChangeFileExt(fn,'.wasm'), m, doReloc);
|
|
|
+ WriteBin(prm, m);
|
|
|
finally
|
|
|
m.Free;
|
|
|
end;
|
|
@@ -66,13 +62,7 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-var
|
|
|
- gFn : string;
|
|
|
- gCommand : string = '';
|
|
|
- gReloc : Boolean = true;
|
|
|
- gCatch : Boolean = false;
|
|
|
-
|
|
|
-procedure ParseParams;
|
|
|
+procedure ParseParams(var p: TAsmParams);
|
|
|
var
|
|
|
i : integer;
|
|
|
s : string;
|
|
@@ -83,39 +73,39 @@ begin
|
|
|
s := ParamStr(i);
|
|
|
if (s<>'') and (s[1]='-') then begin
|
|
|
ls := AnsiLowerCase(s);
|
|
|
- if ls = '-noreloc' then gReloc := false
|
|
|
- else if ls = '-catch' then gCatch := true
|
|
|
- else gCommand:=ls;
|
|
|
+ if ls = '-o' then begin
|
|
|
+ inc(i);
|
|
|
+ if (i<=ParamCount) then
|
|
|
+ p.DstObjFile:=ParamStr(i);
|
|
|
+ end;
|
|
|
end else
|
|
|
- gFn := s;
|
|
|
+ p.SrcFile := s;
|
|
|
inc(i);
|
|
|
end;
|
|
|
+
|
|
|
+ if (p.SrcFile<>'') and (p.DstObjFile = '') then
|
|
|
+ p.DstObjFile := ChangeFileExt(p.SrcFile, '.wasm')
|
|
|
end;
|
|
|
|
|
|
+var
|
|
|
+ prm : TAsmParams;
|
|
|
begin
|
|
|
- ParseParams;
|
|
|
- if (gFn='') then begin
|
|
|
- writeln('please sepcify the input .wat file');
|
|
|
- writeln('other use:');
|
|
|
- writeln(' -compile %inpfn%');
|
|
|
- writeln(' -noreloc - prevents relocation information from being written');
|
|
|
- writeln(' -traverse %inpfn%');
|
|
|
+ DefaultParams(prm);
|
|
|
+ ParseParams(prm);
|
|
|
+ if (prm.SrcFile='') then begin
|
|
|
+ writeln('please specify the input .wat file');
|
|
|
exit;
|
|
|
end;
|
|
|
- if not FileExists(gFn) then begin
|
|
|
- writeln('file doesn''t exist: ', gFn);
|
|
|
+ if not FileExists(prm.SrcFile) then begin
|
|
|
+ writeln('file doesn''t exist: ', prm.SrcFile);
|
|
|
exit;
|
|
|
end;
|
|
|
|
|
|
- if gCatch then
|
|
|
- try
|
|
|
- Run(gFn, gCommand = '-traverse', gReloc);
|
|
|
- except
|
|
|
- on e: exception do
|
|
|
- writeln(e.message);
|
|
|
- end
|
|
|
- else
|
|
|
- Run(gFn, gCommand = '-traverse', gReloc);
|
|
|
-
|
|
|
+ try
|
|
|
+ Run(prm);
|
|
|
+ except
|
|
|
+ on e: exception do
|
|
|
+ writeln(e.message);
|
|
|
+ end
|
|
|
end.
|
|
|
|