Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/string/strelapsed.c
1810 views
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 <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
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
156