Commit e61fc3cb authored by Dimitri van Heesch's avatar Dimitri van Heesch

Bug 704172 - Nested Aliases fail when the nested alias has two or more arguments.

parent f90a787e
...@@ -6973,6 +6973,34 @@ struct Marker ...@@ -6973,6 +6973,34 @@ struct Marker
int size; // size of the marker int size; // size of the marker
}; };
/** For a string \a s that starts with a command name, returns the character
* offset within that string representing the first character after the
* command. For an alias with argument, this is the offset to the
* character just after the argument list.
*
* Examples:
* - s=="a b" returns 1
* - s=="a{2,3} b" returns 6
* = s=="#" returns 0
*/
static int findEndOfCommand(const char *s)
{
const char *p = s;
char c;
int i=0;
if (p)
{
while ((c=*p) && isId(c)) p++;
if (c=='{')
{
QCString args = extractAliasArgs(p,0);
i+=args.length();
}
i+=p-s;
}
return i;
}
/** Replaces the markers in an alias definition \a aliasValue /** Replaces the markers in an alias definition \a aliasValue
* with the corresponding values found in the comma separated argument * with the corresponding values found in the comma separated argument
* list \a argList and the returns the result after recursive alias expansion. * list \a argList and the returns the result after recursive alias expansion.
...@@ -6988,11 +7016,17 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString ...@@ -6988,11 +7016,17 @@ static QCString replaceAliasArguments(const QCString &aliasValue,const QCString
int s=0; int s=0;
for (i=0;i<l;i++) for (i=0;i<l;i++)
{ {
if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) char c = argList.at(i);
if (c==',' && (i==0 || argList.at(i-1)!='\\'))
{ {
args.append(new QCString(argList.mid(s,i-s))); args.append(new QCString(argList.mid(s,i-s)));
s=i+1; // start of next argument s=i+1; // start of next argument
} }
else if (c=='@' || c=='\\')
{
// check if this is the start of another aliased command (see bug704172)
i+=findEndOfCommand(argList.data()+i+1);
}
} }
if (l>s) args.append(new QCString(argList.right(l-s))); if (l>s) args.append(new QCString(argList.right(l-s)));
//printf("found %d arguments\n",args.count()); //printf("found %d arguments\n",args.count());
...@@ -7152,6 +7186,7 @@ static QCString expandAliasRec(const QCString s) ...@@ -7152,6 +7186,7 @@ static QCString expandAliasRec(const QCString s)
return result; return result;
} }
int countAliasArguments(const QCString argList) int countAliasArguments(const QCString argList)
{ {
int count=1; int count=1;
...@@ -7159,8 +7194,15 @@ int countAliasArguments(const QCString argList) ...@@ -7159,8 +7194,15 @@ int countAliasArguments(const QCString argList)
int i; int i;
for (i=0;i<l;i++) for (i=0;i<l;i++)
{ {
if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) count++; char c = argList.at(i);
if (c==',' && (i==0 || argList.at(i-1)!='\\')) count++;
else if (c=='@' || c=='\\')
{
// check if this is the start of another aliased command (see bug704172)
i+=findEndOfCommand(argList.data()+i+1);
}
} }
//printf("countAliasArguments=%d\n",count);
return count; return count;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment