pas2jslibcompiler.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 2018 Michael Van Canneyt
  4. Pascal to Javascript converter class. Library version
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************
  11. }
  12. {$IFNDEF FPC_DOTTEDUNITS}
  13. unit pas2jslibcompiler;
  14. {$ENDIF FPC_DOTTEDUNITS}
  15. {$mode objfpc}{$H+}
  16. {$IFDEF darwin}
  17. {$DEFINE UseCDecl}
  18. {$ENDIF}
  19. interface
  20. {$IFDEF FPC_DOTTEDUNITS}
  21. uses
  22. System.SysUtils, System.Classes, System.Math,
  23. Pas2Js.SrcMap, Pas2Js.Files.Cache, Pas2Js.Compiler.Base, Pas2Js.Compiler.Pcu,
  24. Pas2Js.Compiler.Config, Pas2Js.Compiler.PostProcess;
  25. {$ELSE FPC_DOTTEDUNITS}
  26. uses
  27. SysUtils, Classes, Math,
  28. FPPJsSrcMap, Pas2jsFileCache, Pas2JSCompiler, Pas2jsPCUCompiler,
  29. Pas2JSCompilerCfg, Pas2JSCompilerPP;
  30. {$ENDIF FPC_DOTTEDUNITS}
  31. { ---------------------------------------------------------------------
  32. Compiler descendant, usable in library
  33. ---------------------------------------------------------------------}
  34. Const
  35. DefaultReadBufferSize = 32*1024; // 32kb buffer
  36. Type
  37. PDirectoryCache = Pointer;
  38. TLibLogCallBack = Procedure (Data : Pointer; Msg : PAnsiChar; MsgLen : Integer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  39. TWriteJSCallBack = Procedure (Data : Pointer;
  40. AFileName: PAnsiChar; AFileNameLen : Integer;
  41. AFileData : PAnsiChar; AFileDataLen: Int32); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  42. TReadPasCallBack = Procedure (Data : Pointer;
  43. AFileName: PAnsiChar; AFileNameLen : Integer;
  44. AFileData : PAnsiChar; Var AFileDataLen: Int32); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  45. TReadDirCallBack = Function (Data : Pointer;
  46. P : PDirectoryCache; ADirPath: PAnsiChar): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  47. TUnitAliasCallBack = Function (Data: Pointer;
  48. AUnitName: PAnsiChar; AUnitNameMaxLen: Integer): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  49. TGetFileSrcAttrCallBack = procedure(AData: Pointer; AFileName: PAnsiChar; AFileNameLen: Integer; AFileInfo: PPas2jsFileSrcAttr); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  50. { TLibraryPas2JSCompiler }
  51. TLibraryPas2JSCompiler = Class(TPas2JSPCUCompiler)
  52. private
  53. FLastError: String;
  54. FLastErrorClass: String;
  55. FOnLibLogCallBack: TLibLogCallBack;
  56. FOnLibLogData: Pointer;
  57. FOnReadDir: TReadDirCallBack;
  58. FOnReadDirData: Pointer;
  59. FOnReadPasData: Pointer;
  60. FOnReadPasFile: TReadPasCallBack;
  61. FOnUnitAlias: TUnitAliasCallBack;
  62. FOnUnitAliasData: Pointer;
  63. FOnWriteJSCallBack: TWriteJSCallBack;
  64. FOnWriteJSData: Pointer;
  65. FReadBufferLen: Cardinal;
  66. FOnGetFileSrcAttr: TGetFileSrcAttrCallBack;
  67. FOnGetFileSrcAttrData: Pointer;
  68. function GetLogEncoding: String;
  69. procedure SetLogEncoding(AValue: String);
  70. Protected
  71. Function DoWriteJSFile(const DestFilename, MapFilename: String; aWriter: TPas2JSMapper): Boolean; override;
  72. Procedure GetLastError(AError : PAnsiChar; Var AErrorLength : Longint;
  73. AErrorClass : PAnsiChar; Var AErrorClassLength : Longint);
  74. Function ReadFile(aFilename: string; var aSource: string): boolean; virtual;
  75. Function ReadDirectory(Dir: TPas2jsCachedDirectory): boolean; virtual;
  76. procedure GetFileSrcAttr(AFilename: string; var AAttr: TPas2jsFileSrcAttr);
  77. {$IFDEF DebugLib}
  78. procedure LibDbgLog(Msg: string);
  79. {$ENDIF}
  80. Public
  81. Constructor Create; override;
  82. procedure CheckUnitAlias(var UseUnitName: string); override;
  83. Procedure DoLibraryLog(Sender : TObject; Const Msg : String);
  84. Function LibraryRun(ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) :Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  85. Property LastError : String Read FLastError Write FLastError;
  86. Property LastErrorClass : String Read FLastErrorClass Write FLastErrorClass;
  87. property LogEncoding: String read GetLogEncoding write SetLogEncoding;
  88. Property OnLibLogCallBack : TLibLogCallBack Read FOnLibLogCallBack Write FOnLibLogCallBack;
  89. Property OnLibLogData : Pointer Read FOnLibLogData Write FOnLibLogData;
  90. Property OnWriteJSCallBack : TWriteJSCallBack Read FOnWriteJSCallBack Write FOnWriteJSCallBack;
  91. Property OnWriteJSData : Pointer Read FOnWriteJSData Write FOnWriteJSData;
  92. Property OnReadPasFile : TReadPasCallBack Read FOnReadPasFile Write FOnReadPasFile;
  93. Property OnReadPasData : Pointer Read FOnReadPasData Write FOnReadPasData;
  94. Property ReadBufferLen : Cardinal Read FReadBufferLen Write FReadBufferLen;
  95. Property OnReadDir: TReadDirCallBack read FOnReadDir write FOnReadDir;
  96. Property OnReadDirData: Pointer read FOnReadDirData write FOnReadDirData;
  97. Property OnUnitAlias: TUnitAliasCallBack read FOnUnitAlias write FOnUnitAlias;
  98. Property OnUnitAliasData: Pointer read FOnUnitAliasData write FOnUnitAliasData;
  99. property OnGetFileSrcAttr: TGetFileSrcAttrCallBack read FOnGetFileSrcAttr write FOnGetFileSrcAttr;
  100. property OnGetFileSrcAttrData: Pointer read FOnGetFileSrcAttrData write FOnGetFileSrcAttrData;
  101. end;
  102. Type
  103. PPas2JSCompiler = Pointer;
  104. Procedure SetPas2JSWriteJSCallBack(P : PPas2JSCompiler; ACallBack : TWriteJSCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  105. Procedure SetPas2JSCompilerLogCallBack(P : PPas2JSCompiler; ACallBack : TLibLogCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  106. Procedure SetPas2JSReadPasCallBack(P : PPas2JSCompiler; ACallBack : TReadPasCallBack; CallBackData : Pointer; ABufferSize : Cardinal); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  107. Procedure SetPas2JSReadDirCallBack(P : PPas2JSCompiler; ACallBack : TReadDirCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  108. Procedure AddPas2JSDirectoryEntry(P: PDirectoryCache; AFilename: PAnsiChar;
  109. AAge: TPas2jsFileAgeTime; AAttr: TPas2jsFileAttr; ASize: TPas2jsFileSize); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  110. Procedure SetPas2JSUnitAliasCallBack(P : PPas2JSCompiler; ACallBack : TUnitAliasCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  111. Function RunPas2JSCompiler(P : PPas2JSCompiler; ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) : Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  112. Procedure FreePas2JSCompiler(P : PPas2JSCompiler); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  113. Function GetPas2JSCompiler : PPas2JSCompiler; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  114. Procedure GetPas2JSCompilerLastError(P : PPas2JSCompiler; AError : PAnsiChar; Var AErrorLength : Longint; AErrorClass : PAnsiChar; Var AErrorClassLength : Longint); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  115. procedure SetPas2JSLogEncoding(P : PPas2JSCompiler; Enconding: PAnsiChar); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  116. procedure SetPas2JSGetFileSrcAttrCallBack(P: PPas2JSCompiler; ACallBack: TGetFileSrcAttrCallBack; ACallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  117. implementation
  118. { TLibraryPas2JSCompiler }
  119. function TLibraryPas2JSCompiler.GetLogEncoding: String;
  120. begin
  121. Result := Log.Encoding;
  122. end;
  123. procedure TLibraryPas2JSCompiler.SetLogEncoding(AValue: String);
  124. begin
  125. Log.Encoding := AValue;
  126. end;
  127. function TLibraryPas2JSCompiler.DoWriteJSFile(const DestFilename,
  128. MapFilename: String; aWriter: TPas2JSMapper): Boolean;
  129. var
  130. WithUTF8BOM: Boolean;
  131. ms: TMemoryStream;
  132. begin
  133. Result:=Assigned(OnWriteJSCallBack);
  134. if Result then
  135. begin
  136. ms:=TMemoryStream.Create;
  137. try
  138. try
  139. WithUTF8BOM:=(Log.Encoding='') or (Log.Encoding='utf8');
  140. aWriter.SaveJSToStream(WithUTF8BOM,ExtractFilename(MapFilename),ms);
  141. {$IFDEF DebugLib}
  142. LibDbgLog('DoWriteJSFile: DestFile="'+DestFilename+'" Map="'+MapFilename+'" '+IntToStr(ms.Position));
  143. {$ENDIF}
  144. OnWriteJSCallBack(OnWriteJSData,PAnsiChar(DestFileName),Length(DestFileName),PAnsiChar(ms.Memory),ms.Position);
  145. except
  146. Result:=False;
  147. end;
  148. finally
  149. ms.Free;
  150. end;
  151. end;
  152. end;
  153. procedure TLibraryPas2JSCompiler.GetLastError(AError: PAnsiChar;
  154. var AErrorLength: Longint; AErrorClass: PAnsiChar;
  155. var AErrorClassLength: Longint);
  156. Var
  157. L : Integer;
  158. begin
  159. L:=Length(LastError);
  160. if (L>AErrorLength) then
  161. L:=AErrorLength;
  162. if (L>0) then
  163. Move(FLastError[1],AError^,L);
  164. AErrorLength:=L;
  165. L:=Length(LastErrorClass);
  166. if L>AErrorClassLength then
  167. L:=AErrorClassLength;
  168. if (L>0) then
  169. Move(FLastErrorClass[1],AErrorClass^,L);
  170. AErrorClassLength:=L;
  171. end;
  172. function TLibraryPas2JSCompiler.ReadFile(aFilename: string; var aSource: string): boolean;
  173. Var
  174. Buf : Array of AnsiChar;
  175. S : TStringStream;
  176. BytesRead : Cardinal;
  177. begin
  178. if Not Assigned(OnReadPasFile) then
  179. Exit(False);
  180. S:=nil;
  181. try
  182. if ReadBufferLen=0 then
  183. ReadBufferLen:=DefaultReadBufferSize;
  184. SetLength(Buf{%H-},ReadBufferLen);
  185. S:=TStringStream.Create(''{$IF FPC_FULLVERSION>=30101},CP_ACP{$ENDIF});
  186. Repeat
  187. BytesRead:=ReadBufferLen;
  188. {$IFDEF DebugLib}
  189. LibDbgLog('ReadFile File="'+aFilename+'" BufferLen='+IntToStr(ReadBufferLen));
  190. {$ENDIF}
  191. FOnReadPasFile(OnReadPasData,PAnsiChar(aFileName),Length(aFileName),@Buf[0],BytesRead);
  192. If BytesRead>0 then
  193. S.Write(Buf[0],BytesRead);
  194. Until (BytesRead<ReadBufferLen);
  195. Result:=S.Size<>0;
  196. if Result then
  197. aSource:=S.DataString;
  198. finally
  199. SetLength(Buf,0);
  200. S.Free;
  201. end;
  202. end;
  203. function TLibraryPas2JSCompiler.ReadDirectory(Dir: TPas2jsCachedDirectory
  204. ): boolean;
  205. begin
  206. Result:=false; // return false to call the default TPas2jsCachedDirectory.DoReadDir
  207. if not Assigned(OnReadDir) then exit;
  208. {$IFDEF DebugLib}
  209. LibDbgLog('ReadDirectory Dir="'+Dir.Path+'"...');
  210. {$ENDIF}
  211. Result:=OnReadDir(FOnReadDirData,Dir,PAnsiChar(Dir.Path));
  212. {$IFDEF DebugLib}
  213. LibDbgLog('ReadDirectory Dir="'+Dir.Path+'" '+IntToStr(Dir.Count));
  214. {$ENDIF}
  215. end;
  216. procedure TLibraryPas2JSCompiler.GetFileSrcAttr(AFilename: string; var AAttr: TPas2jsFileSrcAttr);
  217. begin
  218. AAttr.AllowSrcMap := True;
  219. if Assigned(OnGetFileSrcAttr) then
  220. begin
  221. {$IFDEF DebugLib}
  222. LibDbgLog('GetFileSrcAttr: File="'+AFilename+'"...');
  223. {$ENDIF}
  224. OnGetFileSrcAttr(FOnGetFileSrcAttrData, PAnsiChar(AFilename), Length(AFileName), @AAttr);
  225. end;
  226. end;
  227. {$IFDEF DebugLib}
  228. procedure TLibraryPas2JSCompiler.LibDbgLog(Msg: string);
  229. const
  230. LogFilename = 'pas2jslib-log.txt';
  231. var
  232. s: TFileStream;
  233. begin
  234. if Msg='' then exit;
  235. Msg:=Msg+sLineBreak;
  236. if FileExists(LogFilename) then
  237. s:=TFileStream.Create(LogFilename,fmOpenWrite or fmShareDenyNone)
  238. else
  239. s:=TFileStream.Create(LogFilename,fmCreate or fmShareDenyNone);
  240. try
  241. s.Seek(0,soEnd);
  242. s.Write(Msg[1],length(Msg));
  243. finally
  244. s.Free;
  245. end;
  246. end;
  247. {$ENDIF}
  248. constructor TLibraryPas2JSCompiler.Create;
  249. begin
  250. inherited Create;
  251. Log.OnLog:=@DoLibraryLog;
  252. FileCache.OnReadFile:=@ReadFile;
  253. FReadBufferLen:=DefaultReadBufferSize;
  254. FileCache.OnReadDirectory:=@ReadDirectory;
  255. ConfigSupport:=TPas2JSFileConfigSupport.Create(Self);
  256. PostProcessorSupport:=TPas2JSFSPostProcessorSupport.Create(Self);
  257. FileCache.OnGetFileSrcAttr:=@GetFileSrcAttr;
  258. end;
  259. procedure TLibraryPas2JSCompiler.CheckUnitAlias(var UseUnitName: string);
  260. var
  261. UnitNameLen, UnitNameMaxLen: Integer;
  262. s: String;
  263. {$IFDEF DebugLib}
  264. OldUnitName: string;
  265. {$ENDIF}
  266. begin
  267. inherited CheckUnitAlias(UseUnitName);
  268. UnitNameLen:=length(UseUnitName);
  269. if (UnitNameLen>0) and Assigned(OnUnitAlias) then
  270. begin
  271. UnitNameMaxLen:=Max(UnitNameLen,255);
  272. s:=UseUnitName+StringOfChar(#0,UnitNameMaxLen-UnitNameLen);
  273. {$IFDEF DebugLib}
  274. OldUnitName:=UseUnitName;
  275. LibDbgLog('CheckUnitAlias "'+UseUnitName+'"...');
  276. {$ENDIF}
  277. if OnUnitAlias(OnUnitAliasData,Pointer(s),UnitNameMaxLen) then
  278. begin
  279. UseUnitName:=PAnsiChar(s);
  280. {$IFDEF DebugLib}
  281. if UseUnitName<>OldUnitName then
  282. LibDbgLog('CheckUnitAlias New="'+UseUnitName+'"');
  283. {$ENDIF}
  284. end;
  285. end;
  286. end;
  287. procedure TLibraryPas2JSCompiler.DoLibraryLog(Sender: TObject; const Msg: String);
  288. begin
  289. if Assigned(FOnLibLogCallBack) then
  290. FOnLibLogCallBack(FOnLibLogData,PAnsiChar(Msg),Length(Msg))
  291. else if isConsole then
  292. {AllowWriteln}Writeln(Msg);{AllowWriteln-}
  293. end;
  294. function TLibraryPas2JSCompiler.LibraryRun(ACompilerExe, AWorkingDir: PAnsiChar;
  295. CommandLine: PPAnsiChar; DoReset: Boolean): Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  296. Var
  297. C,W : AnsiString;
  298. CmdLine : TStrings;
  299. PP : PPAnsiChar;
  300. begin
  301. Result:=False;
  302. C:=ACompilerExe;
  303. W:=AWorkingDir;
  304. {$IFDEF DebugLib}
  305. LibDbgLog('LibraryRun Exe="'+C+'" WorkDir="'+W+'"');
  306. {$ENDIF}
  307. CmdLine:=TStringList.Create;
  308. try
  309. PP:=CommandLine;
  310. While (PP^<>Nil) do
  311. begin
  312. CmdLine.Add(pp^);
  313. {$IFDEF DebugLib}
  314. LibDbgLog('LibraryRun Param['+IntToStr(CmdLine.Count-1)+']="'+CmdLine[CmdLine.Count-1]+'"');
  315. {$ENDIF}
  316. Inc(PP);
  317. end;
  318. try
  319. Run(C,W,CmdLine,DoReset);
  320. Result:=(ExitCode=0);
  321. if Not Result then
  322. begin
  323. LastError:=Format('Compiler exited with exit code %d',[ExitCode]);
  324. LastErrorClass:='';
  325. {$IFDEF DebugLib}
  326. LibDbgLog('LibraryRun Error "'+LastError+'"');
  327. {$ENDIF}
  328. end;
  329. except
  330. On E : Exception do
  331. begin
  332. LastError:=E.Message;
  333. LastErrorClass:=E.ClassName;
  334. {$IFDEF DebugLib}
  335. LibDbgLog('LibraryRun Exception '+LastErrorClass+' "'+LastError+'"');
  336. {$ENDIF}
  337. end;
  338. end;
  339. finally
  340. CmdLine.free;
  341. end;
  342. end;
  343. { ---------------------------------------------------------------------
  344. Flat interface
  345. ---------------------------------------------------------------------}
  346. procedure SetPas2JSWriteJSCallBack(P: PPas2JSCompiler;
  347. ACallBack: TWriteJSCallBack; CallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  348. begin
  349. TLibraryPas2JSCompiler(P).OnWriteJSCallBack:=ACallBack;
  350. TLibraryPas2JSCompiler(P).OnWriteJSData:=CallBackData;
  351. end;
  352. procedure SetPas2JSCompilerLogCallBack(P: PPas2JSCompiler;
  353. ACallBack: TLibLogCallBack; CallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  354. begin
  355. TLibraryPas2JSCompiler(P).OnLibLogCallBack:=ACallBack;
  356. TLibraryPas2JSCompiler(P).OnLibLogData:=CallBackData;
  357. end;
  358. procedure SetPas2JSReadPasCallBack(P: PPas2JSCompiler;
  359. ACallBack: TReadPasCallBack; CallBackData: Pointer; ABufferSize: Cardinal);
  360. {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  361. begin
  362. TLibraryPas2JSCompiler(P).OnReadPasData:=CallBackData;
  363. TLibraryPas2JSCompiler(P).OnReadPasFile:=ACallback;
  364. if (ABufferSize=0) then
  365. ABufferSize:=DefaultReadBufferSize;
  366. TLibraryPas2JSCompiler(P).ReadBufferLen:=ABufferSize;
  367. end;
  368. procedure SetPas2JSReadDirCallBack(P: PPas2JSCompiler;
  369. ACallBack: TReadDirCallBack; CallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  370. begin
  371. TLibraryPas2JSCompiler(P).OnReadDir:=ACallBack;
  372. TLibraryPas2JSCompiler(P).OnReadDirData:=CallBackData;
  373. end;
  374. procedure AddPas2JSDirectoryEntry(P: PDirectoryCache; AFilename: PAnsiChar;
  375. AAge: TPas2jsFileAgeTime; AAttr: TPas2jsFileAttr; ASize: TPas2jsFileSize);
  376. {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  377. begin
  378. TPas2jsCachedDirectory(P).Add(AFilename,AAge,AAttr,ASize);
  379. end;
  380. procedure SetPas2JSUnitAliasCallBack(P: PPas2JSCompiler;
  381. ACallBack: TUnitAliasCallBack; CallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  382. begin
  383. TLibraryPas2JSCompiler(P).OnUnitAlias:=ACallBack;
  384. TLibraryPas2JSCompiler(P).OnUnitAliasData:=CallBackData;
  385. end;
  386. function RunPas2JSCompiler(P: PPas2JSCompiler; ACompilerExe,
  387. AWorkingDir: PAnsiChar; CommandLine: PPAnsiChar; DoReset: Boolean): Boolean;
  388. {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  389. begin
  390. Result:=TLibraryPas2JSCompiler(P).LibraryRun(ACompilerExe,AWorkingDir,CommandLine,DoReset)
  391. end;
  392. procedure FreePas2JSCompiler(P: PPas2JSCompiler); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  393. begin
  394. TLibraryPas2JSCompiler(P).Free;
  395. end;
  396. function GetPas2JSCompiler: PPas2JSCompiler; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  397. begin
  398. Result:=TLibraryPas2JSCompiler.Create;
  399. end;
  400. procedure GetPas2JSCompilerLastError(P: PPas2JSCompiler; AError: PAnsiChar;
  401. Var AErrorLength: Longint; AErrorClass: PAnsiChar;
  402. Var AErrorClassLength: Longint); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  403. begin
  404. TLibraryPas2JSCompiler(P).GetLastError(AError,AErrorLength,AErrorClass,AErrorClassLength);
  405. end;
  406. procedure SetPas2JSLogEncoding(P : PPas2JSCompiler; Enconding: PAnsiChar); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  407. begin
  408. TLibraryPas2JSCompiler(P).LogEncoding := Enconding;
  409. end;
  410. procedure SetPas2JSGetFileSrcAttrCallBack(P: PPas2JSCompiler; ACallBack: TGetFileSrcAttrCallBack; ACallBackData: Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  411. begin
  412. TLibraryPas2JSCompiler(P).OnGetFileSrcAttr := ACallBack;
  413. TLibraryPas2JSCompiler(P).OnGetFileSrcAttrData := ACallBackData;
  414. end;
  415. end.