xref: /freebsd/contrib/sendmail/src/convtime.c (revision 06f25ae9f1d6020a600a10f713046203d1a82570)
1c2aa98e2SPeter Wemm /*
206f25ae9SGregory Neil Shapiro  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
306f25ae9SGregory Neil Shapiro  *	All rights reserved.
4c2aa98e2SPeter Wemm  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
5c2aa98e2SPeter Wemm  * Copyright (c) 1988, 1993
6c2aa98e2SPeter Wemm  *	The Regents of the University of California.  All rights reserved.
7c2aa98e2SPeter Wemm  *
8c2aa98e2SPeter Wemm  * By using this file, you agree to the terms and conditions set
9c2aa98e2SPeter Wemm  * forth in the LICENSE file which can be found at the top level of
10c2aa98e2SPeter Wemm  * the sendmail distribution.
11c2aa98e2SPeter Wemm  *
12c2aa98e2SPeter Wemm  */
13c2aa98e2SPeter Wemm 
14c2aa98e2SPeter Wemm #ifndef lint
1506f25ae9SGregory Neil Shapiro static char id[] = "@(#)$Id: convtime.c,v 8.25 1999/06/16 21:11:26 ca Exp $";
1606f25ae9SGregory Neil Shapiro #endif /* ! lint */
17c2aa98e2SPeter Wemm 
1806f25ae9SGregory Neil Shapiro #include <sendmail.h>
19c2aa98e2SPeter Wemm 
20c2aa98e2SPeter Wemm /*
21c2aa98e2SPeter Wemm **  CONVTIME -- convert time
22c2aa98e2SPeter Wemm **
23c2aa98e2SPeter Wemm **	Takes a time as an ascii string with a trailing character
24c2aa98e2SPeter Wemm **	giving units:
25c2aa98e2SPeter Wemm **	  s -- seconds
26c2aa98e2SPeter Wemm **	  m -- minutes
27c2aa98e2SPeter Wemm **	  h -- hours
28c2aa98e2SPeter Wemm **	  d -- days (default)
29c2aa98e2SPeter Wemm **	  w -- weeks
30c2aa98e2SPeter Wemm **	For example, "3d12h" is three and a half days.
31c2aa98e2SPeter Wemm **
32c2aa98e2SPeter Wemm **	Parameters:
33c2aa98e2SPeter Wemm **		p -- pointer to ascii time.
34c2aa98e2SPeter Wemm **		units -- default units if none specified.
35c2aa98e2SPeter Wemm **
36c2aa98e2SPeter Wemm **	Returns:
37c2aa98e2SPeter Wemm **		time in seconds.
38c2aa98e2SPeter Wemm **
39c2aa98e2SPeter Wemm **	Side Effects:
40c2aa98e2SPeter Wemm **		none.
41c2aa98e2SPeter Wemm */
42c2aa98e2SPeter Wemm 
43c2aa98e2SPeter Wemm time_t
44c2aa98e2SPeter Wemm convtime(p, units)
45c2aa98e2SPeter Wemm 	char *p;
4606f25ae9SGregory Neil Shapiro 	int units;
47c2aa98e2SPeter Wemm {
48c2aa98e2SPeter Wemm 	register time_t t, r;
49c2aa98e2SPeter Wemm 	register char c;
50c2aa98e2SPeter Wemm 
51c2aa98e2SPeter Wemm 	r = 0;
5206f25ae9SGregory Neil Shapiro 	if (strcasecmp(p, "now") == 0)
5306f25ae9SGregory Neil Shapiro 		return NOW;
54c2aa98e2SPeter Wemm 	while (*p != '\0')
55c2aa98e2SPeter Wemm 	{
56c2aa98e2SPeter Wemm 		t = 0;
57c2aa98e2SPeter Wemm 		while ((c = *p++) != '\0' && isascii(c) && isdigit(c))
58c2aa98e2SPeter Wemm 			t = t * 10 + (c - '0');
59c2aa98e2SPeter Wemm 		if (c == '\0')
60c2aa98e2SPeter Wemm 		{
61c2aa98e2SPeter Wemm 			c = units;
62c2aa98e2SPeter Wemm 			p--;
63c2aa98e2SPeter Wemm 		}
64c2aa98e2SPeter Wemm 		else if (strchr("wdhms", c) == NULL)
65c2aa98e2SPeter Wemm 		{
66c2aa98e2SPeter Wemm 			usrerr("Invalid time unit `%c'", c);
67c2aa98e2SPeter Wemm 			c = units;
68c2aa98e2SPeter Wemm 		}
69c2aa98e2SPeter Wemm 		switch (c)
70c2aa98e2SPeter Wemm 		{
71c2aa98e2SPeter Wemm 		  case 'w':		/* weeks */
72c2aa98e2SPeter Wemm 			t *= 7;
7306f25ae9SGregory Neil Shapiro 			/* FALLTHROUGH */
74c2aa98e2SPeter Wemm 
75c2aa98e2SPeter Wemm 		  case 'd':		/* days */
7606f25ae9SGregory Neil Shapiro 			/* FALLTHROUGH */
77c2aa98e2SPeter Wemm 		  default:
78c2aa98e2SPeter Wemm 			t *= 24;
7906f25ae9SGregory Neil Shapiro 			/* FALLTHROUGH */
80c2aa98e2SPeter Wemm 
81c2aa98e2SPeter Wemm 		  case 'h':		/* hours */
82c2aa98e2SPeter Wemm 			t *= 60;
8306f25ae9SGregory Neil Shapiro 			/* FALLTHROUGH */
84c2aa98e2SPeter Wemm 
85c2aa98e2SPeter Wemm 		  case 'm':		/* minutes */
86c2aa98e2SPeter Wemm 			t *= 60;
8706f25ae9SGregory Neil Shapiro 			/* FALLTHROUGH */
88c2aa98e2SPeter Wemm 
89c2aa98e2SPeter Wemm 		  case 's':		/* seconds */
90c2aa98e2SPeter Wemm 			break;
91c2aa98e2SPeter Wemm 		}
92c2aa98e2SPeter Wemm 		r += t;
93c2aa98e2SPeter Wemm 	}
94c2aa98e2SPeter Wemm 
9506f25ae9SGregory Neil Shapiro 	return r;
96c2aa98e2SPeter Wemm }
97c2aa98e2SPeter Wemm /*
98c2aa98e2SPeter Wemm **  PINTVL -- produce printable version of a time interval
99c2aa98e2SPeter Wemm **
100c2aa98e2SPeter Wemm **	Parameters:
101c2aa98e2SPeter Wemm **		intvl -- the interval to be converted
102c2aa98e2SPeter Wemm **		brief -- if TRUE, print this in an extremely compact form
103c2aa98e2SPeter Wemm **			(basically used for logging).
104c2aa98e2SPeter Wemm **
105c2aa98e2SPeter Wemm **	Returns:
106c2aa98e2SPeter Wemm **		A pointer to a string version of intvl suitable for
107c2aa98e2SPeter Wemm **			printing or framing.
108c2aa98e2SPeter Wemm **
109c2aa98e2SPeter Wemm **	Side Effects:
110c2aa98e2SPeter Wemm **		none.
111c2aa98e2SPeter Wemm **
112c2aa98e2SPeter Wemm **	Warning:
113c2aa98e2SPeter Wemm **		The string returned is in a static buffer.
114c2aa98e2SPeter Wemm */
115c2aa98e2SPeter Wemm 
116c2aa98e2SPeter Wemm #define PLURAL(n)	((n) == 1 ? "" : "s")
117c2aa98e2SPeter Wemm 
118c2aa98e2SPeter Wemm char *
119c2aa98e2SPeter Wemm pintvl(intvl, brief)
120c2aa98e2SPeter Wemm 	time_t intvl;
121c2aa98e2SPeter Wemm 	bool brief;
122c2aa98e2SPeter Wemm {
123c2aa98e2SPeter Wemm 	static char buf[256];
124c2aa98e2SPeter Wemm 	register char *p;
125c2aa98e2SPeter Wemm 	int wk, dy, hr, mi, se;
126c2aa98e2SPeter Wemm 
127c2aa98e2SPeter Wemm 	if (intvl == 0 && !brief)
12806f25ae9SGregory Neil Shapiro 		return "zero seconds";
12906f25ae9SGregory Neil Shapiro 	if (intvl == NOW)
13006f25ae9SGregory Neil Shapiro 		return "too long";
131c2aa98e2SPeter Wemm 
132c2aa98e2SPeter Wemm 	/* decode the interval into weeks, days, hours, minutes, seconds */
133c2aa98e2SPeter Wemm 	se = intvl % 60;
134c2aa98e2SPeter Wemm 	intvl /= 60;
135c2aa98e2SPeter Wemm 	mi = intvl % 60;
136c2aa98e2SPeter Wemm 	intvl /= 60;
137c2aa98e2SPeter Wemm 	hr = intvl % 24;
138c2aa98e2SPeter Wemm 	intvl /= 24;
139c2aa98e2SPeter Wemm 	if (brief)
140c2aa98e2SPeter Wemm 	{
141c2aa98e2SPeter Wemm 		dy = intvl;
142c2aa98e2SPeter Wemm 		wk = 0;
143c2aa98e2SPeter Wemm 	}
144c2aa98e2SPeter Wemm 	else
145c2aa98e2SPeter Wemm 	{
146c2aa98e2SPeter Wemm 		dy = intvl % 7;
147c2aa98e2SPeter Wemm 		intvl /= 7;
148c2aa98e2SPeter Wemm 		wk = intvl;
149c2aa98e2SPeter Wemm 	}
150c2aa98e2SPeter Wemm 
151c2aa98e2SPeter Wemm 	/* now turn it into a sexy form */
152c2aa98e2SPeter Wemm 	p = buf;
153c2aa98e2SPeter Wemm 	if (brief)
154c2aa98e2SPeter Wemm 	{
155c2aa98e2SPeter Wemm 		if (dy > 0)
156c2aa98e2SPeter Wemm 		{
157c2aa98e2SPeter Wemm 			(void) snprintf(p, SPACELEFT(buf, p), "%d+", dy);
158c2aa98e2SPeter Wemm 			p += strlen(p);
159c2aa98e2SPeter Wemm 		}
160c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), "%02d:%02d:%02d",
161c2aa98e2SPeter Wemm 			hr, mi, se);
16206f25ae9SGregory Neil Shapiro 		return buf;
163c2aa98e2SPeter Wemm 	}
164c2aa98e2SPeter Wemm 
165c2aa98e2SPeter Wemm 	/* use the verbose form */
166c2aa98e2SPeter Wemm 	if (wk > 0)
167c2aa98e2SPeter Wemm 	{
168c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), ", %d week%s", wk, PLURAL(wk));
169c2aa98e2SPeter Wemm 		p += strlen(p);
170c2aa98e2SPeter Wemm 	}
171c2aa98e2SPeter Wemm 	if (dy > 0)
172c2aa98e2SPeter Wemm 	{
173c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), ", %d day%s", dy, PLURAL(dy));
174c2aa98e2SPeter Wemm 		p += strlen(p);
175c2aa98e2SPeter Wemm 	}
176c2aa98e2SPeter Wemm 	if (hr > 0)
177c2aa98e2SPeter Wemm 	{
178c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), ", %d hour%s", hr, PLURAL(hr));
179c2aa98e2SPeter Wemm 		p += strlen(p);
180c2aa98e2SPeter Wemm 	}
181c2aa98e2SPeter Wemm 	if (mi > 0)
182c2aa98e2SPeter Wemm 	{
183c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), ", %d minute%s", mi, PLURAL(mi));
184c2aa98e2SPeter Wemm 		p += strlen(p);
185c2aa98e2SPeter Wemm 	}
186c2aa98e2SPeter Wemm 	if (se > 0)
187c2aa98e2SPeter Wemm 	{
188c2aa98e2SPeter Wemm 		(void) snprintf(p, SPACELEFT(buf, p), ", %d second%s", se, PLURAL(se));
189c2aa98e2SPeter Wemm 		p += strlen(p);
190c2aa98e2SPeter Wemm 	}
191c2aa98e2SPeter Wemm 
192c2aa98e2SPeter Wemm 	return (buf + 2);
193c2aa98e2SPeter Wemm }
194