"""Support functions for loading the reference count data file.""" __version__ = '$Revision$' import os import sys # Determine the expected location of the reference count file: try: p = os.path.dirname(__file__) except NameError: p = os.path.dirname(sys.argv[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 = line.strip() if line[:1] in ("", "#"): # blank lines and comments continue parts = line.split(":", 4) if len(parts) != 5: raise ValueError("Not enough fields in %r" % line) function, type, arg, refcount, comment = parts if refcount == "null": refcount = None elif 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 = sorted(d.items()) 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()