codetools: h2pas: allowing in #if && || > < >= <=

git-svn-id: trunk@15915 -
This commit is contained in:
mattias 2008-07-30 06:58:20 +00:00
parent 3740d76c2f
commit 110712e59c
3 changed files with 36 additions and 3 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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