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
2.1 --- a/iixr/positions.py Fri Sep 18 21:07:35 2009 +0200
2.2 +++ b/iixr/positions.py Fri Sep 18 22:21:25 2009 +0200
2.3 @@ -19,7 +19,8 @@
2.4 """
2.5
2.6 from iixr.files import *
2.7 -from iixr.data import vint
2.8 +from iixr.data import vint, vint_to_array
2.9 +from array import array
2.10
2.11 class PositionWriter(FileWriter):
2.12
2.13 @@ -44,18 +45,19 @@
2.14 # Write the document number delta.
2.15 # Write the number of positions.
2.16
2.17 - output = [docnum - self.last_docnum, len(positions)]
2.18 + output = array('B')
2.19 + vint_to_array(docnum - self.last_docnum, output)
2.20 + vint_to_array(len(positions), output)
2.21
2.22 # Write the position deltas.
2.23
2.24 - append = output.append
2.25 last = 0
2.26
2.27 for position in positions:
2.28 - append(position - last)
2.29 + vint_to_array(position - last, output)
2.30 last = position
2.31
2.32 - self.f.write("".join([vint(x) for x in output]))
2.33 + output.tofile(self.f)
2.34
2.35 self.last_docnum = docnum
2.36