|
Packit |
e4b6da |
#!/usr/bin/perl
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
# Heuristic tests (necessary conditions) for a man page to be good.
|
|
Packit |
e4b6da |
#
|
|
Packit |
e4b6da |
# This script checks for:
|
|
Packit |
e4b6da |
# 1. the file ends in a newline
|
|
Packit |
e4b6da |
# (detects some cases where a man-page got cut off from a processing error)
|
|
Packit |
e4b6da |
# 2. no consecutive blank lines except in verbatim environments
|
|
Packit |
e4b6da |
# 3. whitespace is collapsed except in verbatim environments
|
|
Packit |
e4b6da |
#
|
|
Packit |
e4b6da |
# Synopsis:
|
|
Packit |
e4b6da |
# htest-man.pl [man-page files...]
|
|
Packit |
e4b6da |
#
|
|
Packit |
e4b6da |
# Potential errors in the given files will be logged to standard output.
|
|
Packit |
e4b6da |
# The return status will be non-zero whenever they occur.
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
use strict;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
unshift(@ARGV, '-') unless @ARGV;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
my $has_error = 0;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
foreach my $ARGV (@ARGV) {
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
my $has_name = 0;
|
|
Packit |
e4b6da |
my $has_description = 0;
|
|
Packit |
e4b6da |
my $in_verbatim = 0;
|
|
Packit |
e4b6da |
my $last_line_is_blank = 0;
|
|
Packit |
e4b6da |
my $line_num = 0;
|
|
Packit |
e4b6da |
my $newline_exists = 1;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
open(IN, $ARGV);
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
while (<IN>) {
|
|
Packit |
e4b6da |
$line_num++;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
if(chomp == 0) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: no newline at end of file\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
$in_verbatim = 1 if /^.nf\s*$/;
|
|
Packit |
e4b6da |
$in_verbatim = 0 if /^.fi\s*$/;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
# FIXME this doesn't work for non-English-language pages
|
|
Packit |
e4b6da |
$has_name++ if /^.SH\s+NAME$/;
|
|
Packit |
e4b6da |
$has_description++ if /^.SH\s+DESCRIPTION$/;
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
unless($in_verbatim) {
|
|
Packit |
e4b6da |
my $line_is_blank = ($_ =~ /^(.PP)?\s*$/);
|
|
Packit |
e4b6da |
if($line_is_blank and $last_line_is_blank) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: duplicate blank line\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
$last_line_is_blank = $line_is_blank or
|
|
Packit |
e4b6da |
($_ =~ /^(.SH|.SS|.TP)(\s.*)?$/);
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
unless($in_verbatim) {
|
|
Packit |
e4b6da |
if(/[ \t]{2,}/) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: non-collapsed whitespace\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
if($has_name == 0) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: no NAME section found\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
} elsif($has_name > 1) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: too many NAME sections found\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
if($has_description == 0) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: no DESCRIPTION section found\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
} elsif($has_description > 1) {
|
|
Packit |
e4b6da |
print STDERR "$0:$ARGV:${line_num}: too many DESCRIPTION sections found\n";
|
|
Packit |
e4b6da |
$has_error = 1;
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
}
|
|
Packit |
e4b6da |
|
|
Packit |
e4b6da |
exit $has_error;
|
|
Packit |
e4b6da |
|