diff options
-rwxr-xr-x | Tools/scripts/eptags.py | 91 | ||||
-rwxr-xr-x | Tools/scripts/ptags.py | 59 |
2 files changed, 78 insertions, 72 deletions
diff --git a/Tools/scripts/eptags.py b/Tools/scripts/eptags.py index 58021b4..0e93447 100755 --- a/Tools/scripts/eptags.py +++ b/Tools/scripts/eptags.py @@ -1,50 +1,55 @@ #! /usr/bin/env python +"""Create a TAGS file for Python programs, usable with GNU Emacs. -# eptags -# -# Create a TAGS file for Python programs, usable with GNU Emacs (version 18). -# Tagged are: -# - functions (even inside other defs or classes) -# - classes -# Warns about files it cannot open. -# No warnings about duplicate tags. +usage: eptags pyfiles... -import sys -import regex +The output TAGS file is usable with Emacs version 18, 19, 20. +Tagged are: + - functions (even inside other defs or classes) + - classes -def main(): - outfp = open('TAGS', 'w') - args = sys.argv[1:] - for file in args: - treat_file(file, outfp) +eptags warns about files it cannot open. +eptags will not give warnings about duplicate tags. + +BUGS: + Because of tag duplication (methods with the same name in different + classes), TAGS files are not very useful for most object-oriented + python projects. +""" +import sys,re -expr = '^[ \t]*\(def\|class\)[ \t]+\([a-zA-Z0-9_]+\)[ \t]*[:(]' -matcher = regex.compile(expr) +expr = r'^[ \t]*(def|class)[ \t]+([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*[:\(]' +matcher = re.compile(expr) def treat_file(file, outfp): - try: - fp = open(file, 'r') - except: - print 'Cannot open', file - return - charno = 0 - lineno = 0 - tags = [] - size = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - if matcher.search(line) >= 0: - (a, b), (a1, b1), (a2, b2) = matcher.regs[:3] - name = line[a2:b2] - pat = line[a:b] - tag = pat + '\177' + `lineno` + ',' + `charno` + '\n' - tags.append((name, tag)) - size = size + len(tag) - charno = charno + len(line) - outfp.write('\f\n' + file + ',' + `size` + '\n') - for name, tag in tags: - outfp.write(tag) - -main() + """Append tags found in file named 'file' to the open file 'outfp'""" + try: + fp = open(file, 'r') + except: + sys.stderr.write('Cannot open %s\n'%file) + return + charno = 0 + lineno = 0 + tags = [] + size = 0 + while 1: + line = fp.readline() + if not line: break + lineno = lineno + 1 + m = matcher.search(line) + if m: + tag = m.group(0) + '\177%d,%d\n'%(lineno,charno) + tags.append(tag) + size = size + len(tag) + charno = charno + len(line) + outfp.write('\f\n%s,%d\n'%(file,size)) + for tag in tags: + outfp.write(tag) + +def main(): + outfp = open('TAGS', 'w') + for file in sys.argv[1:]: + treat_file(file, outfp) + +if __name__=="__main__": + main() diff --git a/Tools/scripts/ptags.py b/Tools/scripts/ptags.py index f63746e..f7f7eb5 100755 --- a/Tools/scripts/ptags.py +++ b/Tools/scripts/ptags.py @@ -10,41 +10,42 @@ # Warns about files it cannot open. # No warnings about duplicate tags. -import sys -import regex -import os +import sys, re, os -tags = [] # Modified global variable! +tags = [] # Modified global variable! def main(): - args = sys.argv[1:] - for file in args: treat_file(file) - if tags: - fp = open('tags', 'w') - tags.sort() - for s in tags: fp.write(s) + args = sys.argv[1:] + for file in args: treat_file(file) + if tags: + fp = open('tags', 'w') + tags.sort() + for s in tags: fp.write(s) -expr = '^[ \t]*\(def\|class\)[ \t]+\([a-zA-Z0-9_]+\)[ \t]*[:(]' -matcher = regex.compile(expr) +expr = '^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]' +matcher = re.compile(expr) def treat_file(file): - try: - fp = open(file, 'r') - except: - print 'Cannot open', file - return - base = os.path.basename(file) - if base[-3:] == '.py': base = base[:-3] - s = base + '\t' + file + '\t' + '1\n' - tags.append(s) - while 1: - line = fp.readline() - if not line: break - if matcher.search(line) >= 0: - (a, b), (a1, b1), (a2, b2) = matcher.regs[:3] - name = line[a2:b2] - s = name + '\t' + file + '\t/^' + line[a:b] + '/\n' - tags.append(s) + try: + fp = open(file, 'r') + except: + sys.stderr.write('Cannot open %s\n' % file) + return + base = os.path.basename(file) + if base[-3:] == '.py': + base = base[:-3] + s = base + '\t' + file + '\t' + '1\n' + tags.append(s) + while 1: + line = fp.readline() + if not line: + break + m = matcher.match(line) + if m: + content = m.group(0) + name = m.group(2) + s = name + '\t' + file + '\t/^' + content + '/\n' + tags.append(s) main() |