1.1 --- a/iixr/data.py Fri Sep 18 21:07:35 2009 +0200
1.2 +++ b/iixr/data.py Fri Sep 18 22:21:25 2009 +0200
1.3 @@ -21,6 +21,7 @@
1.4 from array import array
1.5
1.6 vint_cache = {}
1.7 +vint_bytes_cache = {}
1.8
1.9 def vint(number):
1.10
1.11 @@ -30,17 +31,8 @@
1.12 return vint_cache[number]
1.13 except KeyError:
1.14 if number >= 0:
1.15 -
1.16 - # Write the number from least to most significant digits.
1.17 -
1.18 bytes = array('B')
1.19 -
1.20 - while number > 127:
1.21 - bytes.append(number & 127 | 128)
1.22 - number = number >> 7
1.23 - else:
1.24 - bytes.append(number)
1.25 -
1.26 + _vint_to_array(number, bytes)
1.27 return bytes.tostring()
1.28
1.29 # Negative numbers are not supported.
1.30 @@ -48,7 +40,35 @@
1.31 else:
1.32 raise ValueError, "Number %r is negative." % number
1.33
1.34 +def vint_to_array(number, bytes):
1.35 +
1.36 + "Write 'number' as a variable-length integer to 'bytes'."
1.37 +
1.38 + try:
1.39 + bytes += vint_bytes_cache[number]
1.40 + except KeyError:
1.41 + if number >= 0:
1.42 + _vint_to_array(number, bytes)
1.43 +
1.44 + # Negative numbers are not supported.
1.45 +
1.46 + else:
1.47 + raise ValueError, "Number %r is negative." % number
1.48 +
1.49 +def _vint_to_array(number, bytes):
1.50 +
1.51 + "Write the 'number' to 'bytes' from least to most significant digits."
1.52 +
1.53 + while number > 127:
1.54 + bytes.append(number & 127 | 128)
1.55 + number = number >> 7
1.56 + else:
1.57 + bytes.append(number)
1.58 +
1.59 for i in xrange(0, 65536):
1.60 - vint_cache[i] = vint(i)
1.61 + bytes = array('B')
1.62 + _vint_to_array(i, bytes)
1.63 + vint_bytes_cache[i] = bytes
1.64 + vint_cache[i] = bytes.tostring()
1.65
1.66 # vim: tabstop=4 expandtab shiftwidth=4