普通文本  |  109行  |  3.04 KB

# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright (c) 2017 The Khronos Group Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------

import os
import re
import sys
from argparse import ArgumentParser
from common import getChangedFiles, getAllProjectFiles, isTextFile

CHECK_LITERAL_PATTERNS = [
	r'\b[us]*int[0-9]+_t\b',
	r'\b[U]*INT(_LEAST|_FAST|)[0-9]+_MAX\b',
	r'\b0b',
]

CHECK_LIST = [
	".cpp",
	".hpp",
	".c",
	".h",
]

EXCLUSION_LIST = [
	"framework/delibs/debase/deDefs.h",
	"framework/platform/android/tcuAndroidPlatform.cpp",
	"framework/platform/android/tcuAndroidWindow.hpp",
	"framework/platform/android/tcuAndroidWindow.cpp",
	"framework/platform/lnx/X11/tcuLnxX11Xcb.cpp",
	"framework/platform/lnx/wayland/tcuLnxWayland.hpp",
	"framework/platform/lnx/wayland/tcuLnxWayland.cpp",
	"framework/delibs/debase/deFloat16.c",
]

def checkEnds(line, ends):
	return any(line.endswith(end) for end in ends)

def checkFileInvalidLiterals (file):
	error = False

	if checkEnds(file.replace("\\", "/"), CHECK_LIST) and not checkEnds(file.replace("\\", "/"), EXCLUSION_LIST):
		f = open(file, 'rb')
		for lineNum, line in enumerate(f):
			# Remove inline comments
			idx = line.find("//")
			if idx > 0:
				line = line[:idx]
			# Remove text in quoted literals
			if line.find("\"") > 0:
				list = line.split('"')
				del list[1::2]
				line = ' '
				line = line.join(list)
			for pattern in CHECK_LITERAL_PATTERNS:
				found = re.search(pattern, line)
				if found is not None:
					error = True
					print "%s:%i Unacceptable type found (pattern:%s)" % (file, lineNum+1, pattern)
		f.close()

	return not error

def checkInvalidLiterals (files):
	error = False
	for file in files:
		if isTextFile(file):
			if not checkFileInvalidLiterals(file):
				error = True

	return not error

if __name__ == "__main__":
	parser = ArgumentParser()
	parser.add_argument("-e", "--only-errors",  action="store_true", dest="onlyErrors",   default=False, help="Print only on error")
	parser.add_argument("-i", "--only-changed", action="store_true", dest="useGitIndex",  default=False, help="Check only modified files. Uses git.")

	args = parser.parse_args()

	if args.useGitIndex:
		files = getChangedFiles()
	else:
		files = getAllProjectFiles()

	error = not checkInvalidLiterals(files)

	if error:
		print "One or more checks failed"
		sys.exit(1)
	if not args.onlyErrors:
		print "All checks passed"