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


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/mkarray.py

    r94c05b89 r2628642  
    2828#
    2929"""
    30 Binary inline data packer
     30C structure creator
    3131"""
    3232
    3333import sys
    3434import os
    35 import zlib
    36 import zipfile
    37 import binascii
     35import struct
    3836
    3937def usage(prname):
    4038        "Print usage syntax"
    41         print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname)
    42 
    43 def arg_check():
    44         if (len(sys.argv) < 5):
    45                 usage(sys.argv[0])
    46                 sys.exit()
    47 
    48 def deflate(data):
    49         "Compress using deflate algorithm (without any headers)"
    50         return zlib.compress(data, 9)[2:-4]
    51 
    52 def chunks(string, length):
    53         "Produce string chunks"
    54         for start in range(0, len(string), length):
    55                 yield string[start:start + length]
     39        print("%s <DESTINATION> <LABEL> <AS_PROLOG> [SOURCE ...]" % prname)
    5640
    5741def main():
    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
     42        if (len(sys.argv) < 4):
     43                usage(sys.argv[0])
     44                return
    6645       
    6746        dest = sys.argv[1]
    6847        label = sys.argv[2]
    6948        as_prolog = sys.argv[3]
    70         section = sys.argv[4]
    7149       
    7250        header_ctx = []
    73         desc_ctx = []
    74         size_ctx = []
    7551        data_ctx = []
    7652       
    77         src_cnt = 0
    78        
    79         archive = zipfile.ZipFile("%s.zip" % dest, "w", zipfile.ZIP_STORED)
    80        
    81         for src in sys.argv[5:]:
     53        for src in sys.argv[4:]:
    8254                basename = os.path.basename(src)
    83                 plainname = os.path.splitext(basename)[0]
    8455                symbol = basename.replace(".", "_")
    8556               
     
    9061                src_in.close()
    9162               
    92                 length = len(src_data)
     63                data_rec = "\t.byte "
    9364               
    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
     65                fmt = 'B'
     66                item_size = struct.calcsize(fmt)
     67                offset = 0
     68                cnt = 0
    10069               
    101                 if sys.version_info < (3,):
    102                         src_data = bytearray(src_data)
     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
    10382               
    104                 length_out = len(src_data)
     83                data_rec += "\n"
    10584               
     85                header_ctx.append("extern uint64_t %s_size;" % symbol)
    10686                header_ctx.append("extern uint8_t %s[];" % symbol)
    107                 header_ctx.append("extern size_t %s_size;" % 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)
    10893               
    10994                data_ctx.append(".globl %s" % symbol)
    11095                data_ctx.append(".balign 8")
    111                 data_ctx.append(".size %s, %u" % (symbol, length_out))
     96                data_ctx.append(".size %s, %u" % (symbol, offset))
    11297                data_ctx.append("%s:" % symbol)
    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
     98                data_ctx.append(data_rec)
    13499       
    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)
     100        header = open("%s.h" % dest, "w")
    158101       
    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)
     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")
    169113       
    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)
     114        header.close()
    183115       
    184         archive.close()
     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()
    185127
    186128if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.