codetools: h2pas: fixed converting int i

git-svn-id: trunk@31301 -
This commit is contained in:
mattias 2011-06-20 15:32:56 +00:00
parent 2b1f4d3db4
commit ab2b327fd3
3 changed files with 63 additions and 25 deletions

View File

@ -366,6 +366,8 @@ type
function CCNodeDescAsString(Desc: TCCodeNodeDesc; SubDesc: TCCodeNodeDesc = 0): string; function CCNodeDescAsString(Desc: TCCodeNodeDesc; SubDesc: TCCodeNodeDesc = 0): string;
procedure InitCCodeKeyWordLists; procedure InitCCodeKeyWordLists;
function GetNodeIndent(Node: TCodeTreeNode): string;
var var
IsCCodeFunctionModifier: TKeyWordFunctionList = nil; IsCCodeFunctionModifier: TKeyWordFunctionList = nil;
IsCCodeCustomOperator: TKeyWordFunctionList = nil; IsCCodeCustomOperator: TKeyWordFunctionList = nil;
@ -454,6 +456,14 @@ begin
end; end;
end; end;
function GetNodeIndent(Node: TCodeTreeNode): string;
begin
if Node=nil then
Result:=''
else
Result:=GetIndentStr(Node.GetLevel*2);
end;
{ TCHeaderFileMerger } { TCHeaderFileMerger }
procedure TCHeaderFileMerger.AddLink(aMergedPos: integer; aCode: TCodeBuffer; procedure TCHeaderFileMerger.AddLink(aMergedPos: integer; aCode: TCodeBuffer;
@ -835,10 +845,8 @@ begin
ReadDefinition(false); ReadDefinition(false);
if CurNode.LastChild.Desc<>ccnFunction then begin if CurNode.LastChild.Desc<>ccnFunction then begin
ReadNextAtom; ReadNextAtom;
debugln(['TCCodeParserTool.OtherToken ',GetAtom,' SrcPos=',SrcPos,' AtomStart=',AtomStart,' SrcLen=',SrcLen]);
if not AtomIsChar(';') then if not AtomIsChar(';') then
RaiseExpectedButAtomFound(';'); RaiseExpectedButAtomFound(';');
debugln(['TCCodeParserTool.OtherToken AAA1']);
end; end;
end else end else
RaiseException('unexpected token '+GetAtom); RaiseException('unexpected token '+GetAtom);
@ -855,7 +863,7 @@ function TCCodeParserTool.DirectiveToken: boolean;
repeat repeat
ReadRawNextAtom; ReadRawNextAtom;
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
debugln([GetIndentStr(CurNode.GetLevel*2),'ReadExpression Atom ',GetAtom]); debugln([GetNodeIndent(CurNode),'ReadExpression Atom ',GetAtom]);
{$ENDIF} {$ENDIF}
if AtomStart>SrcLen then if AtomStart>SrcLen then
RaiseException('missing expression'); RaiseException('missing expression');
@ -949,14 +957,14 @@ begin
RaiseExpectedButAtomFound('identifier'); RaiseExpectedButAtomFound('identifier');
end else if AtomIs('if') then begin end else if AtomIs('if') then begin
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]);
{$ENDIF} {$ENDIF}
CurNode.SubDesc:=ccnsDirectiveIf; CurNode.SubDesc:=ccnsDirectiveIf;
IncIfLevel(AtomStart); IncIfLevel(AtomStart);
ReadExpression; ReadExpression;
end else if AtomIs('ifdef') then begin end else if AtomIs('ifdef') then begin
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]);
{$ENDIF} {$ENDIF}
CurNode.SubDesc:=ccnsDirectiveIfDef; CurNode.SubDesc:=ccnsDirectiveIfDef;
IncIfLevel(AtomStart); IncIfLevel(AtomStart);
@ -965,7 +973,7 @@ begin
RaiseExpectedButAtomFound('identifier'); RaiseExpectedButAtomFound('identifier');
end else if AtomIs('ifndef') then begin end else if AtomIs('ifndef') then begin
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]);
{$ENDIF} {$ENDIF}
CurNode.SubDesc:=ccnsDirectiveIfNDef; CurNode.SubDesc:=ccnsDirectiveIfNDef;
IncIfLevel(AtomStart); IncIfLevel(AtomStart);
@ -974,7 +982,7 @@ begin
RaiseExpectedButAtomFound('identifier'); RaiseExpectedButAtomFound('identifier');
end else if AtomIs('elif') then begin end else if AtomIs('elif') then begin
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2-2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2-2),GetAtom]);
{$ENDIF} {$ENDIF}
CurNode.SubDesc:=ccnsDirectiveElIf; CurNode.SubDesc:=ccnsDirectiveElIf;
if IfLevel=0 then if IfLevel=0 then
@ -982,7 +990,7 @@ begin
ReadExpression; ReadExpression;
end else if AtomIs('else') then begin end else if AtomIs('else') then begin
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2-2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2-2),GetAtom]);
{$ENDIF} {$ENDIF}
CurNode.SubDesc:=ccnsDirectiveElse; CurNode.SubDesc:=ccnsDirectiveElse;
if IfLevel=0 then if IfLevel=0 then
@ -993,7 +1001,7 @@ begin
RaiseException('endif without if'); RaiseException('endif without if');
dec(IfLevel); dec(IfLevel);
{$IFDEF VerboseCDirectives} {$IFDEF VerboseCDirectives}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.DirectiveToken ',GetIndentStr(IfLevel*2),GetAtom]);
{$ENDIF} {$ENDIF}
end else if AtomIs('line') then begin end else if AtomIs('line') then begin
CurNode.SubDesc:=ccnsDirectiveLine; CurNode.SubDesc:=ccnsDirectiveLine;
@ -1223,14 +1231,14 @@ begin
CurNode:=NewNode; CurNode:=NewNode;
CurNode.StartPos:=AtomStart; CurNode.StartPos:=AtomStart;
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.CreateChildNode ',CCNodeDescAsString(Desc)]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.CreateChildNode ',CCNodeDescAsString(Desc)]);
{$ENDIF} {$ENDIF}
end; end;
procedure TCCodeParserTool.EndChildNode; procedure TCCodeParserTool.EndChildNode;
begin begin
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.EndChildNode ',CCNodeDescAsString(CurNode.Desc)]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.EndChildNode ',CCNodeDescAsString(CurNode.Desc)]);
{$ENDIF} {$ENDIF}
if CurNode.EndPos<=0 then if CurNode.EndPos<=0 then
CurNode.EndPos:=SrcPos; CurNode.EndPos:=SrcPos;
@ -1321,7 +1329,7 @@ var
MainNode: TCodeTreeNode; MainNode: TCodeTreeNode;
begin begin
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.ReadVariable START ',GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.ReadVariable START ',GetAtom]);
{$ENDIF} {$ENDIF}
if AtomIs('typedef') then begin if AtomIs('typedef') then begin
if AsParameter then if AsParameter then
@ -1416,7 +1424,7 @@ begin
ReadNextAtom; ReadNextAtom;
end; end;
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.ReadVariable name=',GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.ReadVariable name=',GetAtom]);
{$ENDIF} {$ENDIF}
if AtomIsIdentifier then begin if AtomIsIdentifier then begin
CreateChildNode(ccnName); CreateChildNode(ccnName);
@ -1429,7 +1437,7 @@ begin
RaiseExpectedButAtomFound(')'); RaiseExpectedButAtomFound(')');
end else begin end else begin
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.ReadVariable name=',GetAtom]); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.ReadVariable name=',GetAtom]);
{$ENDIF} {$ENDIF}
if AtomIsIdentifier then begin if AtomIsIdentifier then begin
CreateChildNode(ccnName); CreateChildNode(ccnName);
@ -1761,7 +1769,7 @@ begin
ReadRawNextCAtom(Src,SrcPos,AtomStart); ReadRawNextCAtom(Src,SrcPos,AtomStart);
until (SrcPos>SrcLen) or (not (Src[AtomStart] in [#10,#13])); until (SrcPos>SrcLen) or (not (Src[AtomStart] in [#10,#13]));
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.ReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.ReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']);
{$ENDIF} {$ENDIF}
end; end;
@ -1772,14 +1780,14 @@ begin
LastAtomStart:=AtomStart; LastAtomStart:=AtomStart;
repeat repeat
ReadRawNextCAtom(Src,SrcPos,AtomStart); ReadRawNextCAtom(Src,SrcPos,AtomStart);
if (SrcPos>SrcLen) then break; if (AtomStart>SrcLen) then break;
if Src[AtomStart]='#' then begin if Src[AtomStart]='#' then begin
ReadTilCLineEnd(Src,SrcPos); ReadTilCLineEnd(Src,SrcPos);
if (SrcPos>SrcLen) then break; if (SrcPos>SrcLen) then break;
end; end;
until (not (Src[AtomStart] in [#10,#13])); until (not (Src[AtomStart] in [#10,#13]));
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.ReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.ReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']);
{$ENDIF} {$ENDIF}
end; end;
@ -1801,7 +1809,7 @@ begin
SrcPos:=AtomStart; SrcPos:=AtomStart;
end; end;
{$IFDEF VerboseCCodeParser} {$IFDEF VerboseCCodeParser}
DebugLn([GetIndentStr(CurNode.GetLevel*2),'TCCodeParserTool.UndoReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']); DebugLn([GetNodeIndent(CurNode),'TCCodeParserTool.UndoReadNextAtom END ',AtomStart,'-',SrcPos,' "',copy(Src,AtomStart,SrcPos-AtomStart),'"']);
{$ENDIF} {$ENDIF}
end; end;
@ -2536,7 +2544,7 @@ begin
if Tree<>nil then begin if Tree<>nil then begin
Node:=Tree.Root; Node:=Tree.Root;
while Node<>nil do begin while Node<>nil do begin
DebugLn([GetIndentStr(Node.GetLevel*2)+NodeAsString(Node)]); DebugLn([GetNodeIndent(CurNode)+NodeAsString(Node)]);
Node:=Node.Next; Node:=Node.Next;
end; end;
end; end;

View File

@ -190,6 +190,7 @@ type
FSimplifyExpressions: boolean; FSimplifyExpressions: boolean;
FSourceName: string; FSourceName: string;
FUndefines: TStringToStringTree; FUndefines: TStringToStringTree;
FUseExternal: boolean;
// converting C nodes to H2P nodes // converting C nodes to H2P nodes
procedure ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode); procedure ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode);
procedure ConvertVariable(CNode: TCodeTreeNode; ParentNode: TH2PNode); procedure ConvertVariable(CNode: TCodeTreeNode; ParentNode: TH2PNode);
@ -289,6 +290,7 @@ type
property PredefinedCTypes: TStringToStringTree read FPredefinedCTypes; property PredefinedCTypes: TStringToStringTree read FPredefinedCTypes;
property IgnoreCParts: TIgnoreCSourceParts read FIgnoreCParts write FIgnoreCParts; property IgnoreCParts: TIgnoreCSourceParts read FIgnoreCParts write FIgnoreCParts;
property SourceName: string read FSourceName write FSourceName; property SourceName: string read FSourceName write FSourceName;
property UseExternal: boolean read FUseExternal write FUseExternal;// use external instad of public
// directives // directives
property SimplifyExpressions: boolean read FSimplifyExpressions property SimplifyExpressions: boolean read FSimplifyExpressions
@ -1279,7 +1281,11 @@ begin
SetPasSection(ctnVarSection); SetPasSection(ctnVarSection);
PascalCode:=H2PNode.PascalCode+';'; PascalCode:=H2PNode.PascalCode+';';
if H2PNode.CName<>'' then begin if H2PNode.CName<>'' then begin
PascalCode:=PascalCode+' cvar; public'; PascalCode:=PascalCode+' cvar; ';
if UseExternal then
PascalCode:=PascalCode+'external'
else
PascalCode:=PascalCode+'public';
if H2PNode.PascalName<>H2PNode.CName then begin if H2PNode.PascalName<>H2PNode.CName then begin
PascalCode:=PascalCode+' name '''+H2PNode.CName+''''; PascalCode:=PascalCode+' name '''+H2PNode.CName+'''';
end; end;
@ -2009,7 +2015,10 @@ var
CNode: TCodeTreeNode; CNode: TCodeTreeNode;
NextCNode: TCodeTreeNode; NextCNode: TCodeTreeNode;
begin begin
//DebugLn(['TH2PasTool.BuildH2PTree ParentNode=',ParentNode.DescAsString(CTool)]); if ParentNode<>nil then
DebugLn(['TH2PasTool.BuildH2PTree ParentNode=',ParentNode.DescAsString(CTool)])
else
debugln(['TH2PasTool.BuildH2PTree START']);
if ParentNode<>nil then begin if ParentNode<>nil then begin
if StartNode=nil then if StartNode=nil then
StartNode:=ParentNode.CNode.FirstChild; StartNode:=ParentNode.CNode.FirstChild;
@ -2024,7 +2033,10 @@ begin
end; end;
CNode:=StartNode; CNode:=StartNode;
while CNode<>nil do begin while CNode<>nil do begin
//DebugLn(['TH2PasTool.BuildH2PTree Current ParentNode=',ParentNode.DescAsString(CTool),' CNode=',CCNodeDescAsString(CNode.Desc)]); if ParentNode<>nil then
DebugLn(['TH2PasTool.BuildH2PTree Current ParentNode=',ParentNode.DescAsString(CTool),' CNode=',CCNodeDescAsString(CNode.Desc)])
else
DebugLn(['TH2PasTool.BuildH2PTree Current ParentNode=nil CNode=',CCNodeDescAsString(CNode.Desc)]);
NextCNode:=CNode.NextSkipChilds; NextCNode:=CNode.NextSkipChilds;
case CNode.Desc of case CNode.Desc of
ccnRoot, ccnExternBlock: ccnRoot, ccnExternBlock:
@ -2693,6 +2705,7 @@ begin
FIgnoreCParts:=[icspInclude]; FIgnoreCParts:=[icspInclude];
FDefines:=TStringToStringTree.Create(true); FDefines:=TStringToStringTree.Create(true);
FUndefines:=TStringToStringTree.Create(true); FUndefines:=TStringToStringTree.Create(true);
UseExternal:=true;
AddCommonCDefines; AddCommonCDefines;
end; end;

View File

@ -15,7 +15,7 @@ interface
uses uses
Classes, SysUtils, fpcunit, testglobals, FileProcs, CodeToolManager, Classes, SysUtils, fpcunit, testglobals, FileProcs, CodeToolManager,
CodeCache, CCodeParserTool, H2PasTool; BasicCodeTools, CodeCache, CCodeParserTool, H2PasTool;
type type
@ -119,19 +119,36 @@ var
Tool: TH2PasTool; Tool: TH2PasTool;
Header1: TCodeBuffer; Header1: TCodeBuffer;
PasCode: TCodeBuffer; PasCode: TCodeBuffer;
ExpectedSrc: String;
begin begin
Tool:=TH2PasTool.Create; Tool:=TH2PasTool.Create;
Header1:=nil;
PasCode:=nil;
try try
Header1:=CodeToolBoss.CreateFile('header1.h'); Header1:=CodeToolBoss.CreateFile('header1.h');
PasCode:=CodeToolBoss.CreateFile('header1.pas'); PasCode:=CodeToolBoss.CreateFile('header1.pas');
Header1.Source:='int i;'; Header1.Source:='int i;';
Tool.Convert(Header1,PasCode); Tool.Convert(Header1,PasCode);
Tool.WriteH2PNodeReport; ExpectedSrc:=
'uses ctypes;'+LineEnding
+'var'+LineEnding
+' i: cint; cvar; external;'+LineEnding
+'implementation'+LineEnding
+'end.';
if CompareTextIgnoringSpace(ExpectedSrc,PasCode.Source,true)<>0 then begin
AssertEquals('convert int i;',ExpectedSrc,PasCode.Source);
end else begin
AssertEquals('convert int i;',true,true);
end;
{Tool.WriteH2PNodeReport;
Tool.WriteH2PDirectivesNodeReport; Tool.WriteH2PDirectivesNodeReport;
writeln; writeln;
writeln('============================================='); writeln('=============================================');
writeln(PasCode.Source); writeln(PasCode.Source);}
finally finally
if Header1<>nil then Header1.IsDeleted:=true;
if PasCode<>nil then PasCode.IsDeleted:=true;
Tool.Free; Tool.Free;
end; end;
end; end;