#!/usr/bin/perl -w
use
5.010;
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/^/
$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(
$_
,
'r'
) 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
);