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