def test_parse_digit_string(self): from rpython.rlib.rbigint import parse_digit_string class Parser: def __init__(self, base, sign, digits): self.base = base self.sign = sign self.next_digit = iter(digits + [-1]).next x = parse_digit_string(Parser(10, 1, [6])) assert x.eq(rbigint.fromint(6)) x = parse_digit_string(Parser(10, 1, [6, 2, 3])) assert x.eq(rbigint.fromint(623)) x = parse_digit_string(Parser(10, -1, [6, 2, 3])) assert x.eq(rbigint.fromint(-623)) x = parse_digit_string(Parser(16, 1, [0xA, 0x4, 0xF])) assert x.eq(rbigint.fromint(0xA4F)) num = 0 for i in range(36): x = parse_digit_string(Parser(36, 1, range(i))) assert x.eq(rbigint.fromlong(num)) num = num * 36 + i x = parse_digit_string(Parser(16, -1, range(15, -1, -1) * 99)) assert x.eq(rbigint.fromlong(long('-0x' + 'FEDCBA9876543210' * 99, 16))) assert x.tobool() is True x = parse_digit_string(Parser(7, 1, [0, 0, 0])) assert x.tobool() is False x = parse_digit_string(Parser(7, -1, [0, 0, 0])) assert x.tobool() is False
def test_parse_digit_string(self): from rpython.rlib.rbigint import parse_digit_string class Parser: def __init__(self, base, sign, digits): self.base = base self.sign = sign self.next_digit = iter(digits + [-1]).next x = parse_digit_string(Parser(10, 1, [6])) assert x.eq(rbigint.fromint(6)) x = parse_digit_string(Parser(10, 1, [6, 2, 3])) assert x.eq(rbigint.fromint(623)) x = parse_digit_string(Parser(10, -1, [6, 2, 3])) assert x.eq(rbigint.fromint(-623)) x = parse_digit_string(Parser(16, 1, [0xA, 0x4, 0xF])) assert x.eq(rbigint.fromint(0xA4F)) num = 0 for i in range(36): x = parse_digit_string(Parser(36, 1, range(i))) assert x.eq(rbigint.fromlong(num)) num = num * 36 + i x = parse_digit_string(Parser(16, -1, range(15,-1,-1)*99)) assert x.eq(rbigint.fromlong(long('-0x' + 'FEDCBA9876543210'*99, 16))) assert x.tobool() is True x = parse_digit_string(Parser(7, 1, [0, 0, 0])) assert x.tobool() is False x = parse_digit_string(Parser(7, -1, [0, 0, 0])) assert x.tobool() is False
def test_parse_digit_string(self): from rpython.rlib.rbigint import parse_digit_string class Parser: def __init__(self, base, sign, digits): self.base = base self.sign = sign self.i = 0 self._digits = digits def next_digit(self): i = self.i if i == len(self._digits): return -1 self.i = i + 1 return self._digits[i] def prev_digit(self): i = self.i - 1 assert i >= 0 self.i = i return self._digits[i] x = parse_digit_string(Parser(10, 1, [6])) assert x.eq(rbigint.fromint(6)) x = parse_digit_string(Parser(10, 1, [6, 2, 3])) assert x.eq(rbigint.fromint(623)) x = parse_digit_string(Parser(10, -1, [6, 2, 3])) assert x.eq(rbigint.fromint(-623)) x = parse_digit_string(Parser(16, 1, [0xA, 0x4, 0xF])) assert x.eq(rbigint.fromint(0xA4F)) num = 0 for i in range(36): x = parse_digit_string(Parser(36, 1, range(i))) assert x.eq(rbigint.fromlong(num)) num = num * 36 + i x = parse_digit_string(Parser(16, -1, range(15, -1, -1) * 99)) assert x.eq(rbigint.fromlong(long('-0x' + 'FEDCBA9876543210' * 99, 16))) assert x.tobool() is True x = parse_digit_string(Parser(7, 1, [0, 0, 0])) assert x.tobool() is False x = parse_digit_string(Parser(7, -1, [0, 0, 0])) assert x.tobool() is False for base in [2, 4, 8, 16, 32]: for inp in [[0], [1], [1, 0], [0, 1], [1, 0, 1], [1, 0, 0, 1], [1, 0, 0, base - 1, 0, 1], [base - 1, 1, 0, 0, 0, 1, 0], [base - 1]]: inp = inp * 97 x = parse_digit_string(Parser(base, -1, inp)) num = sum(inp[i] * (base**(len(inp) - 1 - i)) for i in range(len(inp))) assert x.eq(rbigint.fromlong(-num))
def test_parse_digit_string(self): from rpython.rlib.rbigint import parse_digit_string class Parser: def __init__(self, base, sign, digits): self.base = base self.sign = sign self.i = 0 self._digits = digits def next_digit(self): i = self.i if i == len(self._digits): return -1 self.i = i + 1 return self._digits[i] def prev_digit(self): i = self.i - 1 assert i >= 0 self.i = i return self._digits[i] x = parse_digit_string(Parser(10, 1, [6])) assert x.eq(rbigint.fromint(6)) x = parse_digit_string(Parser(10, 1, [6, 2, 3])) assert x.eq(rbigint.fromint(623)) x = parse_digit_string(Parser(10, -1, [6, 2, 3])) assert x.eq(rbigint.fromint(-623)) x = parse_digit_string(Parser(16, 1, [0xA, 0x4, 0xF])) assert x.eq(rbigint.fromint(0xA4F)) num = 0 for i in range(36): x = parse_digit_string(Parser(36, 1, range(i))) assert x.eq(rbigint.fromlong(num)) num = num * 36 + i x = parse_digit_string(Parser(16, -1, range(15,-1,-1)*99)) assert x.eq(rbigint.fromlong(long('-0x' + 'FEDCBA9876543210'*99, 16))) assert x.tobool() is True x = parse_digit_string(Parser(7, 1, [0, 0, 0])) assert x.tobool() is False x = parse_digit_string(Parser(7, -1, [0, 0, 0])) assert x.tobool() is False for base in [2, 4, 8, 16, 32]: for inp in [[0], [1], [1, 0], [0, 1], [1, 0, 1], [1, 0, 0, 1], [1, 0, 0, base-1, 0, 1], [base-1, 1, 0, 0, 0, 1, 0], [base-1]]: inp = inp * 97 x = parse_digit_string(Parser(base, -1, inp)) num = sum(inp[i] * (base ** (len(inp)-1-i)) for i in range(len(inp))) assert x.eq(rbigint.fromlong(-num))
def string_to_bigint(s, base=10, parser=None): """As string_to_int(), but ignores an optional 'l' or 'L' suffix and returns an rbigint.""" if parser is None: s = literal = strip_spaces(s) if (s.endswith('l') or s.endswith('L')) and base < 22: # in base 22 and above, 'L' is a valid digit! try: long('L',22) s = s[:-1] p = NumberStringParser(s, literal, base, 'long') else: p = parser return parse_digit_string(p)