| #!/usr/bin/env perl | |
| # | |
| # Copyright (C) 2017-2026 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); |