#!/usr/bin/perl -w
my
%SYM
;
my
@PAT
=
(
[
[
"config_h.SH"
,
],
[
qr/^#\$(\w+)\s+(\w+)/
,
],
],
[
[
"Porting/config.sh"
,
"plan9/config_h.sample"
,
"win32/config_H.??"
,
],
qr{^(?:\Q/*\E)?#(?:define|undef)\s+(\w+)}
,
],
[
[
"configure.com"
,
],
qr{^(\w+)="(?:define|undef)"}
,
],
);
{
print
STDERR
"$0: Looking for symbols...\n"
;
for
my
$pat
(
@PAT
) {
for
my
$fn
(
map
{
glob
(
$_
) } @{
$pat
->[0] }) {
if
(
open
(
my
$fh
,
'<'
,
$fn
)) {
while
(<
$fh
>) {
for
my
$p
(
@$pat
) {
for
my
$sym
(/
$p
/g) {
$SYM
{
$sym
}{
$fn
}++;
}
}
}
}
}
}
}
printf
(STDERR
"$0: Found %d symbols\n"
,
scalar
keys
%SYM
);
print
STDERR
"$0: Looking for their uses...\n"
;
delete
$SYM
{
'_'
};
delete
$SYM
{
'const'
};
my
$SYM
=
join
(
"|"
,
sort
{
length
(
$b
) <=>
length
(
$a
) ||
$a
cmp
$b
}
keys
%SYM
);
open
(
my
$mani
,
'<'
,
"MANIFEST"
) or
die
"$0: Failed to open MANIFEST\n"
;
my
%found
;
while
(<
$mani
>) {
if
(/^(\S+)\s+/) {
my
$fn
= $1;
next
if
$fn
=~ m{^(?:config_h.SH|Configure|configure\.com|Porting/(?:config|Glossary)|(?:plan9|win32)/(?:config|(?:GNU)?[Mm]akefile)|uconfig)|\.pod$};
open
my
$fh
,
'<'
,
$fn
or
die
qq[$0: Failed to open $fn: $!]
;
while
(<
$fh
>) {
while
(/\b(
$SYM
)\b/go) {
$found
{$1}{
$fn
}++;
}
}
}
}
for
my
$sym
(
sort
keys
%SYM
) {
if
(
exists
$found
{
$sym
}) {
my
@found
=
keys
%{
$found
{
$sym
}};
print
"$sym\t"
,
join
(
" "
,
sort
@found
),
"\n"
;
}
else
{
print
"$sym\n"
;
}
}