11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#!/usr/bin/env python
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# this program is used to find source code that includes linux kernel headers directly
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# (e.g. with #include <linux/...> or #include <asm/...>)
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# then it lists
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectimport sys, cpp, glob, os, re, getopt
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectimport kernel
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfrom utils import *
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfrom defaults import *
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdef usage():
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    print """\
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project  usage:  find_users.py [-v] (file|directory|@listfile)+
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    this program is used to scan a list of files or directories for
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    sources that include kernel headers directly. the program prints
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    the list of said source files when it's done.
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    when scanning directories, only files matching the following
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    extension will be searched: .c .cpp .S .h
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    use -v to enable verbose output
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project"""
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    sys.exit(1)
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttry:
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    optlist, args = getopt.getopt( sys.argv[1:], 'v' )
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectexcept:
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    # unrecognized option
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    print "error: unrecognized option"
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    usage()
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfor opt, arg in optlist:
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    if opt == '-v':
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        kernel.verboseSearch = 1
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        kernel.verboseFind   = 1
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    else:
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project        usage()
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectif len(args) < 1:
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    usage()
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# helper function used to walk the user files
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdef parse_file(path, parser):
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    parser.parseFile(path)
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# first, obtain the list of kernel files used by our clients
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# avoid parsing the 'kernel_headers' directory itself since we
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project# use this program with the Android source tree by default.
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfparser = kernel.HeaderScanner()
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectwalk_source_files( args, parse_file, fparser, excludes=["kernel_headers","original"] )
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfiles   = fparser.getFiles()
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfor f in sorted(files):
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    print f
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsys.exit(0)
64