|
|
1.1 root 1: # include <ctype.h>
2: # include "useful.h"
3:
4: SCCSID(@(#)convtime.c 4.1 7/25/83);
5:
6: /*
7: ** CONVTIME -- convert time
8: **
9: ** Takes a time as an ascii string with a trailing character
10: ** giving units:
11: ** s -- seconds
12: ** m -- minutes
13: ** h -- hours
14: ** d -- days (default)
15: ** w -- weeks
16: ** For example, "3d12h" is three and a half days.
17: **
18: ** Parameters:
19: ** p -- pointer to ascii time.
20: **
21: ** Returns:
22: ** time in seconds.
23: **
24: ** Side Effects:
25: ** none.
26: */
27:
28: time_t
29: convtime(p)
30: char *p;
31: {
32: register time_t t, r;
33: register char c;
34:
35: r = 0;
36: while (*p != '\0')
37: {
38: t = 0;
39: while (isdigit(c = *p++))
40: t = t * 10 + (c - '0');
41: if (c == '\0')
42: p--;
43: switch (c)
44: {
45: case 'w': /* weeks */
46: t *= 7;
47:
48: case 'd': /* days */
49: default:
50: t *= 24;
51:
52: case 'h': /* hours */
53: t *= 60;
54:
55: case 'm': /* minutes */
56: t *= 60;
57:
58: case 's': /* seconds */
59: break;
60: }
61: r += t;
62: }
63:
64: return (r);
65: }
66: /*
67: ** PINTVL -- produce printable version of a time interval
68: **
69: ** Parameters:
70: ** intvl -- the interval to be converted
71: ** brief -- if TRUE, print this in an extremely compact form
72: ** (basically used for logging).
73: **
74: ** Returns:
75: ** A pointer to a string version of intvl suitable for
76: ** printing or framing.
77: **
78: ** Side Effects:
79: ** none.
80: **
81: ** Warning:
82: ** The string returned is in a static buffer.
83: */
84:
85: # define PLURAL(n) ((n) == 1 ? "" : "s")
86:
87: char *
88: pintvl(intvl, brief)
89: time_t intvl;
90: bool brief;
91: {
92: static char buf[256];
93: register char *p;
94: int wk, dy, hr, mi, se;
95:
96: if (intvl == 0 && !brief)
97: return ("zero seconds");
98:
99: /* decode the interval into weeks, days, hours, minutes, seconds */
100: se = intvl % 60;
101: intvl /= 60;
102: mi = intvl % 60;
103: intvl /= 60;
104: hr = intvl % 24;
105: intvl /= 24;
106: if (brief)
107: dy = intvl;
108: else
109: {
110: dy = intvl % 7;
111: intvl /= 7;
112: wk = intvl;
113: }
114:
115: /* now turn it into a sexy form */
116: p = buf;
117: if (brief)
118: {
119: if (dy > 0)
120: {
121: (void) sprintf(p, "%d+", dy);
122: p += strlen(p);
123: }
124: (void) sprintf(p, "%02d:%02d:%02d", hr, mi, se);
125: return (buf);
126: }
127:
128: /* use the verbose form */
129: if (wk > 0)
130: {
131: (void) sprintf(p, ", %d week%s", wk, PLURAL(wk));
132: p += strlen(p);
133: }
134: if (dy > 0)
135: {
136: (void) sprintf(p, ", %d day%s", dy, PLURAL(dy));
137: p += strlen(p);
138: }
139: if (hr > 0)
140: {
141: (void) sprintf(p, ", %d hour%s", hr, PLURAL(hr));
142: p += strlen(p);
143: }
144: if (mi > 0)
145: {
146: (void) sprintf(p, ", %d minute%s", mi, PLURAL(mi));
147: p += strlen(p);
148: }
149: if (se > 0)
150: {
151: (void) sprintf(p, ", %d second%s", se, PLURAL(se));
152: p += strlen(p);
153: }
154:
155: return (buf + 2);
156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.