1 /*
2  * Copyright (c) 1988 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of California at Berkeley. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  *
12  *  Sendmail
13  *  Copyright (c) 1983  Eric P. Allman
14  *  Berkeley, California
15  */
16 
17 #ifndef lint
18 static char sccsid[] = "@(#)convtime.c	5.2 (Berkeley) 03/13/88";
19 #endif /* not lint */
20 
21 # include <ctype.h>
22 # include "useful.h"
23 
24 /*
25 **  CONVTIME -- convert time
26 **
27 **	Takes a time as an ascii string with a trailing character
28 **	giving units:
29 **	  s -- seconds
30 **	  m -- minutes
31 **	  h -- hours
32 **	  d -- days (default)
33 **	  w -- weeks
34 **	For example, "3d12h" is three and a half days.
35 **
36 **	Parameters:
37 **		p -- pointer to ascii time.
38 **
39 **	Returns:
40 **		time in seconds.
41 **
42 **	Side Effects:
43 **		none.
44 */
45 
46 time_t
47 convtime(p)
48 	char *p;
49 {
50 	register time_t t, r;
51 	register char c;
52 
53 	r = 0;
54 	while (*p != '\0')
55 	{
56 		t = 0;
57 		while (isdigit(c = *p++))
58 			t = t * 10 + (c - '0');
59 		if (c == '\0')
60 			p--;
61 		switch (c)
62 		{
63 		  case 'w':		/* weeks */
64 			t *= 7;
65 
66 		  case 'd':		/* days */
67 		  default:
68 			t *= 24;
69 
70 		  case 'h':		/* hours */
71 			t *= 60;
72 
73 		  case 'm':		/* minutes */
74 			t *= 60;
75 
76 		  case 's':		/* seconds */
77 			break;
78 		}
79 		r += t;
80 	}
81 
82 	return (r);
83 }
84 /*
85 **  PINTVL -- produce printable version of a time interval
86 **
87 **	Parameters:
88 **		intvl -- the interval to be converted
89 **		brief -- if TRUE, print this in an extremely compact form
90 **			(basically used for logging).
91 **
92 **	Returns:
93 **		A pointer to a string version of intvl suitable for
94 **			printing or framing.
95 **
96 **	Side Effects:
97 **		none.
98 **
99 **	Warning:
100 **		The string returned is in a static buffer.
101 */
102 
103 # define PLURAL(n)	((n) == 1 ? "" : "s")
104 
105 char *
106 pintvl(intvl, brief)
107 	time_t intvl;
108 	bool brief;
109 {
110 	static char buf[256];
111 	register char *p;
112 	int wk, dy, hr, mi, se;
113 
114 	if (intvl == 0 && !brief)
115 		return ("zero seconds");
116 
117 	/* decode the interval into weeks, days, hours, minutes, seconds */
118 	se = intvl % 60;
119 	intvl /= 60;
120 	mi = intvl % 60;
121 	intvl /= 60;
122 	hr = intvl % 24;
123 	intvl /= 24;
124 	if (brief)
125 		dy = intvl;
126 	else
127 	{
128 		dy = intvl % 7;
129 		intvl /= 7;
130 		wk = intvl;
131 	}
132 
133 	/* now turn it into a sexy form */
134 	p = buf;
135 	if (brief)
136 	{
137 		if (dy > 0)
138 		{
139 			(void) sprintf(p, "%d+", dy);
140 			p += strlen(p);
141 		}
142 		(void) sprintf(p, "%02d:%02d:%02d", hr, mi, se);
143 		return (buf);
144 	}
145 
146 	/* use the verbose form */
147 	if (wk > 0)
148 	{
149 		(void) sprintf(p, ", %d week%s", wk, PLURAL(wk));
150 		p += strlen(p);
151 	}
152 	if (dy > 0)
153 	{
154 		(void) sprintf(p, ", %d day%s", dy, PLURAL(dy));
155 		p += strlen(p);
156 	}
157 	if (hr > 0)
158 	{
159 		(void) sprintf(p, ", %d hour%s", hr, PLURAL(hr));
160 		p += strlen(p);
161 	}
162 	if (mi > 0)
163 	{
164 		(void) sprintf(p, ", %d minute%s", mi, PLURAL(mi));
165 		p += strlen(p);
166 	}
167 	if (se > 0)
168 	{
169 		(void) sprintf(p, ", %d second%s", se, PLURAL(se));
170 		p += strlen(p);
171 	}
172 
173 	return (buf + 2);
174 }
175