ASIC/FPGA Design and Verification Out Source Services
Run a perl script from vim on a block, to create a list of all c, c++
loaded files.
-
As it is usual the case, which is presented in this site, some data (text) need
to be extracted from a simulation log file.
In this case all c, c++ and header files are the data to be extracted and
create a list of all files, which were loaded, based on it.
-
The algorithm is simple. Look for \.[ch] lines.
Upon finding such a line, split on spaces to an array.
Do more filtering like: start and end characters, remove " etc....
-
Note: Some of the filtering is done by using perl's index and substr
functions. It is easier and quicker to find the first occurrence of
a single character in a string and trim the string accordingly.
-
To execute the script form within vim, type, after putting tags at the start and stop, to mark the block of text, that vim passes to the perl script:
:'a,'b !perl ~/bin/vim_extract_c_cc_h.pl
If you need to work on all the file, then there is no need to put any
marks. Simply use the file operator:
:% !perl ~/bin/vim_extract_c_cc_h.pl
You might also need to pipe the result to remove file repetition:
cat file | sort | uniq
-
The code is shown below:
#!/bin/perl
#works on FC log
#extracts loaded files with the following suffixes .c .cc .h
#ignore all others
#invocation from within vim
#:'a,'b !perl ~/bin/vim_extract_c_cc_h.pl
while (<STDIN>) {
if($_ =~ /\.[ch]/) {
chomp($_);
#.c .cc .h
#does it contain spaces
@a=split(/ /, $_);
$a_n=@a;
if($a_n == 1) { &prt($_); }
else {
foreach $j ( @a ) {
if($j =~ /\.[ch]/) {
&prt($j);
}
}#foreach
}
}
}
sub prt {
#remove "
my $buf=$_[0];
if($buf =~ /.*"(.*\.[ch].*)/) {
$buf=$1;
}
#filter .c:111
my $ix=index($buf, ':');
if($ix >= 0) {
$buf=substr($buf, 0, $ix);
}
#must start with a character or /
if($buf =~ /^[A-Za-z\/].*\.[ch]$/) {
print("$buf\n");
}
elsif($buf =~ /\.cc/) {
print("$buf\n");
}
}
|