codetools: h2p: workaround for fpc var/const string bug

git-svn-id: trunk@14682 -
This commit is contained in:
mattias 2008-03-28 15:10:26 +00:00
parent f0bbffbdde
commit a31259b22c
2 changed files with 61 additions and 32 deletions

View File

@ -164,6 +164,7 @@ static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2)
}
typedef unsigned short sa_family_t;
int hci_inquiry(int dev_id, int len, int num_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
#ifdef __cplusplus
}

View File

@ -263,9 +263,11 @@ type
InsertAsPreLast: boolean = false): TH2PNode;
function CreateAutoGeneratedH2PNode(var PascalName: string; CNode: TCodeTreeNode;
PascalDesc: TCodeTreeNodeDesc; const PascalCode: string;
ParentNode: TH2PNode = nil; IsGlobal: boolean = true): TH2PNode;
ParentNode: TH2PNode; IsGlobal: boolean;
InsertAsPreLast: boolean): TH2PNode;
function GetH2PNodeForComplexType(CNode: TCodeTreeNode;
CreateIfNotExists: boolean = true): TH2PNode;
CreateIfNotExists: boolean;
InsertAsPreLast: boolean): TH2PNode;
function CreatePascalNameFromCCode(const CCode: string;
StartPos: integer = 1;
EndPos: integer = -1): string;
@ -510,6 +512,7 @@ procedure TH2PasTool.ConvertStruct(CNode: TCodeTreeNode; ParentNode: TH2PNode);
var
CurName: String;
TypeH2PNode: TH2PNode;
CurCName: String;
begin
CurName:=CTool.ExtractStructName(CNode);
if CurName='' then begin
@ -518,7 +521,8 @@ begin
end else begin
// this struct has a name
// create a type
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'',
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'',
nil,ParentNode=nil);
DebugLn(['TH2PasTool.ConvertStruct ADDED ',TypeH2PNode.DescAsString(CTool)]);
// build recursively
@ -535,6 +539,7 @@ var
SimpleType: String;
H2PNode: TH2PNode;
SubTypeName: String;
CurCName: String;
begin
if (CNode.FirstChild<>nil) and (CNode.FirstChild.Desc=ccnUnion)
then begin
@ -542,7 +547,8 @@ begin
if (ParentNode<>nil) and (ParentNode.PascalDesc=ctnRecordType)
then begin
// create a pascal 'record case'
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordCase,'',
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordCase,'',
ParentNode,false);
DebugLn(['TH2PasTool.ConvertVariable added record case for nested union']);
// build recursively the record cases
@ -560,7 +566,8 @@ begin
BuildH2PTree(TypeH2PNode,CNode.FirstChild.FirstChild);
// create variable
CurName:=CTool.ExtractUnionName(CNode);
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,
TypeH2PNode.PascalName,
nil,ParentNode=nil);
DebugLn(['TH2PasTool.ConvertVariable added variable for union: ',H2PNode.DescAsString(CTool)]);
@ -573,13 +580,15 @@ begin
SimpleType:=GetSimplePascalTypeOfCVar(CNode);
if SimpleType='' then begin
// this variable has a complex type
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
if TypeH2PNode<>nil then
SimpleType:=TypeH2PNode.PascalName;
end;
if SimpleType<>'' then begin
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SimpleType,
ParentNode,ParentNode=nil);
DebugLn(['TH2PasTool.ConvertVariable CurName=',CurName,' ',H2PNode.PascalName]);
DebugLn(['TH2PasTool.ConvertVariable added: ',H2PNode.DescAsString(CTool)]);
end else begin
DebugLn(['TH2PasTool.ConvertVariable SKIPPING Variable Name="',CurName,'" Type="',CurType,'"']);
@ -594,17 +603,19 @@ var
TypeH2PNode: TH2PNode;
CurValue: String;
H2PNode: TH2PNode;
CurCName: String;
begin
CurName:=CTool.ExtractEnumBlockName(CNode);
if CurName='' then begin
// this is an anonymous enum block => auto generate a name
CurName:=CreatePascalNameFromCCode(CTool.Src,CNode.StartPos,CNode.EndPos);
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnEnumerationType,'',
nil,ParentNode=nil);
nil,true,false);
end else begin
// this enum block has a name
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumerationType,'',
nil,ParentNode=nil);
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnEnumerationType,'',
nil,true);
end;
DebugLn(['TH2PasTool.ConvertEnumBlock added: ',TypeH2PNode.DescAsString(CTool)]);
@ -613,8 +624,9 @@ begin
if CNode.Desc=ccnEnumID then begin
CurName:=CTool.ExtractEnumIDName(CNode);
CurValue:=CTool.ExtractEnumIDValue(CNode);
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumIdentifier,CurValue,
TypeH2PNode,ParentNode=nil);
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnEnumIdentifier,CurValue,
TypeH2PNode,true);
DebugLn(['TH2PasTool.ConvertEnumBlock added: ',H2PNode.DescAsString(CTool)]);
end;
CNode:=CNode.NextBrother;
@ -634,6 +646,7 @@ var
H2PNode: TH2PNode;
SubTypeName: String;
ParamsNode: TCodeTreeNode;
CurCName: String;
begin
CurName:=CTool.ExtractFunctionName(CNode);
CurType:=CTool.ExtractFunctionResultType(CNode);
@ -650,7 +663,7 @@ begin
end;
if Ok and (SimpleType='') then begin
// this function has a complex result type
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
if TypeH2PNode<>nil then begin
SimpleType:=TypeH2PNode.PascalName;
end else
@ -662,11 +675,12 @@ begin
// create proc type
ParamsNode:=CTool.GetFunctionParamListNode(CNode);
SubTypeName:=CreatePascalNameFromCCode(CurName+CTool.ExtractFunctionParamList(CNode));
TypeH2PNode:=CreateH2PNode(SubTypeName,'',ParamsNode,ctnProcedureType,SimpleType,
nil,true);
TypeH2PNode:=CreateAutoGeneratedH2PNode(SubTypeName,ParamsNode,
ctnProcedureType,SimpleType,nil,true,false);
DebugLn(['TH2PasTool.ConvertFunction function type added: ',TypeH2PNode.DescAsString(CTool)]);
// create variable
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SubTypeName,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SubTypeName,
ParentNode,ParentNode=nil);
DebugLn(['TH2PasTool.ConvertFunction variable added: ',H2PNode.DescAsString(CTool)]);
// build parameters recursively
@ -674,11 +688,13 @@ begin
BuildH2PTree(TypeH2PNode,ParamsNode.FirstChild);
end else begin
// create proc
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnProcedure,SimpleType,
nil,false);
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnProcedure,SimpleType,
nil,true);
DebugLn(['TH2PasTool.ConvertFunction function added: ',H2PNode.DescAsString(CTool)]);
// build parameters recursively
BuildH2PTree(H2PNode);
if CNode.FirstChild<>nil then
BuildH2PTree(H2PNode);
end;
end else begin
DebugLn(['TH2PasTool.ConvertFunction SKIPPING Function Name="',CurName,'" Type="',CurType,'" at ',CTool.CleanPosToStr(CNode.StartPos)]);
@ -693,6 +709,7 @@ var
SimpleType: String;
TypeH2PNode: TH2PNode;
H2PNode: TH2PNode;
CurCName: String;
begin
CurName:=CTool.ExtractParameterName(CNode);
CurType:=CTool.ExtractParameterType(CNode);
@ -700,12 +717,13 @@ begin
DebugLn(['TH2PasTool.ConvertFuncParameter Parameter: Name="',CurName,'" Type="',CurType,'" SimpleType="',SimpleType,'"']);
if SimpleType='' then begin
// this variable has a complex type
TypeH2PNode:=GetH2PNodeForComplexType(CNode);
TypeH2PNode:=GetH2PNodeForComplexType(CNode,true,false);
if TypeH2PNode<>nil then
SimpleType:=TypeH2PNode.PascalName;
end;
if SimpleType<>'' then begin
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnVarDefinition,SimpleType,
ParentNode,false);
DebugLn(['TH2PasTool.ConvertFuncParameter added: ',H2PNode.DescAsString(CTool)]);
end else begin
@ -723,6 +741,7 @@ var
IsPointerToFunction: Boolean;
SimpleType: String;
H2PNode: TH2PNode;
CurCName: String;
begin
if CNode.FirstChild=nil then begin
exit;
@ -739,12 +758,13 @@ begin
SimpleType:=GetSimplePascalTypeOfCVar(ChildNode);
if SimpleType='' then begin
// this variable has a complex type
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode);
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode,true,false);
if TypeH2PNode<>nil then
SimpleType:=TypeH2PNode.PascalName;
end;
if SimpleType<>'' then begin
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnTypeDefinition,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnTypeDefinition,
SimpleType,nil,true);
DebugLn(['TH2PasTool.ConvertTypedef added: ',H2PNode.DescAsString(CTool)]);
end else begin
@ -759,11 +779,13 @@ begin
and (ChildNode.Desc=ccnStructAlias) then begin
// this is a struct alias
CurType:=GetIdentifier(@CTool.Src[ChildNode.StartPos]);
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,
ctnTypeDefinition,CurType);
end else begin
// this is a new struct
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'');
CurCName:=CurName;
TypeH2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnRecordType,'');
DebugLn(['TH2PasTool.ConvertTypedef added record: ',TypeH2PNode.DescAsString(CTool)]);
// build recursively
if ChildNode<>nil then
@ -779,12 +801,13 @@ begin
SimpleType:=GetSimplePascalResultTypeOfCFunction(ChildNode);
if IsPointerToFunction and (SimpleType='') then begin
// this function has a complex result type
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode);
TypeH2PNode:=GetH2PNodeForComplexType(ChildNode,true,false);
if TypeH2PNode<>nil then
SimpleType:=TypeH2PNode.PascalName;
end;
if IsPointerToFunction and (SimpleType<>'') then begin
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnProcedureType,SimpleType,
CurCName:=CurName;
H2PNode:=CreateH2PNode(CurName,CurCName,CNode,ctnProcedureType,SimpleType,
nil,true);
DebugLn(['TH2PasTool.ConvertTypedef function type added: ',H2PNode.DescAsString(CTool)]);
// build the param list
@ -2231,13 +2254,14 @@ function TH2PasTool.CreateAutoGeneratedH2PNode(var PascalName: string;
CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc;
const PascalCode: string;
ParentNode: TH2PNode;
IsGlobal: boolean): TH2PNode;
IsGlobal: boolean; InsertAsPreLast: boolean): TH2PNode;
function Check(TestName: string; out Node: TH2PNode): boolean;
begin
Node:=FindH2PNodeWithPascalName(TestName);
if (Node=nil) then begin
Node:=CreateH2PNode(TestName,'',CNode,PascalDesc,PascalCode,nil,true,true);
Node:=CreateH2PNode(TestName,'',CNode,PascalDesc,PascalCode,nil,
true,InsertAsPreLast);
Result:=true;
end else if ((Node.CNode=CNode) and (Node.PascalDesc=PascalDesc)
and (Node.PascalCode=PascalCode)
@ -2261,7 +2285,7 @@ begin
end;
function TH2PasTool.GetH2PNodeForComplexType(CNode: TCodeTreeNode;
CreateIfNotExists: boolean): TH2PNode;
CreateIfNotExists: boolean; InsertAsPreLast: boolean): TH2PNode;
var
CCode: String;
PascalName: String;
@ -2339,7 +2363,8 @@ begin
// a new pointer type is needed
NewBasePascalType:='P'+BasePascalType;
SubH2PNode:=CreateAutoGeneratedH2PNode(NewBasePascalType,nil,
ctnTypeDefinition,'^'+BasePascalType);
ctnTypeDefinition,'^'+BasePascalType,
nil,true,InsertAsPreLast);
DebugLn(['TH2PasTool.GetH2PNodeForComplexType added new pointer type: ',SubH2PNode.DescAsString(CTool)]);
NewBasePascalType:=SubH2PNode.PascalName;
end;
@ -2402,7 +2427,8 @@ begin
if NeedH2PNode then begin
PascalName:='T'+PascalName;
PascalName:=copy(PascalName,1,DefaultMaxPascalIdentLen);
SubH2PNode:=CreateAutoGeneratedH2PNode(PascalName,nil,ctnTypeDefinition,PascalCode);
SubH2PNode:=CreateAutoGeneratedH2PNode(PascalName,nil,ctnTypeDefinition,
PascalCode,nil,true,InsertAsPreLast);
end;
// check if the whole declaration was translated
@ -2743,6 +2769,7 @@ end;
procedure TH2PTree.Unbind(Node: TH2PBaseNode);
begin
if Node=Root then Root:=Root.NextBrother;
if Node=LastRoot then LastRoot:=LastRoot.PriorBrother;
with Node do begin
if (Parent<>nil) then begin
if (Parent.FirstChild=Node) then
@ -2856,6 +2883,7 @@ begin
ANode.PriorBrother.NextBrother:=ANode.FirstChild;
end;
ANode.PriorBrother:=ANode.LastChild;
if Root=ANode then Root:=ANode.FirstChild;
ChildNode:=ANode.FirstChild;
while ChildNode<>nil do begin
ChildNode.Parent:=ANode.Parent;