xref: /openbsd-src/gnu/usr.bin/perl/Porting/checkpodencoding.pl (revision 6fb12b7054efc6b436584db6cef9c2f85c0d7e27)
1898184e3Ssthen#!/usr/bin/env perl
2898184e3Ssthenuse 5.010;
3898184e3Ssthenuse open qw< :encoding(utf8) :std >;
4898184e3Ssthenuse autodie;
5898184e3Ssthenuse strict;
6898184e3Ssthenuse File::Find;
7898184e3Ssthenuse Encode::Guess;
8898184e3Ssthen
9898184e3Ssthen# Check if POD files contain non-ASCII without specifying
10898184e3Ssthen# =encoding. Run it as:
11898184e3Ssthen
12898184e3Ssthen## perl Porting/checkpodencoding.pl
13898184e3Ssthen
14898184e3Ssthenfind(
15898184e3Ssthen    {
16898184e3Ssthen        wanted => \&finder,
17898184e3Ssthen        no_chdir => 1,
18898184e3Ssthen    },
19898184e3Ssthen    '.'
20898184e3Ssthen);
21898184e3Ssthen
22898184e3Ssthensub finder {
23898184e3Ssthen    my $file = $_;
24898184e3Ssthen
25*6fb12b70Safresh1    return if -d $file or -B $file;
26898184e3Ssthen
27898184e3Ssthen    open my $fh, '<', $file;
28898184e3Ssthen
29898184e3Ssthen    #say STDERR "Checking $file";
30898184e3Ssthen
31898184e3Ssthen    next if
32898184e3Ssthen        # Test cases
3391f110e0Safresh1        $file =~ m[Pod-Simple/t];
34898184e3Ssthen
35898184e3Ssthen    my ($in_pod, $has_encoding, @non_ascii);
36898184e3Ssthen
37898184e3Ssthen    FILE: while (my $line = <$fh>) {
38898184e3Ssthen        chomp $line;
3991f110e0Safresh1        if ($line =~ /^=[a-z]+/) {
40898184e3Ssthen            $in_pod = 1;
41898184e3Ssthen        }
42898184e3Ssthen
43898184e3Ssthen        if ($in_pod) {
4491f110e0Safresh1            if ($line =~ /^=encoding (\S+)/) {
45898184e3Ssthen                $has_encoding = 1;
46898184e3Ssthen                last FILE;
4791f110e0Safresh1            } elsif ($line =~ /[^[:ascii:]]/) {
48898184e3Ssthen                my $encoding = guess_encoding($line);
49898184e3Ssthen                push @non_ascii => {
50898184e3Ssthen                    num => $.,
51898184e3Ssthen                    line => $line,
52898184e3Ssthen                    encoding => (ref $encoding ? "$encoding->{Name}?" : 'unknown!'),
53898184e3Ssthen                };
54898184e3Ssthen            }
55898184e3Ssthen        }
56898184e3Ssthen
5791f110e0Safresh1        if ($line =~ /^=cut/) {
58898184e3Ssthen            $in_pod = 0;
59898184e3Ssthen        }
60898184e3Ssthen    }
61898184e3Ssthen
62898184e3Ssthen    if (@non_ascii and not $has_encoding) {
63898184e3Ssthen        say "$file:";
64898184e3Ssthen        $DB::single = 1;
65898184e3Ssthen        for (@non_ascii) {
66898184e3Ssthen            say "    $_->{num} ($_->{encoding}): $_->{line}";
67898184e3Ssthen        }
68898184e3Ssthen    }
69898184e3Ssthen}
70