1*35238bceSAndroid Build Coastguard Worker# -*- coding: utf-8 -*- 2*35238bceSAndroid Build Coastguard Worker 3*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker# drawElements Quality Program utilities 5*35238bceSAndroid Build Coastguard Worker# -------------------------------------- 6*35238bceSAndroid Build Coastguard Worker# 7*35238bceSAndroid Build Coastguard Worker# Copyright 2019 The Khronos Group Inc. 8*35238bceSAndroid Build Coastguard Worker# Copyright 2015 The Android Open Source Project 9*35238bceSAndroid Build Coastguard Worker# 10*35238bceSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 11*35238bceSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 12*35238bceSAndroid Build Coastguard Worker# You may obtain a copy of the License at 13*35238bceSAndroid Build Coastguard Worker# 14*35238bceSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 15*35238bceSAndroid Build Coastguard Worker# 16*35238bceSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 17*35238bceSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 18*35238bceSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19*35238bceSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 20*35238bceSAndroid Build Coastguard Worker# limitations under the License. 21*35238bceSAndroid Build Coastguard Worker# 22*35238bceSAndroid Build Coastguard Worker#------------------------------------------------------------------------- 23*35238bceSAndroid Build Coastguard Worker 24*35238bceSAndroid Build Coastguard Workerimport sys 25*35238bceSAndroid Build Coastguard Workerfrom functools import partial 26*35238bceSAndroid Build Coastguard Workerfrom argparse import ArgumentParser 27*35238bceSAndroid Build Coastguard Workerfrom common import getChangedFiles, getAllProjectFiles, isTextFile 28*35238bceSAndroid Build Coastguard Worker 29*35238bceSAndroid Build Coastguard WorkerEXCLUSION_LIST = [ 30*35238bceSAndroid Build Coastguard Worker "/doc/testspecs/VK/apitests.adoc", 31*35238bceSAndroid Build Coastguard Worker "/targets/default/FindWayland.cmake", 32*35238bceSAndroid Build Coastguard Worker "/scripts/src_util/clang-format", 33*35238bceSAndroid Build Coastguard Worker] 34*35238bceSAndroid Build Coastguard Worker 35*35238bceSAndroid Build Coastguard Workerdef checkEnds(line, ends): 36*35238bceSAndroid Build Coastguard Worker return any(line.endswith(end) for end in ends) 37*35238bceSAndroid Build Coastguard Worker 38*35238bceSAndroid Build Coastguard Workerdef hexDumpFromFile(filename, position, size): 39*35238bceSAndroid Build Coastguard Worker print("Invalid symbol(s) at offset %x (%i), byte number: %i" % (position, position, size)) 40*35238bceSAndroid Build Coastguard Worker columnWidth = 32 41*35238bceSAndroid Build Coastguard Worker size += position % columnWidth 42*35238bceSAndroid Build Coastguard Worker position = columnWidth * int(position / columnWidth) 43*35238bceSAndroid Build Coastguard Worker size = columnWidth * int((size + columnWidth - 1) / columnWidth) 44*35238bceSAndroid Build Coastguard Worker 45*35238bceSAndroid Build Coastguard Worker f = open(filename, 'rb') 46*35238bceSAndroid Build Coastguard Worker f.seek(position) 47*35238bceSAndroid Build Coastguard Worker 48*35238bceSAndroid Build Coastguard Worker out1 = "" 49*35238bceSAndroid Build Coastguard Worker out2 = "" 50*35238bceSAndroid Build Coastguard Worker numBytes = 0 51*35238bceSAndroid Build Coastguard Worker while numBytes < size: 52*35238bceSAndroid Build Coastguard Worker if numBytes % columnWidth == 0: 53*35238bceSAndroid Build Coastguard Worker if len(out1) != 0: 54*35238bceSAndroid Build Coastguard Worker print(out1 + " " + out2) 55*35238bceSAndroid Build Coastguard Worker out1 = "" 56*35238bceSAndroid Build Coastguard Worker out2 = "" 57*35238bceSAndroid Build Coastguard Worker out1 += "%0.8X: " % + (position + numBytes) 58*35238bceSAndroid Build Coastguard Worker 59*35238bceSAndroid Build Coastguard Worker byte = f.read(1) 60*35238bceSAndroid Build Coastguard Worker if (byte == None): 61*35238bceSAndroid Build Coastguard Worker break; 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker if (sys.version_info < (3, 0)): 64*35238bceSAndroid Build Coastguard Worker byte = int(ord(byte[0])) 65*35238bceSAndroid Build Coastguard Worker else: 66*35238bceSAndroid Build Coastguard Worker byte = int(byte[0]) 67*35238bceSAndroid Build Coastguard Worker 68*35238bceSAndroid Build Coastguard Worker numBytes += 1 69*35238bceSAndroid Build Coastguard Worker 70*35238bceSAndroid Build Coastguard Worker out1 += "%0.2X " % byte 71*35238bceSAndroid Build Coastguard Worker if (byte >= 32 and byte <=127): 72*35238bceSAndroid Build Coastguard Worker out2 += chr(byte) 73*35238bceSAndroid Build Coastguard Worker else: 74*35238bceSAndroid Build Coastguard Worker out2 += '.' 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Worker if len(out1) != 0: 77*35238bceSAndroid Build Coastguard Worker print(out1 + " " + out2) 78*35238bceSAndroid Build Coastguard Worker 79*35238bceSAndroid Build Coastguard Worker f.close() 80*35238bceSAndroid Build Coastguard Worker 81*35238bceSAndroid Build Coastguard Workerdef SearchInvalidSymbols (filename): 82*35238bceSAndroid Build Coastguard Worker start = None 83*35238bceSAndroid Build Coastguard Worker end = None 84*35238bceSAndroid Build Coastguard Worker with open(filename, 'rb') as file: 85*35238bceSAndroid Build Coastguard Worker for byte in iter(partial(file.read, 1), b''): 86*35238bceSAndroid Build Coastguard Worker if (sys.version_info < (3, 0)): 87*35238bceSAndroid Build Coastguard Worker byte = int(ord(byte[0])) 88*35238bceSAndroid Build Coastguard Worker else: 89*35238bceSAndroid Build Coastguard Worker byte = int(byte[0]) 90*35238bceSAndroid Build Coastguard Worker if (byte > 0x7F): 91*35238bceSAndroid Build Coastguard Worker if start == None: 92*35238bceSAndroid Build Coastguard Worker start = file.tell() 93*35238bceSAndroid Build Coastguard Worker else: 94*35238bceSAndroid Build Coastguard Worker if start != None: 95*35238bceSAndroid Build Coastguard Worker end = file.tell() 96*35238bceSAndroid Build Coastguard Worker if end != None: 97*35238bceSAndroid Build Coastguard Worker hexDumpFromFile(filename, start, end - start) 98*35238bceSAndroid Build Coastguard Worker start = None 99*35238bceSAndroid Build Coastguard Worker end = None 100*35238bceSAndroid Build Coastguard Worker if start != None: 101*35238bceSAndroid Build Coastguard Worker file.seek(0, 2) # Seek to end of file 102*35238bceSAndroid Build Coastguard Worker end = file.tell() 103*35238bceSAndroid Build Coastguard Worker hexDumpFromFile(filename, start, end - start) 104*35238bceSAndroid Build Coastguard Worker 105*35238bceSAndroid Build Coastguard Workerdef checkFileEncoding (filename): 106*35238bceSAndroid Build Coastguard Worker generalEncoding = "ascii" 107*35238bceSAndroid Build Coastguard Worker file = None 108*35238bceSAndroid Build Coastguard Worker error = False 109*35238bceSAndroid Build Coastguard Worker try: 110*35238bceSAndroid Build Coastguard Worker if (sys.version_info < (3, 0)): 111*35238bceSAndroid Build Coastguard Worker file = open(filename, 'rt') 112*35238bceSAndroid Build Coastguard Worker for line in file: 113*35238bceSAndroid Build Coastguard Worker line.decode(generalEncoding) 114*35238bceSAndroid Build Coastguard Worker else: 115*35238bceSAndroid Build Coastguard Worker file = open(filename, 'rt', encoding=generalEncoding) 116*35238bceSAndroid Build Coastguard Worker for bytes in iter(partial(file.read, 1024 * 1024), ''): 117*35238bceSAndroid Build Coastguard Worker pass 118*35238bceSAndroid Build Coastguard Worker except UnicodeDecodeError as e: 119*35238bceSAndroid Build Coastguard Worker if not checkEnds(filename.replace("\\", "/"), EXCLUSION_LIST): 120*35238bceSAndroid Build Coastguard Worker error = True 121*35238bceSAndroid Build Coastguard Worker print("") 122*35238bceSAndroid Build Coastguard Worker print("Unicode error in file: %s (%s)" % (filename, e)) 123*35238bceSAndroid Build Coastguard Worker SearchInvalidSymbols(filename) 124*35238bceSAndroid Build Coastguard Worker finally: 125*35238bceSAndroid Build Coastguard Worker if file != None: 126*35238bceSAndroid Build Coastguard Worker file.close() 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker return not error 129*35238bceSAndroid Build Coastguard Worker 130*35238bceSAndroid Build Coastguard Workerdef checkEncoding (files): 131*35238bceSAndroid Build Coastguard Worker error = False 132*35238bceSAndroid Build Coastguard Worker for file in files: 133*35238bceSAndroid Build Coastguard Worker if isTextFile(file): 134*35238bceSAndroid Build Coastguard Worker if not checkFileEncoding(file): 135*35238bceSAndroid Build Coastguard Worker error = True 136*35238bceSAndroid Build Coastguard Worker 137*35238bceSAndroid Build Coastguard Worker return not error 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Workerif __name__ == "__main__": 140*35238bceSAndroid Build Coastguard Worker parser = ArgumentParser() 141*35238bceSAndroid Build Coastguard Worker parser.add_argument("-e", "--only-errors", action="store_true", dest="onlyErrors", default=False, help="Print only on error") 142*35238bceSAndroid Build Coastguard Worker parser.add_argument("-i", "--only-changed", action="store_true", dest="useGitIndex", default=False, help="Check only modified files. Uses git.") 143*35238bceSAndroid Build Coastguard Worker 144*35238bceSAndroid Build Coastguard Worker args = parser.parse_args() 145*35238bceSAndroid Build Coastguard Worker 146*35238bceSAndroid Build Coastguard Worker if args.useGitIndex: 147*35238bceSAndroid Build Coastguard Worker files = getChangedFiles() 148*35238bceSAndroid Build Coastguard Worker else: 149*35238bceSAndroid Build Coastguard Worker files = getAllProjectFiles() 150*35238bceSAndroid Build Coastguard Worker 151*35238bceSAndroid Build Coastguard Worker error = not checkEncoding(files) 152*35238bceSAndroid Build Coastguard Worker 153*35238bceSAndroid Build Coastguard Worker if error: 154*35238bceSAndroid Build Coastguard Worker print("One or more checks failed") 155*35238bceSAndroid Build Coastguard Worker sys.exit(1) 156*35238bceSAndroid Build Coastguard Worker if not args.onlyErrors: 157*35238bceSAndroid Build Coastguard Worker print("All checks passed") 158