1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-11-11 04:20:01 +01:00

29663: add $EPOCHREALTIME to zsh/datetime

This commit is contained in:
Peter Stephenson 2011-08-10 11:31:18 +00:00
parent 92ee9324a9
commit bbbaed2b53
5 changed files with 56 additions and 3 deletions

@ -1,3 +1,14 @@
2011-08-10 Peter Stephenson <pws@csr.com>
* 29663: configure.ac, Src/module.c, Src/Modules/datetime.c,
Doc/Zsh/mod_datetime.yo: add $EPOCHREALTIME for time in
double precision floating point.
2011-08-04 Peter Stephenson <pws@csr.com>
* 29643: Src/signals.c, Src/utils.c, Src/zle_main.c: set
incompfunc to zero when executing hook or trap function.
2011-08-09 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 29661: Doc/Zsh/redirect.yo: Improve the documentation for
@ -15213,5 +15224,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.5417 $
* $Revision: 1.5418 $
*****************************************************

@ -30,9 +30,17 @@ in seconds if tt(-r) is given) to var(scalar) instead of printing it.
)
enditem()
The tt(zsh/datetime) module makes available one parameter:
The tt(zsh/datetime) module makes available several parameters:
startitem()
vindex(EPOCHREALTIME)
item(tt(EPOCHREALTIME))(
A floating point value representing the number of seconds since
the epoch. The notional accuracy is to nanoseconds if the
tt(clock_gettime) call is available and to microseconds otherwise,
but in practice the range of double precision floating point and
shell scheduling latencies may be significant effects.
)
vindex(EPOCHSECONDS)
item(tt(EPOCHSECONDS))(
An integer value representing the number of seconds since the

@ -151,6 +151,28 @@ getcurrentsecs(UNUSED(Param pm))
return (zlong) time(NULL);
}
static double
getcurrentrealtime(UNUSED(Param pm))
{
#ifdef HAVE_CLOCK_GETTIME
struct timespec now;
if (clock_gettime(CLOCK_REALTIME, &now) < 0) {
zwarn("EPOCHREALTIME: unable to retrieve time: %e", errno);
return (double)0.0;
}
return (double)now.tv_sec + (double)now.tv_nsec * 1e-9;
#else
struct timeval now;
struct timezone dummy_tz;
gettimeofday(&now, &dummy_tz);
return (double)now.tv_sec + (double)now.tv_usec * 1e-6;
#endif
}
static struct builtin bintab[] = {
BUILTIN("strftime", 0, bin_strftime, 2, 2, 0, "qrs:", NULL),
};
@ -158,9 +180,14 @@ static struct builtin bintab[] = {
static const struct gsu_integer epochseconds_gsu =
{ getcurrentsecs, NULL, stdunsetfn };
static const struct gsu_float epochrealtime_gsu =
{ getcurrentrealtime, NULL, stdunsetfn };
static struct paramdef patab[] = {
SPECIALPMDEF("EPOCHSECONDS", PM_INTEGER|PM_READONLY,
&epochseconds_gsu, NULL, NULL),
SPECIALPMDEF("EPOCHREALTIME", PM_FFLOAT|PM_READONLY,
&epochrealtime_gsu, NULL, NULL)
};
static struct features module_features = {

@ -1081,6 +1081,11 @@ addparamdef(Paramdef d)
pm->gsu.i = d->gsu ? (GsuInteger)d->gsu : &varinteger_gsu;
break;
case PM_FFLOAT:
case PM_EFLOAT:
pm->gsu.f = d->gsu;
break;
case PM_ARRAY:
pm->gsu.a = d->gsu ? (GsuArray)d->gsu : &vararray_gsu;
break;

@ -693,6 +693,8 @@ AC_CHECK_LIB(c, printf, [LIBS="$LIBS -lc"])
AC_CHECK_LIB(m, pow)
AC_CHECK_LIB(rt, clock_gettime)
dnl Various features of ncurses depend on having the right header
dnl (the system's own curses.h may well not be good enough).
dnl So don't search for ncurses unless we found the header.
@ -1170,7 +1172,7 @@ dnl need to integrate this function
dnl AC_FUNC_STRFTIME
AC_CHECK_FUNCS(strftime strptime mktime timelocal \
difftime gettimeofday \
difftime gettimeofday clock_gettime \
select poll \
readlink faccessx fchdir ftruncate \
fstat lstat lchown fchown fchmod \