mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	 56aa6280f6
			
		
	
	
		56aa6280f6
		
	
	
	
	
		
			
			This still does not work well since ctags does not do a good job with the Python headers, appearantly due to the DL_IMPORT macro. ;-(
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/bin/env python
 | |
| 
 | |
| import errno
 | |
| import os
 | |
| import re
 | |
| import sys
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     _base = sys.argv[0]
 | |
| else:
 | |
|     _base = __file__
 | |
| 
 | |
| _script_home = os.path.abspath(os.path.dirname(_base))
 | |
| 
 | |
| srcdir = os.path.dirname(os.path.dirname(_script_home))
 | |
| 
 | |
| EXCLUDES = ["bitset.h", "cStringIO.h", "graminit.h", "grammar.h",
 | |
|             "longintrepr.h", "metagrammar.h",
 | |
|             "node.h", "opcode.h", "osdefs.h", "pgenheaders.h",
 | |
|             "py_curses.h", "parsetok.h", "symtable.h", "token.h"]
 | |
| 
 | |
| 
 | |
| def list_headers():
 | |
|     """Return a list of headers."""
 | |
|     incdir = os.path.join(srcdir, "Include")
 | |
|     return [fn for fn in os.listdir(incdir)
 | |
|             if fn.endswith(".h") and fn not in EXCLUDES]
 | |
| 
 | |
| 
 | |
| def matcher(pattern):
 | |
|     return re.compile(pattern).match
 | |
| 
 | |
| MATCHERS = [
 | |
|     matcher(r"\\begin\{cfuncdesc\}\{[^{]*\}\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\cfuncline\{[^{]*\}\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\begin\{ctypedesc\}(\[[^{]*\])?\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\begin\{cvardesc\}\{[^{]*\}\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\begin\{cmemberdesc\}\{[^{]*\}\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\cmemberline\{[^{]*\}\{(?P<sym>[^{]*)\}"),
 | |
|     matcher(r"\\begin\{csimplemacrodesc\}\{(?P<sym>[^{]*)\}"),
 | |
|     ]
 | |
| 
 | |
| 
 | |
| def list_documented_items():
 | |
|     """Return a list of everything that's already documented."""
 | |
|     apidir = os.path.join(srcdir, "Doc", "api")
 | |
|     files = [fn for fn in os.listdir(apidir) if fn.endswith(".tex")]
 | |
|     L = []
 | |
|     for fn in files:
 | |
|         fullname = os.path.join(apidir, fn)
 | |
|         for line in open(fullname):
 | |
|             line = line.lstrip()
 | |
|             if not line.startswith("\\"):
 | |
|                 continue
 | |
|             for matcher in MATCHERS:
 | |
|                 m = matcher(line)
 | |
|                 if m:
 | |
|                     L.append(m.group("sym"))
 | |
|                     break
 | |
|     return L
 | |
| 
 | |
| def split_documented(all, documented):
 | |
|     """Split the list of all symbols into documented and undocumented
 | |
|     categories."""
 | |
|     doc = []
 | |
|     undoc = []
 | |
|     for t in all:
 | |
|         if t[0] in documented:
 | |
|             doc.append(t)
 | |
|         else:
 | |
|             undoc.append(t)
 | |
|     return doc, undoc
 | |
| 
 | |
| def print_list(L, title=None):
 | |
|     """Dump a list to stdout."""
 | |
|     if title:
 | |
|         print title + ":"
 | |
|         print "-" * (len(title) + 1)
 | |
|     w = 0
 | |
|     for sym, filename in L:
 | |
|         w = max(w, len(sym))
 | |
|     if w % 4 == 0:
 | |
|         w += 4
 | |
|     else:
 | |
|         w += (4 - (w % 4))
 | |
|     for sym, filename in L:
 | |
|         print "%-*s%s" % (w, sym, filename)
 | |
| 
 | |
| 
 | |
| _spcjoin = ' '.join
 | |
| 
 | |
| def main():
 | |
|     args = sys.argv[1:]
 | |
|     if args:
 | |
|         headers = args
 | |
|         documented = []
 | |
|     else:
 | |
|         os.chdir(os.path.join(srcdir, "Include"))
 | |
|         headers = list_headers()
 | |
|         documented = list_documented_items()
 | |
| 
 | |
|     cmd = ("ctags -f - --file-scope=no --c-types=dgpstux "
 | |
|            "-Istaticforward -Istatichere=static "
 | |
|            + _spcjoin(headers))
 | |
|     fp = os.popen(cmd)
 | |
|     L = []
 | |
|     prevsym = None
 | |
|     while 1:
 | |
|         line = fp.readline()
 | |
|         if not line:
 | |
|             break
 | |
|         sym, filename = line.split()[:2]
 | |
|         if sym == prevsym:
 | |
|             continue
 | |
|         if not sym.endswith("_H"):
 | |
|             L.append((sym, filename))
 | |
|             prevsym = sym
 | |
|     L.sort()
 | |
|     fp.close()
 | |
| 
 | |
|     try:
 | |
|         if documented:
 | |
|             documented, undocumented = split_documented(L, documented)
 | |
|             print_list(documented, "Documented symbols")
 | |
|             if undocumented:
 | |
|                 print
 | |
|                 print_list(undocumented, "Undocumented symbols")
 | |
|         else:
 | |
|             print_list(L)
 | |
|     except IOError, e:
 | |
|         if e.errno != errno.EPIPE:
 | |
|             raise
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 |