/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 2002-2011 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* dss time type library
*
* Glenn Fowler
* AT&T Research
*/
#include <dsslib.h>
#include <tmx.h>
#if TMX_FLOAT
#endif
typedef struct Precise_s
{
const char* format;
int shift;
} Precise_t;
static ssize_t
time_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
time_t t;
if (!size)
return 40;
return 2 * size;
return s - buf;
}
static ssize_t
time_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
char* f;
{
if (!*f && e > (char*)buf)
return e - (char*)buf;
}
return e - (char*)buf;
}
static void*
{
{
return 0;
}
return precise;
}
static void*
{
{
return 0;
}
return precise;
}
static Time_t
{
Time_t m;
#if TMX_FLOAT
m = t;
t /= NS;
t = (Tmxsec_t)t;
m -= t * NS;
t *= SS;
m *= SS;
#else
m = t % NS;
t /= NS;
t <<= s;
m <<= s;
#endif
m /= NS;
return t + m;
}
static Time_t
{
Time_t m;
#if TMX_FLOAT
m = t / SS;
m = (Tmxnsec_t)m;
m *= NS;
m = t - m;
m /= SS;
t /= SS;
t *= NS;
#else
m = 1;
m <<= s;
m--;
m &= t;
t >>= s;
t *= NS;
m *= NS;
m >>= s;
#endif
return t + m;
}
static ssize_t
precise_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
Time_t t;
if (!size)
return 2 * size;
return s - buf;
}
static ssize_t
precise_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
char* f;
Time_t t;
{
}
else
return e - (char*)buf;
}
static ssize_t
elapsed_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
ssize_t n;
n = strlen(s);
if ((n + 1) > size)
return n + 1;
return n;
}
static ssize_t
elapsed_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
if (e == (char*)buf)
return -1;
return e - (char*)buf;
}
static ssize_t
tm_hour_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
int v;
ssize_t n;
{
if (v > 12)
v -= 12;
if ((n + 1) > size)
return n + 1;
}
else
{
if ((n + 1) > size)
n++;
}
return n;
}
static ssize_t
tm_hour_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
if (e == (char*)buf)
return -1;
return e - (char*)buf;
}
static ssize_t
tm_mon_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
int v;
ssize_t n;
if (v <= 0)
v = 0;
else
v %= 12;
{
n = strlen(s);
if ((n + 1) > size)
return n + 1;
}
else
{
if ((n + 1) > size)
n++;
}
return n;
}
static ssize_t
tm_mon_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
int v;
if (e != (char*)buf)
{
if (v < 1 || v > 12)
return -1;
v--;
}
else if ((v = tmlex(buf, &e, tm_info.format + TM_MONTH_ABBREV, TM_DAY_ABBREV - TM_MONTH_ABBREV, NiL, 0)) < 0)
return -1;
else if (v >= 12)
v -= 12;
return e - (char*)buf;
}
static ssize_t
tm_wday_external(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxvalue_t* value, char* buf, size_t size, Cxdisc_t* disc)
{
char* s;
int v;
ssize_t n;
if (v <= 0)
v = 0;
else
v %= 7;
{
n = strlen(s);
if ((n + 1) > size)
return n + 1;
}
else
{
if ((n + 1) > size)
n++;
}
return n;
}
static ssize_t
tm_wday_internal(Cx_t* cx, Cxtype_t* type, const char* details, Cxformat_t* format, Cxoperand_t* ret, const char* buf, size_t size, Vmalloc_t* vm, Cxdisc_t* disc)
{
char* e;
int v;
if (e != (char*)buf)
{
if (v < 1 || v > 7)
return -1;
v--;
}
return -1;
else if (v >= 7)
v -= 7;
return e - (char*)buf;
}
{
{0}
};
typedef struct Tm_state_s
{
Time_t t;
} Tm_state_t;
static void*
{
{
return 0;
}
return state;
}
static int
tm_get(Cx_t* cx, Cxinstruction_t* pc, Cxoperand_t* r, Cxoperand_t* a, Cxoperand_t* b, void* data, Cxdisc_t* disc)
{
Time_t t;
int shift;
{
}
{
}
else
t *= NS;
if (state->t != t)
{
state->t = t;
}
{
case TIME_T_sec:
break;
case TIME_T_min:
break;
case TIME_T_hour:
break;
case TIME_T_mday:
break;
case TIME_T_mon:
break;
case TIME_T_year:
break;
case TIME_T_wday:
break;
case TIME_T_yday:
break;
case TIME_T_isdst:
break;
case TIME_T_ns:
break;
default:
return -1;
}
return 0;
}
static int
tm_set(Cx_t* cx, Cxinstruction_t* pc, Cxoperand_t* r, Cxoperand_t* a, Cxoperand_t* b, void* data, Cxdisc_t* disc)
{
Time_t t;
int i;
int shift;
{
}
{
}
else
{
shift = -1;
t *= NS;
}
if (state->t != t)
{
state->t = t;
}
{
case TIME_T_sec:
break;
case TIME_T_min:
break;
case TIME_T_hour:
break;
case TIME_T_mday:
break;
case TIME_T_mon:
break;
case TIME_T_year:
break;
case TIME_T_wday:
i += 7;
break;
case TIME_T_yday:
break;
case TIME_T_isdst:
break;
case TIME_T_ns:
return -1;
default:
return -1;
}
if (shift < 0)
t /= NS;
else if (shift)
return 0;
}
{
};
{
{ "tm_hour_t", "Hour since midnight with optional meridian (AM/PM).", CXH, (Cxtype_t*)"number", 0, tm_hour_external, tm_hour_internal, 0, 0, 0, 0, { "The format details string is a \bprintf\b(3) format string.", "%d", CX_UNSIGNED|CX_INTEGER, 1 } },
{ "tm_mon_t", "Month name represented as a number [0-11], starting at January.", CXH, (Cxtype_t*)"number", 0, tm_mon_external, tm_mon_internal, 0, 0, 0, 0, { "The format details string is a \bprintf\b(3) format string.", "%s", CX_UNSIGNED|CX_INTEGER, 1 } },
{ "tm_wday_t", "Weekday name represented as a number [0-6], starting at Sunday.", CXH, (Cxtype_t*)"number", 0, tm_wday_external, tm_wday_internal, 0, 0, 0, 0, { "The format details string is a \bprintf\b(3) format string.", "%s", CX_UNSIGNED|CX_INTEGER, 1 } },
{ "tm_t", "Time parts.", CXH, (Cxtype_t*)"number", tm_init, 0, 0, 0, 0, 0, 0, { 0, 0, CX_UNSIGNED|CX_INTEGER, 4 }, 0, &tm_member },
{ "elapsed_t", "Elapsed time in milliseconds.", CXH, (Cxtype_t*)"number", 0, elapsed_external, elapsed_internal, 0, 0, 0, 0, { 0, 0, CX_INTEGER, 4 } },
{ "ns_t", "64 bit nanoseconds since the epoch.", CXH, (Cxtype_t*)"tm_t", ns_init, precise_external, precise_internal, 0, 0, 0, 0, { "The format details string is a \bstrftime\b(3)/\bstrptime\b(3) format string.", "%K.%9N", CX_UNSIGNED|CX_INTEGER, 8 } },
{ "stamp_t", "64 bit 1/2**32 seconds since the epoch.", CXH, (Cxtype_t*)"tm_t", stamp_init, precise_external, precise_internal, 0, 0, 0, 0, { "The format details string is a \bstrftime\b(3)/\bstrptime\b(3) format string.", "%K.%N", CX_UNSIGNED|CX_INTEGER, 8 } },
{ "time_t", "32 bit seconds since the epoch.", CXH, (Cxtype_t*)"tm_t", 0, time_external, time_internal, 0, 0, 0, 0, { "The format details string is a \bstrftime\b(3)/\bstrptime\b(3) format string.", "%K", CX_UNSIGNED|CX_INTEGER, 4 } },
{ 0, 0 }
};
{
"time_t",
"time type support"
"[-?\n@(#)$Id: dss time type library (AT&T Research) 2011-09-10 $\n]"
CXH,
0,
0,
&types[0],
};