diff --git a/utils/wasmbin/wasa.pas b/utils/wasmbin/wasa.pas index b83342d24c..dcf5781483 100644 --- a/utils/wasmbin/wasa.pas +++ b/utils/wasmbin/wasa.pas @@ -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.