From 5e6b0ef825bb7655c16048a34e5ec5fb1b6de6c2 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Wed, 7 Apr 2021 00:06:32 -0700
Subject: [PATCH] Add optional/better format to file_size_str() by passing a
 precision as 3rd arg

Returns a floating-point formatted size estimate more in-line with my
preference (e.g. 17.0G instead of 17,000M).
---
 exec/load/file_size.js | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/exec/load/file_size.js b/exec/load/file_size.js
index 2d2a918257..d0c0da3d8e 100644
--- a/exec/load/file_size.js
+++ b/exec/load/file_size.js
@@ -4,8 +4,10 @@
 
 // Function for returning a string representation of a file size
 
-function file_size_str(size, bytes)
+function file_size_str(size, bytes, float)
 {
+	if(float !== undefined)
+		return file_size_float(size, /* unit: */bytes, /* precision */float);
 	if(bytes) {
 		if(size < 1000)        /* Bytes */
 			return format("%ldB",size);
@@ -56,3 +58,24 @@ function file_size_str(size, bytes)
 
 	return "Too damn big to download.";
 }
+
+// ported from xpdev/genwrap.c byte_estimate_to_str()
+function file_size_float(bytes, unit, precision)
+{
+	const one_tebibyte = 1024.0*1024.0*1024.0*1024.0;
+	const one_gibibyte = 1024.0*1024.0*1024.0;
+	const one_mebibyte = 1024.0*1024.0;
+	const one_kibibyte = 1024.0;
+
+	if(bytes >= one_tebibyte)
+		return format("%1.*fT", precision, bytes/one_tebibyte);
+	if(bytes >= one_gibibyte || unit == one_gibibyte)
+		return format("%1.*fG", precision, bytes/one_gibibyte);
+	if(bytes >= one_mebibyte || unit == one_mebibyte)
+		return format("%1.*fM", precision, bytes/one_mebibyte);
+	else if(bytes >= one_kibibyte || unit == one_kibibyte)
+		return format("%1.*fK", precision, bytes/one_kibibyte);
+	else
+		return format("%luB", bytes);
+
+}
-- 
GitLab