codetools: added TDefinePool.GetFPCVerFromFPCTemplate

git-svn-id: trunk@24034 -
This commit is contained in:
mattias 2010-03-16 13:29:29 +00:00
parent db75010348
commit fc19399e97

View File

@ -494,6 +494,8 @@ type
out UnitSearchPath, TargetOS,
TargetProcessor: string;
Owner: TObject): TDefineTemplate;
function GetFPCVerFromFPCTemplate(Template: TDefineTemplate;
out FPCVersion, FPCRelease, FPCPatch: integer): boolean;
function CreateFPCSrcTemplate(const FPCSrcDir, UnitSearchPath, PPUExt,
DefaultTargetOS, DefaultProcessorName: string;
UnitLinkListValid: boolean; var UnitLinkList: string;
@ -3211,7 +3213,7 @@ begin
// add
if (LastDefTempl<>nil) then begin
Result:=TDefineTemplate.Create('Free Pascal Compiler',
Result:=TDefineTemplate.Create(StdDefTemplFPC,
ctsFreePascalCompilerInitialMacros,'','',da_Block);
Result.AddChild(LastDefTempl.GetFirstSibling);
Result.SetFlags([dtfAutoGenerated],[],false);
@ -3226,6 +3228,80 @@ begin
Result.SetDefineOwner(Owner,true);
end;
function TDefinePool.GetFPCVerFromFPCTemplate(Template: TDefineTemplate; out
FPCVersion, FPCRelease, FPCPatch: integer): boolean;
var
p: Integer;
function ReadInt(const VarName: string; var AnInteger: integer): boolean;
var
StartPos: Integer;
begin
StartPos:=p;
AnInteger:=0;
while (p<=length(VarName)) and (VarName[p] in ['0'..'9']) do begin
AnInteger:=AnInteger*10+(ord(VarName[p])-ord('0'));
if AnInteger>=100 then begin
Result:=false;
exit;
end;
inc(p);
end;
Result:=StartPos<p;
end;
function ReadVersion(const VarName: string;
out NewVersion, NewRelease, NewPatch: integer): integer;
begin
Result:=0;
if (length(VarName)>3) and (VarName[1] in ['V','v'])
and (VarName[2] in ['E','e']) and (VarName[3] in ['R','r'])
and (VarName[4] in ['0'..'9']) then begin
p:=4;
if not ReadInt(VarName,NewVersion) then exit;
inc(Result);
if (p>=length(VarName)) or (VarName[p]<>'_') then exit;
inc(p);
if not ReadInt(VarName,NewRelease) then exit;
inc(Result);
if (p>=length(VarName)) or (VarName[p]<>'_') then exit;
inc(p);
if not ReadInt(VarName,NewPatch) then exit;
inc(Result);
end;
end;
var
Def: TDefineTemplate;
VarName: String;
BestCount: integer;
NewCount: LongInt;
NewVersion: integer;
NewRelease: integer;
NewPatch: integer;
begin
Result:=false;
FPCVersion:=0;
FPCRelease:=0;
FPCPatch:=0;
BestCount:=0;
Def:=Template;
while Def<>nil do begin
if Def.Action in [da_Define,da_DefineRecurse] then begin
VarName:=Def.Variable;
NewCount:=ReadVersion(VarName,NewVersion,NewRelease,NewPatch);
if NewCount>BestCount then begin
BestCount:=NewCount;
FPCVersion:=NewVersion;
if NewCount>1 then FPCRelease:=NewRelease;
if NewCount>2 then FPCPatch:=NewPatch;
if NewCount=3 then exit;
end;
end;
Def:=Def.Next;
end;
end;
function TDefinePool.CreateFPCSrcTemplate(
const FPCSrcDir, UnitSearchPath, PPUExt, DefaultTargetOS,
DefaultProcessorName: string;