|
|
1.1 ! root 1: # /bin/csh -f ! 2: more << 'EOT' ! 3: ##nroff ! 4: .TI F77/XREF "Oct. 15, 1984" ! 5: Cross References for F77 Programs ! 6: .ds CF ! 7: ! 8: .nf ! 9: The f77 compiler does not produce listings or cross references. ! 10: This help file generates a cross reference for an f77 program. ! 11: To get a corresponding listing of the program including line ! 12: numbers, use 'cat -n'. ! 13: ! 14: The script is simple-minded and assumes: ! 15: ! 16: 1. Blanks are significant, i.e. there are no blanks in the middle ! 17: of variable names, command keywords, and statement numbers. ! 18: 2. Names, keywords, statement numbers and strings are not split ! 19: across lines. ! 20: ! 21: The script is easily confused by: ! 22: ! 23: 1. Counted Holleriths outside of format statements. ! 24: 2. The presence of both " and ' in the same line outside of format ! 25: statements. ! 26: ! 27: All alphanumeric strings starting with a letter are tallied in the ! 28: cross reference. The script can not tell the difference between ! 29: \&'do', 'if', .. used as keywords or as variable names. Since f77 ! 30: allows 16 character names, even 'continue' and 'equivalence' could ! 31: be variable names. ! 32: ! 33: Similarly, if a number is used both as a statement number and as an ! 34: integer, both uses are tallied. ! 35: ! 36: The script is very slow, about 3 lines/second on a VAX 750. ! 37: ! 38: ## ! 39: 'EOT' ! 40: echo -n "enter input file name, carriage return to exit: " ! 41: set in_file = $< ! 42: if( $in_file == '' ) then ! 43: exit(0) ! 44: endif ! 45: echo -n "enter output file name, carriage return to exit: " ! 46: set out_file = $< ! 47: if( $out_file == '' ) then ! 48: exit(0) ! 49: endif ! 50: if( $out_file !~ /* ) then ! 51: set out_file = `pwd`/${out_file} ! 52: endif ! 53: echo -n "enter 'y' if input file has sequence information in columns 73-80: " ! 54: if( $< =~ y* ) then ! 55: set sequencing = "yes" ! 56: else ! 57: set sequencing = "no" ! 58: endif ! 59: # ! 60: unset time ! 61: set dir = /tmp/f77_xref$$ ! 62: /bin/rm -f -r $dir ! 63: mkdir $dir ! 64: # ! 65: # via 'sed': replace comment lines by null lines ! 66: # replace 0 in col. 6 by " " ! 67: # replace contin. char in col. 6 by '_' in col. 1 ! 68: # delete strings: "..." or '...' ! 69: # add spaces around "format" so it'll be separate awk field ! 70: # ! 71: cat << 'EOT' >! $dir/sed1 ! 72: /^[cC*]/s/^.*$// ! 73: /^ 0/s// / ! 74: /^ [^ ]/s//_ / ! 75: /".*"/s/"[^"]*"/ /g ! 76: /'.*'/s/'[^']*'/ /g ! 77: /format/s// format /g ! 78: 'EOT' ! 79: if( $sequencing == "yes" ) then ! 80: colrm 73 < $in_file | sed -f $dir/sed1 >! $dir/step1 ! 81: else ! 82: sed -f $dir/sed1 < $in_file >! $dir/step1 ! 83: endif ! 84: # now blank out format statements including continuation cards ! 85: # also save numbers in statement number field in file 'labels' ! 86: cd $dir ! 87: cat << 'EOT' >! awk1 ! 88: { if ( $2 == "format" ) { ! 89: print $1; ! 90: print "%" $1 >> "labels"; ! 91: prev = "format"; ! 92: } else if ( ( $1 == "&" || $1 == "_") && prev == "format" ) { ! 93: print " "; ! 94: } else if ( length == 0 ) { ! 95: print ; ! 96: } else { ! 97: c1 = substr( $1, 1, 1 ); ! 98: if( c1 >= "0" && c1 <= "9" ) print "%" $1 >> "labels"; ! 99: print ; ! 100: prev = " "; ! 101: } ! 102: } ! 103: 'EOT' ! 104: cat /dev/null >! labels ! 105: awk -f awk1 < step1 >! step2 ! 106: # tr: get rid of special characters ! 107: # awk: add line number to each word and split into one word/line ! 108: # then sort and get count of dups ! 109: cat << 'EOT' >! awk2 ! 110: { { for ( i = 1; i <= NF; i++ ) print $i , NR } } ! 111: 'EOT' ! 112: tr -cs 'A-Za-z0-9\012' ' ' < step2 | awk -f awk2 | sort +0 -1 +1n labels - | uniq -c >! step3 ! 113: # print it out, one word + references per line ! 114: cat << 'EOT' >! awk3 ! 115: { c1 = substr($2,1,1); ! 116: use = "y"; ! 117: if ( c1 == "%" ) { # label definition ! 118: $2 = substr($2,2,length($2)); ! 119: labels[ $2 ] = "y"; ! 120: use = ""; ! 121: } else if ( c1 >= "0" && c1 <= "9" && labels[ $2 ] == "" ) ! 122: use = ""; # starts with digit, but not a label. ! 123: if ( use != "" ) { ! 124: if ( $2 == prev ) { ! 125: if ( length(refs) > 66 ) { ! 126: print refs; ! 127: refs = prev " (cont.) "; ! 128: } ! 129: } else { ! 130: prev = $2; ! 131: print refs; ! 132: refs = $2 " "; ! 133: } ! 134: refs = refs " " $3; ! 135: if( $1 != 1 ) refs = refs "(" $1 ")"; ! 136: } ! 137: } ! 138: END { if( refs != "" ) print refs; } ! 139: 'EOT' ! 140: awk -f awk3 < step3 | sort -n >! $out_file ! 141: /bin/rm -f -r $dir
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.