Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/string/fmtelapsed.c
1810 views
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 <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
/*
24
* return pointer to formatted elapsed time for u 1/n secs
25
* compatible with strelapsed()
26
* return value length is at most 7
27
*/
28
29
#include <ast.h>
30
31
char*
32
fmtelapsed(register unsigned long u, register int n)
33
{
34
register unsigned long t;
35
char* buf;
36
int z;
37
38
if (u == 0L)
39
return "0";
40
if (u == ~0L)
41
return "%";
42
buf = fmtbuf(z = 8);
43
t = u / n;
44
if (t < 60)
45
sfsprintf(buf, z, "%lu.%02lus", t, (u * 100 / n) % 100);
46
else if (t < 60*60)
47
sfsprintf(buf, z, "%lum%02lus", t / 60, t - (t / 60) * 60);
48
else if (t < 24*60*60)
49
sfsprintf(buf, z, "%luh%02lum", t / (60*60), (t - (t / (60*60)) * (60*60)) / 60);
50
else if (t < 7*24*60*60)
51
sfsprintf(buf, z, "%lud%02luh", t / (24*60*60), (t - (t / (24*60*60)) * (24*60*60)) / (60*60));
52
else if (t < 31*24*60*60)
53
sfsprintf(buf, z, "%luw%02lud", t / (7*24*60*60), (t - (t / (7*24*60*60)) * (7*24*60*60)) / (24*60*60));
54
else if (t < 365*24*60*60)
55
sfsprintf(buf, z, "%luM%02lud", (t * 12) / (365*24*60*60), ((t * 12) - ((t * 12) / (365*24*60*60)) * (365*24*60*60)) / (12*24*60*60));
56
else if (t < (365UL*4UL+1UL)*24UL*60UL*60UL)
57
sfsprintf(buf, z, "%luY%02luM", t / (365*24*60*60), ((t - (t / (365*24*60*60)) * (365*24*60*60)) * 5) / (152 * 24 * 60 * 60));
58
else
59
sfsprintf(buf, z, "%luY%02luM", (t * 4) / ((365UL*4UL+1UL)*24UL*60UL*60UL), (((t * 4) - ((t * 4) / ((365UL*4UL+1UL)*24UL*60UL*60UL)) * ((365UL*4UL+1UL)*24UL*60UL*60UL)) * 5) / ((4 * 152 + 1) * 24 * 60 * 60));
60
return buf;
61
}
62
63