1# -*- coding: utf-8 -*- 2 3#------------------------------------------------------------------------- 4# drawElements Quality Program utilities 5# -------------------------------------- 6# 7# Copyright 2015 The Android Open Source Project 8# 9# Licensed under the Apache License, Version 2.0 (the "License"); 10# you may not use this file except in compliance with the License. 11# You may obtain a copy of the License at 12# 13# http://www.apache.org/licenses/LICENSE-2.0 14# 15# Unless required by applicable law or agreed to in writing, software 16# distributed under the License is distributed on an "AS IS" BASIS, 17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18# See the License for the specific language governing permissions and 19# limitations under the License. 20# 21#------------------------------------------------------------------------- 22 23import os 24import sys 25from fnmatch import fnmatch 26from optparse import OptionParser 27 28HEADER_PATTERNS = ["*.hpp", "*.h"] 29IGNORE_FILES = set(["tcuEAGLView.h", "tcuIOSAppDelegate.h", "tcuIOSViewController.h"]) 30CHECK_END_COMMENT = True 31 32def getIncludeGuardName (headerFile): 33 return '_' + os.path.basename(headerFile).upper().replace('.', '_') 34 35def hasValidIncludeGuard (headerFile): 36 includeGuard = getIncludeGuardName(headerFile) 37 f = open(headerFile, 'rb') 38 isHpp = headerFile[-4:] == ".hpp" 39 40 line0 = f.readline().strip() 41 line1 = f.readline().strip() 42 43 if line0 != ("#ifndef %s" % includeGuard): 44 return False 45 if line1 != ("#define %s" % includeGuard): 46 return False 47 48 if CHECK_END_COMMENT: 49 lastLine = "" 50 expectedComment = ("#endif // %s" if isHpp else "#endif /* %s */") % includeGuard 51 for line in f: 52 lastLine = line.strip() 53 54 if lastLine != expectedComment: 55# print "'%s' != '%s'" % (lastLine, expectedComment) 56 return False 57 58 f.close() 59 return True 60 61def fixIncludeGuard (headerFile): 62 f = open(headerFile, 'rb') 63 lines = [] 64 isHpp = headerFile[-4:] == ".hpp" 65 includeGuard = getIncludeGuardName(headerFile) 66 67 for line in f: 68 lines.append(line) 69 f.close() 70 71 # Replace include guards 72 lines[0] = "#ifndef %s\n" % includeGuard 73 lines[1] = "#define %s\n" % includeGuard 74 75 if CHECK_END_COMMENT: 76 lines[len(lines)-1] = ("#endif // %s\n" if isHpp else "#endif /* %s */\n") % includeGuard 77 78 f = open(headerFile, 'wb') 79 for line in lines: 80 f.write(line) 81 f.close() 82 83def isHeader (filename): 84 if os.path.basename(filename) in IGNORE_FILES: 85 return False 86 87 for pattern in HEADER_PATTERNS: 88 if fnmatch(filename, pattern): 89 return True 90 return False 91 92def getHeaderFileList (path): 93 headers = [] 94 if os.path.isfile(path): 95 if isHeader(path): 96 headers.append(path) 97 else: 98 for root, dirs, files in os.walk(path): 99 for file in files: 100 if isHeader(file): 101 headers.append(os.path.join(root, file)) 102 return headers 103 104def checkIncludeGuards (files): 105 error = False 106 for file in files: 107 if isHeader(file): 108 if not hasValidIncludeGuard(file): 109 error = True 110 print "File %s contains invalid include guards" % file 111 return not error 112 113if __name__ == "__main__": 114 parser = OptionParser() 115 parser.add_option("-x", "--fix", action="store_true", dest="fix", default=False, help="attempt to fix include guards (use with caution)") 116 117 (options, args) = parser.parse_args() 118 fix = options.fix 119 headers = [] 120 invalidHeaders = [] 121 122 for dir in args: 123 headers += getHeaderFileList(os.path.normpath(dir)) 124 125 print "Checking..." 126 for header in headers: 127 print " %s" % header 128 if not hasValidIncludeGuard(header): 129 invalidHeaders.append(header) 130 131 print "" 132 if len(invalidHeaders) > 0: 133 print "Found %d files with invalid include guards:" % len(invalidHeaders) 134 135 for header in invalidHeaders: 136 print " %s" % header 137 138 if not fix: 139 sys.exit(-1) 140 else: 141 print "All headers have valid include guards." 142 143 if fix: 144 print "" 145 for header in invalidHeaders: 146 fixIncludeGuard(header) 147 print "Fixed %s" % header 148