added demo of signal/uid handling feature
[tridge/junkcode.git] / what_license.pl
1 #!/usr/bin/perl -w
2
3 use Data::Dumper;
4
5 my %ltype;
6
7 sub process_file($) {
8         my $fname = shift;
9
10         open(HANDLE, $fname) || die "Can't open $fname";
11         my $data = "";
12         read(HANDLE, $data, 4096);
13         $data =~ tr/A-Za-z0-9/ /cs;
14         
15         if ($data =~ /GNU General Public/ ||
16             $data =~ /GNU Public License/) {
17                 if ($data =~ /Everyone is permitted to copy and distribute verbatim copies of this license document but changing it is not allowed/) {
18                         $ltype{"COPYING"}++;
19                 } elsif ($data =~ /License version 3/) {
20                         $ltype{"GPLV3"}++;
21                 } elsif ($data =~ /any later version/ ||
22                     $data =~ /v2 or later/ ||
23                     $data =~ /version 2 or later/) {
24                         $ltype{"GPLV2+"}++;
25                 } elsif ($data =~ /version 2/i) {
26                         $ltype{"GPLV2"}++;
27                         printf("%s\n", $fname);
28                 } else {
29                         $ltype{"GPLvX"}++;                      
30                 }
31         } elsif ($data =~ /copyright/i ||
32                  $data =~ /license/i) {
33                 $ltype{"OTHER"}++;
34         } else {
35                 $ltype{"NONE"}++;
36         }
37         close(HANDLE);
38 }
39
40 sub traverse($) {
41         my $dname = shift;
42         my $d;
43         if (-f $dname) {
44                 process_file($dname);
45                 return;
46         }
47         opendir(DIR, $dname) || die "Can't open directory $dname";
48         my @names = readdir(DIR);
49         foreach my $f (@names) {
50                 next if ($f eq ".") || ($f eq "..");
51                 my $fname = $dname . "/" . $f;
52                 if (-d $fname) {
53                         traverse($fname);
54                 } elsif (-f _) {
55                         process_file($fname);
56                 }
57         }
58         closedir(DIR);
59 }
60
61
62 for (my $i=0;$i<=$#ARGV;$i++) {
63         traverse($ARGV[$i]);
64 }
65
66 foreach my $l (keys %ltype) {
67         printf("%-6s %u\n", $l, $ltype{$l});
68 }
69