xref: /aosp_15_r20/external/deqp/scripts/src_util/check_encoding.py (revision 35238bce31c2a825756842865a792f8cf7f89930)
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