Help Files: Fortran77: Cross References


#/bin/csh -f
more << 'EOT'



     HELP                      Oct. 15, 1984                  F77/XREF



                     Cross References for F77 Programs

     The f77 compiler does not produce listings or cross references.
     This help file generates a cross reference for an f77 program.
     To get a corresponding listing of the program including line
     numbers, use 'cat -n'.

     The script is simple-minded and assumes:

     1.  Blanks are significant, i.e. there are no blanks in the middle
         of variable names, command keywords, and statement numbers.
     2.  Names, keywords, statement numbers and strings are not split
         across lines.

     The script is easily confused by:

     1.  Counted Holleriths outside of format statements.
     2.  The presence of both " and ' in the same line outside of format
         statements.

     All alphanumeric strings starting with a letter are tallied in the
     cross reference.  The script can not tell the difference between
     'do', 'if', ..  used as keywords or as variable names.  Since f77
     allows 16 character names, even 'continue' and 'equivalence' could
     be variable names.

     Similarly, if a number is used both as a statement number and as an
     integer, both uses are tallied.

     The script is very slow, about 3 lines/second on a VAX 750.

'EOT'
echo -n "enter input file name, carriage return to exit: "
set in_file = $<
if( $in_file == '' ) then
exit(0)
endif
echo -n "enter output file name, carriage return to exit: "
set out_file = $<
if( $out_file == '' ) then
exit(0)
endif
if( $out_file !~ /* ) then
set out_file = `pwd`/${out_file}
endif
echo -n "enter 'y' if input file has sequence information in columns 73-80: "
if( $< =~ y* ) then
set sequencing = "yes"
else
set sequencing = "no"
endif
#
unset time
set dir = /tmp/f77_xref$$
/bin/rm -f -r $dir
mkdir $dir
#
#via 'sed': replace comment lines by null lines
#replace 0 in col. 6 by " "
#replace contin. char in col. 6 by '_' in col. 1
#delete strings:  "..."  or  '...'
#add spaces around "format" so it'll be separate awk field
#
cat << 'EOT'  >! $dir/sed1
/^[cC*]/s/^.*$//
/^     0/s// /
/^     [^ ]/s//_ /
/".*"/s/"[^"]*"/ /g
/'.*'/s/'[^']*'/ /g
/format/s// format /g
'EOT'
if( $sequencing == "yes" ) then
colrm 73 < $in_file | sed -f $dir/sed1  >! $dir/step1
else
sed -f $dir/sed1 < $in_file  >! $dir/step1
endif
#now blank out format statements including continuation cards
#also save numbers in statement number field in file 'labels'
cd $dir
cat << 'EOT' >! awk1
{ if ( $2 == "format" ) {
print $1;
print "%" $1 >> "labels";
prev = "format";
  } else if ( ( $1 == "&" || $1 == "_") && prev == "format" ) {
print " ";
  } else if ( length == 0 ) {
print ;
  } else {
c1 = substr( $1, 1, 1 );
if( c1 >= "0" && c1 <= "9" ) print "%" $1 >> "labels";
print ;
prev = " ";
  }
}
'EOT'
cat /dev/null >! labels
awk -f awk1  < step1 >! step2
#tr: get rid of special characters
#awk: add line number to each word and split into one word/line
#then sort and get count of dups
cat << 'EOT' >! awk2
{ { for ( i = 1; i <= NF; i++ ) print $i , NR } }
'EOT'
tr  -cs 'A-Za-z0-9\012' ' ' < step2  | awk -f awk2 | sort +0 -1 +1n labels - |     uniq -c >! step3
#print it out, one word + references per line
cat << 'EOT' >! awk3
{ c1 = substr($2,1,1);
  use = "y";
  if ( c1 == "%" ) {      # label definition
$2 = substr($2,2,length($2));
labels[ $2 ] = "y";
use = "";
  } else if ( c1 >= "0" && c1 <= "9" && labels[ $2 ] == "" )
use = "";# starts with digit, but not a label.
  if ( use != "" ) {
     if ( $2 == prev ) {
if ( length(refs) > 66 ) {
print refs;
refs = prev " (cont.)";
}
     } else {
prev = $2;
print refs;
refs = $2 "";
     }
     refs = refs " " $3;
     if( $1 != 1 ) refs = refs "(" $1 ")";
  }
}
END { if( refs != "" ) print refs; }
'EOT'
awk -f awk3 < step3 | sort -n >! $out_file
/bin/rm -f -r $dir


Comments to decf@euler.berkeley.edu
© 1998 UC Regents