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