#!/usr/bin/env zsh
# convert sizes in bits/bytes/kbytes/etc to human-readable strings

typeset -i sindex

suffices=( 'b' 'kb' 'mb' 'gb' 'tb' 'pb' 'eb' 'zb' 'yb' )

[[ -z $(echo $1 | grep --extended-regexp '^[0-9]*([kmgtpezy]{0,1}b){0,1}$') ]] && return 1

val=$(echo $1 | grep -o '^[0-9]*');
suf=$(echo $1 | grep -o --extended-regexp '([kmgtpezy]{0,1}b){0,1}$');

if [[ "$suf" == "" ]]; then
	if [[ $(echo $val / 8 | bc) -ne 0 ]]; then
		val=$(echo "scale=2; $val / 8" | bc)
	else
		echo $val
		return 0;
	fi
fi

sindex=1
for ((i=1; i <= ${#suffices}; i++)) do
	[[ "$suf" == "${suffices[$i]}" ]] && let sindex=i
done

while [[ $(echo $val / 1000 | bc) -ne 0 ]]; do
	val=$(echo "scale=2; $val / 1000" | bc)
	let sindex=sindex+1
done

echo "${val}${suffices[$sindex]}"