diff --git a/bindings/pascocoa/parser/ObjCParserTypes.pas b/bindings/pascocoa/parser/ObjCParserTypes.pas
index 2c410d986..d5c558d24 100755
--- a/bindings/pascocoa/parser/ObjCParserTypes.pas
+++ b/bindings/pascocoa/parser/ObjCParserTypes.pas
@@ -82,6 +82,7 @@ type
public
owner : TEntity;
Items : TList;
+ TagComment : AnsiString;
constructor Create(AOwner: TEntity);
destructor Destroy; override;
function Parse(AParser: TTextParser): Boolean; virtual;
@@ -238,11 +239,12 @@ type
{ TObjCParameterDef }
- TObjCResultTypeDef = class(TTypeDef)
+ TObjCResultTypeDef = class(TEntity)
{updating}
protected
function DoParse(AParser: TTextParser): Boolean; override;
public
+ _Type : TEntity;
_isRef : Boolean;
_isConst : Boolean; // (const Sometype)
_Prefix : AnsiString; // reserved-word type descriptors
@@ -253,7 +255,7 @@ type
protected
function DoParse(AParser: TTextParser): Boolean; override;
public
- _Res : TObjCResultTypeDef;
+ _Type : TObjCResultTypeDef;
_Name : AnsiString;
end;
@@ -1100,7 +1102,9 @@ begin
end else if (tt = tt_Ident) then begin
// if type is not defined, that it's assumed to be obj-c 'id'
res := TObjCResultTypeDef.Create(Self);
- res._Name := 'id';
+ res._Type := TTypeDef.Create(res);
+ TTypeDef(res._Type)._Name := 'id';
+
Items.Add(res);
AParser.Index := AParser.TokenPos;
end else
@@ -1141,10 +1145,10 @@ var
tt : TTokenType;
begin
Result := false;
- _Res := TObjCResultTypeDef.Create(Self);
- if not _Res.Parse(AParser) then Exit;
+ _Type := TObjCResultTypeDef.Create(Self);
+ if not _Type.Parse(AParser) then Exit;
- Items.Add(_Res);
+ Items.Add(_Type);
AParser.FindNextToken(_Name, tt);
if tt <> tt_Ident then begin
AParser.SetError(ErrExpectStr('Identifier', _Name));
@@ -1153,12 +1157,33 @@ begin
Result := true;
end;
+function isParamFuncPointer(AParser: TTextParser): Boolean;
+var
+ i : Integer;
+ s : AnsiString;
+ tt : TTokenType;
+begin
+ i := AParser.Index;
+ AParser.FindNextToken(s, tt);
+ Result := (tt = tt_Symbol) and (s = '(');
+ if not Result then Exit;
+
+ AParser.FindNextToken(s, tt);
+ Result := (tt = tt_Symbol) and (s = '*');
+ if not Result then Exit;
+
+ AParser.FindNextToken(s, tt);
+ Result := (tt = tt_Symbol) and (s = ')');
+ if not Result then Exit;
+end;
+
{ TResultTypeDef }
function TObjCResultTypeDef.DoParse(AParser: TTextParser): Boolean;
var
s : AnsiString;
tt : TTokenType;
+ fnt : TFunctionTypeDef;
begin
Result := false;
AParser.FindNextToken(s, tt);
@@ -1166,7 +1191,10 @@ begin
AParser.SetError(ErrExpectStr('"("', s));
Exit;
end;
- Result := inherited DoParse(AParser);
+
+ _Type := TTypeDef.Create(Self);
+ Result := _Type.Parse(AParser);
+ if not Result then Exit;
if Result then begin
AParser.FindNextToken(s, tt);
@@ -1175,8 +1203,23 @@ begin
AParser.FindNextToken(s, tt);
end;
-
+ if s = '(' then begin // ptr funciton (*)?
+ AParser.Index := AParser.TokenPos;
+ if not isParamFuncPointer(APArser) then begin
+ AParser.SetError(ErrExpectStr(')', s));
+ Result := false;
+ Exit;
+ end;
+ fnt := TFunctionTypeDef.Create(Self);
+ fnt._ResultType := _Type;
+ Result := fnt.Parse(AParser);
+ _Type := fnt;
+ if not Result then Exit;
+ AParser.FindNextToken(s, tt);
+ end;
Result := s = ')';
+
+
if not Result then
AParser.SetError( ErrExpectStr(')', s));
end;
@@ -1642,8 +1685,10 @@ begin
Exit;
end;
_Spec := _Spec + vl;
- if _Name = '' then _Name := s
- else _Name := _Name + ' ' + s;
+ if (s <> 'const') and (s <> 'volatile') then begin
+ if _Name = '' then _Name := s
+ else _Name := _Name + ' ' + s;
+ end;
AParser.FindNextToken(s, tt);
end; {of while}
diff --git a/bindings/pascocoa/parser/ObjCParserUtils.pas b/bindings/pascocoa/parser/ObjCParserUtils.pas
index ccfce2d2e..6d5aa1fe4 100755
--- a/bindings/pascocoa/parser/ObjCParserUtils.pas
+++ b/bindings/pascocoa/parser/ObjCParserUtils.pas
@@ -47,17 +47,21 @@ type
DefineReplace : TReplaceList;
TypeDefReplace : TReplaceList; // replaces for C types
PtrTypeReplace : TReplaceList; // replaces for C types pointers
-
+
IgnoreTokens : TStringList;
ConvertPrefix : TStringList;
-
+
FloatTypes : TStringList;
StructTypes : TStringList;
- ObjCTypes : TStringList;
-
+ ObjCClassTypes : TStringList;
+
+ CustomTypes : TStringList;
+
constructor Create;
destructor Destroy; override;
+
+ procedure AssignNewTypeName(const AName, TypeDefStr: AnsiString; var NewTypeName: AnsiString);
end;
var
@@ -70,13 +74,15 @@ procedure WriteOutIncludeFile(hdr: TObjCHeader; st: TStrings);
procedure WriteOutMainFramework(hdr: TObjCHeader; st: TStrings);
function ObjCToDelphiType(const objcType: AnsiString; isPointer: Boolean): AnsiString;
+function ObjCResultToDelphiType(Res: TObjCResultTypeDef) : AnsiString;
+function CToDelphiFuncType(AFuncType: TFunctionTypeDef): AnsiString;
function StrFromFile(const FileName: AnsiString): AnsiString;
function IsMethodConstructor(cl: TClassDef; m: TClassMethodDef): Boolean;
function GetMethodStr(cl: TClassDef; m: TClassMethodDef; ForImplementation: Boolean): AnsiString;
function GetProcFuncHead(const FuncName, OfClass, Params, ResType: AnsiString; const FuncDest: AnsiString = ''): AnsiString;
-function GetMethodParams(const m: TClassMethodDef): AnsiString;
+function GetMethodParams(const m: TClassMethodDef; NamesOnly: Boolean): AnsiString;
function GetMethodResultType(const m: TClassMethodDef): AnsiString;
function IsPascalReserved(const s: AnsiString): Boolean;
@@ -96,12 +102,12 @@ 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
+ else if ConvertSettings.ObjCClassTypes.IndexOf(TypeName) >= 0 then
Result := vt_Object;
end;
@@ -171,33 +177,66 @@ end;
function GetMethodResultType(const m: TClassMethodDef): AnsiString;
var
res : TObjCResultTypeDef;
+ tp : TTypeDef;
begin
res := m.GetResultType;
if not Assigned(res) then Result := ''
- else Result := ObjCToDelphiType(m.GetResultType._Name, m.GetResultType._IsPointer);
+ else begin
+
+ if m.GetResultType._Type is TTypeDef then begin
+ tp := TTypeDef(m.GetResultType._Type);
+ Result := ObjCToDelphiType(tp._Name, tp._IsPointer);
+ end else begin
+ ConvertSettings.AssignNewTypeName('', CToDelphiFuncType(TFunctionTypeDef(m.GetResultType._Type)), Result);
+ end;
+ end;
end;
-function GetMethodParams(const m: TClassMethodDef): AnsiString;
+function GetMethodParams(const m: TClassMethodDef; NamesOnly: Boolean): AnsiString;
var
i : Integer;
p : TObject;
vname : AnsiString;
vtype : AnsiString;
+
+ tp : TTypeDef;
+ prc : AnsiString;
+
begin
Result := '';
vname := '';
vtype := '';
for i := 0 to m.Items.Count - 1 do begin
p := TObject(m.Items[i]);
- if p is TParamDescr then
- vname := TParamDescr(p)._Descr
- else if p is TObjCParameterDef then begin
- if vname = '' then vname := TObjCParameterDef(p)._Name;
- vtype := ObjCToDelphiType(TObjCParameterDef(p)._Res._Name, TObjCParameterDef(p)._Res._IsPointer);
- if Result <> '' then Result := Result + '; ';
+
+ if p is TParamDescr then begin
+ if vname = '' then vname := TParamDescr(p)._Descr
+
+ end else if p is TObjCParameterDef then begin
+ vname := TObjCParameterDef(p)._Name;
+
+ if (TObjCParameterDef(p)._Type._Type) is TTypeDef then begin
+ tp := TTypeDef(TObjCParameterDef(p)._Type._Type);
+ vtype := ObjCToDelphiType(tp._Name, tp._IsPointer);
+ end else begin
+ prc := 'TProc' + TObjCParameterDef(p)._Name + IntToStr(ConvertSettings.CustomTypes.Count);
+ ConvertSettings.AssignNewTypeName(prc, CToDelphiFuncType(TFunctionTypeDef(TObjCParameterDef(p)._Type._Type)), vtype);
+ tp := TTypeDef.Create(TObjCParameterDef(p)._Type);
+ tp._Name := vtype;
+ TObjCParameterDef(p)._Type._Type.Free; // replace function type with typename
+ TObjCParameterDef(p)._Type._Type := tp;
+ end;
+ {if IsPascalReserved(vname) then }
+ vname := '_'+vname;
- if Copy(vtype, 1, 5) = 'array' then Result := Result + 'const A'+vname + ': ' + vtype
- else Result := Result + 'A'+vname + ': ' + vtype;
+ if not NamesOnly then begin
+ if Result <> '' then Result := Result + '; ';
+ if Copy(vtype, 1, 5) = 'array' then Result := Result + 'const '+vname + ': ' + vtype
+ else Result := Result + ''+vname + ': ' + vtype;
+ end else begin
+ if Result = '' then Result := vname
+ else Result := Result + ', ' + vname;
+ end;
vname := '';
end;
end;
@@ -282,6 +321,14 @@ begin
end;
end;
+function ObjCResultToDelphiType(Res: TObjCResultTypeDef) : AnsiString;
+begin
+ if Res._Type is TTypeDef then
+ Result := ObjCToDelphiType( TTypeDef(Res._Type)._Name, TTypeDef(Res._Type)._IsPointer)
+ else begin
+ end;
+end;
+
function IsMethodConstructor(cl: TClassDef; m: TClassMethodDef): Boolean;
var
res : TObjCResultTypeDef;
@@ -298,7 +345,10 @@ begin
if not Result then Exit;
res := m.GetResultType;
- l := res._Name;
+ if res._Type is TTypeDef then
+ l := TTypeDef(res._Type)._Name
+ else
+ l := '!!!todo function';
Result := (l = 'id') or (l = cl._ClassName);
end;
@@ -337,8 +387,8 @@ begin
nm := m._Name;
if ForImplementation
- then Result := GetProcFuncHead(nm, cl._ClassName, GetMethodParams(m), res, ft)
- else Result := GetProcFuncHead(nm, '', GetMethodParams(m), res, ft);
+ then Result := GetProcFuncHead(nm, cl._ClassName, GetMethodParams(m, false), res, ft)
+ else Result := GetProcFuncHead(nm, '', GetMethodParams(m, false), res, ft);
if ft = '' then
if m._IsClassMethod then
@@ -462,7 +512,7 @@ begin
if (dir = '#import') or (dir = '#include') then begin
prm := GetIncludeFile(Prec._Params);
- if (prm <> '') and (prm <> ' .inc') and (ConvertSettings.IgnoreIncludes.IndexOf(prm) < 0) then
+ if (prm <> '') and (prm <> ' .inc') then
Result := Format('{$include %s}', [prm]);
end else if (dir = '#if') then begin
@@ -899,8 +949,9 @@ begin
fntype := '{todo: not implemented... see .h file for type}';
end;
restype := ObjCToDelphiType(fntype, isptr);
- Result := GetProcFuncHead('', '', CParamsListToPascalStr(AFuncType._ParamsList), restype);
- Result := Copy(Result, 1, length(Result) - 1);
+ Result := GetProcFuncHead('', '', CParamsListToPascalStr(AFuncType._ParamsList), restype) + ' cdecl';
+ //Result := Copy(Result, 1, length(Result) - 1);
+ //Result := Result + '; cdecl';
end;
procedure WriteOutRecordField(AField: TStructField; const Prefix: AnsiString; subs: TStrings);
@@ -923,7 +974,7 @@ begin
nm := Prefix + Format('%s : %s', [AField._Name, nm]);
subs[i] := nm;
end;
- end else begin
+ end else begin
if (AField._Type is TFunctionTypeDef) then
pastype := CToDelphiFuncType(AField._Type as TFunctionTypeDef)
@@ -1019,7 +1070,7 @@ begin
case GetObjCVarType(FromType) of
vt_FloatPoint: ConvertSettings.FloatTypes.Add(NewType);
- vt_Object: ConvertSettings.ObjCTypes.Add(NewType);
+ vt_Object: ConvertSettings.ObjCClassTypes.Add(NewType);
vt_Struct: ConvertSettings.StructTypes.Add(NewType);
end;
end;
@@ -1118,6 +1169,7 @@ var
// cnt : Integer;
s : AnsiString;
nm : AnsiString;
+ cmt : AnsiString;
j : Integer;
obj : TObject; // or TEntity
@@ -1161,6 +1213,13 @@ begin
nm := TClassMethodDef(cl.Items[j])._Name;
i := mtds.IndexOf(nm);
if Integer(mtds.Objects[i]) > 0 then s := s + ' overload;';
+
+ if Assigned(TClassMethodDef(cl.Items[j]).GetResultType) then begin
+ cmt := TClassMethodDef(cl.Items[j]).GetResultType.TagComment;
+ if cmt <> '' then
+ s := s + '{'+cmt+'}';
+ end;
+
subs.Add(SpacePrefix + s);
end else if obj is TPrecompiler then begin
WriteOutIfDefPrecompiler(TPrecompiler(obj), SpacePrefix, subs);
@@ -1199,6 +1258,16 @@ begin
BeginSection('CLASSES', st);
BeginExcludeSection( GetIfDefFileName(hdr._FileName, 'C'), st);
try
+ if ConvertSettings.CustomTypes.Count > 0 then begin
+ with ConvertSettings do
+ for i := 0 to CustomTypes.Count - 1 do
+ CustomTypes[i] := ' ' + CustomTypes[i];
+
+ st.AddStrings(ConvertSettings.CustomTypes);
+ st.Add('');
+ ConvertSettings.CustomTypes.Clear;
+ end;
+
st.AddStrings(subs);
finally
EndSection(st);
@@ -1234,7 +1303,7 @@ var
begin
typeName := MtdPrefix + mtd._Name + MtdPostFix;
subs.Add('type');
- ms := GetMethodParams(mtd);
+ ms := GetMethodParams(mtd, false);
if ms = '' then ms := 'param1: objc.id; param2: SEL'
else ms := 'param1: objc.id; param2: SEL' + ';' + ms;
restype := GetMethodResultType(mtd);
@@ -1244,7 +1313,7 @@ begin
subs.Add(s);
end;
-function GetParamsNames(mtd: TClassMethodDef): AnsiString;
+(*function GetParamsNames(mtd: TClassMethodDef): AnsiString;
var
i : Integer;
obj : TObject;
@@ -1262,7 +1331,7 @@ begin
end;
end;
Result := Result + vname;
-end;
+end;*)
// procedure writes out constructor entity to the implementation section
@@ -1288,7 +1357,7 @@ var
begin
cl := TClassDef(mtd.Owner);
ObjCMethodToProcType(mtd, typeName, subs);
- prms := GetParamsNames(mtd);
+ prms := GetMethodParams(mtd, true);
if prms <> '' then prms := ', ' + prms;
if (Pos('init', mtd._Name) = 1) and (not mtd._IsClassMethod) then begin
@@ -1342,21 +1411,25 @@ begin
//s := Format('vmethod(%s, sel_registerName(PChar(Str%s_%s)), %s)', [callobj, cl._ClassName, RefixName(mtd._Name), GetParamsNames(mtd)]);
tp := GetObjCVarType(res);
case tp of
- vt_Int: s := Format('objc_msgSend(%s, sel_registerName(PChar(Str%s_%s)), [])', [callobj, cl._ClassName, mnm ]);
+ vt_Int, vt_Object: 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 (ObjCToDelphiType(mtd.GetResultType._Name, mtd.GetResultType._IsPointer) <> '') and (tp <> vt_Struct) then
- s := 'Result := ' + s;
+ if (tp <> vt_Struct) and (ObjCResultToDelphiType(mtd.GetResultType) <> '') then begin
+ if tp <> vt_FloatPoint then
+ s := Format('Result := %s(%s)', [res, s])
+ else
+ s := Format('Result := %s', [s]);
+ //s := 'Result := ' res(' + s+')';
+ end;
+
+
ObjCMethodToProcType(mtd, typeName, subs);
subs.Add('var');
subs.Add(
Format(' vmethod: %s;', [typeName]));
subs.Add('begin');
-
-
-
subs.Add(
Format(' vmethod := %s(@objc_msgSend);', [typeName]));
subs.Add(
@@ -1379,7 +1452,7 @@ begin
res := GetMethodResultType(mtd);
tp := GetObjCVarType(res);
- if tp = vt_Object then begin
+{ if tp = vt_Object then begin
subs.Add('var');
subs.Add(' hnd: objc.id;');
subs.Add('begin');
@@ -1390,27 +1463,30 @@ begin
subs.Add(' end else');
subs.Add(' Result := nil;');
subs.Add('end;');
- end else begin
+ 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_Int, vt_Object: 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+')'
+ if tp <> vt_FloatPoint then
+ s := Format('Result := %s(%s)', [res, s])
+ else
+ s := Format('Result := %s', [s]);
+ //s := 'Result := '+res+'('+s+')';
+ //if res = 'objc.id' then s := 'Result := ' +s
+ //else
end;
s := s + ';';
subs.Add('begin');
subs.Add(' ' + s);
subs.Add('end;');
- end;
-
-
+ // end;
end;
procedure WriteOutMethodToImplementation(mtd: TClassMethodDef; subs: TStrings);
@@ -1609,6 +1685,8 @@ var
i : Integer;
obj : TEntity;
prm : TObjCParameterDef;
+ res : TObjCResultTypeDef;
+ td : TTypeDef;
begin
// i := 0;
for i := 0 to ent.Items.Count - 1 do begin
@@ -1625,18 +1703,35 @@ begin
TClassDef(obj)._SuperClass := 'TObject'
end else if (obj is TParamDescr) then begin
if IsPascalReserved(TParamDescr(obj)._Descr) then
- TParamDescr(obj)._Descr := '_'+TParamDescr(obj)._Descr;
+ TParamDescr(obj)._Descr := '_'+TParamDescr(obj)._Descr
+ end else if (obj is TClassMethodDef) and not IsMethodConstructor(TClassDef(obj.Owner ), TClassMethodDef(obj)) then begin
+ res := TClassMethodDef(obj).GetResultType;
+ if ConvertSettings.ObjCClassTypes.IndexOf( ObjCResultToDelphiType(res))>= 0 then
+ if res._Type is TTypeDef then begin
+ td := TTypeDef(res._Type);
+ res.tagComment := td._Name;
+ td._Name := Format('objc.id', [td._Name] );
+ end;
end else if (obj is TObjCParameterDef) then begin
prm := TObjCParameterDef(obj);
- if ConvertSettings.ObjCTypes.IndexOf(prm._Res._Name) >= 0 then
- prm._Res._Name := Format('objc.id {%s}', [prm._Res._Name] );
+
+ if ConvertSettings.ObjCClassTypes.IndexOf( ObjCResultToDelphiType(prm._Type) ) >= 0 then begin
+ if prm._Type._Type is TTypeDef then begin
+ TTypeDef(prm._Type._Type)._Name := Format('objc.id {%s}', [TTypeDef(prm._Type._Type)._Name] );
+ end;
+ end;
+
if IsPascalReserved(prm._Name) then
prm._Name := '_' + prm._Name;
end else if (obj is TStructField) then begin
- if ConvertSettings.ObjCTypes.IndexOf(TStructField(obj)._TypeName) >= 0 then
- prm._Res._Name := 'objc.id';
+ // should _TypeName to be removed?
+ if ConvertSettings.ObjCClassTypes.IndexOf(TStructField(obj)._TypeName) >= 0 then begin
+ TStructField(obj)._TypeName := 'objc.id'
+ end;
end;
+
+
end;
// packing list, removing nil references.
@@ -1707,6 +1802,7 @@ begin
WriteOutHeaderSection(hdr, st);
WriteOutForwardSection(hdr, st);
+
for i := 0 to hdr.Items.Count - 1 do
if TObject(hdr.Items[i]) is TClassDef then
@@ -1729,6 +1825,18 @@ end;
{ TConvertSettings }
+procedure TConvertSettings.AssignNewTypeName(const AName, TypeDefStr: AnsiString; var NewTypeName: AnsiString);
+var
+ typeName : AnsiSTring;
+begin
+ typeName := AName;
+ if typeName = '' then typeName := 'CnvType' + IntToStr(CustomTypes.Count);
+
+ NewTypeName := typeName;
+ CustomTypes.Add( Format('%s = %s;', [NewTypeName, TypeDefStr]) );
+ // todo: add! a new type!
+end;
+
constructor TConvertSettings.Create;
begin
IgnoreTokens := TStringList.Create;
@@ -1745,16 +1853,17 @@ begin
StructTypes := TStringList.Create;
StructTypes.CaseSensitive := false;
- ObjCTypes := TStringList.Create;
+ ObjCClassTypes := TStringList.Create;
+ ObjCClassTypes.CaseSensitive := false;
- ObjCTypes.CaseSensitive := false;
+ CustomTypes := TStringList.Create;
end;
destructor TConvertSettings.Destroy;
begin
FloatTypes.Free;
StructTypes.Free;
- ObjCTypes.Free;
+ ObjCClassTypes.Free;
IgnoreTokens.Free;
IgnoreIncludes.Free;
@@ -1762,6 +1871,7 @@ begin
PtrTypeReplace.Free;
DefineReplace.Free;
ConvertPrefix.Free;
+ CustomTypes.Free;
inherited Destroy;
end;
@@ -1777,15 +1887,17 @@ begin
end;
with ConvertSettings do begin
- DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2'] := 'MAC_OS_X_VERSION_10_2';
+ {DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2'] := 'MAC_OS_X_VERSION_10_2';
DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3'] := 'MAC_OS_X_VERSION_10_3';
DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4'] := 'MAC_OS_X_VERSION_10_4';
DefineReplace['MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5'] := 'MAC_OS_X_VERSION_10_5';
- DefineReplace['__LP64__'] := 'LP64';
+ DefineReplace['__LP64__'] := 'LP64';}
TypeDefReplace['unsigned char'] := 'byte';
TypeDefReplace['uint8_t'] := 'byte';
PtrTypeReplace['uint8_t'] := 'PByte';
+ PtrTypeReplace['unsigned char'] := 'PChar';
+ PtrTypeReplace['char'] := 'PChar';
TypeDefReplace['short'] := 'SmallInt';
TypeDefReplace['short int'] := 'SmallInt';
@@ -1795,50 +1907,72 @@ begin
TypeDefReplace['uint16_t'] := 'Word';
TypeDefReplace['int'] := 'Integer';
+ TypeDefReplace['signed'] := 'Integer';
TypeDefReplace['signed int'] := 'Integer';
TypeDefReplace['int32_t'] := 'Integer';
TypeDefReplace['NSInteger'] := 'Integer';
TypeDefReplace['unsigned'] := 'LongWord';
- PtrTypeReplace['unsigned'] := 'PLongWord';
-
TypeDefReplace['unsigned int'] := 'LongWord';
TypeDefReplace['uint32_t'] := 'LongWord';
TypeDefReplace['NSUInteger'] := 'LongWord';
+ PtrTypeReplace['int'] := 'PInteger';
+ PtrTypeReplace['signed'] := 'PInteger';
+ PtrTypeReplace['signed int'] := 'PInteger';
+ PtrTypeReplace['int32_t'] := 'PInteger';
+ PtrTypeReplace['NSInteger'] := 'PInteger';
+
+ PtrTypeReplace['unsigned'] := 'PLongWord';
+ PtrTypeReplace['unsigned int'] := 'PLongWord';
+ PtrTypeReplace['uint32_t'] := 'PLongWord';
+ PtrTypeReplace['NSUInteger'] := 'PLongWord';
+
TypeDefReplace['long long'] := 'Int64';
- PtrTypeReplace['long long'] := 'PInt64';
-
- TypeDefReplace['signed long long'] := 'Int64';
- PtrTypeReplace['signed long long'] := 'PInt64';
-
+ TypeDefReplace['singned long long'] := 'Int64';
TypeDefReplace['unsigned long long'] := 'Int64';
- PtrTypeReplace['unsigned long long'] := 'PInt64';
-
TypeDefReplace['int64_t'] := 'Int64';
- PtrTypeReplace['int64_t'] := 'PInt64';
-
TypeDefReplace['uint64_t'] := 'Int64';
+
+ PtrTypeReplace['long long'] := 'PInt64';
+ PtrTypeReplace['singned long long'] := 'PInt64';
+ PtrTypeReplace['unsigned long long'] := 'PInt64';
+ PtrTypeReplace['int64_t'] := 'PInt64';
PtrTypeReplace['uint64_t'] := 'PInt64';
TypeDefReplace['float'] := 'Single';
TypeDefReplace['CGFloat'] := 'Single';
+ PtrTypeReplace['double'] := 'PDouble';
+ PtrTypeReplace['float'] := 'PSingle';
+ PtrTypeReplace['CGFloat'] := 'PSingle';
TypeDefReplace['Class'] := '_Class';
TypeDefReplace['SRefCon'] := 'Pointer';
TypeDefReplace['va_list'] := 'array of const';
- StructTypes.Add('Int64');
- StructTypes.Add('NSAffineTransformStruct');
- FloatTypes.Add('NSTimeInterval');
+ TypeDefReplace['uint8_t']:='byte';
+ TypeDefReplace['unsigned long long']:='Int64';
+ TypeDefReplace['long long']:='Int64';
+ TypeDefReplace['signed long long']:='Int64';
+ TypeDefReplace['unsigned']:='LongWord';
+ PtrTypeReplace['uint8_t']:='Pbyte';
+ PtrTypeReplace['unsigned long long']:='PInt64';
+ PtrTypeReplace['long long']:='Int64';
+ PtrTypeReplace['signed long long']:='PInt64';
+ PtrTypeReplace['unsigned']:='PLongWord';
- IgnoreTokens.Add('DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER');
+ StructTypes.Add('Int64');
+{ StructTypes.Add('NSAffineTransformStruct');
+ FloatTypes.Add('NSTimeInterval');
+ FloatTypes.Add('CFFloat');}
+
+ {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');
+ IgnoreTokens.Add('AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER');}
end;
end;
diff --git a/bindings/pascocoa/parser/default.ini b/bindings/pascocoa/parser/default.ini
new file mode 100755
index 000000000..bf3736042
--- /dev/null
+++ b/bindings/pascocoa/parser/default.ini
@@ -0,0 +1,250 @@
+[common]
+ignoreincludes0=CoreFoundation/ Foundation/
+ignoreincludes1=setjmp.h stdarg.h stdbool.h limits.h stdarg.h
+ignoreincludes2=AvailabilityMacros.h
+ignoreincludes3=ApplicationServices/
+ignoreincludes4=ApplicationServices/../FrameWorks/CoreGraphics.framework/Headers/
+ignoreincludes5=AvailabilityMacros.h
+
+[TypeReplace]
+NSStringRef=CFStringRef
+NSStringRef*=CFStringRef
+NSArray=CFArrayRef
+NSArray*=CFArrayRef
+NSAttributedString=CFAttributedStringRef
+NSAttributesString*=CFAttributedStringRef
+NSCalendar=CFCalendarRef
+NSCalendar*=CFCalendarRef
+NSCharacterSet=CFCharacterSetRef
+NSCharacterSet*=CFCharacterSetRef
+NSData=CFDataRef
+NSData*=CFDataRef
+NSDate=CFDateRef
+NSDate*=CFDateRef
+NSDictionary=CFDictionaryRef
+NSDictionary*=CFDictionaryRef
+NSError=CFErrorRef
+NSError*=CFErrorRef
+NSLocale=CFErrorRef
+NSLocale*=CFErrorRef
+NSMutableArray=CFMutableArrayRef
+NSMutableArray*=CFMutableArrayRef
+NSMutableAttributedString=CFMutableAttributedStringRef
+NSMutableAttributedString*=CFMutableAttributedStringRef
+NSMutableCharacterSetRef=CFMutableCharacterSetRef
+NSMutableCharacterSetRef*=CFMutableCharacterSetRef
+NSMutableData = CFMutableDataRef
+NSMutableDictionary = CFMutableDictionaryRef
+NSMutableSet = CFMutableSetRef
+NSMutableString = CFMutableStringRef
+NSNumber = CFNumberRef
+NSInputStream = CFReadStreamRef
+NSTimer = CFRunLoopTimerRef
+NSSet = CFSetRef
+NSString = CFStringRef
+NSTimeZone = CFTimeZoneRef
+NSURL = CFURLRef
+NSOutputStream = CFWriteStreamRef
+AEDesc*=AEDescPtr
+NSMutableData*= CFMutableDataRef
+NSMutableDictionary*= CFMutableDictionaryRef
+NSMutableSet*= CFMutableSetRef
+NSMutableString* = CFMutableStringRef
+NSNumber* = CFNumberRef
+NSInputStream*= CFReadStreamRef
+NSTimer*= CFRunLoopTimerRef
+NSSet*= CFSetRef
+NSString*= CFStringRef
+NSTimeZone*= CFTimeZoneRef
+NSURL*= CFURLRef
+NSOutputStream*= CFWriteStreamRef
+
+[TypeDefs]
+CGRect=struct
+CGSize=struct
+CGPoint=struct
+CFTimeInterval=float
+CGAffineTransform=struct
+
+NSPoint=struct
+NSSize=struct
+NSRange=struct
+NSTimeInterval=float
+NSAffineTransformStruct=struct
+
+NSAffineTransform=objcclass
+NSAppleEventDescriptor=objcclass
+NSAppleEventManager=objcclass
+NSAppleScript=objcclass
+NSArchiver=objcclass
+NSUnarchiver=objcclass
+NSObject=objcclass
+NSArray=objcclass
+NSMutableArray=objcclass
+NSAttributedString=objcclass
+NSMutableAttributedString=objcclass
+NSAutoreleasePool=objcclass
+NSBundle=objcclass
+NSCalendar=objcclass
+NSDateComponents=objcclass
+NSCalendarDate=objcclass
+NSDate=objcclass
+NSCharacterSet=objcclass
+NSMutableCharacterSet=objcclass
+NSClassDescription=objcclass
+NSCoder=objcclass
+NSComparisonPredicate=objcclass
+NSCompoundPredicate=objcclass
+NSConnection=objcclass
+NSDistantObjectRequest=objcclass
+NSData=objcclass
+NSMutableData=objcclass
+NSDateFormatter=objcclass
+NSDecimalNumber=objcclass
+NSDecimalNumberHandler=objcclass
+NSNumber=objcclass
+NSScanner=objcclass
+NSDictionary=objcclass
+NSMutableDictionary=objcclass
+NSDistantObject=objcclass
+NSDistributedLock=objcclass
+NSDistributedNotificationCenter=objcclass
+NSEnumerator=objcclass
+NSError=objcclass
+NSException=objcclass
+NSAssertionHandler=objcclass
+NSExpression=objcclass
+NSFileHandle=objcclass
+NSPipe=objcclass
+NSFileManager=objcclass
+NSDirectoryEnumerator=objcclass
+NSFormatter=objcclass
+NSGarbageCollector=objcclass
+NSValue=objcclass
+NSHashTable=objcclass
+NSHost=objcclass
+NSHTTPCookie=objcclass
+NSHTTPCookieStorage=objcclass
+NSIndexPath=objcclass
+NSIndexSet=objcclass
+NSMutableIndexSet=objcclass
+NSInvocation=objcclass
+NSKeyedArchiver=objcclass
+NSKeyedUnarchiver=objcclass
+NSSet=objcclass
+NSLocale=objcclass
+NSLock=objcclass
+NSConditionLock=objcclass
+NSRecursiveLock=objcclass
+NSCondition=objcclass
+NSMapTable=objcclass
+NSMetadataQuery=objcclass
+NSMetadataItem=objcclass
+NSMetadataQueryAttributeValueTuple=objcclass
+NSMetadataQueryResultGroup=objcclass
+NSMethodSignature=objcclass
+NSNetService=objcclass
+NSNetServiceBrowser=objcclass
+NSNotification=objcclass
+NSNotificationCenter=objcclass
+NSNotificationQueue=objcclass
+NSNull=objcclass
+NSNumberFormatter=objcclass
+NSOperation=objcclass
+NSInvocationOperation=objcclass
+NSOperationQueue=objcclass
+NSString=objcclass
+NSPointerArray=objcclass
+NSPointerFunctions=objcclass
+NSPort=objcclass
+NSMachPort=objcclass
+NSMessagePort=objcclass
+NSSocketPort=objcclass
+NSPortCoder=objcclass
+NSPortMessage=objcclass
+NSPortNameServer=objcclass
+NSMachBootstrapServer=objcclass
+NSMessagePortNameServer=objcclass
+NSSocketPortNameServer=objcclass
+NSPredicate=objcclass
+NSMutableSet=objcclass
+NSProcessInfo=objcclass
+NSPropertyListSerialization=objcclass
+NSProtocolChecker=objcclass
+NSProxy=objcclass
+NSRunLoop=objcclass
+NSScriptClassDescription=objcclass
+NSScriptCoercionHandler=objcclass
+NSScriptCommand=objcclass
+NSScriptCommandDescription=objcclass
+NSScriptExecutionContext=objcclass
+NSScriptObjectSpecifier=objcclass
+NSIndexSpecifier=objcclass
+NSMiddleSpecifier=objcclass
+NSNameSpecifier=objcclass
+NSPositionalSpecifier=objcclass
+NSPropertySpecifier=objcclass
+NSRandomSpecifier=objcclass
+NSRangeSpecifier=objcclass
+NSRelativeSpecifier=objcclass
+NSUniqueIDSpecifier=objcclass
+NSWhoseSpecifier=objcclass
+NSCloneCommand=objcclass
+NSCloseCommand=objcclass
+NSCountCommand=objcclass
+NSCreateCommand=objcclass
+NSDeleteCommand=objcclass
+NSExistsCommand=objcclass
+NSGetCommand=objcclass
+NSMoveCommand=objcclass
+NSQuitCommand=objcclass
+NSSetCommand=objcclass
+NSScriptSuiteRegistry=objcclass
+NSScriptWhoseTest=objcclass
+NSLogicalTest=objcclass
+NSSpecifierTest=objcclass
+NSCountedSet=objcclass
+NSSortDescriptor=objcclass
+NSSpellServer=objcclass
+NSStream=objcclass
+NSInputStream=objcclass
+NSOutputStream=objcclass
+NSMutableString=objcclass
+NSSimpleCString=objcclass
+NSConstantString=objcclass
+NSTask=objcclass
+NSThread=objcclass
+NSTimer=objcclass
+NSTimeZone=objcclass
+NSUndoManager=objcclass
+NSURL=objcclass
+NSURLAuthenticationChallenge=objcclass
+NSCachedURLResponse=objcclass
+NSURLCache=objcclass
+NSURLConnection=objcclass
+NSURLCredential=objcclass
+NSURLCredentialStorage=objcclass
+NSURLDownload=objcclass
+NSURLHandle=objcclass
+NSURLProtectionSpace=objcclass
+NSURLProtocol=objcclass
+NSURLRequest=objcclass
+NSMutableURLRequest=objcclass
+NSURLResponse=objcclass
+NSHTTPURLResponse=objcclass
+NSUserDefaults=objcclass
+NSValueTransformer=objcclass
+NSXMLDocument=objcclass
+NSXMLDTD=objcclass
+NSXMLDTDNode=objcclass
+NSXMLElement=objcclass
+NSXMLNode=objcclass
+NSXMLParser=objcclass
+
+[TokenReplace]
+DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER=""
+DEPRECATED_IN_MAC_OS_X_VERSION_10_4_AND_LATER=""
+AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER=""
+AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER=""
+AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER=""
+AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER=""
diff --git a/bindings/pascocoa/parser/objcparser.lpi b/bindings/pascocoa/parser/objcparser.lpi
index 1f7ab6dc3..e9b10884b 100755
--- a/bindings/pascocoa/parser/objcparser.lpi
+++ b/bindings/pascocoa/parser/objcparser.lpi
@@ -11,12 +11,13 @@
-
-
+
+
+
@@ -30,270 +31,45 @@
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
-
-
-
-
-
-
-
@@ -302,22 +78,17 @@
-
-
-
-
+
-
-
+
-
-
+
-
+
diff --git a/bindings/pascocoa/parser/objcparser.pas b/bindings/pascocoa/parser/objcparser.pas
index fd692f2fe..30dffa29b 100755
--- a/bindings/pascocoa/parser/objcparser.pas
+++ b/bindings/pascocoa/parser/objcparser.pas
@@ -32,8 +32,16 @@ type
end;
var
- updIni : AnsiString = '';
- noConvert : Boolean = false;
+ updIni : AnsiString = '';
+ doOutput : Boolean = false;
+ doparseAll : Boolean = false;
+
+const
+ TokenReplaceSec = 'TokenReplace';
+ TypeDefsSec = 'TypeDefs';
+ TypeReplaceSec = 'TypeReplace';
+ IgnoreIncludesSec = 'IgnoreIncludes';
+ CommonSec = 'Common';
function FindMax(const c: array of Integer; len: Integer): Integer;
var
@@ -110,16 +118,16 @@ var
i : Integer;
begin
if Entity is TClassDef then begin
- Ini.WriteString('TypeDefs', TClassDef(Entity)._ClassName, 'objcclass');
+ Ini.WriteString(TypeDefsSec, TClassDef(Entity)._ClassName, 'objcclass');
end else if Entity is TStructTypeDef then begin
- Ini.WriteString('TypeDefs', TStructTypeDef(Entity)._Name, 'struct');
+ Ini.WriteString(TypeDefsSec, TStructTypeDef(Entity)._Name, 'struct');
end else if Entity is TTypeNameDef then begin
if Assigned(Sets) then begin
cnv := AnsiLowerCase(ObjCToDelphiType(TTypeNameDef(Entity)._Inherited, false ));
if (cnv = 'float') or (cnv = 'double') then
- Ini.WriteString('TypeDefs', TTypeNameDef(Entity)._TypeName, 'float')
+ Ini.WriteString(TypeDefsSec, TTypeNameDef(Entity)._TypeName, 'float')
else if (cnv = 'Int64') then
- Ini.WriteString('TypeDefs', TTypeNameDef(Entity)._TypeName, 'struct')
+ Ini.WriteString(TypeDefsSec, TTypeNameDef(Entity)._TypeName, 'struct')
end;
end;
@@ -204,13 +212,13 @@ var
f : Text;
err : AnsiString;
begin
- err := '';
+ { err := '';
writeln('would you like to parse all current directory files .h to inc?');
readln(ch);
if (ch <> 'Y') and (ch <> 'y') then begin
writeln('as you wish, bye!');
Exit;
- end;
+ end;}
pth := IncludeTrailingPathDelimiter( GetCurrentDir);
writeln('looking for .h files in ', pth);
@@ -227,13 +235,16 @@ begin
incs := pth + Copy(srch.Name,1, length(srch.Name) - length(ExtractFileExt(srch.Name)));
incs := incs + '.inc';
//writeln(incs);
- assignfile(f, incs); rewrite(f);
- try
- for i := 0 to st.Count - 1 do
- writeln(f, st[i]);
- finally
- closefile(f);
+ if doOutput then begin
+ assignfile(f, incs); rewrite(f);
+ try
+ for i := 0 to st.Count - 1 do
+ writeln(f, st[i]);
+ finally
+ closefile(f);
+ end;
end;
+
st.Clear;
writeln(' converted!');
end else begin
@@ -293,17 +304,25 @@ var
values : TStringList;
a, b : AnsiString;
i : Integer;
+ IniName : AnsiString;
begin
// uikit.ini
if not FileExists(FileName) then begin
writeln('//ini file is not found');
Exit;
end;
- ini := TIniFile.Create(FileName);
+ {$ifndef fpc}
+ if ExtractFileName(FileName) = FileName then
+ IniName := IncludeTrailingPathDelimiter( GetCurrentDir) + FileName
+ else
+ IniName := FileName;
+ {$else}
+ IniName := FileName;
+ {$endif}
+ ini := TIniFile.Create(IniName);
values := TStringList.Create;
try
- values.Clear;
-
+ values.Clear;
{ ini.ReadSection('TypeReplace', values);
for i := 0 to values.Count - 1 do begin
a := values.ValueFromIndex[i];
@@ -314,22 +333,49 @@ begin
end;}
values.Clear;
+ a := ini.ReadString(CommonSec, 'mainunit', '');
+ if a <> '' then begin
+ b := '{%mainunit '+ a + '}';
+ for i := 0 to ConvertSettings.ConvertPrefix.Count - 1 do
+ if Pos(ConvertSettings.ConvertPrefix[i], '{%mainunit') = 1 then begin
+ ConvertSettings.ConvertPrefix[i] := b;
+ a := '';
+ Break;
+ end;
+ if a <> '' then
+ ConvertSettings.ConvertPrefix.Add(b);
+ end;
+
+ a := ini.ReadString(CommonSec, 'ignoreincludes', '');
+ ini.ReadSection('Common', values);
+ for i := 0 to values.Count - 1 do begin
+ if Pos('ignoreincludes', values[i]) = 1 then begin
+ b := ini.ReadString(CommonSec,values[i], '');
+ AddSpaceSeparated(b, ConvertSettings.IgnoreIncludes);
+ end;
+ end;
+ {ini.ReadSectionValues(IgnoreIncludesSec, values);
+ for i := 0 to values.Count - 1 do begin
+ ConvertSettings.IgnoreIncludes.AddStrings(values);
+ end;}
+
//ini.ReadSectionValues('ReplaceToken', values);
- ini.ReadSection('ReplaceToken', values);
+ ini.ReadSection(TokenReplaceSec, values);
+
for i := 0 to values.Count - 1 do begin
a := Values[i];
- b := ini.ReadString('ReplaceToken', a, '');
+ b := ini.ReadString(TokenReplaceSec, a, '');
if b ='' then
Settings.IgnoreTokens.Add(a);
end;
values.Clear;
- ini.ReadSection('TypeDefs', values);
+ ini.ReadSection(TypeDefsSec, values);
for i := 0 to values.Count - 1 do begin
a := Values[i];
- b := AnsiLowerCase(ini.ReadString('TypeDefs', a, ''));
+ b := AnsiLowerCase(ini.ReadString(TypeDefsSec, a, ''));
if b = 'objcclass' then
- Settings.ObjCTypes.Add(a)
+ Settings.ObjCClassTypes.Add(a)
else if b = 'struct' then
Settings.StructTypes.Add(a)
else if b = 'float' then
@@ -337,10 +383,10 @@ begin
end;
values.Clear;
- ini.ReadSection('TypeReplace', values);
+ ini.ReadSection(TypeReplaceSec, values);
for i := 0 to values.Count - 1 do begin
a := Values[i];
- b := ini.ReadString('TypeReplace', a, '');
+ b := ini.ReadString(TypeReplaceSec, a, '');
if isNameofPointer(a) then
Settings.PtrTypeReplace[ Copy(a, 1, length(a) - 1)] := b
else
@@ -369,35 +415,40 @@ begin
for i := 1 to ParamCount do begin
if isParamValue(ParamStr(i), prm, vlm) then begin
prm := AnsiLowerCase(prm);
- if prm = 'mu' then prm := 'mainunit'
- else if prm = 'ii' then prm := 'ignoreinclude';
- Params.Values[prm] := vlm;
+ if prm = 'noout' then doOutput:=false
+ else if prm = 'all' then doparseAll:=true
+ else if prm = 'ini' then begin
+ ReadIniFile(Settings, vlm);
+ end else
+ Params.Values[prm] := vlm;
end else
FileName := ParamStr(i);
end;
- vlm := Params.Values['ini'];
- if vlm <> '' then
- ReadIniFile(Settings, vlm);
-
- vlm := Params.Values['mainunit'];
- if vlm <> '' then
- Settings.ConvertPrefix.Add ('{%mainunit '+vlm+'}');
-
- vlm := Params.Values['ignoreinclude'];
- if vlm <> '' then
- AddSpaceSeparated(vlm, Settings.IgnoreIncludes);
-
- vlm := Params.Values['updini'];
+ vlm := Params.Values['uini'];
if vlm <> '' then
updIni := vlm;
+
finally
Params.Free;
end;
Result := true;
end;
+procedure TypeHelp;
+begin
+ writeln('Obj-C parser usage:');
+ writeln('objcparser [switches] objcheaderfilename');
+ writeln('');
+ writeln('keys:');
+ writeln(' -ini=filename.ini config file to use for pascal file generation');
+ writeln(' multiple "-ini" switches are allowed');
+ writeln(' -uini=filename.ini config file to update the data');
+ writeln(' -noout prevents from .inc files generated');
+ writeln(' -all parses headers (*.h) in the current directory');
+end;
+
var
inpf : AnsiString = '';
st : TStrings = nil;
@@ -406,20 +457,26 @@ var
begin
+ doOutput := true;
try
GetConvertSettings(ConvertSettings, inpf);
- if not FileExists(inpf) then begin
+ if doParseAll then begin
ParseAll;
Exit;
+ end else if not FileExists(inpf) then begin
+ TypeHelp;
+ Exit;
end;
st := TStringList.Create;
try
if not ReadAndParseFile(inpf, st, err) then
writeln('Error: ', err)
- else
- for i := 0 to st.Count - 1 do
- writeln(st[i]);
+ else begin
+ if doOutput then
+ for i := 0 to st.Count - 1 do
+ writeln(st[i]);
+ end;
except
end;
st.Free;