wasa.pas 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. program wasa;
  2. {$mode objfpc}{$H+}
  3. uses
  4. SysUtils, Classes, watparser, watscanner, wasmmodule, wasmbinwriter,
  5. wasmnormalize;
  6. procedure Traverse(p: TWatScanner);
  7. begin
  8. while p.Next do begin
  9. write(p.token,' ', p.resText);
  10. if p.token = weInstr then
  11. write('; inst = $', IntToHex(p.instrCode,2))
  12. else if p.token = weError then begin
  13. writeln('offset = ',p.ofs,' ',p.resText);
  14. break;
  15. end;
  16. writeln;
  17. end;
  18. end;
  19. procedure WriteBin(const fndst: string; m: TWasmModule; WriteReloc: Boolean);
  20. var
  21. f : TFileStream;
  22. begin
  23. f := TFileStream.Create(fndst, fmCreate);
  24. try
  25. Normalize(m);
  26. WriteModule(m, f, WriteReloc, WriteReloc);
  27. finally
  28. f.Free;
  29. end;
  30. end;
  31. procedure Run(const fn: string; const doTraverse: Boolean; doReloc: Boolean);
  32. var
  33. st : TFileStream;
  34. s : string;
  35. p : TWatScanner;
  36. m : TWasmModule;
  37. err : string;
  38. begin
  39. st := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
  40. p := TWatScanner.Create;
  41. try
  42. SetLength(s, st.Size);
  43. if length(s)>0 then st.Read(s[1], length(s));
  44. p.SetSource(s);
  45. if doTraverse then begin
  46. Traverse(p);
  47. Exit;
  48. end;
  49. m := TWasmModule.Create;
  50. try
  51. if not ParseModule(p, m, err) then
  52. writeln('Error: ', err)
  53. else
  54. WriteBin( ChangeFileExt(fn,'.wasm'), m, doReloc);
  55. finally
  56. m.Free;
  57. end;
  58. finally
  59. p.Free;
  60. st.Free;
  61. end;
  62. end;
  63. var
  64. gFn : string;
  65. gCommand : string = '';
  66. gReloc : Boolean = true;
  67. gCatch : Boolean = false;
  68. procedure ParseParams;
  69. var
  70. i : integer;
  71. s : string;
  72. ls : string;
  73. begin
  74. i:=1;
  75. while i<=ParamCount do begin
  76. s := ParamStr(i);
  77. if (s<>'') and (s[1]='-') then begin
  78. ls := AnsiLowerCase(s);
  79. if ls = '-noreloc' then gReloc := false
  80. else if ls = '-catch' then gCatch := true
  81. else gCommand:=ls;
  82. end else
  83. gFn := s;
  84. inc(i);
  85. end;
  86. end;
  87. begin
  88. ParseParams;
  89. if (gFn='') then begin
  90. writeln('please sepcify the input .wat file');
  91. writeln('other use:');
  92. writeln(' -compile %inpfn%');
  93. writeln(' -noreloc - prevents relocation information from being written');
  94. writeln(' -traverse %inpfn%');
  95. exit;
  96. end;
  97. if not FileExists(gFn) then begin
  98. writeln('file doesn''t exist: ', gFn);
  99. exit;
  100. end;
  101. if gCatch then
  102. try
  103. Run(gFn, gCommand = '-traverse', gReloc);
  104. except
  105. on e: exception do
  106. writeln(e.message);
  107. end
  108. else
  109. Run(gFn, gCommand = '-traverse', gReloc);
  110. end.