Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/tm/tmxduration.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
#include <tmx.h>
25
#include <ctype.h>
26
27
/*
28
* parse duration expression in s and return Time_t value
29
* if non-null, e points to the first unused char in s
30
* returns 0 with *e==s on error
31
*/
32
33
Time_t
34
tmxduration(const char* s, char** e)
35
{
36
Time_t ns;
37
Time_t ts;
38
Time_t now;
39
char* last;
40
char* t;
41
char* x;
42
Sfio_t* f;
43
int i;
44
45
now = TMX_NOW;
46
while (isspace(*s))
47
s++;
48
if (*s == 'P' || *s == 'p')
49
ns = tmxdate(s, &last, now) - now;
50
else
51
{
52
ns = strtod(s, &last) * TMX_RESOLUTION;
53
if (*last && (f = sfstropen()))
54
{
55
sfprintf(f, "exact %s", s);
56
t = sfstruse(f);
57
ts = tmxdate(t, &x, now);
58
if ((i = x - t - 6) > (last - s))
59
{
60
last = (char*)s + i;
61
ns = ts - now;
62
}
63
else
64
{
65
sfprintf(f, "p%s", s);
66
t = sfstruse(f);
67
ts = tmxdate(t, &x, now);
68
if ((i = x - t - 1) > (last - s))
69
{
70
last = (char*)s + i;
71
ns = ts - now;
72
}
73
}
74
sfstrclose(f);
75
}
76
}
77
if (e)
78
*e = last;
79
return ns;
80
}
81
82