| """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 = 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() |