mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 03:39:33 +02:00
pastojs: handling environment options PAS2JS_OPTS
git-svn-id: trunk@41862 -
This commit is contained in:
parent
0d87116b81
commit
faf8a5870c
@ -88,7 +88,7 @@ const
|
|||||||
nSrcMapBaseDirIs = 135; sSrcMapBaseDirIs = 'source map "local base directory" is %s';
|
nSrcMapBaseDirIs = 135; sSrcMapBaseDirIs = 'source map "local base directory" is %s';
|
||||||
nUnitFileNotFound = 136; sUnitFileNotFound = 'unit file not found %s';
|
nUnitFileNotFound = 136; sUnitFileNotFound = 'unit file not found %s';
|
||||||
nClassInterfaceStyleIs = 137; sClassInterfaceStyleIs = 'Class interface style is %s';
|
nClassInterfaceStyleIs = 137; sClassInterfaceStyleIs = 'Class interface style is %s';
|
||||||
// was nMacroXSetToY = 138
|
nHandlingEnvOpts = 138; sHandlingEnvOpts = 'handling environment options %s';
|
||||||
nPostProcessorInfoX = 139; sPostProcessorInfoX = 'Post processor: %s';
|
nPostProcessorInfoX = 139; sPostProcessorInfoX = 'Post processor: %s';
|
||||||
nPostProcessorRunX = 140; sPostProcessorRunX = 'Run post processor: %s';
|
nPostProcessorRunX = 140; sPostProcessorRunX = 'Run post processor: %s';
|
||||||
nPostProcessorFailX = 141; sPostProcessorFailX = 'Post processor failed: %s';
|
nPostProcessorFailX = 141; sPostProcessorFailX = 'Post processor failed: %s';
|
||||||
@ -549,6 +549,7 @@ type
|
|||||||
// params, cfg files
|
// params, cfg files
|
||||||
FCurParam: string;
|
FCurParam: string;
|
||||||
procedure LoadConfig(CfgFilename: string);
|
procedure LoadConfig(CfgFilename: string);
|
||||||
|
procedure ReadEnvironment;
|
||||||
procedure ReadParam(Param: string; Quick, FromCmdLine: boolean);
|
procedure ReadParam(Param: string; Quick, FromCmdLine: boolean);
|
||||||
procedure ReadSingleLetterOptions(const Param: string; p: integer;
|
procedure ReadSingleLetterOptions(const Param: string; p: integer;
|
||||||
const Allowed: string; out Enabled, Disabled: string);
|
const Allowed: string; out Enabled, Disabled: string);
|
||||||
@ -1673,30 +1674,211 @@ begin
|
|||||||
// if Result=nil resolver will give a nice error position, so don't do it here
|
// if Result=nil resolver will give a nice error position, so don't do it here
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TPas2jsCompiler }
|
{ TPas2JSConfigSupport }
|
||||||
|
|
||||||
procedure TPas2jsCompiler.SetFS(AValue: TPas2jsFS);
|
procedure TPas2JSConfigSupport.CfgSyntaxError(const Msg: string);
|
||||||
begin
|
begin
|
||||||
if FFS=AValue then Exit;
|
Compiler.Log.Log(mtError,Msg,0,CurrentCfgFilename,CurrentCfgLineNumber,0);
|
||||||
FOwnsFS:=false;
|
Compiler.Terminate(ExitCodeErrorInConfig);
|
||||||
FFS:=AValue;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TPas2jsCompiler.GetFileCount: integer;
|
procedure TPas2JSConfigSupport.LoadConfig(Const aFileName: String);
|
||||||
begin
|
type
|
||||||
Result:=FFiles.Count;
|
TSkip = (
|
||||||
end;
|
skipNone,
|
||||||
|
skipIf,
|
||||||
function TPas2jsCompiler.GetDefaultNamespace: String;
|
skipElse
|
||||||
|
);
|
||||||
|
const
|
||||||
|
IdentChars = ['a'..'z','A'..'Z','_','0'..'9'];
|
||||||
var
|
var
|
||||||
C: TClass;
|
Line: String;
|
||||||
|
l, p, StartP: integer;
|
||||||
|
|
||||||
|
function GetWord: String;
|
||||||
begin
|
begin
|
||||||
Result:='';
|
StartP:=p;
|
||||||
if FMainFile=nil then exit;
|
while (p<=l) and ((Line[p] in IdentChars) or (Line[p]>#127)) do inc(p);
|
||||||
if FMainFile.PasModule=nil then exit;
|
Result:=copy(Line,StartP,p-StartP);
|
||||||
C:=FMainFile.PasModule.ClassType;
|
while (p<=l) and (Line[p] in [' ',#9]) do inc(p);
|
||||||
if (C=TPasProgram) or (C=TPasLibrary) or (C=TPasPackage) then
|
end;
|
||||||
Result:=FMainFile.PascalResolver.DefaultNameSpace;
|
|
||||||
|
procedure DebugCfgDirective(const s: string);
|
||||||
|
begin
|
||||||
|
Compiler.Log.LogMsg(nCfgDirective,[QuoteStr(Line),s],CurrentCfgFilename,CurrentCfgLineNumber,1,false);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
OldCfgFilename, Directive, aName, Expr: String;
|
||||||
|
aFile: TSourceLineReader;
|
||||||
|
IfLvl, SkipLvl, OldCfgLineNumber: Integer;
|
||||||
|
Skip: TSkip;
|
||||||
|
begin
|
||||||
|
if Compiler.ShowDebug or Compiler.ShowTriedUsedFiles then
|
||||||
|
Compiler.Log.LogMsgIgnoreFilter(nReadingOptionsFromFile,[QuoteStr(aFilename)]);
|
||||||
|
IfLvl:=0;
|
||||||
|
SkipLvl:=0;
|
||||||
|
Skip:=skipNone;
|
||||||
|
aFile:=nil;
|
||||||
|
try
|
||||||
|
OldCfgFilename:=FCurrentCfgFilename;
|
||||||
|
FCurrentCfgFilename:=aFilename;
|
||||||
|
OldCfgLineNumber:=FCurrentCfgLineNumber;
|
||||||
|
aFile:=GetReader(aFileName);
|
||||||
|
while not aFile.IsEOF do begin
|
||||||
|
Line:=aFile.ReadLine;
|
||||||
|
FCurrentCfgLineNumber:=aFile.LineNumber;
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
Compiler.Log.LogMsgIgnoreFilter(nInterpretingFileOption,[QuoteStr(Line)]);
|
||||||
|
if Line='' then continue;
|
||||||
|
l:=length(Line);
|
||||||
|
p:=1;
|
||||||
|
while (p<=l) and (Line[p] in [' ',#9]) do inc(p);
|
||||||
|
if p>l then continue; // empty line
|
||||||
|
|
||||||
|
if (p<=l) and (Line[p]='#') then
|
||||||
|
begin
|
||||||
|
// cfg directive
|
||||||
|
inc(p);
|
||||||
|
if (p>l) or (Line[p] in [#0,#9,' ','-']) then continue; // comment
|
||||||
|
Directive:=lowercase(GetWord);
|
||||||
|
case Directive of
|
||||||
|
'ifdef','ifndef':
|
||||||
|
begin
|
||||||
|
inc(IfLvl);
|
||||||
|
if Skip=skipNone then
|
||||||
|
begin
|
||||||
|
aName:=GetWord;
|
||||||
|
if Compiler.IsDefined(aName)=(Directive='ifdef') then
|
||||||
|
begin
|
||||||
|
// execute block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('true -> execute');
|
||||||
|
end else begin
|
||||||
|
// skip block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('false -> skip');
|
||||||
|
SkipLvl:=IfLvl;
|
||||||
|
Skip:=skipIf;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'if':
|
||||||
|
begin
|
||||||
|
inc(IfLvl);
|
||||||
|
if Skip=skipNone then
|
||||||
|
begin
|
||||||
|
Expr:=copy(Line,p,length(Line));
|
||||||
|
if ConditionEvaluator.Eval(Expr) then
|
||||||
|
begin
|
||||||
|
// execute block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('true -> execute');
|
||||||
|
end else begin
|
||||||
|
// skip block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('false -> skip');
|
||||||
|
SkipLvl:=IfLvl;
|
||||||
|
Skip:=skipIf;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'else':
|
||||||
|
begin
|
||||||
|
if IfLvl=0 then
|
||||||
|
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
||||||
|
if (Skip=skipElse) and (IfLvl=SkipLvl) then
|
||||||
|
CfgSyntaxError('"there was already an #else');
|
||||||
|
if (Skip=skipIf) and (IfLvl=SkipLvl) then
|
||||||
|
begin
|
||||||
|
// if-block was skipped -> execute else block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('execute');
|
||||||
|
SkipLvl:=0;
|
||||||
|
Skip:=skipNone;
|
||||||
|
end else if Skip=skipNone then
|
||||||
|
begin
|
||||||
|
// if-block was executed -> skip else block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('skip');
|
||||||
|
Skip:=skipElse;
|
||||||
|
SkipLvl:=IfLvl;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'elseif':
|
||||||
|
begin
|
||||||
|
if IfLvl=0 then
|
||||||
|
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
||||||
|
if (Skip=skipIf) and (IfLvl=SkipLvl) then
|
||||||
|
begin
|
||||||
|
// if-block was skipped -> try this elseif
|
||||||
|
Expr:=copy(Line,p,length(Line));
|
||||||
|
if ConditionEvaluator.Eval(Expr) then
|
||||||
|
begin
|
||||||
|
// execute elseif block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('true -> execute');
|
||||||
|
SkipLvl:=0;
|
||||||
|
Skip:=skipNone;
|
||||||
|
end else begin
|
||||||
|
// skip elseif block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('false -> skip');
|
||||||
|
end;
|
||||||
|
end else if Skip=skipNone then
|
||||||
|
begin
|
||||||
|
// if-block was executed -> skip without test
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('no test -> skip');
|
||||||
|
Skip:=skipIf;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'endif':
|
||||||
|
begin
|
||||||
|
if IfLvl=0 then
|
||||||
|
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
||||||
|
dec(IfLvl);
|
||||||
|
if IfLvl<SkipLvl then
|
||||||
|
begin
|
||||||
|
// end block
|
||||||
|
if Compiler.ShowDebug then
|
||||||
|
DebugCfgDirective('end block');
|
||||||
|
SkipLvl:=0;
|
||||||
|
Skip:=skipNone;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'error':
|
||||||
|
Compiler.ParamFatal('user defined: '+copy(Line,p,length(Line)))
|
||||||
|
else
|
||||||
|
if Skip=skipNone then
|
||||||
|
CfgSyntaxError('unknown directive "#'+Directive+'"')
|
||||||
|
else
|
||||||
|
DebugCfgDirective('skipping unknown directive');
|
||||||
|
end;
|
||||||
|
end else if Skip=skipNone then
|
||||||
|
begin
|
||||||
|
// option line
|
||||||
|
Line:=copy(Line,p,length(Line));
|
||||||
|
Compiler.ReadParam(Line,false,false);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FCurrentCfgFilename:=OldCfgFilename;
|
||||||
|
FCurrentCfgLineNumber:=OldCfgLineNumber;
|
||||||
|
aFile.Free;
|
||||||
|
end;
|
||||||
|
if Compiler.ShowDebug or Compiler.ShowTriedUsedFiles then
|
||||||
|
Compiler.Log.LogMsgIgnoreFilter(nEndOfReadingConfigFile,[QuoteStr(aFilename)]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TPas2JSConfigSupport.LoadDefaultConfig;
|
||||||
|
var
|
||||||
|
aFileName: string;
|
||||||
|
|
||||||
|
begin
|
||||||
|
aFileName:=FindDefaultConfig;
|
||||||
|
if aFileName<>'' then
|
||||||
|
LoadConfig(aFilename);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPas2JSConfigSupport.ConditionEvalLog(Sender: TCondDirectiveEvaluator;
|
procedure TPas2JSConfigSupport.ConditionEvalLog(Sender: TCondDirectiveEvaluator;
|
||||||
@ -1736,6 +1918,32 @@ begin
|
|||||||
Result:=false;
|
Result:=false;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TPas2jsCompiler }
|
||||||
|
|
||||||
|
procedure TPas2jsCompiler.SetFS(AValue: TPas2jsFS);
|
||||||
|
begin
|
||||||
|
if FFS=AValue then Exit;
|
||||||
|
FOwnsFS:=false;
|
||||||
|
FFS:=AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPas2jsCompiler.GetFileCount: integer;
|
||||||
|
begin
|
||||||
|
Result:=FFiles.Count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TPas2jsCompiler.GetDefaultNamespace: String;
|
||||||
|
var
|
||||||
|
C: TClass;
|
||||||
|
begin
|
||||||
|
Result:='';
|
||||||
|
if FMainFile=nil then exit;
|
||||||
|
if FMainFile.PasModule=nil then exit;
|
||||||
|
C:=FMainFile.PasModule.ClassType;
|
||||||
|
if (C=TPasProgram) or (C=TPasLibrary) or (C=TPasPackage) then
|
||||||
|
Result:=FMainFile.PascalResolver.DefaultNameSpace;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TPas2jsCompiler.Compile(StartTime: TDateTime);
|
procedure TPas2jsCompiler.Compile(StartTime: TDateTime);
|
||||||
var
|
var
|
||||||
Checked: TPasAnalyzerKeySet;
|
Checked: TPasAnalyzerKeySet;
|
||||||
@ -2752,7 +2960,7 @@ begin
|
|||||||
r(mtInfo,nSrcMapBaseDirIs,sSrcMapBaseDirIs);
|
r(mtInfo,nSrcMapBaseDirIs,sSrcMapBaseDirIs);
|
||||||
r(mtFatal,nUnitFileNotFound,sUnitFileNotFound);
|
r(mtFatal,nUnitFileNotFound,sUnitFileNotFound);
|
||||||
r(mtInfo,nClassInterfaceStyleIs,sClassInterfaceStyleIs);
|
r(mtInfo,nClassInterfaceStyleIs,sClassInterfaceStyleIs);
|
||||||
LastMsgNumber:=-1; ;// was nMacroXSetToY 138
|
r(mtInfo,nHandlingEnvOpts,sHandlingEnvOpts);
|
||||||
r(mtInfo,nPostProcessorInfoX,sPostProcessorInfoX);
|
r(mtInfo,nPostProcessorInfoX,sPostProcessorInfoX);
|
||||||
r(mtInfo,nPostProcessorRunX,sPostProcessorRunX);
|
r(mtInfo,nPostProcessorRunX,sPostProcessorRunX);
|
||||||
r(mtError,nPostProcessorFailX,sPostProcessorFailX);
|
r(mtError,nPostProcessorFailX,sPostProcessorFailX);
|
||||||
@ -2762,215 +2970,29 @@ begin
|
|||||||
Pas2jsPParser.RegisterMessages(Log);
|
Pas2jsPParser.RegisterMessages(Log);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPas2JSConfigSupport.CfgSyntaxError(const Msg: string);
|
|
||||||
begin
|
|
||||||
Compiler.Log.Log(mtError,Msg,0,CurrentCfgFilename,CurrentCfgLineNumber,0);
|
|
||||||
Compiler.Terminate(ExitCodeErrorInConfig);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TPas2jsCompiler.LoadConfig(CfgFilename: string);
|
procedure TPas2jsCompiler.LoadConfig(CfgFilename: string);
|
||||||
begin
|
begin
|
||||||
ConfigSupport.LoadConfig(CfgFileName);
|
ConfigSupport.LoadConfig(CfgFileName);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPas2JSConfigSupport.LoadConfig(Const aFileName: String);
|
procedure TPas2jsCompiler.ReadEnvironment;
|
||||||
type
|
|
||||||
TSkip = (
|
|
||||||
skipNone,
|
|
||||||
skipIf,
|
|
||||||
skipElse
|
|
||||||
);
|
|
||||||
const
|
|
||||||
IdentChars = ['a'..'z','A'..'Z','_','0'..'9'];
|
|
||||||
var
|
var
|
||||||
Line: String;
|
s: String;
|
||||||
l, p, StartP: integer;
|
List: TStrings;
|
||||||
|
|
||||||
function GetWord: String;
|
|
||||||
begin
|
begin
|
||||||
StartP:=p;
|
s:=GetEnvironmentVariable('PAS2JS_OPTS');
|
||||||
while (p<=l) and ((Line[p] in IdentChars) or (Line[p]>#127)) do inc(p);
|
if s='' then exit;
|
||||||
Result:=copy(Line,StartP,p-StartP);
|
if ShowDebug then
|
||||||
while (p<=l) and (Line[p] in [' ',#9]) do inc(p);
|
Log.LogMsgIgnoreFilter(nHandlingEnvOpts,['PAS2JS_OPTS=['+s+']']);
|
||||||
end;
|
List:=TStringList.Create;
|
||||||
|
|
||||||
procedure DebugCfgDirective(const s: string);
|
|
||||||
begin
|
|
||||||
Compiler.Log.LogMsg(nCfgDirective,[QuoteStr(Line),s],CurrentCfgFilename,CurrentCfgLineNumber,1,false);
|
|
||||||
end;
|
|
||||||
|
|
||||||
var
|
|
||||||
OldCfgFilename, Directive, aName, Expr: String;
|
|
||||||
aFile: TSourceLineReader;
|
|
||||||
IfLvl, SkipLvl, OldCfgLineNumber: Integer;
|
|
||||||
Skip: TSkip;
|
|
||||||
begin
|
|
||||||
if Compiler.ShowDebug or Compiler.ShowTriedUsedFiles then
|
|
||||||
Compiler.Log.LogMsgIgnoreFilter(nReadingOptionsFromFile,[QuoteStr(aFilename)]);
|
|
||||||
IfLvl:=0;
|
|
||||||
SkipLvl:=0;
|
|
||||||
Skip:=skipNone;
|
|
||||||
aFile:=nil;
|
|
||||||
try
|
try
|
||||||
OldCfgFilename:=FCurrentCfgFilename;
|
SplitCmdLineParams(s,List);
|
||||||
FCurrentCfgFilename:=aFilename;
|
for s in List do
|
||||||
OldCfgLineNumber:=FCurrentCfgLineNumber;
|
if s<>'' then
|
||||||
aFile:=GetReader(aFileName);
|
ReadParam(s,false,false);
|
||||||
while not aFile.IsEOF do begin
|
|
||||||
Line:=aFile.ReadLine;
|
|
||||||
FCurrentCfgLineNumber:=aFile.LineNumber;
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
Compiler.Log.LogMsgIgnoreFilter(nInterpretingFileOption,[QuoteStr(Line)]);
|
|
||||||
if Line='' then continue;
|
|
||||||
l:=length(Line);
|
|
||||||
p:=1;
|
|
||||||
while (p<=l) and (Line[p] in [' ',#9]) do inc(p);
|
|
||||||
if p>l then continue; // empty line
|
|
||||||
|
|
||||||
if (p<=l) and (Line[p]='#') then
|
|
||||||
begin
|
|
||||||
// cfg directive
|
|
||||||
inc(p);
|
|
||||||
if (p>l) or (Line[p] in [#0,#9,' ','-']) then continue; // comment
|
|
||||||
Directive:=lowercase(GetWord);
|
|
||||||
case Directive of
|
|
||||||
'ifdef','ifndef':
|
|
||||||
begin
|
|
||||||
inc(IfLvl);
|
|
||||||
if Skip=skipNone then
|
|
||||||
begin
|
|
||||||
aName:=GetWord;
|
|
||||||
if Compiler.IsDefined(aName)=(Directive='ifdef') then
|
|
||||||
begin
|
|
||||||
// execute block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('true -> execute');
|
|
||||||
end else begin
|
|
||||||
// skip block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('false -> skip');
|
|
||||||
SkipLvl:=IfLvl;
|
|
||||||
Skip:=skipIf;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'if':
|
|
||||||
begin
|
|
||||||
inc(IfLvl);
|
|
||||||
if Skip=skipNone then
|
|
||||||
begin
|
|
||||||
Expr:=copy(Line,p,length(Line));
|
|
||||||
if ConditionEvaluator.Eval(Expr) then
|
|
||||||
begin
|
|
||||||
// execute block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('true -> execute');
|
|
||||||
end else begin
|
|
||||||
// skip block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('false -> skip');
|
|
||||||
SkipLvl:=IfLvl;
|
|
||||||
Skip:=skipIf;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'else':
|
|
||||||
begin
|
|
||||||
if IfLvl=0 then
|
|
||||||
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
|
||||||
if (Skip=skipElse) and (IfLvl=SkipLvl) then
|
|
||||||
CfgSyntaxError('"there was already an #else');
|
|
||||||
if (Skip=skipIf) and (IfLvl=SkipLvl) then
|
|
||||||
begin
|
|
||||||
// if-block was skipped -> execute else block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('execute');
|
|
||||||
SkipLvl:=0;
|
|
||||||
Skip:=skipNone;
|
|
||||||
end else if Skip=skipNone then
|
|
||||||
begin
|
|
||||||
// if-block was executed -> skip else block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('skip');
|
|
||||||
Skip:=skipElse;
|
|
||||||
SkipLvl:=IfLvl;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'elseif':
|
|
||||||
begin
|
|
||||||
if IfLvl=0 then
|
|
||||||
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
|
||||||
if (Skip=skipIf) and (IfLvl=SkipLvl) then
|
|
||||||
begin
|
|
||||||
// if-block was skipped -> try this elseif
|
|
||||||
Expr:=copy(Line,p,length(Line));
|
|
||||||
if ConditionEvaluator.Eval(Expr) then
|
|
||||||
begin
|
|
||||||
// execute elseif block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('true -> execute');
|
|
||||||
SkipLvl:=0;
|
|
||||||
Skip:=skipNone;
|
|
||||||
end else begin
|
|
||||||
// skip elseif block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('false -> skip');
|
|
||||||
end;
|
|
||||||
end else if Skip=skipNone then
|
|
||||||
begin
|
|
||||||
// if-block was executed -> skip without test
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('no test -> skip');
|
|
||||||
Skip:=skipIf;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'endif':
|
|
||||||
begin
|
|
||||||
if IfLvl=0 then
|
|
||||||
CfgSyntaxError('"'+Directive+'" without #ifdef');
|
|
||||||
dec(IfLvl);
|
|
||||||
if IfLvl<SkipLvl then
|
|
||||||
begin
|
|
||||||
// end block
|
|
||||||
if Compiler.ShowDebug then
|
|
||||||
DebugCfgDirective('end block');
|
|
||||||
SkipLvl:=0;
|
|
||||||
Skip:=skipNone;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'error':
|
|
||||||
Compiler.ParamFatal('user defined: '+copy(Line,p,length(Line)))
|
|
||||||
else
|
|
||||||
if Skip=skipNone then
|
|
||||||
CfgSyntaxError('unknown directive "#'+Directive+'"')
|
|
||||||
else
|
|
||||||
DebugCfgDirective('skipping unknown directive');
|
|
||||||
end;
|
|
||||||
end else if Skip=skipNone then
|
|
||||||
begin
|
|
||||||
// option line
|
|
||||||
Line:=copy(Line,p,length(Line));
|
|
||||||
Compiler.ReadParam(Line,false,false);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
finally
|
||||||
FCurrentCfgFilename:=OldCfgFilename;
|
List.Free;
|
||||||
FCurrentCfgLineNumber:=OldCfgLineNumber;
|
|
||||||
aFile.Free;
|
|
||||||
end;
|
end;
|
||||||
if Compiler.ShowDebug or Compiler.ShowTriedUsedFiles then
|
|
||||||
Compiler.Log.LogMsgIgnoreFilter(nEndOfReadingConfigFile,[QuoteStr(aFilename)]);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TPas2JSConfigSupport.LoadDefaultConfig;
|
|
||||||
|
|
||||||
var
|
|
||||||
aFileName: string;
|
|
||||||
|
|
||||||
begin
|
|
||||||
aFileName:=FindDefaultConfig;
|
|
||||||
if aFileName<>'' then
|
|
||||||
LoadConfig(aFilename);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPas2jsCompiler.ParamFatal(Msg: string);
|
procedure TPas2jsCompiler.ParamFatal(Msg: string);
|
||||||
@ -4068,6 +4090,9 @@ begin
|
|||||||
if Assigned(ConfigSupport) and not SkipDefaultConfig then
|
if Assigned(ConfigSupport) and not SkipDefaultConfig then
|
||||||
ConfigSupport.LoadDefaultConfig;
|
ConfigSupport.LoadDefaultConfig;
|
||||||
|
|
||||||
|
// read env PAS2JS_OPTS
|
||||||
|
ReadEnvironment;
|
||||||
|
|
||||||
// read command line parameters
|
// read command line parameters
|
||||||
for i:=0 to ParamList.Count-1 do
|
for i:=0 to ParamList.Count-1 do
|
||||||
ReadParam(ParamList[i],false,true);
|
ReadParam(ParamList[i],false,true);
|
||||||
|
Loading…
Reference in New Issue
Block a user