#pragma prototyped
#include <ast.h>
#include <ctype.h>
unsigned long
strelapsed(register const char* s, char** e, int n)
{
register int c;
register unsigned long v;
unsigned long t = 0;
int f = 0;
int p = 0;
int m;
const char* last;
for (;;)
{
while (isspace(*s) || *s == '_')
s++;
if (!*(last = s))
break;
v = 0;
while ((c = *s++) >= '0' && c <= '9')
v = v * 10 + c - '0';
v *= n;
if (c == '.')
for (m = n; (c = *s++) >= '0' && c <= '9';)
f += (m /= 10) * (c - '0');
if (c == '%')
{
t = ~t;
last = s;
break;
}
if (s == last + 1)
break;
if (!p)
while (isspace(c) || c == '_')
c = *s++;
switch (c)
{
case 'S':
if (*s == 'E' || *s == 'e')
{
v += f;
f = 0;
}
else
v *= 20 * 12 * 4 * 7 * 24 * 60 * 60;
break;
case 'y':
case 'Y':
v *= 12 * 4 * 7 * 24 * 60 * 60;
break;
case 'M':
if (*s == 'I' || *s == 'i')
v *= 60;
else
v *= 4 * 7 * 24 * 60 * 60;
break;
case 'w':
v *= 7 * 24 * 60 * 60;
break;
case '-':
p = 1;
case 'd':
v *= 24 * 60 * 60;
break;
case 'h':
v *= 60 * 60;
break;
case ':':
p = 1;
v *= strchr(s, ':') ? (60 * 60) : 60;
break;
case 'm':
if (*s == 'o')
v *= 4 * 7 * 24 * 60 * 60;
else
v *= 60;
break;
case 's':
if (*s == 'c')
{
v *= 20 * 12 * 4 * 7 * 24 * 60 * 60;
break;
}
case 0:
v += f;
f = 0;
break;
default:
if (p)
{
last = s - 1;
t += v + f;
}
goto done;
}
t += v;
while (isalpha(*s))
s++;
}
done:
if (e)
*e = (char*)last;
return t;
}