You've already forked lazarus-ccr
chelper: support for macros with variable arguments. end offset of a comment
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3982 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -69,6 +69,7 @@ type
|
||||
MacroName : AnsiString;
|
||||
MacroParams : TStringList;
|
||||
ReplaceText : AnsiString;
|
||||
isVariableParams : Boolean;
|
||||
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
@ -168,6 +169,7 @@ type
|
||||
public
|
||||
Params : TStringList;
|
||||
_Name : AnsiString;
|
||||
isVar : Boolean;
|
||||
SubsText : AnsiString;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
@ -804,6 +806,7 @@ begin
|
||||
comment := TComment.Create(idx);
|
||||
comment._Comment := cmt;
|
||||
comment.CommenType:=ct;
|
||||
comment.EndOffset:=Index;
|
||||
Comments.Add(Comment);
|
||||
end;
|
||||
if (Assigned(OnComment)) then OnComment(Self, cmt);
|
||||
@ -1263,11 +1266,21 @@ procedure TCMacroHandler.AddParamMacro(const MacroStr,ReplaceStr:AnsiString;
|
||||
var
|
||||
cm : TCMacroStruct;
|
||||
i : Integer;
|
||||
|
||||
begin
|
||||
cm := TCMacroStruct.Create;
|
||||
cm.MacroName := MacroStr;
|
||||
cm.ReplaceText := ReplaceStr;
|
||||
if Assigned(Params) then cm.MacroParams.Assign(Params);
|
||||
if Assigned(Params) then begin
|
||||
cm.MacroParams.Assign(Params);
|
||||
i:=cm.MacroParams.Count-1;
|
||||
if i>=0 then begin
|
||||
if (cm.MacroParams[i]='...') then begin
|
||||
cm.isVariableParams:=true;
|
||||
cm.MacroParams.Delete(i);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
i := MacrosNames.IndexOf(MacroStr);
|
||||
if i >= 0 then begin
|
||||
@ -1338,6 +1351,10 @@ var
|
||||
//j : Integer;
|
||||
cm : TCMacroStruct;
|
||||
RVal : TStringList;
|
||||
va : string;
|
||||
const
|
||||
VaArgs = '__VA_ARGS__';
|
||||
|
||||
begin
|
||||
Parser.FindNextToken(s, tt);
|
||||
i := MacrosNames.IndexOf(s);
|
||||
@ -1368,11 +1385,19 @@ begin
|
||||
while Parser.Token<>')' do begin
|
||||
ParseCMacroParam(Parser, x);
|
||||
|
||||
Result:=i<cm.MacroParams.Count;
|
||||
Result:=(i<cm.MacroParams.Count) or cm.isVariableParams;
|
||||
if not Result then begin
|
||||
Parser.SetError('too many params for the Macro: '+ name);
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if i>=cm.MacroParams.Count then begin
|
||||
//todo: optimize. Values access is slow!
|
||||
va:=RVal.Values[ VaArgs ];
|
||||
if va='' then va:=x
|
||||
else va:=va+','+x;
|
||||
RVal.Values[ VaArgs ]:=va;
|
||||
end else
|
||||
RVal.Values [ cm.MacroParams[i]]:=x;
|
||||
|
||||
Parser.NextToken;
|
||||
|
Reference in New Issue
Block a user