1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-03 10:21:46 +02:00

29674: add $epochtime to datetime

This commit is contained in:
Peter Stephenson 2011-08-11 18:45:04 +00:00
parent 7e27b4eee3
commit 8cbd510002
2 changed files with 61 additions and 2 deletions

View file

@ -30,7 +30,8 @@ in seconds if tt(-r) is given) to var(scalar) instead of printing it.
)
enditem()
The tt(zsh/datetime) module makes available several parameters:
The tt(zsh/datetime) module makes available several parameters;
all are readonly:
startitem()
vindex(EPOCHREALTIME)
@ -45,5 +46,19 @@ vindex(EPOCHSECONDS)
item(tt(EPOCHSECONDS))(
An integer value representing the number of seconds since the
epoch.
)
vindex(epochtime)
item(tt(epochtime))(
An array value containing the number of seconds since the epoch
in the first element and the remainder of the time since the epoch
in nanoseconds in the second element. To ensure the two elements
are consistent the array should be copied or otherwise referenced
as a single substitution before the values are used. The following
idiom may be used:
example(for secs nsecs in $epochtime; do
...
done)
)
enditem()

View file

@ -173,6 +173,45 @@ getcurrentrealtime(UNUSED(Param pm))
#endif
}
static char **
getcurrenttime(UNUSED(Param pm))
{
char **arr;
char buf[DIGBUFSIZE];
#ifdef HAVE_CLOCK_GETTIME
struct timespec now;
if (clock_gettime(CLOCK_REALTIME, &now) < 0) {
zwarn("EPOCHREALTIME: unable to retrieve time: %e", errno);
return NULL;
}
arr = (char **)zhalloc(3 * sizeof(*arr));
sprintf(buf, "%ld", (long)now.tv_sec);
arr[0] = dupstring(buf);
sprintf(buf, "%ld", now.tv_nsec);
arr[1] = dupstring(buf);
arr[2] = NULL;
return arr;
#else
struct timeval now;
struct timezone dummy_tz;
gettimeofday(&now, &dummy_tz);
arr = (char **)zhalloc(3 * sizeof(*arr));
sprintf(buf, "%ld", (long)now.tv_sec);
arr[0] = dupstring(buf);
sprintf(buf, "%ld", (long)now.tv_usec * 1000);
arr[1] = dupstring(buf);
arr[2] = NULL;
return arr;
#endif
}
static struct builtin bintab[] = {
BUILTIN("strftime", 0, bin_strftime, 2, 2, 0, "qrs:", NULL),
};
@ -183,11 +222,16 @@ static const struct gsu_integer epochseconds_gsu =
static const struct gsu_float epochrealtime_gsu =
{ getcurrentrealtime, NULL, stdunsetfn };
static const struct gsu_array epochtime_gsu =
{ getcurrenttime, 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)
&epochrealtime_gsu, NULL, NULL),
SPECIALPMDEF("epochtime", PM_ARRAY|PM_READONLY,
&epochtime_gsu, NULL, NULL)
};
static struct features module_features = {