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