You've already forked lazarus-ccr
*pascal method implementation is fixed. (objc_send, _fpret, _stret)...
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@435 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -166,9 +166,10 @@ type
|
||||
protected
|
||||
function DoParse(AParser: TTextParser): Boolean; override;
|
||||
public
|
||||
_Name : AnsiString;
|
||||
_Name : AnsiString;
|
||||
//todo: remove
|
||||
_isPointer : Boolean;
|
||||
_isPointer : Boolean;
|
||||
_isPointerRef : Boolean;
|
||||
end;
|
||||
|
||||
TUnionTypeDef = class(TStructTypeDef)
|
||||
@@ -190,9 +191,10 @@ type
|
||||
protected
|
||||
function DoParse(AParser: TTextParser): Boolean; override;
|
||||
public
|
||||
_Name : AnsiString;
|
||||
_Spec : TTypeDefSpecs;
|
||||
_IsPointer : Boolean;
|
||||
_Name : AnsiString;
|
||||
_Spec : TTypeDefSpecs;
|
||||
_IsPointer : Boolean;
|
||||
_IsPointerRef : Boolean;
|
||||
end;
|
||||
|
||||
{ TTypeNameDef }
|
||||
@@ -304,7 +306,7 @@ function ScanWhile(const s: AnsiString; var index: Integer; const ch: TCharSet):
|
||||
function ScanTo(const s: AnsiString; var index: Integer; const ch: TCharSet): AnsiString;
|
||||
|
||||
function ParseTypeDef(Owner: TEntity; AParser: TTextParser): TEntity;
|
||||
function ParseCVarDef(AParser: TTextParser; var Name: AnsiString; isArray: Boolean; var ArraySize:AnsiString): Boolean;
|
||||
function ParseCVarDef(AParser: TTextParser; var Name: AnsiString; var isArray: Boolean; var ArraySize:AnsiString): Boolean;
|
||||
|
||||
procedure FreeEntity(Item: TEntity);
|
||||
|
||||
@@ -316,7 +318,28 @@ function ErrExpectStr(const Expected, Found: AnsiString): AnsiString;
|
||||
|
||||
implementation
|
||||
|
||||
function ParseCVarDef(AParser: TTextParser; var Name: AnsiString; isArray: Boolean; var ArraySize:AnsiString): Boolean;
|
||||
// isPointer returned the * is declared
|
||||
// isPointerRef return the ** is declared
|
||||
procedure ParsePointerDef(AParser: TTextParser; var isPointer, isPointerRef: Boolean);
|
||||
var
|
||||
s : AnsiString;
|
||||
tt : TTokenType;
|
||||
begin
|
||||
isPointer := false;
|
||||
isPointerRef := false;
|
||||
if not AParser.FindNextToken(s, tt) then Exit;
|
||||
isPointer := (tt=tt_Symbol) and (s = '*');
|
||||
if isPointer then begin
|
||||
if not AParser.FindNextToken(s, tt) then Exit;
|
||||
|
||||
if (tt=tt_Symbol) and (s = '*') then isPointerRef := true
|
||||
else AParser.Index := AParser.TokenPos;
|
||||
end else
|
||||
AParser.Index := AParser.TokenPos;
|
||||
end;
|
||||
|
||||
|
||||
function ParseCVarDef(AParser: TTextParser; var Name: AnsiString; var isArray: Boolean; var ArraySize:AnsiString): Boolean;
|
||||
var
|
||||
tt : TTokenType;
|
||||
s : AnsiString;
|
||||
@@ -440,7 +463,7 @@ end;
|
||||
|
||||
procedure SetCSymbols(var ch: TCharSet);
|
||||
begin
|
||||
ch := ['(',')', '{','}', ':', '-','+','<','>','*',';', ',','|','&']
|
||||
ch := ['(',')', '{','}', ':', '-','+','<','>','*',';', ',','|','&','[',']']
|
||||
end;
|
||||
|
||||
procedure SetCComments(Table: TTokenTable);
|
||||
@@ -973,8 +996,6 @@ begin
|
||||
AParser.SetError(ErrExpectStr('method name Identifier', s));
|
||||
Exit;
|
||||
end;
|
||||
if _Name = 'defaultCStringEncoding' then
|
||||
_Name := 'defaultCStringEncoding';
|
||||
|
||||
while AParser.FindNextToken(s, tt) do begin
|
||||
if s = ';' then
|
||||
@@ -1048,30 +1069,20 @@ begin
|
||||
AParser.SetError(ErrExpectStr('"("', s));
|
||||
Exit;
|
||||
end;
|
||||
inherited DoParse(AParser);
|
||||
(* _prefix := '';
|
||||
_TypeName := '';
|
||||
repeat
|
||||
Result := inherited DoParse(AParser);
|
||||
|
||||
if Result then begin
|
||||
AParser.FindNextToken(s, tt);
|
||||
if isTypeDefReserved(s) then begin
|
||||
_prefix := _prefix + s;
|
||||
if s = 'unsigned' then _TypeName := _typeName + ' ' + s;
|
||||
s := '';
|
||||
if (tt=tt_Symbol) and (s='<') then begin // skip protocol
|
||||
while (s <> '>') and AParser.FindNextToken(s, tt) do ;
|
||||
AParser.FindNextToken(s, tt);
|
||||
end;
|
||||
until s <> '';
|
||||
_TypeName := _TypeName + s;
|
||||
|
||||
if tt <> tt_Ident then Exit; // an error
|
||||
|
||||
AParser.FindNextToken(s, tt);
|
||||
if (tt = tt_Symbol) and (s = '*') then begin
|
||||
_isRef := true;
|
||||
AParser.FindNextToken(s, tt);
|
||||
end;*)
|
||||
|
||||
AParser.FindNextToken(s, tt);
|
||||
if s <> ')' then ; // an error
|
||||
Result := true;
|
||||
Result := s = ')';
|
||||
if not Result then
|
||||
AParser.SetError( ErrExpectStr(')', s));
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
@@ -1358,9 +1369,8 @@ begin
|
||||
end;
|
||||
|
||||
if not ((tt = tt_Symbol) and (s = '{')) then begin
|
||||
if (tt = tt_Symbol) and (s = '*')
|
||||
then _isPointer := true
|
||||
else AParser.Index := i;
|
||||
AParser.Index := i;
|
||||
ParsePointerDef(AParser, _isPointer, _isPointerRef);
|
||||
Exit;
|
||||
end;
|
||||
|
||||
@@ -1418,7 +1428,7 @@ function TStructField.DoParse(AParser: TTextParser): Boolean;
|
||||
var
|
||||
tt : TTokenType;
|
||||
s : AnsiString;
|
||||
fld : TStructField;
|
||||
// fld : TStructField;
|
||||
begin
|
||||
Result := false;
|
||||
_Type := ParseTypeDef(Self, AParser);
|
||||
@@ -1511,20 +1521,22 @@ begin
|
||||
Exit;
|
||||
end;
|
||||
_Name := s;
|
||||
AParser.FindNextToken(s, tt);
|
||||
end else
|
||||
Result := true;
|
||||
//AParser.FindNextToken(s, tt);
|
||||
end else begin
|
||||
AParser.Index := AParser.TokenPos;
|
||||
Result := true;
|
||||
end;
|
||||
|
||||
end else begin
|
||||
_Name := s;
|
||||
AParser.FindNextToken(s, tt);
|
||||
//AParser.FindNextToken(s, tt);
|
||||
Result := true;
|
||||
end;
|
||||
|
||||
if Result then begin
|
||||
if (tt = tt_Symbol) and (s = '*')
|
||||
then _isPointer := true
|
||||
else AParser.Index := AParser.TokenPos;
|
||||
if (Result) {and (tt=tt_Symbol) and (s = '*') }then begin
|
||||
// AParser.Index := AParser.TokenPos;
|
||||
ParsePointerDef(AParser, _isPointer, _isPointerRef);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
@@ -49,6 +49,11 @@ type
|
||||
IgnoreTokens : TStringList;
|
||||
|
||||
ConvertPrefix : TStringList;
|
||||
|
||||
FloatTypes : TStringList;
|
||||
StructTypes : TStringList;
|
||||
ObjCTypes : TStringList;
|
||||
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
@@ -56,6 +61,9 @@ type
|
||||
var
|
||||
ConvertSettings : TConvertSettings;
|
||||
|
||||
type
|
||||
TObjcConvertVarType = (vt_Int, vt_FloatPoint, vt_Struct, vt_Object);
|
||||
|
||||
procedure WriteOutIncludeFile(hdr: TObjCHeader; st: TStrings);
|
||||
procedure WriteOutMainFramework(hdr: TObjCHeader; st: TStrings);
|
||||
|
||||
@@ -70,10 +78,44 @@ function GetMethodParams(const m: TClassMethodDef): AnsiString;
|
||||
function GetMethodResultType(const m: TClassMethodDef): AnsiString;
|
||||
function IsPascalReserved(const s: AnsiString): Boolean;
|
||||
|
||||
function IsPascalFloatType(const TypeName: AnsiString): Boolean;
|
||||
|
||||
function GetObjCVarType(const TypeName: AnsiString):TObjcConvertVarType; //): Boolean; = (vt_Int, vt_FloatPoint, vt_Struct, vt_Object);
|
||||
|
||||
implementation
|
||||
|
||||
procedure WriteOutRecordField(AField: TStructField; const Prefix: AnsiString; subs: TStrings); forward;
|
||||
|
||||
function GetObjCVarType(const TypeName: AnsiString):TObjcConvertVarType;
|
||||
begin
|
||||
Result := vt_Int;
|
||||
if IsPascalFloatType(TypeName) then begin
|
||||
Result := vt_FloatPoint;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if ConvertSettings.FloatTypes.IndexOf(TypeName) >= 0 then
|
||||
Result := vt_FloatPoint
|
||||
else if ConvertSettings.StructTypes.IndexOf(TypeName) >= 0 then
|
||||
Result := vt_Struct
|
||||
else if ConvertSettings.ObjCTypes.IndexOf(TypeName) >= 0 then
|
||||
Result := vt_Object;
|
||||
end;
|
||||
|
||||
function IsPascalFloatType(const TypeName: AnsiString): Boolean;
|
||||
var
|
||||
nm : AnsiString;
|
||||
begin
|
||||
Result := false;
|
||||
if TypeName = '' then Exit;
|
||||
case TypeName[1] of
|
||||
'd','D','f','F': begin
|
||||
nm := AnsiLowerCase(typeName);
|
||||
Result := (nm = 'double') or (TypeName = 'float');
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function IsPascalReserved(const s: AnsiString): Boolean;
|
||||
var
|
||||
ls : AnsiString;
|
||||
@@ -224,8 +266,8 @@ begin
|
||||
if isPointer then
|
||||
if ((objctype = 'char') or (objctype = 'const char')) then
|
||||
Result := 'PChar'
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function IsMethodConstructor(cl: TClassDef; m: TClassMethodDef): Boolean;
|
||||
var
|
||||
@@ -325,10 +367,6 @@ begin
|
||||
|
||||
pth := vs;
|
||||
|
||||
{$ifdef MSWINDOWS}
|
||||
|
||||
{$endif}
|
||||
|
||||
while (pth <> '') and (length(pth)>1) do begin
|
||||
if ConvertSettings.IgnoreIncludes.IndexOf(pth) >= 0 then
|
||||
Exit; // file must be excluded;
|
||||
@@ -411,11 +449,11 @@ begin
|
||||
|
||||
end else if (dir = '#if') then begin
|
||||
prm := PrecompileIfDefToPascal(Prec._Params, isdef);
|
||||
Result := Format('{$%s %s}', [isdefConst[isdef], prm]);
|
||||
Result := Format('{.$%s %s}', [isdefConst[isdef], prm]);
|
||||
end else if (dir = '#else') then
|
||||
Result := '{$else}'
|
||||
Result := '{.$else}'
|
||||
else if (dir = '#endif') then
|
||||
Result := '{$endif}';
|
||||
Result := '{.$endif}';
|
||||
end;
|
||||
|
||||
procedure WriteOutCommentStr(const AComment, Prefix: AnsiString; Subs: TStrings);
|
||||
@@ -515,8 +553,8 @@ var
|
||||
isend : Boolean;
|
||||
begin
|
||||
ppas := WriteOutPrecompToPascal(prec);
|
||||
isend := IsSubStr('{$endif', ppas, 1);
|
||||
if isend or IsSubStr('{$ifndef', ppas, 1) or IsSubStr('{$ifdef', ppas, 1) or IsSubStr('{$else', ppas, 1) then
|
||||
isend := IsSubStr('{.$endif', ppas, 1);
|
||||
if isend or IsSubStr('{.$ifndef', ppas, 1) or IsSubStr('{.$ifdef', ppas, 1) or IsSubStr('{.$else', ppas, 1) then
|
||||
subs.Add(Prefix + ppas);
|
||||
if isend then ClearEmptyPrecompile(subs);
|
||||
end;
|
||||
@@ -806,13 +844,18 @@ end;
|
||||
procedure WriteOutRecordField(AField: TStructField; const Prefix: AnsiString; subs: TStrings);
|
||||
var
|
||||
pastype : AnsiString;
|
||||
nm : AnsiString;
|
||||
begin
|
||||
//todo:!
|
||||
if Assigned(AField._Type) and (AField._Type is TUnionTypeDef) then begin
|
||||
WriteOutUnion(TUnionTypeDef(AField._Type), Prefix, subs);
|
||||
end else begin
|
||||
pastype := ObjCToDelphiType( AField._TypeName, IsTypePointer(AField._Type, false));
|
||||
subs.Add(Prefix + Format('%s : %s; ', [FixIfReserved(AField._Name), pastype]));
|
||||
nm := FixIfReserved(AField._Name);
|
||||
if (AField._IsArray) and (AField._ArraySize <> '') then
|
||||
subs.Add(Prefix + Format('%s : array [0..%s-1] of %s;', [nm, AField._ArraySize, pastype]))
|
||||
else
|
||||
subs.Add(Prefix + Format('%s : %s; ', [nm, pastype]));
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -847,6 +890,12 @@ begin
|
||||
Result := Format('%s = %s;', [NewType, FromType])
|
||||
else
|
||||
Result := Format('%s = ^%s;', [NewType, FromType]);
|
||||
|
||||
case GetObjCVarType(FromType) of
|
||||
vt_FloatPoint: ConvertSettings.FloatTypes.Add(NewType);
|
||||
vt_Object: ConvertSettings.ObjCTypes.Add(NewType);
|
||||
vt_Struct: ConvertSettings.StructTypes.Add(NewType);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure WriteOutTypeDefToHeader(typedef: TTypeNameDef; const Prefix: AnsiString; subs: TStrings);
|
||||
@@ -869,9 +918,11 @@ begin
|
||||
if TStructTypeDef(typedef._Type)._Name <> '' then begin
|
||||
WriteOutTypeDefRecord(typedef._Type as TStructTypeDef, ' ', 'packed ', subs);
|
||||
subs.Add(Prefix + WriteOutTypeDefName(typedef._TypeName, TStructTypeDef(typedef._Type)._Name, IsTypePointer(typedef._Type, false)));
|
||||
ConvertSettings.StructTypes.Add(TStructTypeDef(typedef._Type)._Name);
|
||||
end else begin
|
||||
TStructTypeDef(typedef._Type)._Name := typedef._TypeName;
|
||||
WriteOutTypeDefRecord(typedef._Type as TStructTypeDef, ' ', 'packed ', subs);
|
||||
ConvertSettings.StructTypes.Add(typedef._TypeName);
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -1012,7 +1063,7 @@ begin
|
||||
try
|
||||
for i := 0 to hdr.Items.Count - 1 do
|
||||
if Assigned(hdr.Items[i]) and (TObject(hdr.Items[i]) is TPrecompiler) then
|
||||
WriteOutPrecompInclude(TPrecompiler(hdr.Items[i]), st);
|
||||
WriteOutPrecompInclude(TPrecompiler(hdr.Items[i]), subs);
|
||||
|
||||
for i := 0 to hdr.Items.Count - 1 do
|
||||
if Assigned(hdr.Items[i]) then begin
|
||||
@@ -1060,6 +1111,7 @@ var
|
||||
// i : integer;
|
||||
s : AnsiString;
|
||||
ms : AnsiString;
|
||||
restype : AnsiString;
|
||||
begin
|
||||
typeName := MtdPrefix + mtd._Name + MtdPostFix;
|
||||
subs.Add('type');
|
||||
@@ -1067,7 +1119,10 @@ begin
|
||||
ms := GetMethodParams(mtd);
|
||||
if ms = '' then ms := 'param1: objc.id; param2: SEL'
|
||||
else ms := 'param1: objc.id; param2: SEL' + ';' + ms;
|
||||
s := Format(' %s = %s cdecl;',[typeName, GetProcFuncHead('', '', ms, GetMethodResultType(mtd), '' )]);
|
||||
restype := GetMethodResultType(mtd);
|
||||
if IsMethodConstructor(mtd.Owner as TClassDef, mtd) then restype := 'objc.id';
|
||||
|
||||
s := Format(' %s = %s cdecl;',[typeName, GetProcFuncHead('', '', ms, restype, '' )]);
|
||||
subs.Add(s);
|
||||
end;
|
||||
|
||||
@@ -1100,13 +1155,24 @@ end;
|
||||
// adds procedure type and variable of objC init??? method, to wrap obj_SendMsg
|
||||
// initialize ObjC object structure calling init??? method
|
||||
|
||||
function RefixName(const mtdName: AnsiString): AnsiString;
|
||||
begin
|
||||
Result := mtdName;
|
||||
if mtdName = '' then Exit;
|
||||
if mtdName[length(mtdName)] = '_' then
|
||||
Result := Copy(mtdName, 1, length(mtdName) - 1);
|
||||
end;
|
||||
|
||||
procedure WriteOutConstructorMethod(mtd: TClassMethodDef; subs: TStrings);
|
||||
var
|
||||
typeName : AnsiString;
|
||||
cl : TClassDef;
|
||||
prms : AnsiString;
|
||||
begin
|
||||
cl := TClassDef(mtd.Owner);
|
||||
ObjCMethodToProcType(mtd, typeName, subs);
|
||||
prms := GetParamsNames(mtd);
|
||||
if prms <> '' then prms := ', ' + prms;
|
||||
subs.Add('var');
|
||||
subs.Add(
|
||||
Format(' vmethod: %s;', [typeName]));
|
||||
@@ -1116,7 +1182,7 @@ begin
|
||||
subs.Add(
|
||||
Format(' vmethod := %s(@objc_msgSend);', [typeName]));
|
||||
subs.Add(
|
||||
Format(' Handle := vmethod(allocbuf, sel_registerName(PChar(Str%s_%s)), %s);', [cl._ClassName, mtd._Name, GetParamsNames(mtd)]));
|
||||
Format(' Handle := vmethod(allocbuf, sel_registerName(PChar(Str%s_%s))%s);', [cl._ClassName, RefixName(mtd._Name), prms]));
|
||||
subs.Add('end;');
|
||||
end;
|
||||
|
||||
@@ -1132,7 +1198,7 @@ begin
|
||||
cl := TClassDef(mtd.Owner);
|
||||
if mtd._IsClassMethod then callobj := 'ClassID'
|
||||
else callobj := 'Handle';
|
||||
s := Format('vmethod(%s, sel_registerName(PChar(Str%s_%s)), %s)', [callobj, cl._ClassName, mtd._Name, GetParamsNames(mtd)]);
|
||||
s := Format('vmethod(%s, sel_registerName(PChar(Str%s_%s)), %s)', [callobj, cl._ClassName, RefixName(mtd._Name), GetParamsNames(mtd)]);
|
||||
|
||||
if ObjCToDelphiType(mtd.GetResultType._Name, mtd.GetResultType._IsPointer) <> '' then
|
||||
s := 'Result := ' + s;
|
||||
@@ -1155,21 +1221,49 @@ var
|
||||
res : AnsiString;
|
||||
cl : TClassDef;
|
||||
callobj : AnsiString;
|
||||
tp : TObjcConvertVarType;
|
||||
mnm : AnsiString;
|
||||
begin
|
||||
cl := TClassDef(mtd.owner);
|
||||
if mtd._IsClassMethod then callobj := 'ClassID'
|
||||
else callobj := 'Handle';
|
||||
|
||||
s := Format('objc_msgSend(%s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, mtd._Name ]);
|
||||
res := GetMethodResultType(mtd);
|
||||
if res <> '' then begin
|
||||
if res = 'objc.id' then s := 'Result := ' +s
|
||||
else s := 'Result := '+res+'('+s+')'
|
||||
end;
|
||||
|
||||
subs.Add('begin');
|
||||
subs.Add(Format(' %s;', [s]));
|
||||
subs.Add('end;');
|
||||
tp := GetObjCVarType(res);
|
||||
|
||||
if tp = vt_Object then begin
|
||||
subs.Add('var');
|
||||
subs.Add(' hnd: objc.id;');
|
||||
subs.Add('begin');
|
||||
subs.Add(' hnd := ' + Format('objc_msgSend(%s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, RefixName(mtd._Name) ]));
|
||||
subs.Add(' if Assigned(hnd) then begin ');
|
||||
subs.Add(' Result := ' + Format('%s.Create; ', [res]) );
|
||||
subs.Add(' Result.Handle := hnd;');
|
||||
subs.Add(' end else');
|
||||
subs.Add(' Result := nil;');
|
||||
subs.Add('end;');
|
||||
end else begin
|
||||
|
||||
mnm := RefixName(mtd._Name);
|
||||
case tp of
|
||||
vt_Int: s := Format('objc_msgSend(%s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, mnm ]);
|
||||
vt_FloatPoint: s := Format('objc_msgSend_fpret(%s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, mnm ]);
|
||||
vt_Struct: s := Format('objc_msgSend_stret(@Result, %s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, mnm ]);
|
||||
end;
|
||||
|
||||
if (tp <> vt_Struct) and (res <> '') then begin
|
||||
if res = 'objc.id' then s := 'Result := ' +s
|
||||
else s := 'Result := '+res+'('+s+')'
|
||||
end;
|
||||
s := s + ';';
|
||||
|
||||
subs.Add('begin');
|
||||
subs.Add(' ' + s);
|
||||
subs.Add('end;');
|
||||
end;
|
||||
|
||||
|
||||
end;
|
||||
|
||||
procedure WriteOutMethodToImplementation(mtd: TClassMethodDef; subs: TStrings);
|
||||
@@ -1295,7 +1389,32 @@ begin
|
||||
end;
|
||||
|
||||
procedure FixAppleClassDef(cl: TClassDef);
|
||||
var
|
||||
i : integer;
|
||||
j : integer;
|
||||
res : TClassMethodDef;
|
||||
mtd : TClassMethodDef;
|
||||
mtdnames : TStringList;
|
||||
begin
|
||||
//todo: use hash table
|
||||
mtdnames := TStringList.Create;
|
||||
try
|
||||
for i := 0 to cl.Items.Count - 1 do
|
||||
if TObject(cl.Items[i]) is TClassMethodDef then begin
|
||||
mtd := TClassMethodDef(cl.Items[i]);
|
||||
j := mtdnames.IndexOf(mtd._Name);
|
||||
if j < 0 then
|
||||
mtdnames.AddObject(mtd._Name, mtd)
|
||||
else begin
|
||||
res := TClassMethodDef(mtdnames.Objects[j]);
|
||||
if res._IsClassMethod then res._Name := res._Name + '_'
|
||||
else if mtd._IsClassMethod then mtd._Name := mtd._Name + '_';
|
||||
end;
|
||||
if IsPascalReserved(mtd._Name) then mtd._Name := mtd._Name + '_';
|
||||
end;
|
||||
finally
|
||||
mtdnames.Free;
|
||||
end;
|
||||
//nothing todo...
|
||||
end;
|
||||
|
||||
@@ -1338,8 +1457,6 @@ begin
|
||||
|
||||
for i := 0 to ent.Items.Count - 1 do begin
|
||||
AppleHeaderFix( TEntity(ent.Items[i]));
|
||||
if TEntity(ent.Items[i]) is TClassDef then
|
||||
FixAppleClassDef( TClassDef(ent.Items[i]));
|
||||
end;
|
||||
|
||||
end;
|
||||
@@ -1371,7 +1488,7 @@ end;
|
||||
|
||||
procedure WriteOutIncludeFile(hdr: TObjCHeader; st: TStrings);
|
||||
var
|
||||
// i : integer;
|
||||
i : integer;
|
||||
cmt : TComment;
|
||||
begin
|
||||
try
|
||||
@@ -1390,6 +1507,11 @@ begin
|
||||
|
||||
WriteOutHeaderSection(hdr, st);
|
||||
WriteOutForwardSection(hdr, st);
|
||||
|
||||
for i := 0 to hdr.Items.Count - 1 do
|
||||
if TObject(hdr.Items[i]) is TClassDef then
|
||||
FixAppleClassDef(TClassDef(hdr.Items[i]));
|
||||
|
||||
WriteOutClassesSection(hdr, st);
|
||||
WriteOutImplementationSection(hdr, st);
|
||||
except
|
||||
@@ -1413,10 +1535,23 @@ begin
|
||||
DefineReplace := TReplaceList.Create;
|
||||
TypeDefReplace := TReplaceList.Create; // replaces for default types
|
||||
ConvertPrefix := TStringList.Create;
|
||||
|
||||
FloatTypes := TStringList.Create;
|
||||
FloatTypes.CaseSensitive := false;
|
||||
|
||||
StructTypes := TStringList.Create;
|
||||
StructTypes.CaseSensitive := false;
|
||||
|
||||
ObjCTypes := TStringList.Create;
|
||||
ObjCTypes.CaseSensitive := false;
|
||||
end;
|
||||
|
||||
destructor TConvertSettings.Destroy;
|
||||
begin
|
||||
FloatTypes.Free;
|
||||
StructTypes.Free;
|
||||
ObjCTypes.Free;
|
||||
|
||||
IgnoreTokens.Free;
|
||||
IgnoreIncludes.Free;
|
||||
TypeDefReplace.Free;
|
||||
@@ -1443,41 +1578,49 @@ begin
|
||||
DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5'] := 'MAC_OS_X_VERSION_10_5';
|
||||
DefineReplace['__LP64__'] := 'LP64';
|
||||
|
||||
TypeDefReplace['uint32_t'] := 'LongWord';
|
||||
TypeDefReplace['uint8_t'] := 'byte';
|
||||
|
||||
TypeDefReplace['NSUInteger'] := 'LongWord';
|
||||
TypeDefReplace['NSInteger'] := 'Integer';
|
||||
|
||||
TypeDefReplace['unsigned char'] := 'byte';
|
||||
TypeDefReplace['uint8_t'] := 'byte';
|
||||
|
||||
TypeDefReplace['short'] := 'SmallInt';
|
||||
TypeDefReplace['short int'] := 'SmallInt';
|
||||
|
||||
TypeDefReplace['unsigned short'] := 'Word';
|
||||
TypeDefReplace['unsigned short int'] := 'Word';
|
||||
TypeDefReplace['uint16_t'] := 'Word';
|
||||
|
||||
TypeDefReplace['int'] := 'Integer';
|
||||
TypeDefReplace['signed int'] := 'Integer';
|
||||
TypeDefReplace['int32_t'] := 'Integer';
|
||||
TypeDefReplace['NSInteger'] := 'Integer';
|
||||
|
||||
TypeDefReplace['unsigned'] := 'LongWord';
|
||||
TypeDefReplace['unsigned int'] := 'LongWord';
|
||||
TypeDefReplace['uint32_t'] := 'LongWord';
|
||||
TypeDefReplace['NSUInteger'] := 'LongWord';
|
||||
|
||||
TypeDefReplace['long long'] := 'Int64';
|
||||
TypeDefReplace['singned long long'] := 'Int64';
|
||||
TypeDefReplace['unsigned long long'] := 'Int64';
|
||||
TypeDefReplace['int64_t'] := 'Int64';
|
||||
TypeDefReplace['uint64_t'] := 'Int64';
|
||||
|
||||
TypeDefReplace['float'] := 'Single';
|
||||
TypeDefReplace['CGFloat'] := 'Single';
|
||||
|
||||
TypeDefReplace['unit16_t'] := 'Word';
|
||||
TypeDefReplace['int32_t'] := 'Integer';
|
||||
TypeDefReplace['int64_t'] := 'Int64';
|
||||
TypeDefReplace['Class'] := '_Class';
|
||||
|
||||
TypeDefReplace['SRefCon'] := 'Pointer';
|
||||
TypeDefReplace['va_list'] := 'array of const';
|
||||
|
||||
StructTypes.Add('NSAffineTransformStruct');
|
||||
FloatTypes.Add('NSTimeInterval');
|
||||
|
||||
IgnoreTokens.Add('DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER');
|
||||
IgnoreTokens.Add('DEPRECATED_IN_MAC_OS_X_VERSION_10_4_AND_LATER');
|
||||
IgnoreTokens.Add('AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER');
|
||||
IgnoreTokens.Add('AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER');
|
||||
IgnoreTokens.Add('AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER');
|
||||
IgnoreTokens.Add('AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER');
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@@ -30,35 +30,35 @@
|
||||
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<Units Count="34">
|
||||
<Units Count="36">
|
||||
<Unit0>
|
||||
<Filename Value="objcparser.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="Project1"/>
|
||||
<CursorPos X="16" Y="18"/>
|
||||
<TopLine Value="3"/>
|
||||
<CursorPos X="1" Y="8"/>
|
||||
<TopLine Value="1"/>
|
||||
<EditorIndex Value="0"/>
|
||||
<UsageCount Value="72"/>
|
||||
<UsageCount Value="74"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<UnitName Value="ObjCParserUtils"/>
|
||||
<CursorPos X="92" Y="150"/>
|
||||
<TopLine Value="141"/>
|
||||
<EditorIndex Value="2"/>
|
||||
<UsageCount Value="33"/>
|
||||
<CursorPos X="1" Y="24"/>
|
||||
<TopLine Value="18"/>
|
||||
<EditorIndex Value="1"/>
|
||||
<UsageCount Value="34"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="ObjCParserTypes.pas"/>
|
||||
<UnitName Value="ObjCParserTypes"/>
|
||||
<CursorPos X="26" Y="6"/>
|
||||
<TopLine Value="1"/>
|
||||
<EditorIndex Value="1"/>
|
||||
<UsageCount Value="33"/>
|
||||
<CursorPos X="1" Y="187"/>
|
||||
<TopLine Value="177"/>
|
||||
<EditorIndex Value="2"/>
|
||||
<UsageCount Value="34"/>
|
||||
<Bookmarks Count="1">
|
||||
<Item0 X="1" Y="589" ID="0"/>
|
||||
<Item0 X="1" Y="612" ID="0"/>
|
||||
</Bookmarks>
|
||||
<Loaded Value="True"/>
|
||||
</Unit2>
|
||||
@@ -110,7 +110,7 @@
|
||||
<Filename Value="../foundation/NSObject.inc"/>
|
||||
<CursorPos X="37" Y="302"/>
|
||||
<TopLine Value="302"/>
|
||||
<UsageCount Value="13"/>
|
||||
<UsageCount Value="14"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit10>
|
||||
<Unit11>
|
||||
@@ -119,13 +119,13 @@
|
||||
<UnitName Value="pascodeutils"/>
|
||||
<CursorPos X="1" Y="13"/>
|
||||
<TopLine Value="1"/>
|
||||
<UsageCount Value="69"/>
|
||||
<UsageCount Value="71"/>
|
||||
</Unit11>
|
||||
<Unit12>
|
||||
<Filename Value="../appkit/NSWindow.inc"/>
|
||||
<CursorPos X="37" Y="302"/>
|
||||
<TopLine Value="302"/>
|
||||
<UsageCount Value="15"/>
|
||||
<UsageCount Value="16"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit12>
|
||||
<Unit13>
|
||||
@@ -190,7 +190,7 @@
|
||||
<IsPartOfProject Value="True"/>
|
||||
<CursorPos X="44" Y="16"/>
|
||||
<TopLine Value="11"/>
|
||||
<UsageCount Value="50"/>
|
||||
<UsageCount Value="52"/>
|
||||
<SyntaxHighlighter Value="C++"/>
|
||||
</Unit22>
|
||||
<Unit23>
|
||||
@@ -263,105 +263,21 @@
|
||||
<TopLine Value="1"/>
|
||||
<UsageCount Value="10"/>
|
||||
</Unit33>
|
||||
<Unit34>
|
||||
<Filename Value="NSAffineTransform.h"/>
|
||||
<CursorPos X="1" Y="1"/>
|
||||
<TopLine Value="1"/>
|
||||
<UsageCount Value="10"/>
|
||||
<SyntaxHighlighter Value="C++"/>
|
||||
</Unit34>
|
||||
<Unit35>
|
||||
<Filename Value="NSAffineTransform.inc"/>
|
||||
<CursorPos X="1" Y="1"/>
|
||||
<TopLine Value="1"/>
|
||||
<UsageCount Value="10"/>
|
||||
</Unit35>
|
||||
</Units>
|
||||
<JumpHistory Count="24" HistoryIndex="23">
|
||||
<Position1>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="135" Column="56" TopLine="131"/>
|
||||
</Position1>
|
||||
<Position2>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1530" Column="13" TopLine="1511"/>
|
||||
</Position2>
|
||||
<Position3>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1439" Column="1" TopLine="1427"/>
|
||||
</Position3>
|
||||
<Position4>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position4>
|
||||
<Position5>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1072" Column="18" TopLine="1060"/>
|
||||
</Position5>
|
||||
<Position6>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1117" Column="120" TopLine="1105"/>
|
||||
</Position6>
|
||||
<Position7>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1133" Column="119" TopLine="1121"/>
|
||||
</Position7>
|
||||
<Position8>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position8>
|
||||
<Position9>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1071" Column="22" TopLine="1071"/>
|
||||
</Position9>
|
||||
<Position10>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1072" Column="24" TopLine="1060"/>
|
||||
</Position10>
|
||||
<Position11>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1117" Column="112" TopLine="1105"/>
|
||||
</Position11>
|
||||
<Position12>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position12>
|
||||
<Position13>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1072" Column="24" TopLine="1060"/>
|
||||
</Position13>
|
||||
<Position14>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position14>
|
||||
<Position15>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1072" Column="19" TopLine="1060"/>
|
||||
</Position15>
|
||||
<Position16>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1117" Column="121" TopLine="1105"/>
|
||||
</Position16>
|
||||
<Position17>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1133" Column="114" TopLine="1121"/>
|
||||
</Position17>
|
||||
<Position18>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="149" Column="32" TopLine="133"/>
|
||||
</Position18>
|
||||
<Position19>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position19>
|
||||
<Position20>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="187" Column="26" TopLine="179"/>
|
||||
</Position20>
|
||||
<Position21>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="1" Column="1" TopLine="1"/>
|
||||
</Position21>
|
||||
<Position22>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="62" Column="26" TopLine="50"/>
|
||||
</Position22>
|
||||
<Position23>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="130" Column="34" TopLine="118"/>
|
||||
</Position23>
|
||||
<Position24>
|
||||
<Filename Value="ObjCParserUtils.pas"/>
|
||||
<Caret Line="153" Column="69" TopLine="137"/>
|
||||
</Position24>
|
||||
</JumpHistory>
|
||||
<JumpHistory Count="0" HistoryIndex="-1"/>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="5"/>
|
||||
|
@@ -13,11 +13,13 @@ program Project1;
|
||||
{$APPTYPE CONSOLE}
|
||||
{$endif}
|
||||
uses
|
||||
Classes,
|
||||
Classes, IniFiles,
|
||||
SysUtils,
|
||||
ObjCParserUtils,
|
||||
ObjCParserTypes;
|
||||
|
||||
// NSAffineTransform.inc
|
||||
|
||||
type
|
||||
// this object is used only for precomile directives handling
|
||||
|
||||
@@ -29,7 +31,7 @@ type
|
||||
procedure OnComment(Sender: TObject; const Comment: AnsiString);
|
||||
constructor Create(AHeader: TObjCHeader);
|
||||
end;
|
||||
|
||||
|
||||
procedure TPrecompileHandler.OnPrecompile(Sender: TObject);
|
||||
var
|
||||
parser : TTextParser;
|
||||
@@ -227,6 +229,30 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure ReadIniFile(Settings: TConvertSettings; const FileName: AnsiString);
|
||||
var
|
||||
ini : TIniFile;
|
||||
values : TStringList;
|
||||
a, b : AnsiString;
|
||||
i : Integer;
|
||||
begin
|
||||
ini := TIniFile.Create(FileName);
|
||||
values := TStringList.Create;
|
||||
try
|
||||
ini.ReadSection('TypeReplace', values);
|
||||
|
||||
for i := 0 to values.Count - 1 do begin
|
||||
a := values.ValueFromIndex[i];
|
||||
b := values.Values[a];
|
||||
Settings.TypeDefReplace[a] := b;
|
||||
end;
|
||||
finally
|
||||
values.Free;
|
||||
ini.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function GetConvertSettings(Settings : TConvertSettings; var FileName: AnsiString): Boolean;
|
||||
var
|
||||
i : integer;
|
||||
@@ -249,6 +275,10 @@ begin
|
||||
FileName := ParamStr(i);
|
||||
end;
|
||||
|
||||
vlm := Params.Values['settings'];
|
||||
if vlm <> '' then
|
||||
ReadIniFile(Settings, vlm);
|
||||
|
||||
vlm := Params.Values['mainunit'];
|
||||
if vlm <> '' then
|
||||
Settings.ConvertPrefix.Add ('{%mainunit '+vlm+'}');
|
||||
|
Reference in New Issue
Block a user