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#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 33Time_t 34tmxduration(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