xref: /aosp_15_r20/external/mesa3d/src/util/xxd.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker# encoding=utf-8
2*61046927SAndroid Build Coastguard Worker# Copyright © 2018 Intel Corporation
3*61046927SAndroid Build Coastguard Worker#
4*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker#
11*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker# Software.
14*61046927SAndroid Build Coastguard Worker#
15*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker# Converts a file to a C/C++ #include containing a string
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Workerimport argparse
26*61046927SAndroid Build Coastguard Workerimport io
27*61046927SAndroid Build Coastguard Workerimport os
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Workerdef get_args():
31*61046927SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser()
32*61046927SAndroid Build Coastguard Worker    parser.add_argument('input', help="Name of input file")
33*61046927SAndroid Build Coastguard Worker    parser.add_argument('output', help="Name of output file")
34*61046927SAndroid Build Coastguard Worker    parser.add_argument("-n", "--name",
35*61046927SAndroid Build Coastguard Worker                        help="Name of C variable")
36*61046927SAndroid Build Coastguard Worker    parser.add_argument("-b", "--binary", dest='binary', action='store_const',
37*61046927SAndroid Build Coastguard Worker                        const=True, default=False)
38*61046927SAndroid Build Coastguard Worker    args = parser.parse_args()
39*61046927SAndroid Build Coastguard Worker    return args
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Workerdef filename_to_C_identifier(n):
43*61046927SAndroid Build Coastguard Worker    if n[0] != '_' and not n[0].isalpha():
44*61046927SAndroid Build Coastguard Worker        n = "_" + n[1:]
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker    return "".join([c if c.isalnum() or c == "_" else "_" for c in n])
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Workerdef emit_byte(f, b):
50*61046927SAndroid Build Coastguard Worker    f.write("0x{:02x}, ".format(ord(b)).encode('utf-8'))
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Workerdef process_file(args):
54*61046927SAndroid Build Coastguard Worker    with io.open(args.input, "rb") as infile:
55*61046927SAndroid Build Coastguard Worker        try:
56*61046927SAndroid Build Coastguard Worker            with io.open(args.output, "wb") as outfile:
57*61046927SAndroid Build Coastguard Worker                # If a name was not specified on the command line, pick one based on the
58*61046927SAndroid Build Coastguard Worker                # name of the input file.  If no input filename was specified, use
59*61046927SAndroid Build Coastguard Worker                # from_stdin.
60*61046927SAndroid Build Coastguard Worker                if args.name is not None:
61*61046927SAndroid Build Coastguard Worker                    name = args.name
62*61046927SAndroid Build Coastguard Worker                else:
63*61046927SAndroid Build Coastguard Worker                    name = filename_to_C_identifier(args.input)
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker                outfile.write("static const char {}[] = {{\n".format(name).encode('utf-8'))
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker                linecount = 0
68*61046927SAndroid Build Coastguard Worker                while True:
69*61046927SAndroid Build Coastguard Worker                    byte = infile.read(1)
70*61046927SAndroid Build Coastguard Worker                    if byte == b"":
71*61046927SAndroid Build Coastguard Worker                        break
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker                    if not args.binary:
74*61046927SAndroid Build Coastguard Worker                        assert(ord(byte) != 0)
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker                    emit_byte(outfile, byte)
77*61046927SAndroid Build Coastguard Worker                    linecount = linecount + 1
78*61046927SAndroid Build Coastguard Worker                    if linecount > 20:
79*61046927SAndroid Build Coastguard Worker                        outfile.write(b"\n ")
80*61046927SAndroid Build Coastguard Worker                        linecount = 0
81*61046927SAndroid Build Coastguard Worker                if not args.binary:
82*61046927SAndroid Build Coastguard Worker                    outfile.write(b"\n0")
83*61046927SAndroid Build Coastguard Worker                outfile.write(b"\n};\n\n")
84*61046927SAndroid Build Coastguard Worker        except Exception:
85*61046927SAndroid Build Coastguard Worker            # In the event that anything goes wrong, delete the output file,
86*61046927SAndroid Build Coastguard Worker            # then re-raise the exception. Deleteing the output file should
87*61046927SAndroid Build Coastguard Worker            # ensure that the build system doesn't try to use the stale,
88*61046927SAndroid Build Coastguard Worker            # half-generated file.
89*61046927SAndroid Build Coastguard Worker            os.unlink(args.output)
90*61046927SAndroid Build Coastguard Worker            raise
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Workerdef main():
94*61046927SAndroid Build Coastguard Worker    args = get_args()
95*61046927SAndroid Build Coastguard Worker    process_file(args)
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Workerif __name__ == "__main__":
99*61046927SAndroid Build Coastguard Worker    main()
100