mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-07 15:47:45 +02:00
164 lines
6.5 KiB
ObjectPascal
164 lines
6.5 KiB
ObjectPascal
unit LibPas2jsIntf;
|
|
|
|
{$ifdef fpc}
|
|
{$mode objfpc}{$H+}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
Const
|
|
{$IFDEF UNIX}
|
|
{$IFDEF darwin}
|
|
libpas2js = 'libpas2js.dylib';
|
|
{$DEFINE UseCDecl}
|
|
{$ELSE}
|
|
libpas2js = 'libpas2js.so';
|
|
{$ENDIF}
|
|
{$ELSE}
|
|
libpas2js = 'libpas2js.dll';
|
|
{$ENDIF}
|
|
|
|
Type
|
|
PPas2JSCompiler = Pointer;
|
|
PDirectoryCache = Pointer;
|
|
TPas2jsFileAgeTime = longint;
|
|
TPas2jsFileAttr = longint;
|
|
TPas2jsFileSize = int64;
|
|
TLibLogCallBack = Procedure (Data : Pointer; Msg : PAnsiChar; MsgLen : Integer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TWriteJSCallBack = Procedure (Data : Pointer; AFileName: PAnsiChar; AFileNameLen : Integer; AFileData : PAnsiChar; AFileDataLen: Int32); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TReadPasCallBack = Procedure (Data : Pointer; AFileName: PAnsiChar; AFileNameLen : Integer; AFileData : PAnsiChar; Var AFileDataLen: Cardinal); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TReadDirCallBack = Function (Data : Pointer; P: PDirectoryCache; ADirPath: PAnsiChar): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TUnitAliasCallBack = Function (Data: Pointer; AUnitName: PAnsiChar; AUnitNameMaxLen: Integer): boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
|
|
TSetPas2JSWriteJSCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TWriteJSCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TSetPas2JSCompilerLogCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TLibLogCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TSetPas2JSReadPasCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TReadPasCallBack; CallBackData : Pointer; ABufferSize : Cardinal); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TSetPas2JSReadDirCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TReadDirCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TAddPas2jsDirectoryEntry = procedure(P: PDirectoryCache; AFilename: PAnsiChar; AAge: TPas2jsFileAgeTime; AAttr: TPas2jsFileAttr; ASize: TPas2jsFileSize); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TSetPas2JSUnitAliasCallBack = Procedure (P : PPas2JSCompiler; ACallBack : TUnitAliasCallBack; CallBackData : Pointer); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TRunPas2JSCompiler = Function (P : PPas2JSCompiler; ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) :Boolean; {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TFreePas2JSCompiler = Procedure (P : PPas2JSCompiler); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TGetPas2JSCompiler = Function () : PPas2JSCompiler;{$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
TGetPas2JSCompilerLastError = Procedure(P : PPas2JSCompiler; AError : PAnsiChar; Var AErrorLength : Longint; AErrorClass : PAnsiChar; Var AErrorClassLength : Longint); {$IFDEF UseCDecl}cdecl{$ELSE}stdcall{$ENDIF};
|
|
|
|
Var
|
|
SetPas2JSWriteJSCallBack : TSetPas2JSWriteJSCallBack;
|
|
SetPas2JSCompilerLogCallBack : TSetPas2JSCompilerLogCallBack;
|
|
SetPas2JSReadPasCallBack : TSetPas2JSReadPasCallBack;
|
|
SetPas2JSReadDirCallBack : TSetPas2JSReadDirCallBack;
|
|
AddPas2JSDirectoryEntry : TAddPas2jsDirectoryEntry;
|
|
SetPas2JSUnitAliasCallBack : TSetPas2JSUnitAliasCallBack;
|
|
RunPas2JSCompiler : TRunPas2JSCompiler;
|
|
FreePas2JSCompiler : TFreePas2JSCompiler;
|
|
GetPas2JSCompiler : TGetPas2JSCompiler;
|
|
GetPas2JSCompilerLastError : TGetPas2JSCompilerLastError;
|
|
|
|
Function LoadPas2JsLibrary(ALibraryName : String = '') : Integer;
|
|
Function FreePas2jsLibrary : Integer;
|
|
|
|
implementation
|
|
|
|
uses
|
|
{$ifdef fpc}
|
|
{$ifdef fpc_fullversion<30101}
|
|
dynlibs,
|
|
{$endif}
|
|
{$else}
|
|
windows,
|
|
{$endif}
|
|
sysutils;
|
|
|
|
{$ifndef fpc}
|
|
type TLibHandle = THandle;
|
|
{$endif}
|
|
|
|
Var
|
|
LibHandle : TLibHandle;
|
|
RefCount : Integer;
|
|
|
|
Function LoadPas2JsLibrary(ALibraryName : String = '') : Integer;
|
|
|
|
Function GPA(N : String) : Pointer ;
|
|
|
|
var
|
|
s: String;
|
|
begin
|
|
Result:=GetProcAddress(LibHandle,PChar(N));
|
|
if Result<>nil then exit;
|
|
s:=Format('Could not load Pas2JS library function "%s" from "%s"',[N,ALibraryName]);
|
|
{$IF defined(Unix) and defined(FPC)}
|
|
s:=s+': '+GetLoadErrorStr;
|
|
{$ENDIF}
|
|
Raise Exception.Create(s);
|
|
end;
|
|
|
|
var
|
|
s: String;
|
|
begin
|
|
if RefCount<>0 then
|
|
Inc(RefCount)
|
|
else
|
|
begin
|
|
if ALibraryName='' then
|
|
ALibraryName:=libpas2js;
|
|
{$ifdef UseDL}
|
|
LibHandle:=dlopen(Pchar(ALibraryName));
|
|
{$ELSE}
|
|
LibHandle:=LoadLibrary(PChar(ALibraryName));
|
|
{$ENDIF}
|
|
if (LibHandle=TLibHandle(0)) then
|
|
begin
|
|
s:=Format('Could not load Pas2JS library "%s"',[ALibraryName]);
|
|
{$IF defined(Unix) and defined(FPC)}
|
|
s:=s+': '+GetLoadErrorStr;
|
|
{$ENDIF}
|
|
Raise Exception.Create(s);
|
|
end;
|
|
// Compiler
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSWriteJSCallBack):=GPA('SetPas2JSWriteJSCallBack');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSCompilerLogCallBack):=GPA('SetPas2JSCompilerLogCallBack');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadPasCallBack):=GPA('SetPas2JSReadPasCallBack');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadDirCallBack):=GPA('SetPas2JSReadDirCallBack');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}AddPas2JSDirectoryEntry):=GPA('AddPas2JSDirectoryEntry');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSUnitAliasCallBack):=GPA('SetPas2JSUnitAliasCallBack');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}RunPas2JSCompiler):=GPA('RunPas2JSCompiler');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}FreePas2JSCompiler):=GPA('FreePas2JSCompiler');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompiler):=GPA('GetPas2JSCompiler');
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompilerLastError):=GPA('GetPas2JSCompilerLastError');
|
|
RefCount:=1;
|
|
end;
|
|
Result:=RefCount;
|
|
end;
|
|
|
|
Function FreePas2jsLibrary : Integer;
|
|
|
|
begin
|
|
If (RefCount>0) then
|
|
begin
|
|
Dec(RefCount);
|
|
if RefCount=0 then
|
|
begin
|
|
{$IFNDEF FPC}
|
|
FreeLibrary(Libhandle);
|
|
{$else}
|
|
UnloadLibrary(Libhandle);
|
|
{$ENDIF}
|
|
// Compiler
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSWriteJSCallBack):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSCompilerLogCallBack):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadPasCallBack):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSReadDirCallBack):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}AddPas2JSDirectoryEntry):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}SetPas2JSUnitAliasCallBack):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}RunPas2JSCompiler):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}FreePas2JSCompiler):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompiler):=nil;
|
|
Pointer({$IFNDEF FPC}@{$ENDIF}GetPas2JSCompilerLastError):=nil;
|
|
end;
|
|
end;
|
|
Result:=RefCount;
|
|
end;
|
|
|
|
end.
|
|
|