Changeset 0516fd7 in mainline for tools/xstruct.py


Ignore:
Timestamp:
2008-08-09T23:46:00Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8f2a852
Parents:
838e14e2
Message:

structure objects: variable names, comments

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/xstruct.py

    r838e14e2 r0516fd7  
    2727#
    2828"""
    29 Convert descriptive structure definitions to struct formats
     29Convert descriptive structure definitions to structure object
    3030"""
    3131
    3232import struct
    3333
    34 def convert(definition):
    35         "Convert structure defition to struct format"
     34class Struct:
     35        def size(self):
     36                return struct.calcsize(self._format_)
     37       
     38        def pack(self):
     39                list = []
     40                for variable in self._list_:
     41                        list.append(self.__dict__[variable])
     42               
     43                return struct.pack(self._format_, *list)
     44
     45def create(definition):
     46        "Create structure object"
    3647       
    3748        tokens = definition.split(None)
    3849       
    3950        # Initial byte order tag
    40         struct = {
     51        format = {
    4152                "little:":  lambda: "<",
    4253                "big:":     lambda: ">",
    4354                "network:": lambda: "!"
    4455        }[tokens[0]]()
     56        inst = Struct()
     57        list = []
    4558       
    4659        # Member tags
    47        
    4860        comment = False
     61        variable = False
    4962        for token in tokens[1:]:
    5063                if (comment):
     
    5366                        continue
    5467               
     68                if (variable):
     69                        inst.__dict__[token] = None
     70                        list.append(token)
     71                        variable = False
     72                        continue
     73               
    5574                if (token == "/*"):
    5675                        comment = True
     76                elif (token[0:8] == "padding["):
     77                        size = token[8:].split("]")[0]
     78                        format += "%dx" % int(size)
    5779                elif (token[0:5] == "char["):
    5880                        size = token[5:].split("]")[0]
    59                         struct += ("%d" % int(size)) + "s"
     81                        format += "%ds" % int(size)
     82                        variable = True
    6083                else:
    61                         struct += {
     84                        format += {
    6285                                "uint8_t":  lambda: "B",
    6386                                "uint16_t": lambda: "H",
     
    7093                                "int64_t":  lambda: "q"
    7194                        }[token]()
     95                        variable = True
    7296       
    73         return struct
    74 
    75 def little_string(string):
    76         return struct.pack("<" + ("%d" % len(string)) + "s", string)
    77 
    78 def little_padding(length):
    79         return struct.pack("<" + ("%d" % length) + "x")
     97        inst.__dict__['_format_'] = format
     98        inst.__dict__['_list_'] = list
     99        return inst
Note: See TracChangeset for help on using the changeset viewer.