trick/bin/pm/get_headers.pm

111 lines
3.8 KiB
Perl
Raw Normal View History

2015-02-26 15:02:31 +00:00
package get_headers ;
use Exporter ();
@ISA = qw(Exporter);
@EXPORT = qw(get_headers);
use File::Basename ;
use strict ;
use Cwd 'abs_path';
my ( @inc_paths , @valid_inc_paths ) ;
my %immediate_includes ;
my %visited_files ;
sub parse_file($$) {
my ($file_name, $sim_ref) = @_ ;
my $curr_path ;
if ( ! exists $visited_files{$file_name} ) {
$visited_files{$file_name} = 1 ;
$curr_path = dirname($file_name) ;
open my $fh, $file_name or warn "Could not open file $file_name" ;
while ( <$fh> ) {
if ( /^\s*#\s*include\s+\"(.*)\"/ ) {
#print "$1\n" ;
my ($include_file) = $1 ;
my $include_file_full_path ;
if ( -e "$curr_path/$include_file") {
$include_file_full_path = abs_path(dirname("$curr_path/$include_file")) . "/" . basename("$include_file");
$immediate_includes{$file_name}{$include_file_full_path} = 1 ;
#print "1 $include_file_full_path\n" ;
parse_file( $include_file_full_path , $sim_ref );
} else {
my ($found) = 0 ;
foreach my $p ( @inc_paths ) {
if ( -e "$p/$include_file" || -e "$include_file" ) {
if ( -e "$p/$include_file" ) {
$include_file_full_path = abs_path(dirname("$p/$include_file")) . "/" . basename("$include_file");
} else {
$include_file_full_path = $include_file ;
}
#print "2 $include_file_full_path\n" ;
$immediate_includes{$file_name}{$include_file_full_path} = 1 ;
$found = 1 ;
parse_file( $include_file_full_path , $sim_ref );
last ;
}
}
if ( $found == 0 ) {
#print "could not file $include_file in $file_name\n" ;
}
}
} elsif ( /ICG:/i ) {
my ($line) = $_ ;
my ($next_line) ;
do {
$next_line = <$fh> ;
$line .= $next_line ;
} while ( $next_line =~ /^\s*$/ and !eof($fh) ) ;
if ( $line =~ /\(\s*No\s*\)/si ) {
#print "ICG no found in $file_name\n" ;
$$sim_ref{icg_no}{$file_name} = 1 ;
}
}
}
}
}
sub get_all_includes($$$) {
my ($sim_ref , $top_file , $curr_file ) = @_ ;
foreach my $f ( keys %{$immediate_includes{$curr_file}} ) {
if ( ! exists $$sim_ref{all_includes}{$top_file}{$f} ) {
$$sim_ref{all_includes}{$top_file}{$f} = 1 ;
get_all_includes( $sim_ref , $top_file , $f ) ;
}
}
}
sub get_headers($$) {
my ( $sim_ref, $top_file ) = @_ ;
@inc_paths = $ENV{"TRICK_CFLAGS"} =~ /-I\s*(\S+)/g ; # get include paths from TRICK_CFLAGS
push @inc_paths , "$ENV{TRICK_HOME}/trick_source" ;
push @inc_paths , "../include" ;
# Get only the include paths that exist
foreach (@inc_paths) {
push @valid_inc_paths , $_ if ( -e $_ ) ;
}
@inc_paths = @valid_inc_paths ;
parse_file($top_file, $sim_ref) ;
# make hash of all downward files that are included by $f
foreach my $f ( keys %immediate_includes ) {
get_all_includes($sim_ref , $f , $f) ;
}
# get all file modification times. The hash of $top_file plus S_source.hh constitute all include files
foreach my $f ( (keys %{$$sim_ref{all_includes}{$top_file}}) , $top_file ) {
$$sim_ref{mod_date}{$f} = (stat $f)[9] ;
}
}
1 ;