3 # Copyright (c) 2011 Martin Decky
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
10 # - Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # - Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # - The name of the author may not be used to endorse or promote products
16 # derived from this software without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 Binary inline data packer
41 print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname
)
44 if (len(sys
.argv
) < 5):
49 "Compress using deflate algorithm (without any headers)"
50 return zlib
.compress(data
, 9)[2:-4]
52 def chunks(string
, length
):
53 "Produce string chunks"
54 for start
in range(0, len(string
), length
):
55 yield string
[start
:start
+ length
]
60 if sys
.argv
[1] == "--deflate":
69 as_prolog
= sys
.argv
[3]
72 timestamp
= (1980, 1, 1, 0, 0, 0)
81 archive
= zipfile
.ZipFile("%s.zip" % dest
, "w", zipfile
.ZIP_STORED
)
83 for src
in sys
.argv
[5:]:
84 basename
= os
.path
.basename(src
)
85 plainname
= os
.path
.splitext(basename
)[0]
86 symbol
= basename
.replace(".", "_")
88 print("%s -> %s" % (src
, symbol
))
90 src_in
= open(src
, "rb")
91 src_data
= src_in
.read()
94 length
= len(src_data
)
97 src_data
= deflate(src_data
)
98 src_fname
= os
.path
.basename("%s.deflate" % src
)
99 zipinfo
= zipfile
.ZipInfo(src_fname
, timestamp
)
100 archive
.writestr(zipinfo
, src_data
)
104 if sys
.version_info
< (3,):
105 src_data
= bytearray(src_data
)
107 length_out
= len(src_data
)
109 header_ctx
.append("extern uint8_t %s[];" % symbol
)
110 header_ctx
.append("extern size_t %s_size;" % symbol
)
112 data_ctx
.append(".globl %s" % symbol
)
113 data_ctx
.append(".balign 8")
114 data_ctx
.append(".size %s, %u" % (symbol
, length_out
))
115 data_ctx
.append("%s:" % symbol
)
116 data_ctx
.append("\t.incbin \"%s\"\n" % src_fname
)
119 desc_field
.append("\t{")
120 desc_field
.append("\t\t.name = \"%s\"," % plainname
)
121 desc_field
.append("\t\t.addr = (void *) %s," % symbol
)
122 desc_field
.append("\t\t.size = %u," % length_out
)
123 desc_field
.append("\t\t.inflated = %u," % length
)
126 desc_field
.append("\t\t.compressed = true")
128 desc_field
.append("\t\t.compressed = false")
130 desc_field
.append("\t}")
132 desc_ctx
.append("\n".join(desc_field
))
134 size_ctx
.append("size_t %s_size = %u;" % (symbol
, length_out
))
139 data
+= '/***************************************\n'
140 data
+= ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
141 data
+= ' * Generated by: tools/mkarray.py *\n'
142 data
+= ' ***************************************/\n\n'
143 data
+= "#ifndef %sS_H_\n" % label
.upper()
144 data
+= "#define %sS_H_\n\n" % label
.upper()
145 data
+= "#include <stddef.h>\n"
146 data
+= "#include <stdint.h>\n"
147 data
+= "#include <stdbool.h>\n\n"
148 data
+= "#define %sS %u\n\n" % (label
.upper(), src_cnt
)
149 data
+= "typedef struct {\n"
150 data
+= "\tconst char *name;\n"
151 data
+= "\tvoid *addr;\n"
152 data
+= "\tsize_t size;\n"
153 data
+= "\tsize_t inflated;\n"
154 data
+= "\tbool compressed;\n"
155 data
+= "} %s_t;\n\n" % label
156 data
+= "extern %s_t %ss[];\n\n" % (label
, label
)
157 data
+= "\n".join(header_ctx
)
160 zipinfo
= zipfile
.ZipInfo("%s.h" % dest
, timestamp
)
161 archive
.writestr(zipinfo
, data
)
164 data
+= '/***************************************\n'
165 data
+= ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
166 data
+= ' * Generated by: tools/mkarray.py *\n'
167 data
+= ' ***************************************/\n\n'
169 data
+= "%s\n\n" % section
170 data
+= "\n".join(data_ctx
)
172 zipinfo
= zipfile
.ZipInfo("%s.s" % dest
, timestamp
)
173 archive
.writestr(zipinfo
, data
)
176 data
+= '/***************************************\n'
177 data
+= ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
178 data
+= ' * Generated by: tools/mkarray.py *\n'
179 data
+= ' ***************************************/\n\n'
180 data
+= "#include \"%s.h\"\n\n" % dest
181 data
+= "%s_t %ss[] = {\n" % (label
, label
)
182 data
+= ",\n".join(desc_ctx
)
185 data
+= "\n".join(size_ctx
)
187 zipinfo
= zipfile
.ZipInfo("%s_desc.c" % dest
, timestamp
)
188 archive
.writestr(zipinfo
, data
)
192 if __name__
== '__main__':