1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-15 20:19:23 +00:00
trezor-firmware/src/trezor/utils.py

88 lines
2.3 KiB
Python
Raw Normal View History

import gc
2018-07-03 14:20:26 +00:00
import sys
from trezorutils import halt, memcpy, model, set_mode_unprivileged, symbol # noqa: F401
2016-04-27 19:07:37 +00:00
def unimport_begin():
return set(sys.modules)
def unimport_end(mods):
for mod in sys.modules:
if mod not in mods:
# remove reference from sys.modules
del sys.modules[mod]
# remove reference from the parent module
i = mod.rfind('.')
if i < 0:
continue
path = mod[:i]
name = mod[i + 1:]
if path in sys.modules:
delattr(sys.modules[path], name)
# collect removed modules
gc.collect()
2016-06-09 14:31:53 +00:00
def ensure(cond, msg=None):
if not cond:
if msg is None:
raise AssertionError()
else:
raise AssertionError(msg)
def chunks(items, size):
for i in range(0, len(items), size):
yield items[i:i + size]
2016-11-23 13:46:55 +00:00
def split_words(sentence, width, metric=len):
line = []
for w in sentence.split(' '):
# empty word -> skip
if not w:
continue
# new word will not fit -> break the line
if metric(' '.join(line + [w])) >= width:
yield ' '.join(line)
line = []
# word is too wide -> split the word
while metric(w) >= width:
for i in range(1, len(w) + 1):
if metric(w[:-i]) < width:
yield w[:-i] + '-'
w = w[-i:]
break
line.append(w)
yield ' '.join(line)
def format_amount(amount, decimals):
d = pow(10, decimals)
amount = ('%d.%0*d' % (amount // d, decimals, amount % d)).rstrip('0')
if amount.endswith('.'):
2018-02-09 12:36:08 +00:00
amount = amount[:-1]
return amount
def format_ordinal(number):
return str(number) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= number % 100 < 20 else number % 10, 'th')
2018-02-27 13:45:11 +00:00
class HashWriter:
def __init__(self, hashfunc, *hashargs, **hashkwargs):
self.ctx = hashfunc(*hashargs, **hashkwargs)
2018-02-27 13:45:11 +00:00
self.buf = bytearray(1) # used in append()
def extend(self, buf: bytearray):
self.ctx.update(buf)
def append(self, b: int):
self.buf[0] = b
self.ctx.update(self.buf)
def get_digest(self, *args) -> bytes:
return self.ctx.digest(*args)