Implement a better num2str()

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/fio.h b/fio.h
index e8c025d..28104cd 100644
--- a/fio.h
+++ b/fio.h
@@ -568,6 +568,8 @@
 extern void options_mem_free(struct thread_data *);
 extern void td_fill_rand_seeds(struct thread_data *);
 extern void add_job_opts(const char **);
+extern char *num2str(unsigned long, int, int, int);
+
 #define FIO_GETOPT_JOB		0x89988998
 #define FIO_NR_OPTIONS		(FIO_MAX_OPTS + 128)
 
@@ -653,49 +655,6 @@
 	return 0;
 }
 
-/*
- * Cheesy number->string conversion, complete with carry rounding error.
- */
-static inline char *num2str(unsigned long num, int maxlen, int base, int pow2)
-{
-	char postfix[] = { ' ', 'K', 'M', 'G', 'P', 'E' };
-	unsigned int thousand;
-	char *buf;
-	int i;
-
-	if (pow2)
-		thousand = 1024;
-	else
-		thousand = 1000;
-
-	buf = malloc(128);
-
-	for (i = 0; base > 1; i++)
-		base /= thousand;
-
-	do {
-		int len, carry = 0;
-
-		len = sprintf(buf, "%'lu", num);
-		if (len <= maxlen) {
-			if (i >= 1) {
-				buf[len] = postfix[i];
-				buf[len + 1] = '\0';
-			}
-			return buf;
-		}
-
-		if ((num % thousand) >= (thousand / 2))
-			carry = 1;
-
-		num /= thousand;
-		num += carry;
-		i++;
-	} while (i <= 5);
-
-	return buf;
-}
-
 static inline int __should_check_rate(struct thread_data *td,
 				      enum fio_ddir ddir)
 {