fosphor/mkresources: Don't generate string longer than 64k
Turns out some fucked up compilers (MSVC I'm looking at you) don't support strings that are very long. So in the resource compiler: - Change binary encoding to use a separate declaration and use array rather than string encoding - If a text file is > 64k, use the binary encoding method rather than string Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
parent
48b7e9242c
commit
436b966b76
|
@ -30,6 +30,10 @@ class ResourcePacker(object):
|
||||||
return [
|
return [
|
||||||
"/* AUTO GENERATED - DO NOT MODIFY BY HAND */",
|
"/* AUTO GENERATED - DO NOT MODIFY BY HAND */",
|
||||||
"#include \"resource_internal.h\"",
|
"#include \"resource_internal.h\"",
|
||||||
|
]
|
||||||
|
|
||||||
|
def rp_header(self):
|
||||||
|
return [
|
||||||
"struct resource_pack __resources[] = {",
|
"struct resource_pack __resources[] = {",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -79,35 +83,46 @@ class ResourcePacker(object):
|
||||||
return self._file_wrap(name, len(content), dl)
|
return self._file_wrap(name, len(content), dl)
|
||||||
|
|
||||||
def file_binary(self, name, content):
|
def file_binary(self, name, content):
|
||||||
dl = []
|
return self._file_wrap(name, len(content), [ self.file_binary_slug(name) ])
|
||||||
for i in range(0, len(content), 16):
|
|
||||||
l = content[i:i+16]
|
|
||||||
s = '"'
|
|
||||||
for c in l:
|
|
||||||
s += '\\x%02x' % ord(c)
|
|
||||||
s += '"'
|
|
||||||
dl.append(s)
|
|
||||||
return self._file_wrap(name, len(content), dl)
|
|
||||||
|
|
||||||
def footer(self):
|
def rp_footer(self):
|
||||||
return [
|
return [
|
||||||
"\t/* Guard */",
|
"\t/* Guard */",
|
||||||
"\t{ .name = (void*)0 }",
|
"\t{ .name = (void*)0 }",
|
||||||
"};",
|
"};",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def file_binary_slug(self, name):
|
||||||
|
return 'data_' + name.encode('hex')
|
||||||
|
|
||||||
|
def file_binary_data(self, name, content):
|
||||||
|
dl = [ 'static const char %s[] = {' % self.file_binary_slug(name) ]
|
||||||
|
for i in range(0, len(content), 8):
|
||||||
|
dl.append('\t' + ' '.join(['0x%02x,' % ord(c) for c in content[i:i+8]]))
|
||||||
|
dl.append('};');
|
||||||
|
return dl
|
||||||
|
|
||||||
def process(self, filenames):
|
def process(self, filenames):
|
||||||
b = []
|
b = []
|
||||||
b.extend(self.header())
|
b.extend(self.header())
|
||||||
|
|
||||||
|
data = []
|
||||||
|
rp = []
|
||||||
|
rp.extend(self.rp_header())
|
||||||
for f in filenames:
|
for f in filenames:
|
||||||
fh = open(f, 'rb')
|
fh = open(f, 'rb')
|
||||||
c = fh.read()
|
c = fh.read()
|
||||||
if '\x00' in c:
|
if '\x00' in c or len(c) > 65535:
|
||||||
b.extend(self.file_binary(f, c))
|
rp.extend(self.file_binary(f, c))
|
||||||
|
data.extend(self.file_binary_data(f, c))
|
||||||
else:
|
else:
|
||||||
b.extend(self.file_text(f, c))
|
rp.extend(self.file_text(f, c))
|
||||||
fh.close()
|
fh.close()
|
||||||
b.extend(self.footer())
|
rp.extend(self.rp_footer())
|
||||||
|
|
||||||
|
b.extend(data)
|
||||||
|
b.extend(rp)
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue