diff options
author | Fred Drake <fdrake@acm.org> | 1999-10-20 21:50:31 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 1999-10-20 21:50:31 (GMT) |
commit | d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4 (patch) | |
tree | ab930518cf59d59e3ef37c2f93f0f1ebf3dad68c | |
parent | 805bf1b330aec153eb9a3487e48a9a0dc3b90503 (diff) | |
download | cpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.zip cpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.tar.gz cpython-d6512808f0e5b0953367eeef5adc6a4a7aaaa8c4.tar.bz2 |
Module/script to parse the reference count data file and make the
information accessible to Python.
When run as a script, just dumps the information back out in the data
format, with functions in sorted order and a blank line between
different functions.
Still need to apply the information somehow.
-rw-r--r-- | Doc/tools/refcounts.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/Doc/tools/refcounts.py b/Doc/tools/refcounts.py new file mode 100644 index 0000000..6056328 --- /dev/null +++ b/Doc/tools/refcounts.py @@ -0,0 +1,95 @@ +"""Support functions for loading the reference count data file.""" +__version__ = '$Revision$' + +import os +import string +import sys + + +# Determine the expected location of the reference count file: +try: + p = os.path.dirname(__file__) +except NameError: + p = sys.path[0] +p = os.path.normpath(os.path.join(os.getcwd(), p, os.pardir, + "api", "refcounts.dat")) +DEFAULT_PATH = p +del p + + +def load(path=DEFAULT_PATH): + return loadfile(open(path)) + + +def loadfile(fp): + d = {} + while 1: + line = fp.readline() + if not line: + break + line = string.strip(line) + if line[:1] in ("", "#"): + # blank lines and comments + continue + parts = string.split(line, ":", 4) + function, type, arg, refcount, comment = parts + if refcount: + refcount = int(refcount) + else: + refcount = None + # + # Get the entry, creating it if needed: + # + try: + entry = d[function] + except KeyError: + entry = d[function] = Entry(function) + # + # Update the entry with the new parameter or the result information. + # + if arg: + entry.args.append((arg, type, refcount)) + else: + entry.result_type = type + entry.result_refs = refcount + return d + + +class Entry: + def __init__(self, name): + self.name = name + self.args = [] + self.result_type = '' + self.result_refs = None + + +def dump(d): + """Dump the data in the 'canonical' format, with functions in + sorted order.""" + items = d.items() + items.sort() + first = 1 + for k, entry in items: + if first: + first = 0 + else: + print + s = entry.name + ":%s:%s:%s:" + if entry.result_refs is None: + r = "" + else: + r = entry.result_refs + print s % (entry.result_type, "", r) + for t, n, r in entry.args: + if r is None: + r = "" + print s % (t, n, r) + + +def main(): + d = load() + dump(d) + + +if __name__ == "__main__": + main() |