Changes in tools/mkarray.py [2628642:94c05b89] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/mkarray.py

    r2628642 r94c05b89  
    2828#
    2929"""
    30 C structure creator
     30Binary inline data packer
    3131"""
    3232
    3333import sys
    3434import os
    35 import struct
     35import zlib
     36import zipfile
     37import binascii
    3638
    3739def usage(prname):
    3840        "Print usage syntax"
    39         print("%s <DESTINATION> <LABEL> <AS_PROLOG> [SOURCE ...]" % prname)
     41        print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname)
     42
     43def arg_check():
     44        if (len(sys.argv) < 5):
     45                usage(sys.argv[0])
     46                sys.exit()
     47
     48def deflate(data):
     49        "Compress using deflate algorithm (without any headers)"
     50        return zlib.compress(data, 9)[2:-4]
     51
     52def chunks(string, length):
     53        "Produce string chunks"
     54        for start in range(0, len(string), length):
     55                yield string[start:start + length]
    4056
    4157def main():
    42         if (len(sys.argv) < 4):
    43                 usage(sys.argv[0])
    44                 return
     58        arg_check()
     59       
     60        if sys.argv[1] == "--deflate":
     61                sys.argv.pop(1)
     62                arg_check()
     63                compress = True
     64        else:
     65                compress = False
    4566       
    4667        dest = sys.argv[1]
    4768        label = sys.argv[2]
    4869        as_prolog = sys.argv[3]
     70        section = sys.argv[4]
    4971       
    5072        header_ctx = []
     73        desc_ctx = []
     74        size_ctx = []
    5175        data_ctx = []
    5276       
    53         for src in sys.argv[4:]:
     77        src_cnt = 0
     78       
     79        archive = zipfile.ZipFile("%s.zip" % dest, "w", zipfile.ZIP_STORED)
     80       
     81        for src in sys.argv[5:]:
    5482                basename = os.path.basename(src)
     83                plainname = os.path.splitext(basename)[0]
    5584                symbol = basename.replace(".", "_")
    5685               
     
    6190                src_in.close()
    6291               
    63                 data_rec = "\t.byte "
     92                length = len(src_data)
    6493               
    65                 fmt = 'B'
    66                 item_size = struct.calcsize(fmt)
    67                 offset = 0
    68                 cnt = 0
     94                if compress:
     95                        src_data = deflate(src_data)
     96                        src_fname = os.path.basename("%s.deflate" % src)
     97                        archive.writestr(src_fname, src_data)
     98                else:
     99                        src_fname = src
    69100               
    70                 while (len(src_data[offset:]) >= item_size):
    71                         byte = struct.unpack_from(fmt, src_data, offset)
    72                        
    73                         if (offset > 0):
    74                                 if ((cnt % 15) == 0):
    75                                         data_rec += "\n\t.byte "
    76                                 else:
    77                                         data_rec += ", "
    78                        
    79                         data_rec += "0x%x" % byte
    80                         offset += item_size
    81                         cnt += 1
     101                if sys.version_info < (3,):
     102                        src_data = bytearray(src_data)
    82103               
    83                 data_rec += "\n"
     104                length_out = len(src_data)
    84105               
    85                 header_ctx.append("extern uint64_t %s_size;" % symbol)
    86106                header_ctx.append("extern uint8_t %s[];" % symbol)
    87                
    88                 data_ctx.append(".globl %s_size" % symbol)
    89                 data_ctx.append(".balign 8");
    90                 data_ctx.append(".size %s_size, 8" % symbol)
    91                 data_ctx.append("%s_size:" % symbol)
    92                 data_ctx.append("\t.quad %u\n" % offset)
     107                header_ctx.append("extern size_t %s_size;" % symbol)
    93108               
    94109                data_ctx.append(".globl %s" % symbol)
    95110                data_ctx.append(".balign 8")
    96                 data_ctx.append(".size %s, %u" % (symbol, offset))
     111                data_ctx.append(".size %s, %u" % (symbol, length_out))
    97112                data_ctx.append("%s:" % symbol)
    98                 data_ctx.append(data_rec)
     113                data_ctx.append("\t.incbin \"%s\"\n" % src_fname)
     114               
     115                desc_field = []
     116                desc_field.append("\t{")
     117                desc_field.append("\t\t.name = \"%s\"," % plainname)
     118                desc_field.append("\t\t.addr = (void *) %s," % symbol)
     119                desc_field.append("\t\t.size = %u," % length_out)
     120                desc_field.append("\t\t.inflated = %u," % length)
     121               
     122                if compress:
     123                        desc_field.append("\t\t.compressed = true")
     124                else:
     125                        desc_field.append("\t\t.compressed = false")
     126               
     127                desc_field.append("\t}")
     128               
     129                desc_ctx.append("\n".join(desc_field))
     130               
     131                size_ctx.append("size_t %s_size = %u;" % (symbol, length_out))
     132               
     133                src_cnt += 1
    99134       
    100         header = open("%s.h" % dest, "w")
     135        data = ''
     136        data += '/***************************************\n'
     137        data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
     138        data += ' * Generated by: tools/mkarray.py      *\n'
     139        data += ' ***************************************/\n\n'
     140        data += "#ifndef %sS_H_\n" % label.upper()
     141        data += "#define %sS_H_\n\n" % label.upper()
     142        data += "#include <stddef.h>\n"
     143        data += "#include <stdint.h>\n"
     144        data += "#include <stdbool.h>\n\n"
     145        data += "#define %sS  %u\n\n" % (label.upper(), src_cnt)
     146        data += "typedef struct {\n"
     147        data += "\tconst char *name;\n"
     148        data += "\tvoid *addr;\n"
     149        data += "\tsize_t size;\n"
     150        data += "\tsize_t inflated;\n"
     151        data += "\tbool compressed;\n"
     152        data += "} %s_t;\n\n" % label
     153        data += "extern %s_t %ss[];\n\n" % (label, label)
     154        data += "\n".join(header_ctx)
     155        data += "\n\n"
     156        data += "#endif\n"
     157        archive.writestr("%s.h" % dest, data)
    101158       
    102         header.write('/***************************************\n')
    103         header.write(' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n')
    104         header.write(' * Generated by: tools/mkarray.py      *\n')
    105         header.write(' ***************************************/\n\n')
    106         header.write("#ifndef %s_H_\n" % label)
    107         header.write("#define %s_H_\n\n" % label)
    108         header.write("#include <stddef.h>\n")
    109         header.write("#include <stdint.h>\n\n")
    110         header.write("\n".join(header_ctx))
    111         header.write("\n\n")
    112         header.write("#endif\n")
     159        data = ''
     160        data += '/***************************************\n'
     161        data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
     162        data += ' * Generated by: tools/mkarray.py      *\n'
     163        data += ' ***************************************/\n\n'
     164        data += as_prolog
     165        data += "%s\n\n" % section
     166        data += "\n".join(data_ctx)
     167        data += "\n"
     168        archive.writestr("%s.s" % dest, data)
    113169       
    114         header.close()
     170        data = ''
     171        data += '/***************************************\n'
     172        data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
     173        data += ' * Generated by: tools/mkarray.py      *\n'
     174        data += ' ***************************************/\n\n'
     175        data += "#include \"%s.h\"\n\n" % dest
     176        data += "%s_t %ss[] = {\n" % (label, label)
     177        data += ",\n".join(desc_ctx)
     178        data += "\n"
     179        data += "};\n\n"
     180        data += "\n".join(size_ctx)
     181        data += "\n"
     182        archive.writestr("%s_desc.c" % dest, data)
    115183       
    116         data = open("%s.s" % dest, "w")
    117        
    118         data.write('/***************************************\n')
    119         data.write(' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n')
    120         data.write(' * Generated by: tools/mkarray.py      *\n')
    121         data.write(' ***************************************/\n\n')
    122         data.write(as_prolog)
    123         data.write('.data\n\n')
    124         data.write("\n".join(data_ctx))
    125        
    126         data.close()
     184        archive.close()
    127185
    128186if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.