1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2011 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24 * Glenn Fowler
25 * AT&T Research
26 *
27 * return scaled number n
28 * string width is 5 chars or less
29 * if m>1 then n divided by m before scaling
30 */
31
32 #include <ast.h>
33
34 char*
fmtnum(register unsigned long n,int m)35 fmtnum(register unsigned long n, int m)
36 {
37 register int i;
38 register unsigned long r;
39 char* buf;
40 int z;
41
42 char suf[2];
43
44 if (m > 1)
45 {
46 r = n;
47 n /= m;
48 r -= n;
49 }
50 else
51 r = 0;
52 suf[1] = 0;
53 if (n < 1024)
54 suf[0] = 0;
55 else if (n < 1024 * 1024)
56 {
57 suf[0] = 'k';
58 r = ((n % 1024) * 100) / 1024;
59 n /= 1024;
60 }
61 else if (n < 1024 * 1024 * 1024)
62 {
63 suf[0] = 'm';
64 r = ((n % (1024 * 1024)) * 100) / (1024 * 1024);
65 n /= 1024 * 1024;
66 }
67 else
68 {
69 suf[0] = 'g';
70 r = ((n % (1024 * 1024 * 1024)) * 100) / (1024 * 1024 * 1024);
71 n /= 1024 * 1024 * 1024;
72 }
73 if (r)
74 {
75 if (n >= 100)
76 r = 0;
77 else if (n >= 10)
78 {
79 i = 1;
80 if (r >= 10)
81 r /= 10;
82 }
83 else
84 i = 2;
85 }
86 buf = fmtbuf(z = 8);
87 if (r)
88 sfsprintf(buf, z, "%lu.%0*lu%s", n, i, r, suf);
89 else
90 sfsprintf(buf, z, "%lu%s", n, suf);
91 return buf;
92 }
93