From a2386744e63dc5de8a99bfb1ea56e4225cc361de Mon Sep 17 00:00:00 2001 From: MMGen Date: Tue, 19 Feb 2019 11:20:17 +0000 Subject: [PATCH] util.py: improve bytespec-parsing algorithm --- mmgen/seed.py | 2 +- mmgen/tool.py | 4 ++-- mmgen/util.py | 22 +++++++++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/mmgen/seed.py b/mmgen/seed.py index a2c67e86..f29309f1 100755 --- a/mmgen/seed.py +++ b/mmgen/seed.py @@ -1022,7 +1022,7 @@ harder to find, you're advised to choose a much larger file size than this. min_fsize = d.target_data_len + d.hincog_offset msg(self.msg['choose_file_size'].format(min_fsize)) while True: - fsize = parse_nbytes(my_raw_input('Enter file size: ')) + fsize = parse_bytespec(my_raw_input('Enter file size: ')) if fsize >= min_fsize: break msg('File size must be an integer no less than {}'.format(min_fsize)) diff --git a/mmgen/tool.py b/mmgen/tool.py index 1b53f550..b3154dc2 100755 --- a/mmgen/tool.py +++ b/mmgen/tool.py @@ -476,7 +476,7 @@ class MMGenToolCmd(object): return True def rand2file(self,outfile,nbytes,threads=4,silent=False): - nbytes = parse_nbytes(nbytes) + nbytes = parse_bytespec(nbytes) from Crypto import Random rh = Random.new() from queue import Queue @@ -534,7 +534,7 @@ class MMGenToolCmd(object): return True def bytespec(self,s): - return str(parse_nbytes(s)) + return str(parse_bytespec(s)) def keyaddrlist2monerowallets(self,infile,blockheight=None,addrs=None): return self.monero_wallet_ops(infile=infile,op='create',blockheight=blockheight,addrs=addrs) diff --git a/mmgen/util.py b/mmgen/util.py index 8e68c879..b881e816 100755 --- a/mmgen/util.py +++ b/mmgen/util.py @@ -101,18 +101,30 @@ def set_for_type(val,refval,desc,invert_bool=False,src=None): # c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, # GB=1000*1000*1000, G=1024*1024*1024, and so on for T, P, E, Z, Y. -def parse_nbytes(nbytes): +def parse_bytespec(nbytes): + smap = (('c', 1), + ('w', 2), + ('b', 512), + ('kB', 1000), + ('K', 1024), + ('MB', 1000*1000), + ('M', 1024*1024), + ('GB', 1000*1000*1000), + ('G', 1024*1024*1024), + ('TB', 1000*1000*1000*1000), + ('T', 1024*1024*1024*1024)) import re - m = re.match(r'([0123456789]+)(.*)',nbytes) - smap = ('c',1),('w',2),('b',512),('kB',1000),('K',1024),('MB',1000*1000),\ - ('M',1024*1024),('GB',1000*1000*1000),('G',1024*1024*1024) + m = re.match(r'([0123456789.]+)(.*)',nbytes) if m: if m.group(2): for k,v in smap: if k == m.group(2): - return int(m.group(1)) * v + from decimal import Decimal + return int(Decimal(m.group(1)) * v) else: msg("Valid byte specifiers: '{}'".format("' '".join([i[0] for i in smap]))) + elif '.' in nbytes: + raise ValueError('fractional bytes not allowed') else: return int(nbytes)