Add CTS_ARB_gl_spirv test implementation
[platform/upstream/VK-GL-CTS.git] / scripts / src_util / check_include_guards.py
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
23 import os
24 import sys
25 from fnmatch import fnmatch
26 from optparse import OptionParser
27
28 HEADER_PATTERNS         = ["*.hpp", "*.h"]
29 IGNORE_FILES            = set(["tcuEAGLView.h", "tcuIOSAppDelegate.h", "tcuIOSViewController.h"])
30 CHECK_END_COMMENT       = True
31
32 def getIncludeGuardName (headerFile):
33         return '_' + os.path.basename(headerFile).upper().replace('.', '_')
34
35 def 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
61 def 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
83 def 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
92 def 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
104 def 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
113 if __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