mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 01:09:31 +02:00
* Added library version of pas2js
git-svn-id: trunk@37752 -
This commit is contained in:
parent
3990686be3
commit
3496256179
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -16948,6 +16948,8 @@ utils/pas2js/pas2jsfilecache.pp svneol=native#text/plain
|
||||
utils/pas2js/pas2jsfileutils.pp svneol=native#text/plain
|
||||
utils/pas2js/pas2jsfileutilsunix.inc svneol=native#text/plain
|
||||
utils/pas2js/pas2jsfileutilswin.inc svneol=native#text/plain
|
||||
utils/pas2js/pas2jslib.lpi svneol=native#text/plain
|
||||
utils/pas2js/pas2jslib.pp svneol=native#text/plain
|
||||
utils/pas2js/pas2jslogger.pp svneol=native#text/plain
|
||||
utils/pas2js/pas2jspparser.pp svneol=native#text/plain
|
||||
utils/pas2js/samples/arraydemo.pp svneol=native#text/plain
|
||||
|
@ -42,6 +42,12 @@ begin
|
||||
PT.Dependencies.AddUnit('pas2jsfilecache');
|
||||
PT.Dependencies.AddUnit('pas2jslogger');
|
||||
PT.Dependencies.AddUnit('pas2jspparser');
|
||||
PT:=P.Targets.AddLibrary('pas2jslib.pp');
|
||||
PT.Dependencies.AddUnit('pas2jscompiler');
|
||||
PT.Dependencies.AddUnit('pas2jsfileutils');
|
||||
PT.Dependencies.AddUnit('pas2jsfilecache');
|
||||
PT.Dependencies.AddUnit('pas2jslogger');
|
||||
PT.Dependencies.AddUnit('pas2jspparser');
|
||||
end;
|
||||
end;
|
||||
|
||||
|
70
utils/pas2js/pas2jslib.lpi
Normal file
70
utils/pas2js/pas2jslib.lpi
Normal file
@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="10"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<MainUnitHasCreateFormStatements Value="False"/>
|
||||
<MainUnitHasTitleStatement Value="False"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<Title Value="Pas2JS Shared Library version"/>
|
||||
<UseAppBundle Value="False"/>
|
||||
<ResourceType Value="res"/>
|
||||
</General>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="Default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<Units Count="2">
|
||||
<Unit0>
|
||||
<Filename Value="pas2jslib.pp"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="pas2jscompiler.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="Pas2jsCompiler"/>
|
||||
</Unit1>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<Target>
|
||||
<Filename Value="pas2jslib"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<RelocatableUnit Value="True"/>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Options>
|
||||
<ExecutableType Value="Library"/>
|
||||
</Options>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
<Debugging>
|
||||
<Exceptions Count="3">
|
||||
<Item1>
|
||||
<Name Value="EAbort"/>
|
||||
</Item1>
|
||||
<Item2>
|
||||
<Name Value="ECodetoolError"/>
|
||||
</Item2>
|
||||
<Item3>
|
||||
<Name Value="EFOpenError"/>
|
||||
</Item3>
|
||||
</Exceptions>
|
||||
</Debugging>
|
||||
</CONFIG>
|
196
utils/pas2js/pas2jslib.pp
Normal file
196
utils/pas2js/pas2jslib.pp
Normal file
@ -0,0 +1,196 @@
|
||||
library pas2jslib;
|
||||
|
||||
{$mode objfpc}
|
||||
{$H+}
|
||||
|
||||
uses
|
||||
SysUtils, Classes, FPPJsSrcMap, Pas2jsFileCache, Pas2jsCompiler;
|
||||
|
||||
{ ---------------------------------------------------------------------
|
||||
Compiler descendant, usable in library
|
||||
---------------------------------------------------------------------}
|
||||
|
||||
Type
|
||||
TLibLogCallBack = Procedure (Data : Pointer; Msg : PansiChar; MsgLen : Integer); stdcall;
|
||||
TWriteJSCallBack = Procedure (Data : Pointer;
|
||||
AFileName: PAnsiChar; AFileNameLen : Integer;
|
||||
AFileData : PAnsiChar; AFileDataLen: Int32); stdcall;
|
||||
|
||||
{ TLibraryPas2JSCompiler }
|
||||
|
||||
TLibraryPas2JSCompiler = Class(TPas2JSCompiler)
|
||||
private
|
||||
FLastError: String;
|
||||
FLastErrorClass: String;
|
||||
FOnLibLogCallBack: TLibLogCallBack;
|
||||
FOnLibLogData: Pointer;
|
||||
FOnWriteJSCallBack: TWriteJSCallBack;
|
||||
FOnWriteJSData: Pointer;
|
||||
Protected
|
||||
Function DoWriteJSFile(const DestFilename: String; aWriter: TPas2JSMapper): Boolean; override;
|
||||
Procedure GetLastError(AError : PAnsiChar; Var AErrorLength : Longint;
|
||||
AErrorClass : PAnsiChar; Var AErrorClassLength : Longint);
|
||||
Public
|
||||
Constructor Create; override;
|
||||
Procedure DoLibraryLog(Sender : TObject; Const Msg : String);
|
||||
Function LibraryRun(ACompilerExe, AWorkingDir : PAnsiChar; CommandLine : PPAnsiChar; DoReset : Boolean) :Boolean; stdcall;
|
||||
Property LastError : String Read FLastError Write FLastError;
|
||||
Property LastErrorClass : String Read FLastErrorClass Write FLastErrorClass;
|
||||
Property OnLibLogCallBack : TLibLogCallBack Read FOnLibLogCallBack Write FOnLibLogCallBack;
|
||||
Property OnLibLogData : Pointer Read FOnLibLogData Write FOnLibLogData;
|
||||
Property OnWriteJSCallBack : TWriteJSCallBack Read FOnWriteJSCallBack Write FOnWriteJSCallBack;
|
||||
Property OnWriteJSData : Pointer Read FOnWriteJSData Write FOnWriteJSData;
|
||||
end;
|
||||
|
||||
{ TLibraryPas2JSCompiler }
|
||||
|
||||
function TLibraryPas2JSCompiler.DoWriteJSFile(const DestFilename: String; aWriter: TPas2JSMapper): Boolean;
|
||||
|
||||
Var
|
||||
Src : string;
|
||||
|
||||
begin
|
||||
Result:=Assigned(OnWriteJSCallBack);
|
||||
if Result then
|
||||
try
|
||||
Src:=aWriter.AsAnsistring;
|
||||
OnWriteJSCallBack(OnWriteJSData,PAnsiChar(DestFileName),Length(DestFileName),PAnsiChar(Src),Length(Src));
|
||||
except
|
||||
Result:=False;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TLibraryPas2JSCompiler.GetLastError(AError: PAnsiChar; var AErrorLength : Longint;
|
||||
AErrorClass: PAnsiChar; var AErrorClassLength : Longint);
|
||||
|
||||
Var
|
||||
L : Integer;
|
||||
|
||||
begin
|
||||
L:=Length(LastError);
|
||||
if (L>AErrorLength) then
|
||||
L:=AErrorLength;
|
||||
if (L>0) then
|
||||
Move(FLastError[1],AError^,L);
|
||||
L:=Length(LastErrorClass);
|
||||
if L>AErrorClassLength then
|
||||
L:=AErrorClassLength;
|
||||
if (L>0) then
|
||||
Move(FLastErrorClass[1],AErrorClass^,L);
|
||||
end;
|
||||
|
||||
constructor TLibraryPas2JSCompiler.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
Log.OnLog:=@DoLibraryLog;
|
||||
end;
|
||||
|
||||
procedure TLibraryPas2JSCompiler.DoLibraryLog(Sender: TObject; const Msg: String);
|
||||
begin
|
||||
if Assigned(FOnLibLogCallBack) then
|
||||
FOnLibLogCallBack(FOnLibLogData,PAnsiChar(Msg),Length(Msg))
|
||||
else if isConsole then
|
||||
Writeln(Msg);
|
||||
end;
|
||||
|
||||
function TLibraryPas2JSCompiler.LibraryRun(ACompilerExe, AWorkingDir: PAnsiChar;
|
||||
CommandLine: PPAnsiChar; DoReset: Boolean): Boolean; stdcall;
|
||||
|
||||
Var
|
||||
C,W : AnsiString;
|
||||
CmdLine : TStrings;
|
||||
PP : PPAnsiChar;
|
||||
|
||||
begin
|
||||
Result:=False;
|
||||
C:=ACompilerExe;
|
||||
W:=AWorkingDir;
|
||||
CmdLine:=TStringList.Create;
|
||||
try
|
||||
PP:=CommandLine;
|
||||
While (PP^<>Nil) do
|
||||
begin
|
||||
CmdLine.Add(pp^);
|
||||
Inc(PP);
|
||||
end;
|
||||
try
|
||||
Run(C,W,CmdLine,DoReset);
|
||||
Result:=(ExitCode=0);
|
||||
if Not Result then
|
||||
begin
|
||||
LastError:=Format('Compiler exited with exit code %d',[ExitCode]);
|
||||
LastErrorClass:=ECompilerTerminate.ClassName;
|
||||
end;
|
||||
except
|
||||
On E : Exception do
|
||||
begin
|
||||
LastError:=E.Message;
|
||||
LastErrorClass:=E.ClassName;
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
CmdLine.free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ ---------------------------------------------------------------------
|
||||
Flat interface
|
||||
---------------------------------------------------------------------}
|
||||
|
||||
Type
|
||||
PPas2JSCompiler = Pointer;
|
||||
PStubCreator = Pointer;
|
||||
|
||||
|
||||
Procedure SetPas2JSWriteJSCallBack(P : PPas2JSCompiler; ACallBack : TWriteJSCallBack;
|
||||
CallBackData : Pointer); stdcall;
|
||||
|
||||
begin
|
||||
TLibraryPas2JSCompiler(P).OnWriteJSCallBack:=ACallBack;
|
||||
TLibraryPas2JSCompiler(P).OnWriteJSData:=CallBackData;
|
||||
end;
|
||||
|
||||
Procedure SetPas2JSCompilerLogCallBack(P : PPas2JSCompiler; ACallBack : TLibLogCallBack;
|
||||
CallBackData : Pointer); stdcall;
|
||||
|
||||
begin
|
||||
TLibraryPas2JSCompiler(P).OnLibLogCallBack:=ACallBack;
|
||||
TLibraryPas2JSCompiler(P).OnLibLogData:=CallBackData;
|
||||
end;
|
||||
|
||||
Function RunPas2JSCompiler(P : PPas2JSCompiler; ACompilerExe, AWorkingDir : PAnsiChar;
|
||||
CommandLine : PPAnsiChar; DoReset : Boolean) : Boolean; stdcall;
|
||||
|
||||
begin
|
||||
Result:=TLibraryPas2JSCompiler(P).LibraryRun(ACompilerExe,AWorkingDir,CommandLine,DoReset)
|
||||
end;
|
||||
|
||||
Procedure FreePas2JSCompiler(P : PPas2JSCompiler); stdcall;
|
||||
|
||||
begin
|
||||
TLibraryPas2JSCompiler(P).Free;
|
||||
end;
|
||||
|
||||
Function GetPas2JSCompiler : PPas2JSCompiler; stdcall;
|
||||
|
||||
begin
|
||||
Result:=TLibraryPas2JSCompiler.Create;
|
||||
end;
|
||||
|
||||
Procedure GetPas2JSCompilerLastError(P : PPas2JSCompiler; AError : PAnsiChar;
|
||||
Var AErrorLength : Longint; AErrorClass : PAnsiChar; Var AErrorClassLength : Longint); stdcall;
|
||||
|
||||
begin
|
||||
TLibraryPas2JSCompiler(P).GetLastError(AError,AErrorLength,AErrorClass,AErrorClassLength);
|
||||
end;
|
||||
|
||||
exports
|
||||
GetPas2JSCompiler,
|
||||
FreePas2JSCompiler,
|
||||
RunPas2JSCompiler,
|
||||
SetPas2JSWriteJSCallBack,
|
||||
SetPas2JSCompilerLogCallBack,
|
||||
GetPas2JSCompilerLastError;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user