mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	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()
 |