1 # include <ctype.h>
2 # include "useful.h"
3 
4 SCCSID(@(#)convtime.c	4.1		07/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 }
157