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