44import struct
55
66class Field :
7- def __init__ (self , name , bits , types , prefix = "" ):
7+ def __init__ (self , name , bits , types , prefix = "" , condition = "True" ):
88 self .name = name
99 self .bits = bits
1010 self .types = types
1111 self .prefix = prefix
12+ self .condition = condition
1213
1314 def __repr__ (self ):
1415 return self .name + " (" + str (self .bits ) + ")"
@@ -30,18 +31,28 @@ def getTypes(self):
3031
3132 def getPrefix (self ):
3233 return self .prefix
34+
35+ def getCondition (self ):
36+ return self .condition
3337
3438
3539def parseDefinition (definition , bits = []):
3640 with open (definition ) as df :
3741 d = df .readlines ()
3842 for l in d :
3943 p = l .split (":" )
40- if len (p ) == 2 :
41- bits .append (Field (p [0 ].strip (), (p [1 ].strip ()), ["hex" , "int" , "bin" ], definition ))
42- elif len (p ) == 3 :
43- types = list (map (lambda x : x .strip (), p [2 ].strip ().split ("," )))
44- bits .append (Field (p [0 ].strip (), (p [1 ].strip ()), types , definition ))
44+ name = p [0 ].strip ()
45+ bitlen = p [1 ].strip ()
46+ ptypes = ["hex" , "int" , "bin" ]
47+ cond = "True"
48+
49+ if len (p ) == 3 :
50+ ptypes = list (map (lambda x : x .strip (), p [2 ].strip ().split ("," )))
51+ if len (p ) == 4 :
52+ cond = p [3 ].strip ()
53+
54+ bits .append (Field (name , bitlen , ptypes , definition , cond ))
55+
4556 return bits
4657
4758def endianness (x , endian , bits ):
@@ -96,34 +107,42 @@ def main(argv):
96107
97108 bitlen = 0
98109 lenexpr = bit .getBits ()
110+ condexpr = bit .getCondition ()
99111 for p in parsed .keys ():
100112 lenexpr = lenexpr .replace (p , str (parsed [p ]))
113+ condexpr = condexpr .replace (p , str (parsed [p ]))
101114 try :
102115 bitlen = eval (lenexpr )
103116 except :
104117 print ("Error: " + str (bit .getBits ()) + " is not a valid size!" )
105118 return
119+ try :
120+ cond = eval (condexpr )
121+ except :
122+ print ("Error: " + str (bit .Condition ()) + " is not a valid condition!" )
123+ return
106124
107- val = field .read (bitlen )
108- parsed [bit .getName ()] = val .uint
109- pos += bitlen
110- if last_header is not bit .getPrefix ():
111- last_header = bit .getPrefix ()
112- print ("" )
113-
114- out = bit .getName () + ": "
115- for t , endian in bit .getTypes ():
116- if t == "hex" :
117- out += "0x" + val .hex + " "
118- if t == "int" :
119- out += str (endianness (val .uint , endian , int (bitlen ))) + " "
120- if t == "bin" :
121- out += "0b" + val .bin + " "
122- if t == "str" :
123- s = ""
124- for si in range (0 , len (str (val )[2 :]), 2 ):
125- out += str (chr (int (str (val )[si + 2 :si + 4 ], 16 )))
126- print (out )
125+ if cond :
126+ val = field .read (bitlen )
127+ parsed [bit .getName ()] = val .uint
128+ pos += bitlen
129+ if last_header is not bit .getPrefix ():
130+ last_header = bit .getPrefix ()
131+ print ("" )
132+
133+ out = bit .getName () + ": "
134+ for t , endian in bit .getTypes ():
135+ if t == "hex" :
136+ out += "0x" + val .hex + " "
137+ if t == "int" :
138+ out += str (endianness (val .uint , endian , int (bitlen ))) + " "
139+ if t == "bin" :
140+ out += "0b" + val .bin + " "
141+ if t == "str" :
142+ s = ""
143+ for si in range (0 , len (str (val )[2 :]), 2 ):
144+ out += str (chr (int (str (val )[si + 2 :si + 4 ], 16 )))
145+ print (out )
127146
128147if __name__ == "__main__" :
129148 main (sys .argv )
0 commit comments