*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:
skalogryz
2008-04-22 08:07:37 +00:00
parent a2ed931905
commit 7574dbc5dc
4 changed files with 294 additions and 193 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"/>

View File

@@ -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+'}');