Annotation of OpenXM_contrib/pari/src/make_emacs_tags, Revision 1.1.1.1
1.1 maekawa 1: #!/bin/sh
2:
3: # Generate a tags file which contains PARI functions, and allows going
4: # to help-message for a PARI functions and to a PARI function of C function
5: # by repeated C-u M-.
6:
7: # If you are reading this, you may enjoy imenu-go.el from
8: # ftp://ftp.math.ohio-state.edu/pub/users/ilya/emacs/
9:
10: # Skip language/init.c, gp/gp_init.c and language/helpmessages.c:
11:
12: messages='language/helpmsg.c'
13: gp_init='gp/gp_init.c'
14: init_c='language/init.c'
15:
16: excluded=`perl -e 'print join "\n",
17: grep { $_ ne "'$init_c'"
18: and $_ ne "'$messages'"
19: and $_ ne "'$gp_init'" }
20: <*/*.[chs]>, <*/*/*.[chs]>'`
21:
22: etags $excluded
23:
24: # Process declarations like
25:
26: # {"polredord",1,(void*)ordred,6,"Gp"},
27:
28: # => an entry for polredord, and an entry for ordred as well
29: # (so that one may find which PARI function is implemented by the C one)
30:
31: re='[ \t]*{[ \t]*"\([a-zA-Z_0-9]+\)"[ \t]*,[ \t]*[0-9]+[ \t]*,[ \t]*([ \t]*void[ \t]*\*[ \t]*)[ \t]*\([a-zA-Z0-9+]+\)[ \t]*,'
32:
33: etags -a -l c -o TAGS.tmp -r "/$re/\\1/" -r "/$re/\\2/" $init_c
34:
35: # Process helpmessages too:
36: # "printtex(a): outputs a in TeX format",
37:
38: helpre='[ \t]*"\([a-zA-Z_0-9]+\)[=(]'
39:
40: etags -a -l c -o TAGS.tmp -r "/$re/\\1/" -r "/$re/\\2/" \
41: -r "/$helpre/\\1/" $gp_init
42:
43: etags -a -l c -o TAGS.tmp -r "/$helpre/\\1/" $messages
44:
45: # This would produces a wrong entry size - though AFAIK, nobody uses it
46: # uniq TAGS.tm >> TAGS
47:
48: perl -w014pe 'if (s/^(.*\n)\1+/$1/mg) { # Remove duplicate lines
49: $chars = chomp;
50: s/^((\n.+,)\d+)/ $2 . (length($_) - length($1) - 1) /e;
51: $_ .= ("\f" x $chars);
52: }' TAGS.tmp > TAGS.tm2
53:
54: # Since we generate *specific* definitions for the functions in the table,
55: # they will be prefered by Emacs over non-specific ones for the code, so we
56: # convert non-specific definitions into specific ones (with \x1):
57:
58: perl -w014pe 'if (s/^( [^\n\x7F\x01]*\b # 1: TAG group
59: (\w+) # 2: word
60: [^\w\x7F\x01\n]* # Most anything
61: \x7F # End of description
62: )
63: (\d+,\d+\n) # 3: TAGS Trail
64: /$1$2\x01$3/mgx) { # Add specific marking
65: $chars = chomp;
66: s/^((\n.+,)\d+)/ $2 . (length($_) - length($1) - 1) /e;
67: $_ .= ("\f" x $chars);
68: }' TAGS > TAGS.tm1 && mv TAGS.tm1 TAGS
69:
70: cat TAGS.tm2 >> TAGS
71: rm TAGS.tm*
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>