summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-09-02 04:43:30 (GMT)
committerGuido van Rossum <guido@python.org>2001-09-02 04:43:30 (GMT)
commit43db62e2636a456cb78c86efc17c85335f64f1ef (patch)
tree645e0e78c972bb324205610c1ed217e8f2e310c1
parentaa78236636d62a07af4759b64ea89452c6690c7e (diff)
downloadcpython-43db62e2636a456cb78c86efc17c85335f64f1ef.zip
cpython-43db62e2636a456cb78c86efc17c85335f64f1ef.tar.gz
cpython-43db62e2636a456cb78c86efc17c85335f64f1ef.tar.bz2
A grep-like tool that looks for division operators.
-rwxr-xr-xTools/scripts/finddiv.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/Tools/scripts/finddiv.py b/Tools/scripts/finddiv.py
new file mode 100755
index 0000000..47b6f12
--- /dev/null
+++ b/Tools/scripts/finddiv.py
@@ -0,0 +1,89 @@
+#! /usr/bin/env python
+
+"""finddiv - a grep-like tool that looks for division operators.
+
+Usage: finddiv [-l] file_or_directory ...
+
+For directory arguments, all files in the directory whose name ends in
+.py are processed, and subdirectories are processed recursively.
+
+This actually tokenizes the files to avoid false hits in comments or
+strings literals.
+
+By default, this prints all lines containing a / or /= operator, in
+grep -n style. With the -l option specified, it prints the filename
+of files that contain at least one / or /= operator.
+"""
+
+import os
+import sys
+import getopt
+import tokenize
+
+def main():
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "lh")
+ except getopt.error, msg:
+ usage(msg)
+ return 2
+ if not args:
+ usage("at least one file argument is required")
+ return 2
+ listnames = 0
+ for o, a in opts:
+ if o == "-h":
+ print __doc__
+ return
+ if o == "-l":
+ listnames = 1
+ exit = None
+ for file in args:
+ x = process(file, listnames)
+ exit = exit or x
+ return exit
+
+def usage(msg):
+ sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
+ sys.stderr.write("Usage: %s [-l] file ...\n" % sys.argv[0])
+ sys.stderr.write("Try `%s -h' for more information.\n" % sys.argv[0])
+
+def process(file, listnames):
+ if os.path.isdir(file):
+ return processdir(file, listnames)
+ try:
+ fp = open(file)
+ except IOError, msg:
+ sys.stderr.write("Can't open: %s\n" % msg)
+ return 1
+ g = tokenize.generate_tokens(fp.readline)
+ lastrow = None
+ for type, token, (row, col), end, line in g:
+ if token in ("/", "/="):
+ if listnames:
+ print file
+ break
+ if row != lastrow:
+ lastrow = row
+ print "%s:%d:%s" % (file, row, line),
+ fp.close()
+
+def processdir(dir, listnames):
+ try:
+ names = os.listdir(dir)
+ except os.error, msg:
+ sys.stderr.write("Can't list directory: %s\n" % dir)
+ return 1
+ files = []
+ for name in names:
+ fn = os.path.join(dir, name)
+ if os.path.normcase(fn).endswith(".py") or os.path.isdir(fn):
+ files.append(fn)
+ files.sort(lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b)))
+ exit = None
+ for fn in files:
+ x = process(fn, listnames)
+ exit = exit or x
+ return exit
+
+if __name__ == "__main__":
+ sys.exit(main())