#! /usr/bin/env python

def fix_uncompressed_size ( ratio, compressed_size, uncompressed_size_modulo_4gb ):

	fourgb = 2**32

	n = (float(compressed_size)/float(ratio)-float(uncompressed_size_modulo_4gb))/fourgb
	n = int( round(n) )

	return long( uncompressed_size_modulo_4gb )+n*fourgb

def print_size( size_in_bytes, human_form ):

	kB = 2**10
	MB = kB*kB
	GB = kB*MB
	TB = kB*GB

	size = long(size_in_bytes)

	if not human_form:
		size =  '%s'%size
	elif size > TB:
		size = '%.2fT'%(float(size)/TB)
	elif size > GB:
		size = '%.2fG'%(float(size)/GB)
	elif size > MB:
		size = '%.2fM'%(float(size)/MB)
	elif size > kB:
		size = '%.2fk'%(float(size)/kB)
	else:
		size = '%s'%size

	# ternary statement not supported prior to v3.5
	#size =  '%s'%size		   if not human_form	else	\
	#	'%.2fT'%(float(size)/TB) if size > TB		else	\
	#	'%.2fG'%(float(size)/GB) if size > GB		else	\
	#	'%.2fM'%(float(size)/MB) if size > MB		else	\
	#	'%.2fk'%(float(size)/kB) if size > kB		else	\
	#	'%s'%size

	print size.strip()

if __name__ == '__main__':

	import sys, os
	from optparse import OptionParser

	usage = "%prog [options] compressed_size uncompressed_size\n\n"+       \
                "\tcompressed_size as returned by 'gzip -l'\n"+ \
				"\tuncompressed size as returned by 'gzip -l'\n"+ \
				"\t\t(this could be off by a multiple of 4GB=2^32 bytes)\n\n"

	version = '1.00'

	parser = OptionParser(usage=usage,version=version)

	parser.add_option("-v", "--verbose", action='store_true', help="verbose (default: FALSE)",default=False)
	parser.add_option("-r", "--ratio", type='float', help="expected compression ratio (default: 0.5)",default=0.5)
	parser.add_option("-s", "--short", dest='human_form', action='store_true', help="print sizes in short (human readable) format",default=False)
	parser.add_option("-t", "--total", dest='print_total', action='store_true', help="print accumulated total size",default=False)
	parser.add_option("-f", "--files", dest='read_files', action='store_true', help="read file names from stdin",default=False)
	parser.add_option("-c", "--compressed-size", dest='compressed_size', action='store_true', help="print compressed sizes",default=False)

	(options, args) = parser.parse_args()

	verbose			= options.verbose
	ratio			= options.ratio
	human_form		= options.human_form
	print_total		= options.print_total
	read_files		= options.read_files
	show_compressed_size	= options.compressed_size

	if len( args ) > 0:

		uncompressed_size = fix_uncompressed_size( ratio, compressed_size, uncompressed_size_modulo_4gb )
		print uncompressed_size

	else:
		total_size = 0

		while 1:
			line = sys.stdin.readline()		# read one line

			if not line:
				break				# EOF

			if read_files:

				lines = (os.popen('gzip -l '+line)).read().split('\n')[0:-1]
				line = [ x for x in lines if 'uncompressed_name' not in x ][0]

			elif 'uncompressed_name' in line:
				continue

			(compressed_size, uncompressed_size_modulo_4gb) = line.strip().split()[0:2]
			uncompressed_size = fix_uncompressed_size( ratio, compressed_size, uncompressed_size_modulo_4gb )
			compressed_size = long(compressed_size)

			size = [uncompressed_size,compressed_size][show_compressed_size]
			#size = compressed_size if show_compressed_size else uncompressed_size

			if print_total:
				total_size += size
			else:
				print_size( size, human_form )

		if print_total:
			print_size ( total_size, human_form )

	sys.exit(0)
