diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349 (patch) | |
tree | defd1cc07d16ad2f3b21154114e092d11c94c5bb /libc/kernel/tools/clean_header.py | |
download | bionic-a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349.zip bionic-a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349.tar.gz bionic-a27d2baa0c1a2ec70f47ea9199b1dd6762c8a349.tar.bz2 |
Initial Contributionandroid-1.0
Diffstat (limited to 'libc/kernel/tools/clean_header.py')
-rwxr-xr-x | libc/kernel/tools/clean_header.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/libc/kernel/tools/clean_header.py b/libc/kernel/tools/clean_header.py new file mode 100755 index 0000000..bed9926 --- /dev/null +++ b/libc/kernel/tools/clean_header.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +# + +import sys, cpp, kernel, glob, os, re, getopt +from defaults import * +from utils import * + +noUpdate = 1 + +def cleanupFile( path ): + """reads an original header and perform the cleanup operation on it + this functions returns the destination path and the clean header + as a single string""" + # check the header path + src_path = path + + if not os.path.exists(src_path): + if noUpdate: + panic( "file does not exist: '%s'\n" % path ) + sys.stderr.write( "warning: file does not exit: %s\n" % path ) + return None, None + + if not os.path.isfile(src_path): + if noUpdate: + panic( "path is not a file: '%s'\n" % path ) + sys.stderr.write( "warning: not a file: %s\n" % path ) + return None, None + + original_path = kernel_original_path + if os.path.commonprefix( [ src_path, original_path ] ) != original_path: + if noUpdate: + panic( "file is not in 'original' directory: %s\n" % path ); + sys.stderr.write( "warning: file not in 'original' ignored: %s\n" % path ) + return None, None + + src_path = src_path[len(original_path):] + if len(src_path) > 0 and src_path[0] == '/': + src_path = src_path[1:] + + if len(src_path) == 0: + panic( "oops, internal error, can't extract correct relative path" ) + + # convert into destination path, extracting architecture if needed + # and the corresponding list of known static functions + # + arch = None + re_asm_arch = re.compile( r"asm-([\w\d_\+\.\-]+)(/.*)" ) + m = re_asm_arch.match(src_path) + statics = kernel_known_generic_statics + if m and m.group(1) != 'generic': + dst_path = "arch-%s/asm/%s" % m.groups() + arch = m.group(1) + statics = statics.union( kernel_known_statics.get( arch, set() ) ) + else: + dst_path = "common/" + src_path + + dst_path = os.path.normpath( original_path + "/../" + dst_path ) + + # now, let's parse the file + # + list = cpp.BlockParser().parseFile(path) + if not list: + sys.stderr.write( "error: can't parse '%s'" % path ) + sys.exit(1) + + + list.optimizeMacros( kernel_known_macros ) + list.optimizeIf01() + list.removeVarsAndFuncs( statics ) + list.removeComments() + list.removeEmptyLines() + list.insertDisclaimer( kernel.kernel_disclaimer ) + + out = StringOutput() + list.write(out) + return dst_path, out.get() + + +if __name__ == "__main__": + + def usage(): + print """\ + usage: %s [options] <header_path> + + options: + -v enable verbose mode + + -u enabled update mode + this will try to update the corresponding 'clean header' + if the content has changed. with this, you can pass more + than one file on the command-line + + <header_path> must be in a subdirectory of 'original' + """ % os.path.basename(sys.argv[0]) + sys.exit(1) + + try: + optlist, args = getopt.getopt( sys.argv[1:], 'uv' ) + except: + # unrecognized option + sys.stderr.write( "error: unrecognized option\n" ) + usage() + + for opt, arg in optlist: + if opt == '-u': + noUpdate = 0 + elif opt == '-v': + verbose = 1 + D_setlevel(1) + + if len(args) == 0: + usage() + + if noUpdate: + for path in args: + dst_path, newdata = cleanupFile(path) + print newdata + + sys.exit(0) + + # now let's update our files. + + b = BatchFileUpdater() + + for path in args: + dst_path, newdata = cleanupFile(path) + if not dst_path: + continue + + b.readFile( dst_path ) + r = b.editFile( dst_path, newdata ) + if r == 0: + r = "unchanged" + elif r == 1: + r = "edited" + else: + r = "added" + + print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r ) + + + if os.environ.has_key("ANDROID_PRODUCT_OUT"): + b.updateP4Files() + else: + b.updateFiles() + + sys.exit(0) |