98 lines · 2.3 KB · Python
RawDownload
"""Support functions for loading the reference count data file."""__version__ = '$Revision: 35267 $' import osimport 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 = pdel 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 = 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()