# profevts.pl # Thierry Fevrier 25-Feb-2000 # # Perl script to generate IA64 profiling events. # # Caveats: # sorry but it is my first perl script... # and it was done very quickly to satisfy the needs # of a simple program. # require 5.001; # Forward declarations sub Usage; sub PrintProlog; sub PrintBody; sub HalpProfileMappingToSource; sub PrintEpilog; # Contants my $SCRIPT_VERSION = "1.00"; my $SCRIPT_CMD = "profevts.pl"; my $SCRIPT_LONGVERSION = "PROFEVTS.PL Version $SCRIPT_VERSION"; my $typedstr = "HalpProfileMapping"; if ($#ARGV != 0) { $error = "requires 1 arguments..."; Usage($error); } my $filename = $ARGV[0]; if (-e $filename && -T $filename) { open(FH, "<$filename") || die "$SCRIPT_CMD: could not open $filename...\n"; } else { $error = "$filename does not exist or is not a text file..."; Usage($error); } while ( ) { # look for the specified string if ( ($_ =~ /$typedstr/) && ($_ =~ /\[.*\]/) && ($_ =~ /\{/) ) { chop $_; PrintProlog( $typedstr ); if ( PrintBody( ) ) { PrintEpilog( $typedstr ); last; } else { print "Parsing failed...\n"; } } } close(FH); exit 0; sub PrintBody { # Note: in_comment is really for the section defining the structure. # I do not handle the case if the structure is inside a comment block. my $in_comment = 0; my $index = 0; LINE: while () { local($line) = $_; #print $line; if ( $line =~ /^\s*#.*$/ ) { chop $line; #print "Found pre-processor macro \"$line\" in $typedstr...\n"; print "$line\n"; next LINE; } local($line) = $_; if ( $in_comment ) { # Does this line have the end of the C comment? # if ($line =~ /\*\//) { # Yes. Keep everything after the end of the # comment and keep going with normal processing $line = $'; $in_comment = 0; } else { next LINE; } } # Remove single line C "/* */" comments $line =~ s/\/\*.*?\*\///g; # Remove any "//" comments # Make sure the start of the comment is NOT # inside a string if (($line =~ /\/\//) && ($line !~ /\".*?\/\/.*?\"/)) { $line =~ s/\/\/.*$/ /; } # Multi-line C comment? # Make sure the start of the comment is NOT # inside a string if (($line =~ /\/\*/) && ($line !~ /\".*?\/\*.*?\"/)) { # Grab anything before the comment # Need to make it look like there's still a EOL marker $line = $` . "\n"; # Remember that we're in "comment" mode $in_comment = 1; next LINE; } local($line_pack) = $line; # Replace spaces between word characters with '#' $line_pack =~ s/(\w)\s+(\w)/$1#$2/g; # remove whitespace $line_pack =~ tr/ \t//d; # Remove quoted double-quote characters $line_pack =~ s/'\\?"'/'_'/g; # Remove any strings # Note: Doesn't handle quoted quote characters correctly $line_pack =~ s/"[^"]*"/_/g; # Remove any "//" comments $line_pack =~ s/\/\/.*$//; # For empty lines, if ( $line_pack eq "\n" ) { next LINE; } if ( $line_pack =~ /^\}/) { return $index; } # Remove beginning "{" $line_pack =~ s/^\{(.*)\}.*$/$1/; # print "line_pack: $line_pack\n"; @words = split(/,/, $line_pack); HalpProfileMappingToSource( $index, @words ); $index++; next LINE; } return 0; } sub HalpProfileMappingToSource { local($idx, $supported, $event, $profileSource, $profileSourceMask, $interval, $defInterval, $maxInterval, $minInterval) = @_; if ( $idx eq 0 ) { print " \{ \"ProfileTime\", ProfileTime, \"ProfileTime\", $defInterval, $defInterval \}"; } elsif ( $supported eq "FALSE" ) { print ",\n \{ \"INVALID_$idx\", ProfileIA64Maximum, \"INVALID_$idx\", 0, 0 \}"; } else { print ",\n \{ \"$event\", Profile$event, \"$event\", $defInterval, 0 \}"; } } sub PrintProlog { local($str) = @_; local($basename) = $filename; local($header) = $filename; local($arrayname); $basename =~ s/.*\\(.*).[ch]/$1/; $arrayname = $basename . "StaticSources"; if ($header !~ /\.h/) { $header =~ s/\.c$/\.h/; } print "\/\/\n"; print "\/\/ This file is automatically generated by $SCRIPT_CMD, parsing\n"; print "\/\/ $filename.\n"; print "\/\/\n\n"; print "\#include \"$header\"\n\n"; print "SOURCE\n"; print "$arrayname\[\] = \{\n"; } sub PrintEpilog { local($str) = @_; print "\n};\n"; } sub Usage { local($error) = @_; die "$error\n", "$SCRIPT_LONGVERSION\n", "Usage : $SCRIPT_CMD filename\n", "Options:\n", " filename file containing the IA64 $typedstr definition\n"; }