# This code is covered under the terms of the GNU Library General
# Public License as described in the bup LICENSE file.
+# Variable length integers are encoded as vints -- see lucene.
+
from __future__ import absolute_import
from io import BytesIO
+import sys
+
+from bup import compat
-# Variable length integers are encoded as vints -- see jakarta lucene.
def write_vuint(port, x):
+ write = port.write
+ bytes_from_uint = compat.bytes_from_uint
if x < 0:
raise Exception("vuints must not be negative")
elif x == 0:
- port.write('\0')
+ write(bytes_from_uint(0))
else:
while True:
seven_bits = x & 0x7f
x >>= 7
if x:
- port.write(chr(0x80 | seven_bits))
+ write(bytes_from_uint(0x80 | seven_bits))
else:
- port.write(chr(seven_bits))
+ write(bytes_from_uint(seven_bits))
break
c = port.read(1)
if not c:
raise EOFError('encountered EOF while reading vuint')
+ assert isinstance(c, bytes)
if ord(c) == 0:
return 0
result = 0
def write_vint(port, x):
# Sign is handled with the second bit of the first byte. All else
# matches vuint.
+ write = port.write
+ bytes_from_uint = compat.bytes_from_uint
if x == 0:
- port.write('\0')
+ write(bytes_from_uint(0))
else:
if x < 0:
x = -x
sign_and_six_bits = x & 0x3f
x >>= 6
if x:
- port.write(chr(0x80 | sign_and_six_bits))
+ write(bytes_from_uint(0x80 | sign_and_six_bits))
write_vuint(port, x)
else:
- port.write(chr(sign_and_six_bits))
+ write(bytes_from_uint(sign_and_six_bits))
def read_vint(port):
c = port.read(1)
if not c:
raise EOFError('encountered EOF while reading vint')
+ assert isinstance(c, bytes)
negative = False
result = 0
offset = 0
# Handle first byte with sign bit specially.
- if c:
- b = ord(c)
- if b & 0x40:
- negative = True
- result |= (b & 0x3f)
- if b & 0x80:
- offset += 6
- c = port.read(1)
- elif negative:
- return -result
- else:
- return result
+ b = ord(c)
+ if b & 0x40:
+ negative = True
+ result |= (b & 0x3f)
+ if b & 0x80:
+ offset += 6
+ c = port.read(1)
+ elif negative:
+ return -result
+ else:
+ return result
while True:
b = ord(c)
if b & 0x80: