summaryrefslogtreecommitdiff
path: root/Porting/checkansi.pl
diff options
context:
space:
mode:
authorMarcus Holland-Moritz <mhx-perl@gmx.net>2007-12-30 12:20:12 +0000
committerMarcus Holland-Moritz <mhx-perl@gmx.net>2007-12-30 12:20:12 +0000
commitf019531057e624642eeb6be122ff985859ed0d0a (patch)
tree2385b8468369b188070b719cb9d0f39e4f92e620 /Porting/checkansi.pl
parent20f4945e16943f141ab760ffdcdbf39a5f3b734e (diff)
downloadperl-f019531057e624642eeb6be122ff985859ed0d0a.tar.gz
Add script to check source code for ANSI-C violations.
p4raw-id: //depot/perl@32784
Diffstat (limited to 'Porting/checkansi.pl')
-rw-r--r--Porting/checkansi.pl111
1 files changed, 111 insertions, 0 deletions
diff --git a/Porting/checkansi.pl b/Porting/checkansi.pl
new file mode 100644
index 0000000000..c072b28e2c
--- /dev/null
+++ b/Porting/checkansi.pl
@@ -0,0 +1,111 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use 5.010;
+use File::Find;
+use IO::File;
+use Getopt::Long;
+use Pod::Usage;
+
+my %limits = (
+ c90 => {
+ 'logical-source-line-length' => 509,
+ },
+ c99 => {
+ 'logical-source-line-length' => 4095,
+ },
+);
+
+my %opt = (
+ std => 'c99',
+);
+
+GetOptions(\%opt, qw( logical-source-line-length=i std=s ))
+ && @ARGV && exists $limits{$opt{std}}
+ or pod2usage(2);
+
+for my $k (keys %{$limits{$opt{std}}}) {
+ $opt{$k} //= $limits{$opt{std}}{$k};
+}
+
+{
+ my $num = 1;
+
+ sub report
+ {
+ my $msg = shift;
+ my $info = join '', @_;
+
+ if ($info) {
+ $info =~ s/\R+$//;
+ $info =~ s/^/ #|\t/mg;
+ $info = "\n$info\n\n";
+ }
+
+ warn sprintf "[%d] %s(%d): %s\n%s",
+ $num++, $File::Find::name, $., $msg, $info;
+ }
+}
+
+find(sub {
+ /\.([ch]|xs)$/ or return;
+
+ my $fh = IO::File->new($_) or die "$_: $!\n";
+ my $ll = '';
+
+ while (defined(my $line = <$fh>)) {
+ report("trailing whitespace after backslash", $line)
+ if $line =~ /\\[[:blank:]]+$/;
+
+ $ll .= $line;
+
+ unless ($ll =~ /\\$/) {
+ if (length $ll > $opt{'logical-source-line-length'}) {
+ report(sprintf("logical source line too long (%d > %d)",
+ length $ll, $opt{'logical-source-line-length'}), $ll);
+ }
+ $ll = '';
+ }
+ }
+}, @ARGV);
+
+__END__
+
+=head1 NAME
+
+checkansi.pl - Check source code for ANSI-C violations
+
+=head1 SYNOPSIS
+
+checkansi.pl [B<--std>=c90|c99]
+[B<--logical-source-line-length>=I<num>]
+<path> ...
+
+=head1 DESCRIPTION
+
+B<checkansi.pl> searches
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--std>=c90|c99
+
+Choose the ANSI/ISO standard against which shall be checked.
+Defaults to C<c99>.
+
+=item B<--logical-source-line-length>=I<number>
+
+Maximum length of a logical source line. Overrides the default
+given by the chosen standard.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 2007 by Marcus Holland-Moritz <mhx@cpan.org>.
+
+This program is free software; you may redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=cut