tripwire-open-source/src/check_st.pl

105 lines
2.9 KiB
Perl
Executable File

###############################################################################
# check_st.pl
#
# created 26 may 1999 mdb
#
# Purpose:
# This script verifies that all of the string refrenced in a tripwire string
# table header file has a corresponding entry in the .cpp file
#
# Usage:
# Run from the root Tripwire directory. set PKGS to the package names that you
# want to check.
#
# TODO: gracefully handle packages with no string table
# TODO: handle commented out blocks in cpp files.
#
@PKGS = ( "core", "fco", "tw", "fs", "ntfs",
"ntreg", "siggen", "tripwire", "twadmin", "twprint" );
##-----------------------------------------------------------------------------
## execute main
##-----------------------------------------------------------------------------
sub main;
main();
exit 0;
##-----------------------------------------------------------------------------
## make_string_list
##
## opens the string header file and retrieves all of the string enums
## (identified by lines starting with \s*STR_) and returns them in a list
##
## Parameters:
## package name (ie -- core)
##-----------------------------------------------------------------------------
sub make_string_list
{
my $pkg_name = shift( @_ );
my $header_name = "${pkg_name}/${pkg_name}strings.h";
my @rtn_list;
open( IN, "<$header_name" ) || die "Unable to open $header_name\n";
while( <IN> )
{
if( /^\s*(STR_[a-zA-Z0-9_]+)/ )
{
push( @rtn_list, $1 );
}
}
close( IN );
return @rtn_list;
}
##-----------------------------------------------------------------------------
## verify_string_list
##
## takes as input a list of string identifiers, opens the string cpp
## file and makes sure that all strings in the list appear in that file.
##
## Limitation:
## can't tell whether entries in the cpp file are commented out.
##-----------------------------------------------------------------------------
sub verify_string_list
{
my $pkg_name = shift( @_ );
my @str_list = @_;
my $cpp_name = "${pkg_name}/${pkg_name}strings.cpp";
my @cpp_lines;
my $result;
# first, load the entire cpp file into an array...
#
open( IN, "<$cpp_name" ) || die "Unable to open $cpp_name\n";
while( <IN> )
{
push( @cpp_lines, $_ );
}
# now, iterate through the string list, looking for each
# string in the cpp file.
#
foreach $str (@str_list)
{
$result = grep( /$str/, @cpp_lines );
if( $result == 0 )
{
print "$str is missing from $pkg_name string table!\n";
}
}
}
##-----------------------------------------------------------------------------
## main
##-----------------------------------------------------------------------------
sub main
{
my @str_list;
foreach $pkg (@PKGS)
{
print "\n*** Processing $pkg ***\n";
@str_list = make_string_list( $pkg );
verify_string_list( $pkg, @str_list );
}
}