2
def __init__(self, buffer, pos):
8
self.stackByteLength = 0
29
def _doPush(self, nbr):
30
bytes = self.buffer[self.pos:self.pos+nbr]
31
# print "push %d bytes: (%s)" % (nbr, ", ".join(["0x%.2x" % ord(x) for x in bytes]))
32
self.stack.append(bytes)
33
self.stackByteLength = self.stackByteLength + nbr
34
self.pos = self.pos + nbr
35
if self.stackByteLength == 6:
36
# print " buffer filled"
41
bytes = self.stack.pop()
43
# print "popped %d bytes" % nbr
44
self.stackByteLength = self.stackByteLength - nbr
47
combined = self._rangeValue("".join(self.stack) + self.buffer[self.pos])
48
mask = ord(self.buffer[self.pos+1])
49
self.pos = self.pos + 2
54
# print "doBitmask: start (start: %x)" % lowValue
58
# print "mask: %s; bit: %s" % (bin(mask), bin(bit))
62
lowValue = combined + ((x + 1) << 40)
64
# print "doBitmask: new record (ends: %x)" % lowValue
67
# print "doBitmask: commit: [%.12x:%.12x]" % (lowValue, highValue)
68
self.ranges.append((lowValue, highValue))
71
highValue = combined + ((x + 1) << 40)
72
# print "doBitmask: extending range (highValue: %x)" % highValue
75
self.ranges.append((lowValue, highValue))
78
nbr = 6 - self.stackByteLength
80
combined = "".join(self.stack)
82
# print "pair covering %d bytes" % nbr
83
lowValue = self._rangeValue(combined
84
+ self.buffer[self.pos:self.pos+nbr])
85
self.pos = self.pos + nbr
86
highValue = self._rangeValue(combined
87
+ self.buffer[self.pos:self.pos+nbr])
88
self.pos = self.pos + nbr
90
# print "singleton (implied)"
91
lowValue = self._rangeValue(combined)
94
raise Exception, "reached negative range count"
96
# print "doRange: [%.12x:%.12x]" % (lowValue, highValue)
98
self.ranges.append((lowValue, highValue))
100
def _rangeValue(self, bytes):
105
value = value + ord(x) * base
111
# print "end reached"
113
if len(self.stack) > 0:
114
raise Exception, "stack should be empty"
117
command_methods = { 0x01: self._doPush1,
124
0x42: self._doBitmask,
129
command = ord(self.buffer[self.pos])
130
if command_methods.has_key(command):
131
self.pos = self.pos + 1
132
command_method = command_methods[command]
135
# print "buffer: %s..." % ["%.2x" % ord(x) for x in self.buffer[self.start_pos:self.pos]]
136
# for x in self.ranges:
137
# print "[%.12x:%.12x]" % x
138
raise Exception, "unknown command: %x at pos %d" % (command, self.pos)
140
return (self.pos - self.start_pos)