server/dep/ACE_wrappers/bin/show_unused_macros.pl
cipherCOM 571f510ee4 [11162] Changed ACE lib to same version but with configure script
(based on cipherCOM's repo commit d3d8934)

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
2011-02-14 12:51:16 +03:00

224 lines
5 KiB
Perl
Executable file

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}'
& eval 'exec perl -w -S $0 $argv:q'
if 0;
# ************************************************************
# Description : Find macros in specified config files that
# are not referenced in other config files,
# but are referenced in the rest of the source
# files.
# Author : Chad Elliott
# Create Date : 12/22/2004
# $Id: show_unused_macros.pl 80826 2008-03-04 14:51:23Z wotte $
# ************************************************************
# ************************************************************
# Pragmas
# ************************************************************
use strict;
use Cwd;
use FileHandle;
use File::Basename;
# ************************************************************
# Data Section
# ************************************************************
my($in_comment) = undef;
# ************************************************************
# Subroutine Section
# ************************************************************
sub getline {
my($fh) = shift;
my($line) = $fh->getline();
if (defined $line) {
## Remove the line feed
$line =~ s/\n//;
## Remove one line c comments
$line =~ s/\/\*.*\*\///;
## Check for multi lined c comments
if ($line =~ s/\/\*.*//) {
$in_comment = 1;
}
elsif ($line =~ s/.*\*\///) {
$in_comment = 0;
}
elsif ($in_comment) {
$line = '';
}
else {
## Remove c++ comments
$line =~ s/\/\/.*//;
## Concatenate lines
if ($line =~ s/\\\s*$//) {
$line .= getline($fh);
}
}
}
return $line;
}
sub findMacros {
my($defines) = shift;
my($macros) = shift;
my(@files) = @_;
foreach my $file (@files) {
my($fh) = new FileHandle();
if (open($fh, $file)) {
$in_comment = undef;
while(defined($_ = getline($fh))) {
if (($defines & 1) == 1 && /^\s*#\s*define\s*([^\s]+)/) {
my($word) = $1;
$word =~ s/\(.*//;
if (!defined $$macros{$word}) {
$$macros{$word} = $file;
}
}
elsif (($defines & 2) == 2 && /^\s*#\s*if/) {
foreach my $word (split(/[^\w]/, $_)) {
if ($word =~ /^[^\d]\w+$/ &&
$word !~ /^if([n]?def)?$/ &&
$word !~ /^define[d]?/ &&
$word !~ /^els(e|if)$/ && !defined $$macros{$word}) {
$$macros{$word} = $file;
}
}
}
}
close($fh);
}
else {
print STDERR "Unable to open $file\n";
exit(2);
}
}
}
sub usageAndExit {
my($msg) = shift;
if (defined $msg) {
print STDERR "ERROR: $msg\n";
}
print STDERR 'Usage: ', basename($0), " [-I <directory>] <config headers>\n\n",
"This script will provide a set of macros that may possibly\n",
"be removed from ACE.\n\n",
"It should be run under ACE_wrappers/ace and the input should\n",
"be the config header file or files planned for removal.\n";
exit(1);
}
# ************************************************************
# Main Section
# ************************************************************
my(@files) = ();
my(@dirs) = ('.', 'os_include', 'os_include/sys',
'os_include/netinet', 'os_include/net',
'os_include/arpa',
);
for(my $i = 0; $i <= $#ARGV; ++$i) {
my($arg) = $ARGV[$i];
if ($arg =~ /^-/) {
if ($arg eq '-h') {
usageAndExit();
}
elsif ($arg eq '-I') {
++$i;
if (defined $ARGV[$i]) {
push(@dirs, $ARGV[$i]);
}
else {
usageAndExit('-I requires a directory parameter');
}
}
else {
usageAndExit("$arg is an unknown option");
}
}
else {
push(@files, $arg);
}
}
if (!defined $files[0]) {
usageAndExit();
}
## First find all of the control macros
my(%control) = ();
findMacros(3, \%control, @files);
## Now find all of the macros from the other config files
my(@other) = grep(!/config-all\.h|config-lite\.h/, <config-*.h>);
for(my $i = 0; $i <= $#other; ++$i) {
foreach my $file (@files) {
if ($other[$i] eq $file) {
splice(@other, $i, 1);
--$i;
last;
}
}
}
my(%other) = ();
findMacros(3, \%other, @other);
my(%notreferenced) = ();
foreach my $macro (keys %control) {
if (!defined $other{$macro}) {
$notreferenced{$macro} = $control{$macro};
}
}
## Find all other macros
my(@all) = ();
foreach my $dir (@dirs) {
my($orig) = getcwd();
if (chdir($dir)) {
my(@more) = <*.h *.i* *.cpp>;
if ($dir ne '.') {
foreach my $file (@more) {
$file = "$dir/$file";
}
}
push(@all, @more);
chdir($orig);
}
}
for(my $i = 0; $i <= $#all; ++$i) {
foreach my $file (@files, @other) {
if ($all[$i] eq $file) {
splice(@all, $i, 1);
--$i;
last;
}
}
}
my(%all) = ();
findMacros(2, \%all, @all);
foreach my $macro (sort keys %notreferenced) {
if (defined $all{$macro}) {
print "$macro\n";
}
}