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; NameNode: TCodeTreeNode;
begin begin
NameNode:=StructNode.FirstChild; NameNode:=StructNode.FirstChild;
if (NameNode<>nil) and (NameNode.Desc=ccnName) then if (NameNode<>nil) and (NameNode.Desc=ccnTypeName) then
Result:=GetIdentifier(@Src[NameNode.StartPos]) Result:=GetIdentifier(@Src[NameNode.StartPos])
else else
Result:=''; Result:='';

View File

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

View File

@ -383,8 +383,8 @@ type
For example: For example:
Do something after 2 seconds after user input and idle. Do something after 2 seconds after user input and idle.
AutoEnabled:=true; AutoEnabled:=true;
AutoStartEvent:=[itaOnIdle]; // start the timer on first idle AutoStartEvent:=itaOnIdle; // start the timer on first idle
AutoEndEvent:=[itaOnUserInput]; // end on any user input AutoEndEvent:=itaOnUserInput; // end on any user input
If the OnTimer event works in several chunks, set FireOnIdle:=true. If the OnTimer event works in several chunks, set FireOnIdle:=true.
The OnTimer event will then be called on idle until FireOnIdle is false. 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=TestCTH2PConvertEnumsTypes
./runtests --format=plain --suite=TestCTH2PConvertConst ./runtests --format=plain --suite=TestCTH2PConvertConst
./runtests --format=plain --suite=TestCTH2PConvertSimpleTypedefs ./runtests --format=plain --suite=TestCTH2PConvertSimpleTypedefs
./runtests --format=plain --suite=TestCTH2PConvertSimpleStructs
} }
unit TestCTH2Pas; unit TestCTH2Pas;
@ -35,6 +36,7 @@ type
procedure TestCTH2PConvertEnumsTypes; procedure TestCTH2PConvertEnumsTypes;
procedure TestCTH2PConvertConst; procedure TestCTH2PConvertConst;
procedure TestCTH2PConvertSimpleTypedefs; procedure TestCTH2PConvertSimpleTypedefs;
procedure TestCTH2PConvertSimpleStructs;
end; end;
implementation implementation
@ -233,6 +235,13 @@ begin
'type sa_family_t = cushort;'); 'type sa_family_t = cushort;');
end; end;
procedure TTestCodetoolsH2Pas.TestCTH2PConvertSimpleStructs;
begin
TestIntf('convert struct SwsContext;',
'struct SwsContext;',
'type SwsContext = record end;');
end;
initialization initialization
AddToCodetoolsTestSuite(TTestCodetoolsH2Pas); AddToCodetoolsTestSuite(TTestCodetoolsH2Pas);