1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#! /usr/bin/perl -w
# This script looks all installed man page, and report some stats about them
# (usefull only to guide reflexions to po-man implementation)
use strict;
use File::Find ();
# for the convenience of &wanted calls, including -eval statements:
#use vars qw/*name *dir *prune/;
#*name = *File::Find::name;
#*dir = *File::Find::dir;
#*prune = *File::Find::prune;
my %page;
$page{'pod'}{'desc'} = "generated by Pod::Man";
$page{'help2man'}{'desc'} = "generated by help2man";
$page{'docbook-to-man'}{'desc'} = "generated by docbook-to-man";
$page{'docbook2man'}{'desc'} = "generated by docbook2man";
$page{'latex2man'}{'desc'} = "generated by latex2man";
$page{'db2man.xsl'}{'desc'} = "generated by db2man.xsl";
$page{'mtex2man'}{'desc'} = "generated by mtex2man(1)";
$page{'auto'}{'desc'} = "contains 'THIS FILE HAS BEEN AUTOMATICALLY GENERATED. DO NOT EDIT.'";
$page{'notedit'}{'desc'} = "contains 'DO NOT EDIT' or 'generated', but I dunno by who.";
$page{'man'}{'desc'} = "seem to be a source file";
my %used=(); # used macros
my %defined=(); # self defined macros
foreach my $type (keys %page) {
$page{$type}{'defcount'} = 0;
}
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
if ((($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -f $_) {
my $file = $File::Find::dir."/".$_;
return unless $file =~ m|/usr/share/man/man|; # pass translations
if ($file =~ /\.gz$/) {
open FILE,"zcat $file|" || die "Can't open $file\n";
} else {
open FILE,"<$file" || die "Can't open $file\n";
}
my $header="";
while ($_=<FILE>) {
last unless /^.."/;#"
# chomp;
$header .= " $_";
}
$header = "\n$header" if (length $header);
my $define="";
while (<FILE>) {
if (m/^\.de (.*)$/) {
my $macro=$1;
$define .= $macro.",";
$defined{$macro} =(defined($defined{$macro}) ? $defined{$macro}+1 : 1);
next;
} elsif (m/^\.de/) {
print "DEF: $_";
} elsif (m/^\.([^ ]*)/) {
my $macro=$1;
chomp($macro);
$macro =~ s/\s*$//g;
$macro =~ s/^\s*//g;
$macro =~ s/.".*$/|"/;
next unless (length($macro));
# unless ($define =~ m/$macro/) { # ignore self defined macro
$used{$macro} = (defined($used{$macro}) ? $used{$macro}+1 : 1);
# }
}
}
close FILE;
my $type="man";
if ($header =~ /Pod::Man/) { $type="pod";
} elsif ($header =~ /generated by help2man/) { $type="help2man";
} elsif ($header =~ /with docbook-to-man/) { $type="docbook-to-man";
} elsif ($header =~ /generated by docbook2man/) { $type="docbook2man";
} elsif ($header =~ /created with latex2man/) { $type="latex2man";
} elsif ($header =~ /Generated by db2man.xsl/) { $type="db2man.xsl";
} elsif ($header =~ /generated automatically by mtex2man/) { $type="mtex2man";
} elsif ($header =~ /THIS FILE HAS BEEN AUTOMATICALLY GENERATED. DO NOT EDIT./) {
$type="auto";
} elsif ($header =~ /DO NOT EDIT/i || $header =~ /generated/i) {
$type="notedit";
}
if (length($define)) {
$page{$type}{'define'}{$file} = $define;
$page{$type}{'defcount'}++;
}
push @{$page{$type}{'files'}},$file;
push @{$page{$type}{'headers'}},"$file\n$header";
}
}
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/usr/share/man');
my $total=0;
foreach my $type (sort keys %page) {
$page{$type}{'num'} = scalar @{$page{$type}{'files'}};
$total += $page{$type}{'num'};
}
print "Seen $total pages.\n";
foreach my $type (sort {$page{$a}{'num'} <=> $page{$b}{'num'}} keys %page) {
print " ".$page{$type}{'num'}." ".$page{$type}{'desc'}.". ".
$page{$type}{'defcount'}." seem to define new macro.\n";
}
print "\nHere is a list of the (regular and self defined) macros used:\n";
foreach my $macro (sort {$used{$a} <=> $used{$b}} keys %used) {
print " $macro (used ".$used{$macro}." times)\n";
}
#print "\nHere is the list of pages seeming to be source page, and defining new macros:\n";
#foreach my $page(sort { $page{'man'}{'define'}{$a} cmp $page{'man'}{'define'}{$b}
# } keys %{$page{'man'}{'define'}}) {
# print $page{'man'}{'define'}{$page}.". in $page\n";
#}
|