Initial Contribution
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)