diff --git a/bindings/pascocoa/parser/ObjCParserTypes.pas b/bindings/pascocoa/parser/ObjCParserTypes.pas index f7960ab01..49fc92cb9 100755 --- a/bindings/pascocoa/parser/ObjCParserTypes.pas +++ b/bindings/pascocoa/parser/ObjCParserTypes.pas @@ -105,7 +105,7 @@ type Stack : TList; Errors : TStringList; - IgnoreTokens : TStringList; + //IgnoreTokens : TStringList; MacroHandler : TMacroHandler; UseCommentEntities : Boolean; @@ -182,7 +182,7 @@ type end; TCPrepElIf = TCPrepIf; - + TCPrepPragma = class(TCPrepocessor) _Text : AnsiString; function DoParse(AParser: TTextParser): Boolean; override; @@ -228,9 +228,10 @@ type function DoParse(AParser: TTextParser): Boolean; override; function ParseAfterTypeName(AParser: TTextParser): Boolean; public - _Type : TEntity; - _Name : AnsiString; - _isConst : Boolean; + _Type : TEntity; + _Name : AnsiString; + _isConst : Boolean; + _isExtern : Boolean; end; { TFunctionParam } @@ -254,7 +255,7 @@ type TFunctionTypeDef = class(TEntity) protected function DoParse(APArser: TTextParser): Boolean; override; - public + public _ResultType : TEntity; _ParamsList : TFunctionParamsList; @@ -262,6 +263,15 @@ type _isPointerRef : Boolean; end; + TCCodeSection = class(TEntity) + protected + function DoParse(AParser: TTextParser): Boolean; override; + public + _RawText : AnsiSTring; + end; + + TFunctionBody = class(TCCodeSection); + { TFunctionDef } TFunctionDef = class(TEntity) @@ -274,9 +284,11 @@ type _Name : AnsiString; _isPointer : Boolean; _isPointerRef : Boolean; - _isExternal : Boolean; - _CallConv : TCallingConv; - end; + _isExternal : Boolean; + _isInLine : Boolean; + _CallConv : TCallingConv; + _Body : TFunctionBody; // can be nil! + end; { TEnumValue } @@ -462,9 +474,7 @@ type destructor Destroy; override; end; - - - TCHeader = class(TEntity); + TCHeader = class(TEntity); // it's CCodeSection ?? { TObjCHeader } @@ -482,6 +492,7 @@ const WhiteSpaceChars : TCharSet = [#10,#13,#32,#9]; // utility functions +function SkipEndOfLineChars(const Src: AnsiString; idx: integer): Integer; function ParseSeq(Parser: TTextParser; const OpenSeq, CloseSeq: AnsiString): AnsiString; @@ -544,18 +555,29 @@ implementation var CustomList : TList = nil; +function SkipEndOfLineChars(const Src: AnsiString; idx: integer): Integer; +begin + if idx < length(Src) then begin + if (Src[idx] = #10) and (Src[idx+1]=#13) then inc(idx) + else if (Src[idx] = #13) and (Src[idx+1]=#10) then inc(idx); + end; + Result := idx+1; +end; + function IsCReserved(const Token: AnsiString): Boolean; begin if Token = '' then begin Result := false; Exit; end; - Result := true; case Token[1] of - 'c': begin + 'c': if Token = 'const' then Exit; - end; + 'e': + if Token = 'extern' then Exit; + 'i': + if Token = 'inline' then Exit; end; Result := false; @@ -933,7 +955,7 @@ begin Line := 1; Stack := TList.Create; Errors := TStringList.Create; - IgnoreTokens := TStringList.Create; + //IgnoreTokens := TStringList.Create; UsePrecompileEntities := true; Comments := TList.Create; end; @@ -941,7 +963,7 @@ end; destructor TTextParser.Destroy; begin Comments.Free; - IgnoreTokens.Free; + //IgnoreTokens.Free; Errors.Free; Stack.Free; inherited Destroy; @@ -1138,8 +1160,10 @@ begin ScanTo(Buf, index, EoLnChars); SkipSingleEoLnChars; - end else if not (IsSubStr(TokenTable.Precompile, Buf, Index) and HandlePrecomiler) then begin // 1. check is Compiler directive is found - if (Buf[index] in TokenTable.Symbols) then begin // 2. symbol has been found, so it's not an ident + end else begin + if (IsSubStr(TokenTable.Precompile, Buf, Index) and HandlePrecomiler) then + // 1. check is Preprocessor directive is found + else if (Buf[index] in TokenTable.Symbols) then begin // 2. symbol has been found, so it's not an ident if (not (Buf[index] in blck)) or (not SkipComments) then begin // 2.1 check if comment is found (comment prefixes match to the symbols) Result := true; // 2.2 check if symbol is found if (Buf[index] = '.') and (index < length(Buf)) and (Buf[index+1] in ['0'..'9']) then begin @@ -1181,14 +1205,14 @@ begin end; end; - if Result and (IgnoreTokens.Count > 0) then + {if Result and (IgnoreTokens.Count > 0) then if IgnoreTokens.IndexOf(Token) >= 0 then begin if Assigned(OnIgnoreToken) then OnIgnoreToken(Self, Token); Result := false; TokenType := tt_None; Token := ''; - end; + end;} if (Token <> '') and (TokenType = tt_Ident) and Result then begin TokenPos := Index - length(Token); @@ -1258,7 +1282,7 @@ var m : AnsiString; begin Result := false; - if ProcessingMacro or not assigned(MacroHandleR) then Exit; + if ProcessingMacro or not Assigned(MacroHandler) then Exit; ProcessingMacro := true; try @@ -1462,48 +1486,42 @@ var isfunc : Boolean; tt : TTokenType; s : AnsiString; -// rep : integer; - v : TVariable; - fn : TFunctionDef; - isext : Boolean; - + v : TVariable; + fn : TFunctionDef; idx : Integer; Modifiers : TStringList; + ent : TEntity; begin - Modifiers := TStringList.Create; - Result := false; idx := AParser.TokenPos; + Result := false; + Modifiers := TStringList.Create; + ctype:=nil; + fn := nil; try - AParser.FindNextToken(s, tt); - isext := false; - if s = 'extern' then begin - isext := true; - end else - AParser.Index := AParser.TokenPos; + repeat + if not AParser.FindNextToken(s, tt) or (tt <> tt_Ident) then begin + Result := false; + Exit; + end; + if isCReserved (s) then begin + Modifiers.Add(s); // C reserved tokens cannot be name of a function + s := ''; + end; + until s <> ''; + + AParser.Index := AParser.TokenPos; ctype := TTypeDef.Create(nil); Result := ctype.Parse(AParser); - if not Result then begin - ctype.Free; - Exit; - end; + if not Result then Exit; // expecting name of Variable or Function name - repeat - AParser.FindNextToken(_name, tt); - if isCReserved (_name) then begin - Modifiers.Add(_name); - _name := ''; - end; - until _name <> ''; - if tt <> tt_Ident then begin - + if not AParser.FindNextToken(_name, tt) or (tt <> tt_Ident) then begin Result := false; Exit; end; - //rep := AParser.TokenPos; AParser.FindNextToken(s, tt); @@ -1513,21 +1531,35 @@ begin fn := TFunctionDef.Create(Owner); fn._ResultType := ctype; fn._Name := _name; - fn._IsExternal := isext; + fn._IsExternal := Modifiers.IndexOf('extern')>=0; + fn._isInline := Modifiers.IndexOf('inline')>=0; fn.ParseParams(AParser); - owner.Items.Add(fn); + ent := fn; end else begin v := TVariable.Create(Owner); v._Type := ctype; v._Name := _name; - owner.Items.add(v); + v._isExtern := Modifiers.IndexOf('extern')>=0; + ent := v; AParser.Index := AParser.TokenPos; end; AParser.FindNextToken(s, tt); + Result := (tt = tt_Symbol) and (s = ';'); + if isfunc and not Result and Assigned(fn) then begin + AParser.Index := AParser.TokenPos; + fn._Body := TFunctionBody.Create(fn); + Result := fn._Body.Parse(AParser); + end; + + if Result then owner.Items.Add(ent) + else ent.Free; + finally - if not Result then + if not Result then begin + ctype.Free; AParser.Index := idx; + end; Modifiers.Free; end; end; @@ -1588,7 +1620,7 @@ begin AParser.Index := AParser.TokenPos; TSkip(ent)._Skip := SkipLine(AParser.Buf, AParser.Index); end; - end; + end; end; if Assigned(ent) then Items.Add(ent); end; @@ -2555,7 +2587,7 @@ end; { TFunctionDef } -function TFunctionDef.DoParse(APArser: TTextParser): Boolean; +function TFunctionDef.DoParse(AParser: TTextParser): Boolean; var s : AnsiString; tt : TTokenType; @@ -2575,8 +2607,17 @@ begin Exit; end; if not Assigned(_ParamsList) then - _ParamsList := TFunctionParamsList.Create(Self); + _ParamsList := TFunctionParamsList.Create(Self); // an empty param list Result := true; + + AParser.FindNextToken(s, tt); + if (tt = tt_Symbol) and (s = '{') then begin + AParser.Index := AParser.TokenPos; + _Body := TFunctionBody.Create(Self); + _Body.Parse(AParser); + end else + AParser.Index := AParser.TokenPos; + end; function TFunctionDef.ParseParams(AParser: TTextParser): Boolean; @@ -2733,7 +2774,7 @@ var tt : TTokenType; begin AParser.FindNextToken(s, tt); - Result := (s = '#if') or (s = '#ifdef') or (s = '#elif'); + Result := (s = '#if') or (s = '#ifdef') or (s = '#elif') or (s = '#ifndef'); _Cond := SkipLine(AParser.buf, AParser.Index); end; @@ -2947,6 +2988,34 @@ begin end; +function TCCodeSection.DoParse(AParser: TTextParser): Boolean; +var + s : String; + tt : TTokenType; + braces : Integer; + idx : Integer; +begin + AParser.FindNextToken(s, tt); + Result := (tt = tt_Symbol) and (s = '{'); + if not Result then begin + AParser.SetError(ErrExpectStr('{', s)); + Exit; + end; + idx := AParser.TokenPos; + + braces := 1; // brace opened + while braces > 0 do begin + AParser.FindNextToken(s, tt); + // todo: c expressions and declarations parsing + if s = '{' then inc(braces) // another brace opened + else if s = '}' then dec(braces); // brace closed + end; + Result := true; + _RawText := Copy(APArser.Buf, idx, AParser.Index - idx); +end; + + + initialization finalization diff --git a/bindings/pascocoa/parser/ObjCParserUtils.pas b/bindings/pascocoa/parser/ObjCParserUtils.pas index d6d992910..ecac4fe9f 100755 --- a/bindings/pascocoa/parser/ObjCParserUtils.pas +++ b/bindings/pascocoa/parser/ObjCParserUtils.pas @@ -43,6 +43,7 @@ type public constructor Create; destructor Destroy; override; + procedure GetReplaces(strings: TStrings); property Replace[const s: AnsiString]: AnsiString read GetReplace write SetReplace; default; property CaseSensetive: Boolean read GetCaseSense write SetCaseSense; end; @@ -58,8 +59,9 @@ type DefineReplace : TReplaceList; TypeDefReplace : TReplaceList; // replaces for C types PtrTypeReplace : TReplaceList; // replaces for C types pointers + TokenReplace : TReplaceList; - IgnoreTokens : TStringList; + //IgnoreTokens : TStringList; //todo: Remote. Use TokenReplace instead ConvertPrefix : TStringList; @@ -110,7 +112,6 @@ function GetMethodStr(cl: TClassDef; m: TClassMethodDef; ForImplementation: Bool function GetProcFuncHead(const FuncName, OfClass, Params, ResType: AnsiString; const FuncDest: AnsiString = ''): AnsiString; function GetMethodParams(const m: TClassMethodDef; NamesOnly: Boolean): AnsiString; function GetMethodResultType(const m: TClassMethodDef): AnsiString; -function IsPascalReserved(const s: AnsiString): Boolean; function IsPascalFloatType(const TypeName: AnsiString): Boolean; @@ -162,43 +163,6 @@ begin end; -// 'result' is considered reserved word! -function IsPascalReserved(const s: AnsiString): Boolean; -var - ls : AnsiString; -begin - //todo: a hash table should be used! - Result := false; - if s = '' then Exit; - ls := AnsiLowerCase(s); - case ls[1] of - 'a': Result := (ls = 'absolute') or (ls = 'abstract') or (ls = 'and') or (ls = 'array') or (ls = 'as') or (ls= 'asm') or (ls = 'assembler'); - 'b': Result := (ls = 'begin') or (ls = 'break'); - 'c': Result := (ls = 'cdecl') or (ls = 'class') or (ls = 'const') or (ls = 'constructor') or (ls = 'continue') or (ls = 'cppclass'); - 'd': Result := (ls = 'deprecated') or (ls = 'destructor') or (ls = 'div') or (ls = 'do') or (ls = 'downto'); - 'e': Result := (ls = 'else') or (ls = 'end') or (ls = 'except') or (ls = 'exit') or (ls = 'export') or (ls = 'exports') or (ls = 'external'); - 'f': Result := (ls = 'fail') or (ls = 'false') or (ls = 'far') or (ls = 'file') or (ls = 'finally') or (ls = 'for') or (ls = 'forward') or (ls = 'function'); - 'g': Result := (ls = 'goto'); - 'i': - Result := (ls = 'if') or (ls = 'implementation') or (ls = 'in') or (ls = 'index') or (ls = 'inherited') or (ls = 'initialization') or (ls = 'inline') - or (ls = 'interface') or (ls = 'interrupt') or (ls = 'is'); - 'l': Result := (ls = 'label') or (ls = 'library'); - 'm': Result := (ls = 'mod'); - 'n': Result := {(ls = 'name') or} (ls = 'near') or (ls = 'nil') or (ls = 'not'); - 'o': Result := (ls = 'object') or (ls = 'of') or (ls = 'on') or (ls = 'operator') or (ls = 'or') or (ls = 'otherwise'); - 'p': - Result := (ls = 'packed') or (ls = 'popstack') or (ls = 'private') or (ls = 'procedure') or (ls = 'program') or (ls = 'property') - or (ls = 'protected') or (ls = 'public'); - 'r': Result := (ls = 'raise') or (ls = 'record') or (ls = 'reintroduce') or (ls = 'repeat') or (ls = 'result'); - 's': Result := (ls = 'self') or (ls = 'set') or (ls = 'shl') or (ls = 'shr') or (ls = 'stdcall') or (ls = 'string'); - 't': Result := (ls = 'then') or (ls = 'to') or (ls = 'true') or (ls = 'try') or (ls = 'type'); - 'u': Result := (ls = 'unimplemented') or (ls = 'unit') or (ls = 'until') or (ls = 'uses'); - 'v': Result := (ls = 'var') or (ls = 'virtual'); - 'w': Result := (ls = 'while') or (ls = 'with'); - 'x': Result := (ls = 'xor'); - end; -end; - function FixIfReserved(const AName: AnsiString; NotUse: TStrings = nil): AnsiString; begin Result := AName; @@ -441,7 +405,7 @@ begin //todo: still, i don't like it... Result :=''; i := 1; - ScanWhile(s, i, [#32, #9]); + ScanWhile(s, i, InvsChars); vs := Copy(s, i, length(s) - i + 1); if vs = '' then Exit; @@ -487,11 +451,11 @@ var vs : AnsiString; begin i := 1; - ScanWhile(prm, i, [#32, #9]); + ScanWhile(prm, i, InvsChars); if prm[i] = '!' then begin isDef := false; inc(i); - ScanWhile(prm, i, [#32, #9]); + ScanWhile(prm, i, InvsChars); end else isDef :=true; vs := Copy(prm, i, length(prm) - i + 1); @@ -551,12 +515,8 @@ begin i := 1; while i <= length(AComment) do begin // scan for multylined comments - cmtln := ScanTo(AComment, i, [#10, #13]); - if i < length(AComment) then begin - if (AComment[i] = #10) and (AComment[i+1] = #13) then inc(i) - else if (AComment[i] = #13) and (AComment[i+1] = #10) then inc(i); - end; - inc(i); + cmtln := ScanTo(AComment, i, EoLnChars); + i := SkipEndOfLineChars(AComment, i); // break long comments into lines j := 1; @@ -564,7 +524,7 @@ begin k := j; inc(j, 80); if j > length(cmtln) then j := length(cmtln); - ScanTo(cmtln, j, [#32, #10, #13, #9]); + ScanTo(cmtln, j, WhiteSpaceChars); subs.Add(Prefix + '// ' + Copy(cmtln, k, j - k)); inc(j); end; @@ -709,24 +669,27 @@ var i : Integer; begin i := 1; - ScanWhile(s, i, [#9, #32, #10, #13]); + ScanWhile(s, i, WhiteSpaceChars); if i < length(s) then begin - DefWhat := ScanTo(s, i, [#9, #32, #10, #13]); - ScanWhile(s, i, [#9, #32]); + DefWhat := ScanTo(s, i, WhiteSpaceChars); + ScanWhile(s, i, InvsChars); DefTo := Copy(s, i, length(s) - i + 1); end else DefTo := ''; end; -procedure WriteOutPrecompDefine(const Prec: TPrecompiler; Prefix: AnsiString; st: TStrings); +procedure WriteOutPrecompDefine(const Prec: TPrecompiler; Prefix: AnsiString; st: TStrings; var IsConstant: Boolean); var a, b: AnsiString; begin + IsConstant:=false; if Prec._Directive = '#define' then begin ParseDefine(Prec._Params, a, b); - if b <> '' - then st.Add(Prefix + Format('%s = %s;', [a, b])) - else st.Add(Prefix + Format('{$define %s}', [a])); + if b <> '' then begin + st.Add(Prefix + Format('%s = %s;', [a, b])); + IsConstant:=True; + end else + st.Add(Prefix + Format('{$define %s}', [a])); end; end; @@ -905,9 +868,15 @@ begin end; restype := ObjCToDelphiType(fntype, isptr); - s:= GetProcFuncHead(f._Name, '', CParamsListToPascalStr(f._ParamsList), restype) + ' ' + ConvertSettings.GetCallConv(true); + s:= GetProcFuncHead(f._Name, '', CParamsListToPascalStr(f._ParamsList), restype) + ' '; + + if f._isInLine then s := s + ' inline; ' + else s:=s+ConvertSettings.GetCallConv(true); + st.Add(s); - s := Format(' external name ''%s%s'';', [ConvertSettings.ExternFuncPrefix, f._Name]); + if f._isExternal then + s := Format(' external name ''%s%s'';', [ConvertSettings.ExternFuncPrefix, f._Name]); + st.Add(s); end; @@ -1168,6 +1137,8 @@ var cmt : TStringList; cl : TClassDef; clName : String; + isConstant : Boolean; + b : Boolean; PasSection : String; @@ -1189,17 +1160,19 @@ begin subs := TStringList.Create; consts := TStringList.Create; cmt := TStringList.Create; + isConstant := false; try for i := 0 to hdr.Items.Count - 1 do if Assigned(hdr.Items[i]) then if (TObject(hdr.Items[i]) is TPrecompiler) then begin WriteOutIfDefPrecompiler(TPrecompiler(hdr.Items[i]), SpacePrefix, st); WriteOutPrecompInclude(TPrecompiler(hdr.Items[i]), st); - WriteOutPrecompDefine(TPrecompiler(hdr.Items[i]), ' ', subs); + WriteOutPrecompDefine(TPrecompiler(hdr.Items[i]), ' ', subs, b); + isConstant := isConstant or b; end; if subs.Count > 0 then begin - st.Add('const'); + if isConstant then StartSection('const'); st.AddStrings(subs); subs.Clear; end; @@ -1215,7 +1188,6 @@ begin end; end; - for i := 0 to hdr.Items.Count - 1 do if Assigned(hdr.Items[i]) then begin @@ -1671,9 +1643,54 @@ begin end; end; +procedure WriteOutFuncitionToImplemenation(f: TFunctionDef; st: TStrings); +var + restype : AnsiString; + fntype : AnsiString; + isptr : Boolean; + s : AnsiString; + txt : AnsiString; + line : AnsiString; + idx : Integer; +begin + if not Assigned(f) or (f._isExternal) then Exit; // external functions does not have a body + + if not Assigned(f._ResultType) then begin + isptr := false; + fntype := 'int'; + end else if (f._ResultType is TTypeDef) then begin + isptr := TTypeDef(f._ResultType)._IsPointer; + fntype := TTypeDef(f._ResultType)._Name; + end else begin + isptr := false; + fntype := '{todo: not implemented... see .h file for type}'; + end; + + restype := ObjCToDelphiType(fntype, isptr); + s:= GetProcFuncHead(f._Name, '', CParamsListToPascalStr(f._ParamsList), restype) + ' '; + if f._isInline then s := s + 'inline; ' + else s:=s+ConvertSettings.GetCallConv(true); + st.Add(s); + st.Add('begin '); + if not Assigned(f._Body) then + st.Add(' //body is missing... Probably declared somethere in .c (.cpp, .cxx) file? or the parser bug?') + else begin + txt := TFunctionBody(f._Body)._RawText; + idx := 1; + st.Add(' // Sorry, but the parser cannot convert the function''s body. '); + while idx <= length(txt) do begin + line := ScanTo(txt, idx, EoLnChars); + idx := SkipEndOfLineChars(txt, idx); + st.Add(' //'+Line); + end; + end; + st.Add('end;'); + st.Add(''); +end; + procedure WriteOutImplementationSection(hdr: TObjCHeader; st: TStrings; consts: TStringList); var - i : Integer; + i : Integer; subs : TStringList; begin subs := TStringList.Create; @@ -1687,7 +1704,10 @@ begin for i := 0 to hdr.Items.Count - 1 do if Assigned(hdr.Items[i]) then if (TObject(hdr.Items[i]) is TClassDef) then - WriteOutClassToImplementation(TClassDef(hdr.Items[i]), subs); + WriteOutClassToImplementation(TClassDef(hdr.Items[i]), subs) + else if (TObject(hdr.Items[i]) is TFunctionDef) then begin + WriteOutFuncitionToImplemenation(TFunctionDef(hdr.Items[i]), subs); + end; if subs.Count = 0 then Exit; @@ -1993,7 +2013,8 @@ end; constructor TConvertSettings.Create; begin - IgnoreTokens := TStringList.Create; + TokenReplace := TReplaceList.Create; + //IgnoreTokens := TStringList.Create; IgnoreIncludes := TStringList.Create; IgnoreIncludes.CaseSensitive := false; DefineReplace := TReplaceList.Create; @@ -2020,11 +2041,12 @@ end; destructor TConvertSettings.Destroy; begin + TokenReplace.Free; FloatTypes.Free; StructTypes.Free; ObjCClassTypes.Free; - IgnoreTokens.Free; + //IgnoreTokens.Free; IgnoreIncludes.Free; TypeDefReplace.Free; PtrTypeReplace.Free; @@ -2169,6 +2191,20 @@ begin else Result := TReplaceItem(fItems.Objects[i]).ReplaceStr; end; +procedure TReplaceList.GetReplaces(strings: TStrings); +var + i : Integer; + s : AnsiString; +const + EmptyString = ' '; +begin + for i := 0 to fItems.Count - 1 do begin + s := TReplaceItem(fItems.Objects[i]).ReplaceStr; + if s = '' then s := EmptyString; // otherwise it's lost + strings.Values[ fitems[i]] := s; + end; +end; + procedure TReplaceList.SetReplace(const ARepl, AValue: AnsiString); var i : integer; diff --git a/bindings/pascocoa/parser/ObjCToPas.pas b/bindings/pascocoa/parser/ObjCToPas.pas index 7e404416d..b2571bc4c 100755 --- a/bindings/pascocoa/parser/ObjCToPas.pas +++ b/bindings/pascocoa/parser/ObjCToPas.pas @@ -12,12 +12,20 @@ interface {$ifdef fpc}{$mode delphi}{$h+}{$endif} uses - ObjCParserTypes; + SysUtils, ObjCParserTypes; const ObjCDefaultParamDelim = '_'; + +type + TCProcessor = class(TObject) + public + procedure ProcessTree(Root: TEntity); virtual; abstract; + end; + function ObjCToPasMethodName(mtd: TClassMethodDef; CutLastDelims: Boolean = false; ParamDelim: AnsiChar = ObjCDefaultParamDelim): AnsiString; +function IsPascalReserved(const s: AnsiString): Boolean; implementation @@ -43,6 +51,43 @@ begin end; end; +// 'result' is considered reserved word! +function IsPascalReserved(const s: AnsiString): Boolean; +var + ls : AnsiString; +begin + //todo: a hash table should be used! + Result := false; + if s = '' then Exit; + ls := AnsiLowerCase(s); + case ls[1] of + 'a': Result := (ls = 'absolute') or (ls = 'abstract') or (ls = 'and') or (ls = 'array') or (ls = 'as') or (ls= 'asm') or (ls = 'assembler'); + 'b': Result := (ls = 'begin') or (ls = 'break'); + 'c': Result := (ls = 'cdecl') or (ls = 'class') or (ls = 'const') or (ls = 'constructor') or (ls = 'continue') or (ls = 'cppclass'); + 'd': Result := (ls = 'deprecated') or (ls = 'destructor') or (ls = 'div') or (ls = 'do') or (ls = 'downto'); + 'e': Result := (ls = 'else') or (ls = 'end') or (ls = 'except') or (ls = 'exit') or (ls = 'export') or (ls = 'exports') or (ls = 'external'); + 'f': Result := (ls = 'fail') or (ls = 'false') or (ls = 'far') or (ls = 'file') or (ls = 'finally') or (ls = 'for') or (ls = 'forward') or (ls = 'function'); + 'g': Result := (ls = 'goto'); + 'i': + Result := (ls = 'if') or (ls = 'implementation') or (ls = 'in') or (ls = 'index') or (ls = 'inherited') or (ls = 'initialization') or (ls = 'inline') + or (ls = 'interface') or (ls = 'interrupt') or (ls = 'is'); + 'l': Result := (ls = 'label') or (ls = 'library'); + 'm': Result := (ls = 'mod'); + 'n': Result := {(ls = 'name') or} (ls = 'near') or (ls = 'nil') or (ls = 'not'); + 'o': Result := (ls = 'object') or (ls = 'of') or (ls = 'on') or (ls = 'operator') or (ls = 'or') or (ls = 'otherwise'); + 'p': + Result := (ls = 'packed') or (ls = 'popstack') or (ls = 'private') or (ls = 'procedure') or (ls = 'program') or (ls = 'property') + or (ls = 'protected') or (ls = 'public'); + 'r': Result := (ls = 'raise') or (ls = 'record') or (ls = 'reintroduce') or (ls = 'repeat') or (ls = 'result'); + 's': Result := (ls = 'self') or (ls = 'set') or (ls = 'shl') or (ls = 'shr') or (ls = 'stdcall') or (ls = 'string'); + 't': Result := (ls = 'then') or (ls = 'to') or (ls = 'true') or (ls = 'try') or (ls = 'type'); + 'u': Result := (ls = 'unimplemented') or (ls = 'unit') or (ls = 'until') or (ls = 'uses'); + 'v': Result := (ls = 'var') or (ls = 'virtual'); + 'w': Result := (ls = 'while') or (ls = 'with'); + 'x': Result := (ls = 'xor'); + end; +end; + diff --git a/bindings/pascocoa/parser/objcparser.lpi b/bindings/pascocoa/parser/objcparser.lpi index accfe10fa..11ad9cbf2 100755 --- a/bindings/pascocoa/parser/objcparser.lpi +++ b/bindings/pascocoa/parser/objcparser.lpi @@ -12,7 +12,7 @@ - + @@ -45,8 +45,8 @@ - - + + @@ -70,79 +70,127 @@ - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - - - - - + + + + + + - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bindings/pascocoa/parser/objcparser.pas b/bindings/pascocoa/parser/objcparser.pas index e1d83688e..a6acc1c0d 100755 --- a/bindings/pascocoa/parser/objcparser.pas +++ b/bindings/pascocoa/parser/objcparser.pas @@ -148,6 +148,8 @@ var s : AnsiString; i, cnt : integer; upini : TIniFile; + + repl : TStringList; begin Result :=false; if not FileExists(FileName) then begin @@ -158,15 +160,25 @@ begin s := StrFromFile(FileName); hdr := TObjCHeader.Create; prec := TPrecompileHandler.Create(hdr); - parser := CreateCParser(s); + parser := CreateCParser(s, true); try + repl := TStringList.Create; + ConvertSettings.TokenReplace.GetReplaces(repl); + for i := 0 to repl.Count - 1 do begin + TCMacroHandler(parser.MacroHandler).AddSimpleMacro(repl.Names[i], repl.ValueFromIndex[i]); + end; parser.Buf := s; try parser.UsePrecompileEntities := false; parser.UseCommentEntities := false; parser.OnPrecompile := prec.OnPrecompile; parser.OnComment := prec.OnComment; - parser.IgnoreTokens.AddStrings(ConvertSettings.IgnoreTokens); + + {for i := 0 to repl.Count - 1 do begin + TCMacroHandler(parser.MacroHandler).AddSimpleMacro( + ConvertSettings.IgnoreTokens[i], ''); + //parser.IgnoreTokens.AddStrings(ConvertSettings.IgnoreTokens); + end;} hdr._FileName := ExtractFileName(FileName); Result := hdr.Parse(parser); @@ -332,6 +344,7 @@ begin Settings.TypeDefReplace[a] := b; end;} + //[Common] values.Clear; a := ini.ReadString(CommonSec, 'mainunit', ''); if a <> '' then begin @@ -359,16 +372,19 @@ begin ConvertSettings.IgnoreIncludes.AddStrings(values); end;} - //ini.ReadSectionValues('ReplaceToken', values); + // [TokenReplace] + Values.Clear; ini.ReadSection(TokenReplaceSec, values); - for i := 0 to values.Count - 1 do begin a := Values[i]; b := ini.ReadString(TokenReplaceSec, a, ''); - if b ='' then - Settings.IgnoreTokens.Add(a); + {if b ='' then + Settings.IgnoreTokens.Add(a) + else} + Settings.TokenReplace[a] := b; end; + // [TypeReplace] values.Clear; ini.ReadSection(TypeDefsSec, values); for i := 0 to values.Count - 1 do begin @@ -390,7 +406,7 @@ begin if isNameofPointer(a) then Settings.PtrTypeReplace[ Copy(a, 1, length(a) - 1)] := b else - Settings.TypeDefReplace[a] := b + Settings.TypeDefReplace[a] := b; end; finally @@ -563,7 +579,6 @@ begin // TestTemplate; // Exit; - doOutput := true; try GetConvertSettings(ConvertSettings, inpf); @@ -593,3 +608,4 @@ begin end; end. +