| #!/usr/bin/env perl |
| # |
| # Copyright (C) 2017-2018 Free Software Foundation, Inc. |
| # |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3, or (at your option) |
| # any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. |
| |
| use warnings; |
| use strict; |
| |
| my @lines = <>; |
| my %forwards = map { /^sub (\w+)\s*\((.*)\);$/ ? ("$1" => "$2") : () } @lines; |
| my %subs = map { /^sub (\w+)\s*\((.*)\)$/ ? ("$1" => "$2") : () } @lines; |
| my $error_count = 0; |
| |
| # $subs{"foo"} = "$$"; |
| # $subs{"bar"} = "@"; |
| # $forwards{"bar"} = "\$"; |
| |
| # Check that every subroutine has a matching forward declaration with |
| # the same prototype. |
| foreach my $sub (keys (%subs)) |
| { |
| # XXX: The location of the subroutine is not reported. |
| if (grep { $sub eq $_ } keys (%forwards)) |
| { |
| if ($forwards{$sub} ne $subs{$sub}) |
| { |
| $error_count += 1; |
| warn ("prototype mismatch for \"$sub\" subroutine\n"); |
| } |
| } |
| else |
| { |
| $error_count += 1; |
| warn ("missing prototype for \"$sub\" subroutine\n"); |
| } |
| } |
| |
| exit (($error_count == 0) ? 0 : 1); |