123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- 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.
|