1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2011 AT&T Intellectual Property * 5 * and is licensed under the * 6 * Eclipse Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.eclipse.org/org/documents/epl-v10.html * 11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12 * * 13 * Information and Software Systems Research * 14 * AT&T Research * 15 * Florham Park NJ * 16 * * 17 * Glenn Fowler <gsf@research.att.com> * 18 * David Korn <dgk@research.att.com> * 19 * Phong Vo <kpv@research.att.com> * 20 * * 21 ***********************************************************************/ 22 #pragma prototyped 23 /* 24 * Glenn Fowler 25 * AT&T Bell Laboratories 26 * 27 * parse elapsed time in 1/n secs from s 28 * compatible with fmtelapsed() 29 * also handles ps [day-][hour:]min:sec 30 * also handles coshell % for 'infinity' 31 * if e!=0 then it is set to first unrecognized char 32 */ 33 34 #include <ast.h> 35 #include <ctype.h> 36 37 unsigned long 38 strelapsed(register const char* s, char** e, int n) 39 { 40 register int c; 41 register unsigned long v; 42 unsigned long t = 0; 43 int f = 0; 44 int p = 0; 45 int z = 1; 46 int m; 47 const char* last; 48 49 for (;;) 50 { 51 while (isspace(*s) || *s == '_') 52 s++; 53 if (!*(last = s)) 54 break; 55 if (z) 56 { 57 z = 0; 58 if (*s == '0' && (!(c = *(s + 1)) || isspace(c) || c == '_')) 59 { 60 last = s + 1; 61 break; 62 } 63 } 64 v = 0; 65 while ((c = *s++) >= '0' && c <= '9') 66 v = v * 10 + c - '0'; 67 v *= n; 68 if (c == '.') 69 for (m = n; (c = *s++) >= '0' && c <= '9';) 70 f += (m /= 10) * (c - '0'); 71 if (c == '%') 72 { 73 t = ~t; 74 last = s; 75 break; 76 } 77 if (s == last + 1) 78 break; 79 if (!p) 80 while (isspace(c) || c == '_') 81 c = *s++; 82 switch (c) 83 { 84 case 'S': 85 if (*s == 'E' || *s == 'e') 86 { 87 v += f; 88 f = 0; 89 } 90 else 91 v *= 20 * 12 * 4 * 7 * 24 * 60 * 60; 92 break; 93 case 'y': 94 case 'Y': 95 v *= 12 * 4 * 7 * 24 * 60 * 60; 96 break; 97 case 'M': 98 if (*s == 'I' || *s == 'i') 99 v *= 60; 100 else 101 v *= 4 * 7 * 24 * 60 * 60; 102 break; 103 case 'w': 104 v *= 7 * 24 * 60 * 60; 105 break; 106 case '-': 107 p = 1; 108 /*FALLTHROUGH*/ 109 case 'd': 110 v *= 24 * 60 * 60; 111 break; 112 case 'h': 113 v *= 60 * 60; 114 break; 115 case ':': 116 p = 1; 117 v *= strchr(s, ':') ? (60 * 60) : 60; 118 break; 119 case 'm': 120 if (*s == 'o') 121 v *= 4 * 7 * 24 * 60 * 60; 122 else 123 v *= 60; 124 break; 125 case 's': 126 if (*s == 'c') 127 { 128 v *= 20 * 12 * 4 * 7 * 24 * 60 * 60; 129 break; 130 } 131 v += f; 132 f = 0; 133 break; 134 case 0: 135 s--; 136 v += f; 137 break; 138 default: 139 if (p) 140 { 141 last = s - 1; 142 t += v + f; 143 } 144 goto done; 145 } 146 t += v; 147 while (isalpha(*s)) 148 s++; 149 } 150 done: 151 if (e) 152 *e = (char*)last; 153 return t; 154 } 155