1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#!/bin/sh
#fptags - Create an emacs tags file for functional programs
#Please send me a copy of any modifications you make.
#Denis Howe <dbh@doc.ic.ac.uk>
#0.00 20-Sep-1991 created
#0.01 09-Apr-1992 don't count ==, <=, >= as definition
#0.02 09-Feb-1994 fix bug in fix 0.01. Add /=.
# partain: got it from wombat.doc.ic.ac.uk:pub
#The algorithm for spotting identifiers is crude to the point of
#vulgarity. Any line containing an = is assumed to define an
#identifier. If there are no non-white characters before the = then
#the definition is assumed to start on the previous line. White
#characters are space, tab and > (for literate programs). The =s in
#the relations ==, <=, >= and /= are temporarily transformed while
#searching for =s.
#The tags file is not in the format produced by ctags but rather,
#that produced by etags and used by GNU-Emacs's find-tag command.
#Does not tag constructors in sum data types.
#The tags file, TAGS, is created in the current directory. It
#contains an entry for each argument file. The entry begins with a
#line containing just ^L. The next line contains the filename, a
#comma and the number of following bytes before the next ^L or EOF.
#Subsequent lines should give the location within the argument file of
#identifier definitions. Each line contains a prefix of a line from
#the argument file, a ^?, the line number within the argument file, a
#comma and the position of the start of that line in the argument file
#(first character = 1).
[ -z "$1" ] && echo usage: $0 files && exit 1
exec > TAGS
tf=/tmp/fp$$
for f
do echo ""
sed 's/==//g
s/>=/>/g
s/<=/</g
s|/=|/|g' $f | awk '
/^[> ]*=/{ print prevline "" NR-1 "," prevpos; }
/[^> ].*=/{ print $0 "" NR "," pos; }
{ prevline = $0; prevpos = pos; pos += length($0)+1; }
' pos=1 | sed 's/[ )]*=.*//
s//=/g' > $tf
echo -n $f,; echo `wc -c < $tf` #lose spaces
cat $tf
done
rm -f $tf
|