-
Notifications
You must be signed in to change notification settings - Fork 34
/
Copy pathfmtnum.c
88 lines (84 loc) · 2.24 KB
/
fmtnum.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1985-2011 AT&T Intellectual Property *
* Copyright (c) 2020-2023 Contributors to ksh 93u+m *
* and is licensed under the *
* Eclipse Public License, Version 2.0 *
* *
* A copy of the License is available at *
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html *
* (with md5 checksum 84283fa8859daf213bdda5a9f8d1be1d) *
* *
* Glenn Fowler <[email protected]> *
* David Korn <[email protected]> *
* Phong Vo <[email protected]> *
* Martijn Dekker <[email protected]> *
* *
***********************************************************************/
/*
* 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(unsigned long n, int m)
{
int i;
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;
}