strftime: Add support for %s (seconds since epoch)
* libc/time/strftime.c (__strftime): add support for %s (seconds from Unix epoch). Fix whitespaces. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
cf51db8baa
commit
6090952296
|
@ -1,3 +1,8 @@
|
||||||
|
2015-10-26 Brian Inglis <Brian.Inglis@SystematicSw.ab.ca>
|
||||||
|
|
||||||
|
* libc/time/strftime.c (__strftime): add support for %s (seconds from
|
||||||
|
Unix epoch). Fix whitespaces.
|
||||||
|
|
||||||
2015-10-19 Nick Clifton <nickc@redhat.com>
|
2015-10-19 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* libc/include/sys/_intsup.h: Add support for 16-bit and 20-bit
|
* libc/include/sys/_intsup.h: Add support for 16-bit and 20-bit
|
||||||
|
|
|
@ -79,7 +79,7 @@ The century, that is, the year divided by 100 then truncated. For
|
||||||
4-digit years, the result is zero-padded and exactly two characters;
|
4-digit years, the result is zero-padded and exactly two characters;
|
||||||
but for other years, there may a negative sign or more digits. In
|
but for other years, there may a negative sign or more digits. In
|
||||||
this way, `<<%C%y>>' is equivalent to `<<%Y>>'. [tm_year]
|
this way, `<<%C%y>>' is equivalent to `<<%Y>>'. [tm_year]
|
||||||
|
|
||||||
o %d
|
o %d
|
||||||
The day of the month, formatted with two digits (from `<<01>>' to
|
The day of the month, formatted with two digits (from `<<01>>' to
|
||||||
`<<31>>'). [tm_mday]
|
`<<31>>'). [tm_mday]
|
||||||
|
@ -110,7 +110,7 @@ includes January 4th, and begin on Mondays. Therefore, if January 1st,
|
||||||
2nd, or 3rd falls on a Sunday, that day and earlier belong to the last
|
2nd, or 3rd falls on a Sunday, that day and earlier belong to the last
|
||||||
week of the previous year; and if December 29th, 30th, or 31st falls
|
week of the previous year; and if December 29th, 30th, or 31st falls
|
||||||
on Monday, that day and later belong to week 1 of the next year. For
|
on Monday, that day and later belong to week 1 of the next year. For
|
||||||
consistency with %Y, it always has at least four characters.
|
consistency with %Y, it always has at least four characters.
|
||||||
Example: "%G" for Saturday 2nd January 1999 gives "1998", and for
|
Example: "%G" for Saturday 2nd January 1999 gives "1998", and for
|
||||||
Tuesday 30th December 1997 gives "1998". [tm_year, tm_wday, tm_yday]
|
Tuesday 30th December 1997 gives "1998". [tm_year, tm_wday, tm_yday]
|
||||||
|
|
||||||
|
@ -166,6 +166,10 @@ notations, the result is an empty string. [tm_sec, tm_min, tm_hour]
|
||||||
o %R
|
o %R
|
||||||
The 24-hour time, to the minute. Equivalent to "%H:%M". [tm_min, tm_hour]
|
The 24-hour time, to the minute. Equivalent to "%H:%M". [tm_min, tm_hour]
|
||||||
|
|
||||||
|
o %s
|
||||||
|
The time elapsed, in seconds, since the start of the Unix epoch at
|
||||||
|
1970-01-01 00:00:00 UTC.
|
||||||
|
|
||||||
o %S
|
o %S
|
||||||
The second, formatted with two digits (from `<<00>>' to `<<60>>'). The
|
The second, formatted with two digits (from `<<00>>' to `<<60>>'). The
|
||||||
value 60 accounts for the occasional leap second. [tm_sec]
|
value 60 accounts for the occasional leap second. [tm_sec]
|
||||||
|
@ -273,7 +277,7 @@ the "C" locale settings.
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
#include "local.h"
|
#include "local.h"
|
||||||
#include "../locale/timelocal.h"
|
#include "../locale/timelocal.h"
|
||||||
|
|
||||||
/* Defines to make the file dual use for either strftime() or wcsftime().
|
/* Defines to make the file dual use for either strftime() or wcsftime().
|
||||||
* To get wcsftime, define MAKE_WCSFTIME.
|
* To get wcsftime, define MAKE_WCSFTIME.
|
||||||
* To get strftime, do not define MAKE_WCSFTIME.
|
* To get strftime, do not define MAKE_WCSFTIME.
|
||||||
|
@ -738,7 +742,7 @@ _DEFUN (strftime, (s, maxsize, format, tim_p),
|
||||||
if (*format == CQ('E'))
|
if (*format == CQ('E'))
|
||||||
{
|
{
|
||||||
alt = *format++;
|
alt = *format++;
|
||||||
#ifdef _WANT_C99_TIME_FORMATS
|
#ifdef _WANT_C99_TIME_FORMATS
|
||||||
#if defined (MAKE_WCSFTIME) && defined (__HAVE_LOCALE_INFO_EXTENDED__)
|
#if defined (MAKE_WCSFTIME) && defined (__HAVE_LOCALE_INFO_EXTENDED__)
|
||||||
if (!*era_info && *_CurrentTimeLocale->wera)
|
if (!*era_info && *_CurrentTimeLocale->wera)
|
||||||
*era_info = get_era_info (tim_p, _CurrentTimeLocale->wera);
|
*era_info = get_era_info (tim_p, _CurrentTimeLocale->wera);
|
||||||
|
@ -751,7 +755,7 @@ _DEFUN (strftime, (s, maxsize, format, tim_p),
|
||||||
else if (*format == CQ('O'))
|
else if (*format == CQ('O'))
|
||||||
{
|
{
|
||||||
alt = *format++;
|
alt = *format++;
|
||||||
#ifdef _WANT_C99_TIME_FORMATS
|
#ifdef _WANT_C99_TIME_FORMATS
|
||||||
#if defined (MAKE_WCSFTIME) && defined (__HAVE_LOCALE_INFO_EXTENDED__)
|
#if defined (MAKE_WCSFTIME) && defined (__HAVE_LOCALE_INFO_EXTENDED__)
|
||||||
if (!*alt_digits && *_CurrentTimeLocale->walt_digits)
|
if (!*alt_digits && *_CurrentTimeLocale->walt_digits)
|
||||||
*alt_digits = get_alt_digits (_CurrentTimeLocale->walt_digits);
|
*alt_digits = get_alt_digits (_CurrentTimeLocale->walt_digits);
|
||||||
|
@ -934,7 +938,7 @@ recurse:
|
||||||
{ /* %F is equivalent to "%+4Y-%m-%d", flags and width can change
|
{ /* %F is equivalent to "%+4Y-%m-%d", flags and width can change
|
||||||
that. Recurse to avoid need to replicate %Y formation. */
|
that. Recurse to avoid need to replicate %Y formation. */
|
||||||
CHAR fmtbuf[32], *fmt = fmtbuf;
|
CHAR fmtbuf[32], *fmt = fmtbuf;
|
||||||
|
|
||||||
*fmt++ = CQ('%');
|
*fmt++ = CQ('%');
|
||||||
if (pad) /* '0' or '+' */
|
if (pad) /* '0' or '+' */
|
||||||
*fmt++ = pad;
|
*fmt++ = pad;
|
||||||
|
@ -1109,6 +1113,74 @@ recurse:
|
||||||
tim_p->tm_hour, tim_p->tm_min);
|
tim_p->tm_hour, tim_p->tm_min);
|
||||||
CHECK_LENGTH ();
|
CHECK_LENGTH ();
|
||||||
break;
|
break;
|
||||||
|
case CQ('s'):
|
||||||
|
/*
|
||||||
|
* From:
|
||||||
|
* The Open Group Base Specifications Issue 7
|
||||||
|
* IEEE Std 1003.1, 2013 Edition
|
||||||
|
* Copyright (c) 2001-2013 The IEEE and The Open Group
|
||||||
|
* XBD Base Definitions
|
||||||
|
* 4. General Concepts
|
||||||
|
* 4.15 Seconds Since the Epoch
|
||||||
|
* A value that approximates the number of seconds that have elapsed since the
|
||||||
|
* Epoch. A Coordinated Universal Time name (specified in terms of seconds
|
||||||
|
* (tm_sec), minutes (tm_min), hours (tm_hour), days since January 1 of the year
|
||||||
|
* (tm_yday), and calendar year minus 1900 (tm_year)) is related to a time
|
||||||
|
* represented as seconds since the Epoch, according to the expression below.
|
||||||
|
* If the year is <1970 or the value is negative, the relationship is undefined.
|
||||||
|
* If the year is >=1970 and the value is non-negative, the value is related to a
|
||||||
|
* Coordinated Universal Time name according to the C-language expression, where
|
||||||
|
* tm_sec, tm_min, tm_hour, tm_yday, and tm_year are all integer types:
|
||||||
|
* tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 +
|
||||||
|
* (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 -
|
||||||
|
* ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
|
||||||
|
* OR
|
||||||
|
* ((((tm_year-69)/4 - (tm_year-1)/100 + (tm_year+299)/400 +
|
||||||
|
* (tm_year-70)*365 + tm_yday)*24 + tm_hour)*60 + tm_min)*60 + tm_sec
|
||||||
|
*/
|
||||||
|
/* modified from %z case by hoisting offset outside if block and initializing */
|
||||||
|
{
|
||||||
|
long offset = 0; /* offset < 0 => W of GMT, > 0 => E of GMT:
|
||||||
|
subtract to get UTC */
|
||||||
|
|
||||||
|
if (tim_p->tm_isdst >= 0)
|
||||||
|
{
|
||||||
|
TZ_LOCK;
|
||||||
|
if (!tzset_called)
|
||||||
|
{
|
||||||
|
_tzset_unlocked ();
|
||||||
|
tzset_called = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined (__CYGWIN__)
|
||||||
|
/* Cygwin must check if the application has been built with or
|
||||||
|
without the extra tm members for backward compatibility, and
|
||||||
|
then use either that or the old method fetching from tzinfo.
|
||||||
|
Rather than pulling in the version check infrastructure, we
|
||||||
|
just call a Cygwin function. */
|
||||||
|
extern long __cygwin_gettzoffset (const struct tm *tmp);
|
||||||
|
offset = __cygwin_gettzoffset (tim_p);
|
||||||
|
#elif defined (__TM_GMTOFF)
|
||||||
|
offset = tim_p->__TM_GMTOFF;
|
||||||
|
#else
|
||||||
|
__tzinfo_type *tz = __gettzinfo ();
|
||||||
|
/* The sign of this is exactly opposite the envvar TZ. We
|
||||||
|
could directly use the global _timezone for tm_isdst==0,
|
||||||
|
but have to use __tzrule for daylight savings. */
|
||||||
|
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
||||||
|
#endif
|
||||||
|
TZ_UNLOCK;
|
||||||
|
}
|
||||||
|
len = snprintf (&s[count], maxsize - count, CQ("%lld"),
|
||||||
|
(((((long long)tim_p->tm_year - 69)/4
|
||||||
|
- (tim_p->tm_year - 1)/100
|
||||||
|
+ (tim_p->tm_year + 299)/400
|
||||||
|
+ (tim_p->tm_year - 70)*365 + tim_p->tm_yday)*24
|
||||||
|
+ tim_p->tm_hour)*60 + tim_p->tm_min)*60
|
||||||
|
+ tim_p->tm_sec - offset);
|
||||||
|
CHECK_LENGTH ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case CQ('S'):
|
case CQ('S'):
|
||||||
#ifdef _WANT_C99_TIME_FORMATS
|
#ifdef _WANT_C99_TIME_FORMATS
|
||||||
if (alt != CQ('O') || !*alt_digits
|
if (alt != CQ('O') || !*alt_digits
|
||||||
|
@ -1378,13 +1450,13 @@ recurse:
|
||||||
/* The remainder of this file can serve as a regression test. Compile
|
/* The remainder of this file can serve as a regression test. Compile
|
||||||
* with -D_REGRESSION_TEST. */
|
* with -D_REGRESSION_TEST. */
|
||||||
#if defined(_REGRESSION_TEST) /* [Test code: */
|
#if defined(_REGRESSION_TEST) /* [Test code: */
|
||||||
|
|
||||||
/* This test code relies on ANSI C features, in particular on the ability
|
/* This test code relies on ANSI C features, in particular on the ability
|
||||||
* of adjacent strings to be pasted together into one string. */
|
* of adjacent strings to be pasted together into one string. */
|
||||||
|
|
||||||
/* Test output buffer size (should be larger than all expected results) */
|
/* Test output buffer size (should be larger than all expected results) */
|
||||||
#define OUTSIZE 256
|
#define OUTSIZE 256
|
||||||
|
|
||||||
struct test {
|
struct test {
|
||||||
CHAR *fmt; /* Testing format */
|
CHAR *fmt; /* Testing format */
|
||||||
size_t max; /* Testing maxsize */
|
size_t max; /* Testing maxsize */
|
||||||
|
@ -1396,9 +1468,9 @@ struct list {
|
||||||
const struct test *vec; /* Test vectors */
|
const struct test *vec; /* Test vectors */
|
||||||
int cnt; /* Number of vectors */
|
int cnt; /* Number of vectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
const char TZ[]="TZ=EST5EDT";
|
const char TZ[]="TZ=EST5EDT";
|
||||||
|
|
||||||
/* Define list of test inputs and expected outputs, for the given time zone
|
/* Define list of test inputs and expected outputs, for the given time zone
|
||||||
* and time. */
|
* and time. */
|
||||||
const struct tm tm0 = {
|
const struct tm tm0 = {
|
||||||
|
@ -1442,6 +1514,7 @@ const struct test Vec0[] = {
|
||||||
{ CQ("%p"), 2+1, EXP(CQ("AM")) },
|
{ CQ("%p"), 2+1, EXP(CQ("AM")) },
|
||||||
{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) },
|
{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) },
|
||||||
{ CQ("%R"), 5+1, EXP(CQ("09:53")) },
|
{ CQ("%R"), 5+1, EXP(CQ("09:53")) },
|
||||||
|
{ CQ("%s"), 2+1, EXP(CQ("1230648827")) },
|
||||||
{ CQ("%S"), 2+1, EXP(CQ("47")) },
|
{ CQ("%S"), 2+1, EXP(CQ("47")) },
|
||||||
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
||||||
{ CQ("%T"), 8+1, EXP(CQ("09:53:47")) },
|
{ CQ("%T"), 8+1, EXP(CQ("09:53:47")) },
|
||||||
|
@ -1502,6 +1575,7 @@ const struct test Vec1[] = {
|
||||||
{ CQ("%p"), 2+1, EXP(CQ("PM")) },
|
{ CQ("%p"), 2+1, EXP(CQ("PM")) },
|
||||||
{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) },
|
{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) },
|
||||||
{ CQ("%R"), 5+1, EXP(CQ("23:01")) },
|
{ CQ("%R"), 5+1, EXP(CQ("23:01")) },
|
||||||
|
{ CQ("%s"), 2+1, EXP(CQ("1215054073")) },
|
||||||
{ CQ("%S"), 2+1, EXP(CQ("13")) },
|
{ CQ("%S"), 2+1, EXP(CQ("13")) },
|
||||||
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
{ CQ("%t"), 1+1, EXP(CQ("\t")) },
|
||||||
{ CQ("%T"), 8+1, EXP(CQ("23:01:13")) },
|
{ CQ("%T"), 8+1, EXP(CQ("23:01:13")) },
|
||||||
|
@ -1526,7 +1600,7 @@ const struct test Vec1[] = {
|
||||||
#undef VEC
|
#undef VEC
|
||||||
#undef EXP
|
#undef EXP
|
||||||
};
|
};
|
||||||
|
|
||||||
#if YEAR_BASE == 1900 /* ( */
|
#if YEAR_BASE == 1900 /* ( */
|
||||||
/* Checks for very large years. YEAR_BASE value relied upon so that the
|
/* Checks for very large years. YEAR_BASE value relied upon so that the
|
||||||
* answer strings can be predetermined.
|
* answer strings can be predetermined.
|
||||||
|
@ -1624,7 +1698,7 @@ const struct test Vecyr1[] = {
|
||||||
#undef CENT
|
#undef CENT
|
||||||
#undef Year
|
#undef Year
|
||||||
#endif /* YEAR_BASE ) */
|
#endif /* YEAR_BASE ) */
|
||||||
|
|
||||||
/* Checks for years just over zero (also test for s=60).
|
/* Checks for years just over zero (also test for s=60).
|
||||||
* Years less than 4 digits are not mentioned for %Y in the standard, so the
|
* Years less than 4 digits are not mentioned for %Y in the standard, so the
|
||||||
* test for that case is based on the design intent. */
|
* test for that case is based on the design intent. */
|
||||||
|
@ -1695,7 +1769,7 @@ const struct test Vecyrzn[] = {
|
||||||
#undef YEAR
|
#undef YEAR
|
||||||
#undef CENT
|
#undef CENT
|
||||||
#undef Year
|
#undef Year
|
||||||
|
|
||||||
const struct list ListYr[] = {
|
const struct list ListYr[] = {
|
||||||
{ &tmyrzp, Vecyrzp, sizeof(Vecyrzp)/sizeof(Vecyrzp[0]) },
|
{ &tmyrzp, Vecyrzp, sizeof(Vecyrzp)/sizeof(Vecyrzp[0]) },
|
||||||
{ &tmyrzn, Vecyrzn, sizeof(Vecyrzn)/sizeof(Vecyrzn[0]) },
|
{ &tmyrzn, Vecyrzn, sizeof(Vecyrzn)/sizeof(Vecyrzn[0]) },
|
||||||
|
@ -1704,19 +1778,19 @@ const struct list ListYr[] = {
|
||||||
{ &tmyr1, Vecyr1, sizeof(Vecyr1)/sizeof(Vecyr1[0]) },
|
{ &tmyr1, Vecyr1, sizeof(Vecyr1)/sizeof(Vecyr1[0]) },
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* List of tests to be run */
|
/* List of tests to be run */
|
||||||
const struct list List[] = {
|
const struct list List[] = {
|
||||||
{ &tm0, Vec0, sizeof(Vec0)/sizeof(Vec0[0]) },
|
{ &tm0, Vec0, sizeof(Vec0)/sizeof(Vec0[0]) },
|
||||||
{ &tm1, Vec1, sizeof(Vec1)/sizeof(Vec1[0]) },
|
{ &tm1, Vec1, sizeof(Vec1)/sizeof(Vec1[0]) },
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(STUB_getenv_r)
|
#if defined(STUB_getenv_r)
|
||||||
char *
|
char *
|
||||||
_getenv_r(struct _reent *p, const char *cp) { return getenv(cp); }
|
_getenv_r(struct _reent *p, const char *cp) { return getenv(cp); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
main(void)
|
main(void)
|
||||||
{
|
{
|
||||||
|
@ -1724,7 +1798,7 @@ int i, l, errr=0, erro=0, tot=0;
|
||||||
const char *cp;
|
const char *cp;
|
||||||
CHAR out[OUTSIZE];
|
CHAR out[OUTSIZE];
|
||||||
size_t ret;
|
size_t ret;
|
||||||
|
|
||||||
/* Set timezone so that %z and %Z tests come out right */
|
/* Set timezone so that %z and %Z tests come out right */
|
||||||
cp = TZ;
|
cp = TZ;
|
||||||
if((i=putenv(cp))) {
|
if((i=putenv(cp))) {
|
||||||
|
@ -1736,7 +1810,7 @@ if(strcmp(getenv("TZ"),strchr(TZ,'=')+1)) {
|
||||||
return(-2);
|
return(-2);
|
||||||
}
|
}
|
||||||
tzset();
|
tzset();
|
||||||
|
|
||||||
#if defined(VERBOSE)
|
#if defined(VERBOSE)
|
||||||
printf("_timezone=%d, _daylight=%d, _tzname[0]=%s, _tzname[1]=%s\n", _timezone, _daylight, _tzname[0], _tzname[1]);
|
printf("_timezone=%d, _daylight=%d, _tzname[0]=%s, _tzname[1]=%s\n", _timezone, _daylight, _tzname[0], _tzname[1]);
|
||||||
{
|
{
|
||||||
|
@ -1748,7 +1822,7 @@ __tzinfo_type *tz = __gettzinfo ();
|
||||||
printf("tz->__tzrule[0].offset=%d, tz->__tzrule[1].offset=%d\n", tz->__tzrule[0].offset, tz->__tzrule[1].offset);
|
printf("tz->__tzrule[0].offset=%d, tz->__tzrule[1].offset=%d\n", tz->__tzrule[0].offset, tz->__tzrule[1].offset);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Run all of the exact-length tests as-given--results should match */
|
/* Run all of the exact-length tests as-given--results should match */
|
||||||
for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
||||||
const struct list *test = &List[l];
|
const struct list *test = &List[l];
|
||||||
|
@ -1769,7 +1843,7 @@ for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run all of the exact-length tests with the length made too short--expect to
|
/* Run all of the exact-length tests with the length made too short--expect to
|
||||||
* fail. */
|
* fail. */
|
||||||
for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
||||||
|
@ -1795,7 +1869,7 @@ for(l=0; l<sizeof(List)/sizeof(List[0]); l++) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run all of the special year test cases */
|
/* Run all of the special year test cases */
|
||||||
for(l=0; l<sizeof(ListYr)/sizeof(ListYr[0]); l++) {
|
for(l=0; l<sizeof(ListYr)/sizeof(ListYr[0]); l++) {
|
||||||
const struct list *test = &ListYr[l];
|
const struct list *test = &ListYr[l];
|
||||||
|
@ -1816,14 +1890,14 @@ for(l=0; l<sizeof(ListYr)/sizeof(ListYr[0]); l++) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STRIZE(f) #f
|
#define STRIZE(f) #f
|
||||||
#define NAME(f) STRIZE(f)
|
#define NAME(f) STRIZE(f)
|
||||||
printf(NAME(strftime) "() test ");
|
printf(NAME(strftime) "() test ");
|
||||||
if(errr || erro) printf("FAILED %d/%d of", errr, erro);
|
if(errr || erro) printf("FAILED %d/%d of", errr, erro);
|
||||||
else printf("passed");
|
else printf("passed");
|
||||||
printf(" %d test cases.\n", tot);
|
printf(" %d test cases.\n", tot);
|
||||||
|
|
||||||
return(errr || erro);
|
return(errr || erro);
|
||||||
}
|
}
|
||||||
#endif /* defined(_REGRESSION_TEST) ] */
|
#endif /* defined(_REGRESSION_TEST) ] */
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
What's new:
|
What's new:
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
- strftime(3) supports %s (seconds since Epoch) now.
|
||||||
|
|
||||||
- posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
- posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
||||||
starting with Windows 8/Server 2012. Still a no-op on older systems.
|
starting with Windows 8/Server 2012. Still a no-op on older systems.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2015-10-27 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* new-features.xml (ov-new2.3): Document strftime %s addition.
|
||||||
|
|
||||||
2015-10-22 Corinna Vinschen <corinna@vinschen.de>
|
2015-10-22 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* posix.xml (std-iso): New section.
|
* posix.xml (std-iso): New section.
|
||||||
|
|
|
@ -8,6 +8,10 @@
|
||||||
|
|
||||||
<itemizedlist mark="bullet">
|
<itemizedlist mark="bullet">
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
strftime(3) supports %s (seconds since Epoch) now.
|
||||||
|
</para></listitem>
|
||||||
|
|
||||||
<listitem><para>
|
<listitem><para>
|
||||||
posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
posix_madvise(POSIX_MADV_WILLNEED) now utilizes OS functionality available
|
||||||
starting with Windows 8/Server 2012.
|
starting with Windows 8/Server 2012.
|
||||||
|
|
Loading…
Reference in New Issue