codetools: h2pas: simple struct

git-svn-id: trunk@31320 -
This commit is contained in:
mattias 2011-06-21 18:41:26 +00:00
parent e748b7b37e
commit 1346c39a97
4 changed files with 24 additions and 11 deletions

View File

@ -2287,7 +2287,7 @@ var
NameNode: TCodeTreeNode;
begin
NameNode:=StructNode.FirstChild;
if (NameNode<>nil) and (NameNode.Desc=ccnName) then
if (NameNode<>nil) and (NameNode.Desc=ccnTypeName) then
Result:=GetIdentifier(@Src[NameNode.StartPos])
else
Result:='';

View File

@ -192,7 +192,7 @@ type
FUndefines: TStringToStringTree;
FUseExternal: boolean;
// converting C nodes to H2P nodes
procedure ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode);
function ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode): TH2PNode;
procedure ConvertVariable(CNode: TCodeTreeNode; ParentNode: TH2PNode);
function ConvertEnumBlock(CNode: TCodeTreeNode; ParentNode: TH2PNode): TH2PNode;
procedure ConvertFunction(CNode: TCodeTreeNode; ParentNode: TH2PNode);
@ -514,12 +514,13 @@ end;
{ TH2PasTool }
procedure TH2PasTool.ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode);
function TH2PasTool.ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode
): TH2PNode;
var
CurName: String;
TypeH2PNode: TH2PNode;
CurCName: String;
begin
Result:=nil;
CurName:=CTool.ExtractStructName(CNode);
if CurName='' then begin
// this is an anonymous struct -> ignore
@ -528,11 +529,11 @@ begin
// this struct has a name
// create a type
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'',
Result:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'',
nil,ParentNode=nil);
DebugLn(['TH2PasTool.ConvertStruct ADDED ',TypeH2PNode.DescAsString(CTool)]);
DebugLn(['TH2PasTool.ConvertStruct ADDED ',Result.DescAsString(CTool)]);
// build recursively
BuildH2PTree(TypeH2PNode);
BuildH2PTree(Result);
end;
end;
@ -2327,8 +2328,7 @@ begin
ReadRawNextCAtom(CType,p,CurAtomStart);
if CurAtomStart>length(CType) then break;
//DebugLn(['TH2PasTool.ConvertSimpleCTypeToPascalType Atom=',copy(CType,CurAtomStart,p-CurAtomStart)]);
if (not TestIsAtomAndRemove('const'))
and (not TestIsAtomAndRemove('struct')) then ;
TestIsAtomAndRemove('const');
until false;
// seach in predefined ctypes
Result:=PredefinedCTypes[CType];
@ -2435,6 +2435,10 @@ begin
Result:=ConvertEnumBlock(SubCNode,nil);
exit;
end;
if (SubCNode.Desc=ccnStruct) then begin
Result:=ConvertStruct(SubCNode,nil);
exit;
end;
if SubCNode.Desc<>ccnConstant then begin
debugln(['TH2PasTool.GetH2PNodeForComplexType TODO: ',CCNodeDescAsString(CNode.Desc),' of ',CCNodeDescAsString(SubCNode.Desc)]);
exit;

View File

@ -383,8 +383,8 @@ type
For example:
Do something after 2 seconds after user input and idle.
AutoEnabled:=true;
AutoStartEvent:=[itaOnIdle]; // start the timer on first idle
AutoEndEvent:=[itaOnUserInput]; // end on any user input
AutoStartEvent:=itaOnIdle; // start the timer on first idle
AutoEndEvent:=itaOnUserInput; // end on any user input
If the OnTimer event works in several chunks, set FireOnIdle:=true.
The OnTimer event will then be called on idle until FireOnIdle is false.

View File

@ -7,6 +7,7 @@
./runtests --format=plain --suite=TestCTH2PConvertEnumsTypes
./runtests --format=plain --suite=TestCTH2PConvertConst
./runtests --format=plain --suite=TestCTH2PConvertSimpleTypedefs
./runtests --format=plain --suite=TestCTH2PConvertSimpleStructs
}
unit TestCTH2Pas;
@ -35,6 +36,7 @@ type
procedure TestCTH2PConvertEnumsTypes;
procedure TestCTH2PConvertConst;
procedure TestCTH2PConvertSimpleTypedefs;
procedure TestCTH2PConvertSimpleStructs;
end;
implementation
@ -233,6 +235,13 @@ begin
'type sa_family_t = cushort;');
end;
procedure TTestCodetoolsH2Pas.TestCTH2PConvertSimpleStructs;
begin
TestIntf('convert struct SwsContext;',
'struct SwsContext;',
'type SwsContext = record end;');
end;
initialization
AddToCodetoolsTestSuite(TTestCodetoolsH2Pas);