diff --git a/components/codetools/ccodeparsertool.pas b/components/codetools/ccodeparsertool.pas index 4bf2eae21f..45e5ba3a9c 100644 --- a/components/codetools/ccodeparsertool.pas +++ b/components/codetools/ccodeparsertool.pas @@ -31,6 +31,8 @@ interface {$I codetools.inc} +{off $DEFINE VerboseCCodeParser} + uses {$IFDEF MEM_CHECK} MemCheck, @@ -445,10 +447,8 @@ begin RaiseException('missing declaration') else ReadVariable; - DebugLn(['TCCodeParserTool.TypedefToken AAA1 ',GetAtom]); // read semicolon ReadNextAtom; - DebugLn(['TCCodeParserTool.TypedefToken AAA2 ',GetAtom]); if not AtomIsChar(';') then RaiseExpectedButAtomFound(';'); EndChildNode; @@ -502,12 +502,16 @@ begin NewNode.Desc:=Desc; CurNode:=NewNode; CurNode.StartPos:=AtomStart; + {$IFDEF VerboseCCodeParser} DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.CreateChildNode ',CCNodeDescAsString(Desc)]); + {$ENDIF} end; procedure TCCodeParserTool.EndChildNode; begin + {$IFDEF VerboseCCodeParser} DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.EndChildNode ',CCNodeDescAsString(CurNode.Desc)]); + {$ENDIF} if CurNode.EndPos<=0 then CurNode.EndPos:=SrcPos; CurNode:=CurNode.Parent; @@ -570,7 +574,9 @@ var NeedEnd: Boolean; LastIsName: Boolean; begin + {$IFDEF VerboseCCodeParser} DebugLn(['TCCodeParserTool.ReadVariable START ',GetAtom]); + {$ENDIF} CreateChildNode(ccnVariable); IsFunction:=false; if AtomIs('struct') then begin @@ -634,7 +640,9 @@ begin // pointer or const ReadNextAtom; end; + {$IFDEF VerboseCCodeParser} DebugLn(['TCCodeParserTool.ReadVariable name=',GetAtom]); + {$ENDIF} if not AtomIsIdentifier then RaiseExpectedButAtomFound('identifier'); ReadNextAtom; @@ -646,7 +654,9 @@ begin ReadNextAtom; end; + {$IFDEF VerboseCCodeParser} DebugLn(['TCCodeParserTool.ReadVariable name=',GetAtom]); + {$ENDIF} if not AtomIsIdentifier then RaiseExpectedButAtomFound('identifier'); end; @@ -907,7 +917,9 @@ begin repeat ReadRawNextCAtom(Src,SrcPos,AtomStart); until (SrcPos>SrcLen) or (not (Src[AtomStart] in [#10,#13])); + {$IFDEF VerboseCCodeParser} DebugLn(['TCCodeParserTool.ReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']); + {$ENDIF} end; procedure TCCodeParserTool.UndoReadNextAtom; @@ -1050,7 +1062,9 @@ var Node: TCodeTreeNode; DiffPos: Integer; begin + {$IFDEF VerboseCCodeParser} DebugLn(['TCCodeParserTool.Replace ',FromPos,'-',ToPos,' Old="',copy(Src,FromPos,ToPos-FromPos),'" New="',NewSrc,'"']); + {$ENDIF} IncreaseChangeStep; Code.Replace(FromPos,ToPos-FromPos,NewSrc); Src:=Code.Source; diff --git a/components/codetools/h2pastool.pas b/components/codetools/h2pastool.pas index eaa675f845..b8817b37d0 100644 --- a/components/codetools/h2pastool.pas +++ b/components/codetools/h2pastool.pas @@ -40,8 +40,8 @@ unit H2PasTool; interface uses - Classes, SysUtils, FileProcs,CCodeParserTool, NonPascalCodeTools, - CodeCache, CodeTree, CodeAtom; + Classes, SysUtils, FileProcs, BasicCodeTools, CCodeParserTool, + NonPascalCodeTools, CodeCache, CodeTree, CodeAtom; type @@ -92,6 +92,8 @@ type Tree: TH2PTree; CTool: TCCodeParserTool; function Convert(CCode, PascalCode: TCodeBuffer): boolean; + procedure BuildH2PTree; + function ExtractCVariableName(CVarNode: TCodeTreeNode): string; procedure WriteDebugReport; constructor Create; destructor Destroy; override; @@ -110,8 +112,9 @@ begin try // pare C header file CTool.Parse(CCode); - CTool.WriteDebugReport; - + //CTool.WriteDebugReport; + + BuildH2PTree; finally CTool.Free; end; @@ -119,6 +122,37 @@ begin Result:=true; end; +procedure TH2PasTool.BuildH2PTree; +var + CNode: TCodeTreeNode; + VarName: String; +begin + Tree.Clear; + CNode:=CTool.Tree.Root; + while CNode<>nil do begin + case CNode.Desc of + ccnVariable: + begin + VarName:=ExtractCVariableName(CNode); + DebugLn(['TH2PasTool.BuildH2PTree Variable Name="',VarName,'"']); + end; + + end; + CNode:=CNode.Next; + end; +end; + +function TH2PasTool.ExtractCVariableName(CVarNode: TCodeTreeNode): string; +var + Node: TCodeTreeNode; +begin + Node:=CVarNode.FirstChild; + if (Node=nil) or (Node.Desc<>ccnVariableName) then + Result:='' + else + Result:=copy(CTool.Src,Node.StartPos,Node.EndPos-node.StartPos); +end; + procedure TH2PasTool.WriteDebugReport; begin DebugLn(['TH2PasTool.WriteDebugReport ']);