mirror of https://github.com/python/cpython.git
76 lines
1.8 KiB
Python
76 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
#
|
|
# Compute tables for longobject.c long_from_non_binary_base(). They are used
|
|
# for conversions of strings to integers with a non-binary base.
|
|
|
|
import math
|
|
import textwrap
|
|
|
|
|
|
def format_array(name, values):
|
|
values = [str(v) for v in values]
|
|
values = ', '.join(values)
|
|
result = f'{name} = {{{values}}};'
|
|
result = textwrap.wrap(
|
|
result,
|
|
initial_indent=' ' * 4,
|
|
subsequent_indent=' ' * 8,
|
|
)
|
|
return '\n'.join(result)
|
|
|
|
|
|
def conv_tables(long_bits):
|
|
PyLong_BASE = 1 << long_bits
|
|
log_base_BASE = [0.0] * 37
|
|
convmultmax_base = [0] * 37
|
|
convwidth_base = [0] * 37
|
|
for base in range(2, 37):
|
|
is_binary_base = (base & (base - 1)) == 0
|
|
if is_binary_base:
|
|
continue # don't need, leave as zero
|
|
convmax = base
|
|
i = 1
|
|
log_base_BASE[base] = math.log(base) / math.log(PyLong_BASE)
|
|
while True:
|
|
next = convmax * base
|
|
if next > PyLong_BASE:
|
|
break
|
|
convmax = next
|
|
i += 1
|
|
convmultmax_base[base] = convmax
|
|
assert i > 0
|
|
convwidth_base[base] = i
|
|
return '\n'.join(
|
|
[
|
|
format_array(
|
|
'static const double log_base_BASE[37]', log_base_BASE
|
|
),
|
|
format_array(
|
|
'static const int convwidth_base[37]', convwidth_base
|
|
),
|
|
format_array(
|
|
'static const twodigits convmultmax_base[37]',
|
|
convmultmax_base,
|
|
),
|
|
]
|
|
)
|
|
|
|
|
|
def main():
|
|
print(
|
|
f'''\
|
|
// Tables are computed by Tools/scripts/long_conv_tables.py
|
|
#if PYLONG_BITS_IN_DIGIT == 15
|
|
{conv_tables(15)}
|
|
#elif PYLONG_BITS_IN_DIGIT == 30
|
|
{conv_tables(30)}
|
|
#else
|
|
#error "invalid PYLONG_BITS_IN_DIGIT value"
|
|
#endif
|
|
'''
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|