8d515d962ac490e3630572d2539e5d51660ae4e1
[lab.git] / misc / findcombinable.pl
1 #! /usr/bin/perl -w
2
3 use strict;
4 use warnings;
5 use utf8;
6
7 use Encode;
8 use Unicode::Normalize qw(NFC NFKC);
9 binmode STDOUT => 'encoding(utf8)';
10 binmode STDERR => 'encoding(utf8)';
11
12 my $top = shift @ARGV || exit;
13 if (! -d $top) { exit; }
14
15 my $utf8 = find_encoding("utf8");
16 $top = $utf8->decode($top);
17
18 checkdir($top);
19
20 sub match {
21     my $str = shift @_;
22     
23     if ($str ne NFC($str)) {
24         return 1;
25     }
26     
27     return '';
28 }
29
30 sub checkdir {
31     my $target = shift @_;
32     
33     print STDERR "checking '$target'\n";
34     opendir(my $dir, $target) || return $target;
35     my @entries = sort grep { !m/^(\.|\.\.)$/g } readdir($dir);
36     closedir($dir);
37     
38     my @dirs;
39     while (my $entry = shift @entries) {
40         $entry = $utf8->decode($entry);
41         if (match($entry)) {
42             print "'$target/$entry' can be composed\n";
43             next;
44         }
45         if (-d "$target/$entry") {
46             push @dirs, $entry;
47             next;
48         }
49     }
50     
51     while (my $entry = pop @dirs) {
52         checkdir("$target/$entry");
53     }
54 }