You've already forked lazarus-ccr
+ added external functions and variables pascal code generation.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@722 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -230,6 +230,7 @@ type
|
|||||||
public
|
public
|
||||||
_Type : TEntity;
|
_Type : TEntity;
|
||||||
_Name : AnsiString;
|
_Name : AnsiString;
|
||||||
|
_isConst : Boolean;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFunctionParam }
|
{ TFunctionParam }
|
||||||
@@ -240,6 +241,7 @@ type
|
|||||||
_Type : TEntity;
|
_Type : TEntity;
|
||||||
_Name : AnsiString;
|
_Name : AnsiString;
|
||||||
_IsAny : Boolean;
|
_IsAny : Boolean;
|
||||||
|
_IsArray : Boolean;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TFunctionParamsList }
|
{ TFunctionParamsList }
|
||||||
@@ -542,6 +544,23 @@ implementation
|
|||||||
var
|
var
|
||||||
CustomList : TList = nil;
|
CustomList : TList = nil;
|
||||||
|
|
||||||
|
function IsCReserved(const Token: AnsiString): Boolean;
|
||||||
|
begin
|
||||||
|
if Token = '' then begin
|
||||||
|
Result := false;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := true;
|
||||||
|
case Token[1] of
|
||||||
|
'c': begin
|
||||||
|
if Token = 'const' then Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := false;
|
||||||
|
end;
|
||||||
|
|
||||||
function ParseSeq(Parser: TTextParser; const OpenSeq, CloseSeq: AnsiString): AnsiString;
|
function ParseSeq(Parser: TTextParser; const OpenSeq, CloseSeq: AnsiString): AnsiString;
|
||||||
var
|
var
|
||||||
i : integer;
|
i : integer;
|
||||||
@@ -1449,7 +1468,11 @@ var
|
|||||||
isext : Boolean;
|
isext : Boolean;
|
||||||
|
|
||||||
idx : Integer;
|
idx : Integer;
|
||||||
|
|
||||||
|
Modifiers : TStringList;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
Modifiers := TStringList.Create;
|
||||||
Result := false;
|
Result := false;
|
||||||
idx := AParser.TokenPos;
|
idx := AParser.TokenPos;
|
||||||
try
|
try
|
||||||
@@ -1468,7 +1491,13 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
// expecting name of Variable or Function name
|
// expecting name of Variable or Function name
|
||||||
|
repeat
|
||||||
AParser.FindNextToken(_name, tt);
|
AParser.FindNextToken(_name, tt);
|
||||||
|
if isCReserved (_name) then begin
|
||||||
|
Modifiers.Add(_name);
|
||||||
|
_name := '';
|
||||||
|
end;
|
||||||
|
until _name <> '';
|
||||||
if tt <> tt_Ident then begin
|
if tt <> tt_Ident then begin
|
||||||
|
|
||||||
Result := false;
|
Result := false;
|
||||||
@@ -1498,6 +1527,7 @@ begin
|
|||||||
finally
|
finally
|
||||||
if not Result then
|
if not Result then
|
||||||
AParser.Index := idx;
|
AParser.Index := idx;
|
||||||
|
Modifiers.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -2414,6 +2444,19 @@ begin
|
|||||||
AParser.Index := AParser.TokenPos
|
AParser.Index := AParser.TokenPos
|
||||||
else
|
else
|
||||||
_Name := s;
|
_Name := s;
|
||||||
|
|
||||||
|
AParser.FindNextToken(s, tt);
|
||||||
|
if (tt = tt_Symbol) and (s = '[') then begin
|
||||||
|
_IsArray := true;
|
||||||
|
AParser.FindNextToken(s, tt);
|
||||||
|
if s <> ']' then begin
|
||||||
|
AParser.SetError( ErrExpectStr(']', s));
|
||||||
|
Result := false;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end else
|
||||||
|
AParser.Index := AParser.TokenPos;
|
||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@@ -829,6 +829,66 @@ begin
|
|||||||
else Result := prefix + postfix;
|
else Result := prefix + postfix;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure WriteOutVariableToHeader(v: TVariable; const SpacePrefix: String; Vars: TStringList);
|
||||||
|
var
|
||||||
|
tp : TTypeDef;
|
||||||
|
s : AnsiString;
|
||||||
|
begin
|
||||||
|
tp := TTypeDef(v._Type);
|
||||||
|
s := Format('%s : %s; // external name ''%s''; ', [v._Name, ObjCToDelphiType(tp._Name, tp._IsPointer), v._Name] );
|
||||||
|
Vars.Add(SpacePrefix + s);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function CParamsListToPascalStr(Params: TFunctionParamsList): AnsiString;
|
||||||
|
var
|
||||||
|
i : integer;
|
||||||
|
num : Integer;
|
||||||
|
prm : TFunctionParam;
|
||||||
|
vs : AnsiString;
|
||||||
|
begin
|
||||||
|
Result := '';
|
||||||
|
num := 1;
|
||||||
|
for i := 0 to Params.Items.Count - 1 do
|
||||||
|
if TObject(Params.Items[i]) is TFunctionParam then begin
|
||||||
|
prm := TFunctionParam(Params.Items[i]);
|
||||||
|
if prm._IsAny then Continue;
|
||||||
|
vs := ObjCToDelphiType( GetTypeNameFromEntity(prm._Type), IsTypeDefIsPointer(prm._Type));
|
||||||
|
if prm._Name = ''
|
||||||
|
then vs := '_param'+IntToStr(num) + ': ' + vs
|
||||||
|
else vs := prm._Name + ': ' + vs;
|
||||||
|
if Result <> '' then
|
||||||
|
Result := Result + '; ' + vs
|
||||||
|
else
|
||||||
|
Result := vs;
|
||||||
|
inc(num);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteOutFunctionToHeader(f: TFunctionDef; st: TStringList);
|
||||||
|
var
|
||||||
|
restype : AnsiString;
|
||||||
|
fntype : AnsiString;
|
||||||
|
isptr : Boolean;
|
||||||
|
s : AnsiString;
|
||||||
|
begin
|
||||||
|
if not Assigned(f._ResultType) then begin
|
||||||
|
isptr := false;
|
||||||
|
fntype := 'int';
|
||||||
|
end else if (f._ResultType is TTypeDef) then begin
|
||||||
|
isptr := TTypeDef(f._ResultType)._IsPointer;
|
||||||
|
fntype := TTypeDef(f._ResultType)._Name;
|
||||||
|
end else begin
|
||||||
|
isptr := false;
|
||||||
|
fntype := '{todo: not implemented... see .h file for type}';
|
||||||
|
end;
|
||||||
|
|
||||||
|
restype := ObjCToDelphiType(fntype, isptr);
|
||||||
|
s:= GetProcFuncHead(f._Name, '', CParamsListToPascalStr(f._ParamsList), restype) + ' cdecl';
|
||||||
|
st.Add( s);
|
||||||
|
s := Format(' external name ''_%s'';', [f._Name]);
|
||||||
|
st.Add(s);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure WriteOutEnumToHeader(enm: TEnumTypeDef; st: TStrings);
|
procedure WriteOutEnumToHeader(enm: TEnumTypeDef; st: TStrings);
|
||||||
var
|
var
|
||||||
i : Integer;
|
i : Integer;
|
||||||
@@ -904,31 +964,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function CParamsListToPascalStr(Params: TFunctionParamsList): AnsiString;
|
|
||||||
var
|
|
||||||
i : integer;
|
|
||||||
num : Integer;
|
|
||||||
prm : TFunctionParam;
|
|
||||||
vs : AnsiString;
|
|
||||||
begin
|
|
||||||
Result := '';
|
|
||||||
num := 1;
|
|
||||||
for i := 0 to Params.Items.Count - 1 do
|
|
||||||
if TObject(Params.Items[i]) is TFunctionParam then begin
|
|
||||||
prm := TFunctionParam(Params.Items[i]);
|
|
||||||
if prm._IsAny then Continue;
|
|
||||||
vs := ObjCToDelphiType( GetTypeNameFromEntity(prm._Type), IsTypeDefIsPointer(prm._Type));
|
|
||||||
if prm._Name = ''
|
|
||||||
then vs := '_param'+IntToStr(num) + ': ' + vs
|
|
||||||
else vs := prm._Name + ': ' + vs;
|
|
||||||
if Result <> '' then
|
|
||||||
Result := Result + '; ' + vs
|
|
||||||
else
|
|
||||||
Result := vs;
|
|
||||||
inc(num);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function CToDelphiFuncType(AFuncType: TFunctionTypeDef): AnsiString;
|
function CToDelphiFuncType(AFuncType: TFunctionTypeDef): AnsiString;
|
||||||
var
|
var
|
||||||
restype : AnsiString;
|
restype : AnsiString;
|
||||||
@@ -1109,6 +1144,8 @@ var
|
|||||||
subs : TStringList;
|
subs : TStringList;
|
||||||
// s : AnsiString;
|
// s : AnsiString;
|
||||||
consts : TStringList;
|
consts : TStringList;
|
||||||
|
vars : TStringList;
|
||||||
|
functs : TStringList;
|
||||||
const
|
const
|
||||||
SpacePrefix = ' ';
|
SpacePrefix = ' ';
|
||||||
begin
|
begin
|
||||||
@@ -1116,7 +1153,8 @@ begin
|
|||||||
BeginExcludeSection( GetIfDefFileName(hdr._FileName, 'H'), st);
|
BeginExcludeSection( GetIfDefFileName(hdr._FileName, 'H'), st);
|
||||||
subs := TStringList.Create;
|
subs := TStringList.Create;
|
||||||
consts := TStringList.Create;
|
consts := TStringList.Create;
|
||||||
|
vars := TStringList.Create;
|
||||||
|
functs := TStringList.Create;
|
||||||
try
|
try
|
||||||
for i := 0 to hdr.Items.Count - 1 do
|
for i := 0 to hdr.Items.Count - 1 do
|
||||||
if Assigned(hdr.Items[i]) then
|
if Assigned(hdr.Items[i]) then
|
||||||
@@ -1144,7 +1182,11 @@ begin
|
|||||||
subs.Add('//'+ TSkip(hdr.Items[i])._Skip)
|
subs.Add('//'+ TSkip(hdr.Items[i])._Skip)
|
||||||
else if (TObject(hdr.Items[i]) is TComment) then
|
else if (TObject(hdr.Items[i]) is TComment) then
|
||||||
//WriteOutIfComment(hdr.Items, i, SpacePrefix, subs);
|
//WriteOutIfComment(hdr.Items, i, SpacePrefix, subs);
|
||||||
WriteOutCommentStr( TComment(hdr.Items[i])._Comment, SpacePrefix, Subs);
|
WriteOutCommentStr( TComment(hdr.Items[i])._Comment, SpacePrefix, Subs)
|
||||||
|
else if (TObject(hdr.Items[i]) is TVariable) then
|
||||||
|
WriteOutVariableToHeader(TVariable(hdr.Items[i]), SpacePrefix, Vars)
|
||||||
|
else if (TObject(hdr.Items[i]) is TFunctionDef) then
|
||||||
|
WriteOutFunctionToHeader(TFunctionDef(hdr.Items[i]), Functs);
|
||||||
end; {of if}
|
end; {of if}
|
||||||
|
|
||||||
st.add('');
|
st.add('');
|
||||||
@@ -1154,12 +1196,27 @@ begin
|
|||||||
subs.Clear;
|
subs.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if vars.Count > 0 then begin
|
||||||
|
st.Add('');
|
||||||
|
st.Add('var');
|
||||||
|
st.AddStrings(vars);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
if functs.Count > 0 then begin
|
||||||
|
st.Add('');
|
||||||
|
st.AddStrings(functs);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
finally
|
finally
|
||||||
EndSection(st);
|
EndSection(st);
|
||||||
EndSection(st);
|
EndSection(st);
|
||||||
subs.Add('');
|
subs.Add('');
|
||||||
subs.Free;
|
subs.Free;
|
||||||
consts.Free;
|
consts.Free;
|
||||||
|
vars.Free;
|
||||||
|
functs.Free;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -2072,6 +2129,7 @@ begin
|
|||||||
TReplaceItem(fItems.Objects[i]).ReplaceStr := AValue;
|
TReplaceItem(fItems.Objects[i]).ReplaceStr := AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
ConvertSettings := TConvertSettings.Create;
|
ConvertSettings := TConvertSettings.Create;
|
||||||
InitConvertSettings;
|
InitConvertSettings;
|
||||||
|
@@ -43,4 +43,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@@ -21,6 +21,7 @@ uses
|
|||||||
SysUtils,
|
SysUtils,
|
||||||
ObjCParserUtils,
|
ObjCParserUtils,
|
||||||
ObjCParserTypes,
|
ObjCParserTypes,
|
||||||
|
ObjCTemplate,
|
||||||
gnuccFeatures;
|
gnuccFeatures;
|
||||||
|
|
||||||
type
|
type
|
||||||
@@ -505,7 +506,49 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;}
|
end;}
|
||||||
|
|
||||||
|
|
||||||
|
procedure TestTemplate;
|
||||||
|
var
|
||||||
|
fn : TFileStream;
|
||||||
|
tmp : AnsiString;
|
||||||
|
|
||||||
|
tp : TTemplateProc;
|
||||||
|
s : string;
|
||||||
|
pv : TPascalValues;
|
||||||
|
root: TTemplateList;
|
||||||
|
cl : TTemplateList;
|
||||||
begin
|
begin
|
||||||
|
root:=TTemplateList.Create(nil);
|
||||||
|
cl:=TTemplateList.Create(root);
|
||||||
|
cl.Name :='class';
|
||||||
|
cl.Params.Values['class_objcname'] := 'NSNotebook';
|
||||||
|
cl.Params.Values['class_objcsupername'] := 'NSObject';
|
||||||
|
|
||||||
|
root.SubLists.Add(cl);
|
||||||
|
|
||||||
|
fn := TFileStream.Create('templatesample.txt', fmOpenRead or fmShareDenyNone);
|
||||||
|
tp := TTemplateProc.Create;
|
||||||
|
pv := TPascalValues.Create;
|
||||||
|
try
|
||||||
|
SetLength(tmp, fn.Size);
|
||||||
|
fn.Read(tmp[1], fn.Size);
|
||||||
|
|
||||||
|
|
||||||
|
s := tp.Parse(tmp, root, pv);
|
||||||
|
writeln(s);
|
||||||
|
readln;
|
||||||
|
finally
|
||||||
|
pv.Free;
|
||||||
|
tp.Free;
|
||||||
|
fn.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
// TestTemplate;
|
||||||
|
// Exit;
|
||||||
|
|
||||||
|
|
||||||
doOutput := true;
|
doOutput := true;
|
||||||
try
|
try
|
||||||
GetConvertSettings(ConvertSettings, inpf);
|
GetConvertSettings(ConvertSettings, inpf);
|
||||||
|
Reference in New Issue
Block a user