summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/string/fmtnum.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libast/common/string/fmtnum.c')
-rw-r--r--usr/src/lib/libast/common/string/fmtnum.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/string/fmtnum.c b/usr/src/lib/libast/common/string/fmtnum.c
new file mode 100644
index 0000000000..a5410492e3
--- /dev/null
+++ b/usr/src/lib/libast/common/string/fmtnum.c
@@ -0,0 +1,92 @@
+/***********************************************************************
+* *
+* This software is part of the ast package *
+* Copyright (c) 1985-2007 AT&T Knowledge Ventures *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Knowledge Ventures *
+* *
+* A copy of the License is available at *
+* http://www.opensource.org/licenses/cpl1.0.txt *
+* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
+* *
+* Information and Software Systems Research *
+* AT&T Research *
+* Florham Park NJ *
+* *
+* Glenn Fowler <gsf@research.att.com> *
+* David Korn <dgk@research.att.com> *
+* Phong Vo <kpv@research.att.com> *
+* *
+***********************************************************************/
+#pragma prototyped
+/*
+ * Glenn Fowler
+ * AT&T Research
+ *
+ * return scaled number n
+ * string width is 5 chars or less
+ * if m>1 then n divided by m before scaling
+ */
+
+#include <ast.h>
+
+char*
+fmtnum(register unsigned long n, int m)
+{
+ register int i;
+ register unsigned long r;
+ char* buf;
+ int z;
+
+ char suf[2];
+
+ if (m > 1)
+ {
+ r = n;
+ n /= m;
+ r -= n;
+ }
+ else
+ r = 0;
+ suf[1] = 0;
+ if (n < 1024)
+ suf[0] = 0;
+ else if (n < 1024 * 1024)
+ {
+ suf[0] = 'k';
+ r = ((n % 1024) * 100) / 1024;
+ n /= 1024;
+ }
+ else if (n < 1024 * 1024 * 1024)
+ {
+ suf[0] = 'm';
+ r = ((n % (1024 * 1024)) * 100) / (1024 * 1024);
+ n /= 1024 * 1024;
+ }
+ else
+ {
+ suf[0] = 'g';
+ r = ((n % (1024 * 1024 * 1024)) * 100) / (1024 * 1024 * 1024);
+ n /= 1024 * 1024 * 1024;
+ }
+ if (r)
+ {
+ if (n >= 100)
+ r = 0;
+ else if (n >= 10)
+ {
+ i = 1;
+ if (r >= 10)
+ r /= 10;
+ }
+ else
+ i = 2;
+ }
+ buf = fmtbuf(z = 8);
+ if (r)
+ sfsprintf(buf, z, "%lu.%0*lu%s", n, i, r, suf);
+ else
+ sfsprintf(buf, z, "%lu%s", n, suf);
+ return buf;
+}