|
|
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.