in meta/style.pm [236:330]
sub CheckFunctionsParams
{
#
# make sure that doxygen params match function params names
#
my ($data, $file) = @_;
my $doxygenCommentPattern = '/\*\*((?:(?!\*/).)*?)\*/';
my $fnTypeDefinition = 'typedef\s*\w+[^;]+?(\w+_fn)\s*\)([^;]+?);';
my $globalFunction = 'sai_\w+\s*(sai_\w+)[^;]*?\(([^;]+?);';
while ($data =~ m/$doxygenCommentPattern\s*(?:$fnTypeDefinition|$globalFunction)/gis)
{
my $comment = $1;
my $fname = $2;
my $fn = $3;
$fname = $4 if defined $4;
$fn = $5 if defined $5;
my @params = $comment =~ /\@param\[\w+]\s+(\.\.\.|\w+)/gis;
my @fnparams = $fn =~ /_(?:In|Out|Inout)_.+?(\.\.\.|\w+)\s*[,\)]/gis;
for my $p (@params)
{
LogWarning "param $p in $fname should not be prefixed sai_" if $p =~ /sai_/;
}
my $params = "@params";
my $fnparams = "@fnparams";
if ($params ne $fnparams)
{
LogWarning "not matching params in function $fname: $file";
LogWarning " doxygen '$params' vs code '$fnparams'";
}
if ("@params" =~ /[A-Z]/)
{
LogWarning "params should use small letters only '@params' in $fname: $file";
}
# exceptions
next if $fname eq "sai_remove_all_neighbor_entries_fn";
next if $fname eq "sai_switch_register_write_fn";
next if $fname eq "sai_switch_register_read_fn";
next if $fname eq "sai_switch_mdio_write_fn";
next if $fname eq "sai_switch_mdio_read_fn";
next if $fname eq "sai_switch_mdio_cl22_write_fn";
next if $fname eq "sai_switch_mdio_cl22_read_fn";
my @paramsFlags = lc($comment) =~ /\@param\[(\w+)]/gis;
my @fnparamsFlags = lc($fn) =~ /_(\w+)_.+?(?:\.\.\.|\w+)\s*[,\)]/gis;
if (not "@paramsFlags" eq "@fnparamsFlags")
{
LogWarning "params flags not match ('@paramsFlags' vs '@fnparamsFlags') in $fname: $file";
}
next if not $fname =~ /_fn$/; # below don't apply for global functions
if (not $fnparams =~ /^(\w+)(| attr| attr_count attr_list| switch_id attr_count attr_list)$/ and
not $fname =~ /_(stats|stats_ext|notification)_fn$|^sai_(send|allocate|free|recv|bulk)_|^sai_meta/)
{
LogWarning "wrong param names: $fnparams: $fname";
LogWarning " expected: $params[0](| attr| attr_count attr_list| switch_id attr_count attr_list)";
}
if ($fname =~ /^sai_(get|set|create|remove)_(\w+?)(_attribute)?(_stats|_stats_ext)?_fn/)
{
my $pattern = $2;
my $first = $params[0];
if ($pattern =~ /_entry$/)
{
$pattern = "${pattern}_id|${pattern}";
}
else
{
$pattern = "${pattern}_id";
}
if (not $first =~ /^$pattern$/)
{
LogWarning "first param should be called ${pattern} but is $first in $fname: $file";
}
}
if ($fname =~ /^sai_\w+_stats_/)
{
CheckStatsFunction($fname,$fn,$fnparams);
}
}
}