libpas2jsintf.pas 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. unit LibPas2jsIntf;
  2. {$ifdef fpc}
  3. {$mode objfpc}{$H+}
  4. {$endif}
  5. interface
  6. Const
  7. {$IFDEF UNIX}
  8. {$IFDEF darwin}
  9. libpas2js = 'libpas2js.dylib';
  10. {$DEFINE UseCDecl}
  11. {$ELSE}
  12. libpas2js = 'libpas2js.so';
  13. {$ENDIF}
  14. {$ELSE}
  15. libpas2js = 'libpas2js.dll';
  16. {$ENDIF}
  17. Type
  18. PPas2JSCompiler = Pointer;
  19. PDirectoryCache = Pointer;
  20. TPas2jsFileAgeTime = longint;
  21. TPas2jsFileAttr = longint;
  22. TPas2jsFileSize = int64;
  23. TLibLogCallBack = Procedure (Data : Pointer; Msg : PAnsiChar; MsgLen : Integer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  24. TWriteJSCallBack = Procedure (Data : Pointer; AFileName: PAnsiChar; AFileNameLen : Integer; AFileData : PAnsiChar; AFileDataLen: Int32); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  25. TReadPasCallBack = Procedure (Data : Pointer; AFileName: PAnsiChar; AFileNameLen : Integer; AFileData : PAnsiChar; Var AFileDataLen: Cardinal); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  26. TReadDirCallBack = Function (Data : Pointer; P: PDirectoryCache; ADirPath: PAnsiChar): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  27. TUnitAliasCallBack = Function (Data: Pointer; AUnitName: PAnsiChar; AUnitNameMaxLen: Integer): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  28. TSetPas2JSWriteJSCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TWriteJSCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  29. TSetPas2JSCompilerLogCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TLibLogCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  30. TSetPas2JSReadPasCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TReadPasCallBack; CallBackData : Pointer; ABufferSize : Cardinal); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  31. TSetPas2JSReadDirCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TReadDirCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  32. TAddPas2jsDirectoryEntry = procedure(P: PDirectoryCache; AFilename: PAnsiChar; AAge: TPas2jsFileAgeTime; AAttr: TPas2jsFileAttr; ASize: TPas2jsFileSize); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  33. TSetPas2JSUnitAliasCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TUnitAliasCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  34. TRunPas2JSCompiler = Function (P : PPas2JSCompiler; ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) :Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  35. TFreePas2JSCompiler = Procedure (P : PPas2JSCompiler); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  36. TGetPas2JSCompiler = Function () : PPas2JSCompiler;{$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  37. TGetPas2JSCompilerLastError = Procedure(P : PPas2JSCompiler; AError : PAnsiChar; Var AErrorLength : Longint; AErrorClass : PAnsiChar; Var AErrorClassLength : Longint); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
  38. Var
  39. SetPas2JSWriteJSCallBack : TSetPas2JSWriteJSCallBack;
  40. SetPas2JSCompilerLogCallBack : TSetPas2JSCompilerLogCallBack;
  41. SetPas2JSReadPasCallBack : TSetPas2JSReadPasCallBack;
  42. SetPas2JSReadDirCallBack : TSetPas2JSReadDirCallBack;
  43. AddPas2JSDirectoryEntry : TAddPas2jsDirectoryEntry;
  44. SetPas2JSUnitAliasCallBack : TSetPas2JSUnitAliasCallBack;
  45. RunPas2JSCompiler : TRunPas2JSCompiler;
  46. FreePas2JSCompiler : TFreePas2JSCompiler;
  47. GetPas2JSCompiler : TGetPas2JSCompiler;
  48. GetPas2JSCompilerLastError : TGetPas2JSCompilerLastError;
  49. Function LoadPas2JsLibrary(ALibraryName : String = '') : Integer;
  50. Function FreePas2jsLibrary : Integer;
  51. implementation
  52. uses
  53. {$ifdef fpc}
  54. {$ifdef fpc_fullversion<30101}
  55. dynlibs,
  56. {$endif}
  57. {$else}
  58. windows,
  59. {$endif}
  60. sysutils;
  61. {$ifndef fpc}
  62. type TLibHandle = THandle;
  63. {$endif}
  64. Var
  65. LibHandle : TLibHandle;
  66. RefCount : Integer;
  67. Function LoadPas2JsLibrary(ALibraryName : String = '') : Integer;
  68. Function GPA(N : String) : Pointer ;
  69. var
  70. s: String;
  71. begin
  72. Result:=GetProcAddress(LibHandle,PChar(N));
  73. if Result<>nil then exit;
  74. s:=Format('Could not load Pas2JS library function "%s" from "%s"',[N,ALibraryName]);
  75. {$IF defined(Unix) and defined(FPC)}
  76. s:=s+': '+GetLoadErrorStr;
  77. {$ENDIF}
  78. Raise Exception.Create(s);
  79. end;
  80. var
  81. s: String;
  82. begin
  83. if RefCount<>0 then
  84. Inc(RefCount)
  85. else
  86. begin
  87. if ALibraryName='' then
  88. ALibraryName:=libpas2js;
  89. {$ifdef UseDL}
  90. LibHandle:=dlopen(Pchar(ALibraryName));
  91. {$ELSE}
  92. LibHandle:=LoadLibrary(PChar(ALibraryName));
  93. {$ENDIF}
  94. if (LibHandle=TLibHandle(0)) then
  95. begin
  96. s:=Format('Could not load Pas2JS library "%s"',[ALibraryName]);
  97. {$IF defined(Unix) and defined(FPC)}
  98. s:=s+': '+GetLoadErrorStr;
  99. {$ENDIF}
  100. Raise Exception.Create(s);
  101. end;
  102. // Compiler
  103. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSWriteJSCallBack):=GPA('SetPas2JSWriteJSCallBack');
  104. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSCompilerLogCallBack):=GPA('SetPas2JSCompilerLogCallBack');
  105. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadPasCallBack):=GPA('SetPas2JSReadPasCallBack');
  106. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadDirCallBack):=GPA('SetPas2JSReadDirCallBack');
  107. Pointer({$IFNDEF FPC}@{$ENDIF}AddPas2JSDirectoryEntry):=GPA('AddPas2JSDirectoryEntry');
  108. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSUnitAliasCallBack):=GPA('SetPas2JSUnitAliasCallBack');
  109. Pointer({$IFNDEF FPC}@{$ENDIF}RunPas2JSCompiler):=GPA('RunPas2JSCompiler');
  110. Pointer({$IFNDEF FPC}@{$ENDIF}FreePas2JSCompiler):=GPA('FreePas2JSCompiler');
  111. Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompiler):=GPA('GetPas2JSCompiler');
  112. Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompilerLastError):=GPA('GetPas2JSCompilerLastError');
  113. RefCount:=1;
  114. end;
  115. Result:=RefCount;
  116. end;
  117. Function FreePas2jsLibrary : Integer;
  118. begin
  119. If (RefCount>0) then
  120. begin
  121. Dec(RefCount);
  122. if RefCount=0 then
  123. begin
  124. {$IFNDEF FPC}
  125. FreeLibrary(Libhandle);
  126. {$else}
  127. UnloadLibrary(Libhandle);
  128. {$ENDIF}
  129. // Compiler
  130. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSWriteJSCallBack):=nil;
  131. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSCompilerLogCallBack):=nil;
  132. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadPasCallBack):=nil;
  133. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadDirCallBack):=nil;
  134. Pointer({$IFNDEF FPC}@{$ENDIF}AddPas2JSDirectoryEntry):=nil;
  135. Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSUnitAliasCallBack):=nil;
  136. Pointer({$IFNDEF FPC}@{$ENDIF}RunPas2JSCompiler):=nil;
  137. Pointer({$IFNDEF FPC}@{$ENDIF}FreePas2JSCompiler):=nil;
  138. Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompiler):=nil;
  139. Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompilerLastError):=nil;
  140. end;
  141. end;
  142. Result:=RefCount;
  143. end;
  144. end.