1.1 --- a/iixr.py Fri Sep 11 00:01:53 2009 +0200
1.2 +++ b/iixr.py Fri Sep 11 00:39:20 2009 +0200
1.3 @@ -49,29 +49,33 @@
1.4
1.5 def vint(number):
1.6
1.7 + "Write 'number' as a variable-length integer."
1.8 +
1.9 + if number >= 0:
1.10 +
1.11 + # Special case: one byte containing a 7-bit number.
1.12 +
1.13 + if number < 128:
1.14 + return chr(number)
1.15 +
1.16 + # Write the number from least to most significant digits.
1.17 +
1.18 + bytes = []
1.19 +
1.20 + while number != 0:
1.21 + lsd = number & 127
1.22 + number = number >> 7
1.23 + if number != 0:
1.24 + lsd |= 128
1.25 + bytes.append(chr(lsd))
1.26 +
1.27 + return "".join(bytes)
1.28 +
1.29 # Negative numbers are not supported.
1.30
1.31 - if number < 0:
1.32 + else:
1.33 raise ValueError, "Number %r is negative." % number
1.34
1.35 - # Special case: one byte containing a 7-bit number.
1.36 -
1.37 - elif number < 128:
1.38 - return chr(number)
1.39 -
1.40 - # Write the number from least to most significant digits.
1.41 -
1.42 - bytes = []
1.43 -
1.44 - while number != 0:
1.45 - lsd = number & 127
1.46 - number = number >> 7
1.47 - if number != 0:
1.48 - lsd |= 128
1.49 - bytes.append(chr(lsd))
1.50 -
1.51 - return "".join(bytes)
1.52 -
1.53 # Foundation classes.
1.54
1.55 class File:
1.56 @@ -230,15 +234,6 @@
1.57 # Record the offset of this record.
1.58
1.59 offset = self.f.tell()
1.60 - output = []
1.61 -
1.62 - # Write the document number delta.
1.63 -
1.64 - output.append(vint(docnum - self.last_docnum))
1.65 -
1.66 - # Write the number of positions.
1.67 -
1.68 - output.append(vint(len(positions)))
1.69
1.70 # Make sure that the positions are sorted.
1.71
1.72 @@ -246,15 +241,18 @@
1.73
1.74 # Write the position deltas.
1.75
1.76 + output = []
1.77 last = 0
1.78 +
1.79 for position in positions:
1.80 - pos = position - last
1.81 - output.append(vint(pos))
1.82 + output.append(vint(position - last))
1.83 last = position
1.84
1.85 - # Actually write the data.
1.86 -
1.87 - self.f.write("".join(output))
1.88 + # Write the document number delta.
1.89 + # Write the number of positions.
1.90 + # Then write the positions.
1.91 +
1.92 + self.f.write(vint(docnum - self.last_docnum) + vint(len(positions)) + "".join(output))
1.93
1.94 self.last_docnum = docnum
1.95 return offset