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