BSD 4_4 release
[unix-history] / usr / src / usr.sbin / sendmail / src / convtime.c
index 3114d10..5cb5e49 100644 (file)
@@ -1,13 +1,59 @@
-# include <sys/types.h>
-# include <ctype.h>
+/*
+ * Copyright (c) 1983 Eric P. Allman
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
 
-static char    SccsId[] =      "@(#)convtime.c 3.1     %G%";
+#ifndef lint
+static char sccsid[] = "@(#)convtime.c 8.1 (Berkeley) 6/7/93";
+#endif /* not lint */
+
+# include <ctype.h>
+# include "useful.h"
 
 /*
 **  CONVTIME -- convert time
 **
 
 /*
 **  CONVTIME -- convert time
 **
+**     Takes a time as an ascii string with a trailing character
+**     giving units:
+**       s -- seconds
+**       m -- minutes
+**       h -- hours
+**       d -- days (default)
+**       w -- weeks
+**     For example, "3d12h" is three and a half days.
+**
 **     Parameters:
 **             p -- pointer to ascii time.
 **     Parameters:
 **             p -- pointer to ascii time.
+**             units -- default units if none specified.
 **
 **     Returns:
 **             time in seconds.
 **
 **     Returns:
 **             time in seconds.
@@ -17,33 +63,135 @@ static char        SccsId[] =      "@(#)convtime.c 3.1     %G%";
 */
 
 time_t
 */
 
 time_t
-convtime(p)
+convtime(p, units)
        char *p;
        char *p;
+       char units;
 {
 {
-       register time_t t;
+       register time_t t, r;
+       register char c;
 
 
-       t = 0;
-       while (isdigit(*p))
-               t = t * 10 + (*p++ - '0');
-       switch (*p)
+       r = 0;
+       while (*p != '\0')
        {
        {
-         case 'w':             /* weeks */
-               t *= 7;
+               t = 0;
+               while ((c = *p++) != '\0' && isascii(c) && isdigit(c))
+                       t = t * 10 + (c - '0');
+               if (c == '\0')
+               {
+                       c = units;
+                       p--;
+               }
+               switch (c)
+               {
+                 case 'w':             /* weeks */
+                       t *= 7;
 
 
-         case 'd':             /* days */
-         case '\0':
-         default:
-               t *= 24;
+                 case 'd':             /* days */
+                 default:
+                       t *= 24;
 
 
-         case 'h':             /* hours */
-               t *= 60;
+                 case 'h':             /* hours */
+                       t *= 60;
+
+                 case 'm':             /* minutes */
+                       t *= 60;
+
+                 case 's':             /* seconds */
+                       break;
+               }
+               r += t;
+       }
+
+       return (r);
+}
+\f/*
+**  PINTVL -- produce printable version of a time interval
+**
+**     Parameters:
+**             intvl -- the interval to be converted
+**             brief -- if TRUE, print this in an extremely compact form
+**                     (basically used for logging).
+**
+**     Returns:
+**             A pointer to a string version of intvl suitable for
+**                     printing or framing.
+**
+**     Side Effects:
+**             none.
+**
+**     Warning:
+**             The string returned is in a static buffer.
+*/
 
 
-         case 'm':             /* minutes */
-               t *= 60;
+# define PLURAL(n)     ((n) == 1 ? "" : "s")
 
 
-         case 's':             /* seconds */
-               break;
+char *
+pintvl(intvl, brief)
+       time_t intvl;
+       bool brief;
+{
+       static char buf[256];
+       register char *p;
+       int wk, dy, hr, mi, se;
+
+       if (intvl == 0 && !brief)
+               return ("zero seconds");
+
+       /* decode the interval into weeks, days, hours, minutes, seconds */
+       se = intvl % 60;
+       intvl /= 60;
+       mi = intvl % 60;
+       intvl /= 60;
+       hr = intvl % 24;
+       intvl /= 24;
+       if (brief)
+               dy = intvl;
+       else
+       {
+               dy = intvl % 7;
+               intvl /= 7;
+               wk = intvl;
+       }
+
+       /* now turn it into a sexy form */
+       p = buf;
+       if (brief)
+       {
+               if (dy > 0)
+               {
+                       (void) sprintf(p, "%d+", dy);
+                       p += strlen(p);
+               }
+               (void) sprintf(p, "%02d:%02d:%02d", hr, mi, se);
+               return (buf);
+       }
+
+       /* use the verbose form */
+       if (wk > 0)
+       {
+               (void) sprintf(p, ", %d week%s", wk, PLURAL(wk));
+               p += strlen(p);
+       }
+       if (dy > 0)
+       {
+               (void) sprintf(p, ", %d day%s", dy, PLURAL(dy));
+               p += strlen(p);
+       }
+       if (hr > 0)
+       {
+               (void) sprintf(p, ", %d hour%s", hr, PLURAL(hr));
+               p += strlen(p);
+       }
+       if (mi > 0)
+       {
+               (void) sprintf(p, ", %d minute%s", mi, PLURAL(mi));
+               p += strlen(p);
+       }
+       if (se > 0)
+       {
+               (void) sprintf(p, ", %d second%s", se, PLURAL(se));
+               p += strlen(p);
        }
 
        }
 
-       return (t);
+       return (buf + 2);
 }
 }