mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-04 12:00:18 +02:00
codetools: h2pas: allowing in #if && || > < >= <=
git-svn-id: trunk@15915 -
This commit is contained in:
parent
3740d76c2f
commit
110712e59c
@ -235,6 +235,8 @@ type
|
||||
function ExtractDefine(DefineNode: TCodeTreeNode;
|
||||
out MacroName, MacroParamList, MacroValue: string): boolean;
|
||||
|
||||
function FindEnclosingIFNDEF: TCodeTreeNode;// finds the typical IFNDEF that encloses the whole header source
|
||||
|
||||
procedure Replace(FromPos, ToPos: integer; const NewSrc: string);
|
||||
|
||||
procedure IncreaseChangeStep;
|
||||
@ -360,9 +362,12 @@ function TCCodeParserTool.DirectiveToken: boolean;
|
||||
end else if AtomIsChar(')') then begin
|
||||
if BracketLevel=0 then
|
||||
RaiseException(') without (');
|
||||
inc(BracketLevel);
|
||||
end else if AtomIsCharOfSet('!+-*/') or AtomIs('!=') or AtomIs('==')
|
||||
dec(BracketLevel);
|
||||
end else if AtomIsCharOfSet('!+-*/><')
|
||||
or AtomIs('!=') or AtomIs('==') or AtomIs('<=') or AtomIs('>=')
|
||||
or AtomIs('&&') or AtomIs('||')
|
||||
then begin
|
||||
// valid operator
|
||||
end else if IsIdentChar[Src[AtomStart]] then begin
|
||||
if AtomIs('defined') then begin
|
||||
// read defined(macro)
|
||||
@ -1863,6 +1868,21 @@ begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
function TCCodeParserTool.FindEnclosingIFNDEF: TCodeTreeNode;
|
||||
{ Search for the typical enclosing IFNDEF of c header file:
|
||||
- No code in front
|
||||
- #IFNDEF NAME
|
||||
- #DEFINE NAME
|
||||
- ...
|
||||
- #ENDIF
|
||||
- No code behind
|
||||
}
|
||||
begin
|
||||
Result:=Tree.Root;
|
||||
// skip non code
|
||||
WriteDebugReport;
|
||||
end;
|
||||
|
||||
function TCCodeParserTool.GetAtom: string;
|
||||
begin
|
||||
Result:=copy(Src,AtomStart,SrcPos-AtomStart);
|
||||
|
@ -82,6 +82,9 @@ begin
|
||||
CCode:=CodeToolBoss.LoadFile(Filename,false,false);
|
||||
if CCode=nil then
|
||||
raise Exception.Create('loading failed '+Filename);
|
||||
Tool.FindEnclosingIFNDEF(CCode);
|
||||
Halt;
|
||||
|
||||
if Src<>'' then
|
||||
Src:=Src+LineEnding;
|
||||
Src:=Src+CCode.Source;
|
||||
|
@ -246,6 +246,7 @@ type
|
||||
Macros: TAVLTree;// tree of TH2PMacroStats
|
||||
function Convert(CCode, PascalCode: TCodeBuffer): boolean;
|
||||
procedure BuildH2PTree(ParentNode: TH2PNode = nil; StartNode: TCodeTreeNode = nil);
|
||||
function FindEnclosingIFNDEF(CCode: TCodeBuffer): TCodeTreeNode;
|
||||
procedure SimplifyDirectives;
|
||||
procedure WritePascal(PascalCode: TCodeBuffer);
|
||||
procedure WritePascalToStream(s: TStream);
|
||||
@ -1945,7 +1946,7 @@ begin
|
||||
|
||||
if CTool=nil then
|
||||
CTool:=TCCodeParserTool.Create;
|
||||
// pare C header file
|
||||
// parse C header file
|
||||
CTool.Parse(CCode);
|
||||
CTool.WriteDebugReport;
|
||||
|
||||
@ -2020,6 +2021,15 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TH2PasTool.FindEnclosingIFNDEF(CCode: TCodeBuffer): TCodeTreeNode;
|
||||
begin
|
||||
if CTool=nil then
|
||||
CTool:=TCCodeParserTool.Create;
|
||||
// parse C header file
|
||||
CTool.Parse(CCode);
|
||||
Result:=CTool.FindEnclosingIFNDEF;
|
||||
end;
|
||||
|
||||
procedure TH2PasTool.SimplifyDirectives;
|
||||
(* Check and improve the following cases
|
||||
1.a {$DEFINE Name} and Name is never used afterwards -> disable
|
||||
|
Loading…
Reference in New Issue
Block a user