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