Commit c4cd2a0b authored by Paul Eggert's avatar Paul Eggert

Update from Gnulib

This incorporates:
2019-12-06 nstrftime: better width support for %N, %z
2019-12-03 Avoid hassles caused by [[noreturn]] in C++
2019-12-02 Fix mistakes in --enable-threads=isoc fixes from 2019-12-01
* admin/merge-gnulib (AVOIDED_MODULES): Avoid pthread-h.
* lib/_Noreturn.h, lib/nstrftime.c, m4/gnulib-common.m4:
* m4/timer_time.m4:
Copy from Gnulib.
* lib/gnulib.mk.in: Regenerate.
parent 99ad65ed
Pipeline #4256 failed with stage
in 59 minutes and 3 seconds
...@@ -50,7 +50,7 @@ GNULIB_MODULES=' ...@@ -50,7 +50,7 @@ GNULIB_MODULES='
AVOIDED_MODULES=' AVOIDED_MODULES='
btowc close dup fchdir fstat langinfo lock btowc close dup fchdir fstat langinfo lock
malloc-posix mbrtowc mbsinit memchr mkdir msvc-inval msvc-nothrow nl_langinfo malloc-posix mbrtowc mbsinit memchr mkdir msvc-inval msvc-nothrow nl_langinfo
openat-die opendir raise openat-die opendir pthread-h raise
save-cwd select setenv sigprocmask stat stdarg stdbool save-cwd select setenv sigprocmask stat stdarg stdbool
threadlib tzset unsetenv utime utime-h threadlib tzset unsetenv utime utime-h
wchar wcrtomb wctype-h wchar wcrtomb wctype-h
......
...@@ -17,7 +17,14 @@ ...@@ -17,7 +17,14 @@
#ifndef _Noreturn #ifndef _Noreturn
# if (defined __cplusplus \ # if (defined __cplusplus \
&& ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
|| (defined _MSC_VER && 1900 <= _MSC_VER))) || (defined _MSC_VER && 1900 <= _MSC_VER)) \
&& 0)
/* [[noreturn]] is not practically usable, because with it the syntax
extern _Noreturn void func (...);
would not be valid; such a declaration would only be valid with 'extern'
and '_Noreturn' swapped, or without the 'extern' keyword. However, some
AIX system header files and several gnulib header files use precisely
this syntax with 'extern'. */
# define _Noreturn [[noreturn]] # define _Noreturn [[noreturn]]
# elif ((!defined __cplusplus || defined __clang__) \ # elif ((!defined __cplusplus || defined __clang__) \
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
# --avoid=nl_langinfo \ # --avoid=nl_langinfo \
# --avoid=openat-die \ # --avoid=openat-die \
# --avoid=opendir \ # --avoid=opendir \
# --avoid=pthread-h \
# --avoid=raise \ # --avoid=raise \
# --avoid=save-cwd \ # --avoid=save-cwd \
# --avoid=select \ # --avoid=select \
......
...@@ -162,19 +162,20 @@ extern char *tzname[]; ...@@ -162,19 +162,20 @@ extern char *tzname[];
# define advance(P, N) ((P) += (N)) # define advance(P, N) ((P) += (N))
#endif #endif
#define add(n, f) \ #define add(n, f) width_add (width, n, f)
#define width_add(width, n, f) \
do \ do \
{ \ { \
size_t _n = (n); \ size_t _n = (n); \
size_t _w = (width < 0 ? 0 : width); \ size_t _w = pad == L_('-') || width < 0 ? 0 : width; \
size_t _incr = _n < _w ? _w : _n; \ size_t _incr = _n < _w ? _w : _n; \
if (_incr >= maxsize - i) \ if (_incr >= maxsize - i) \
return 0; \ return 0; \
if (p) \ if (p) \
{ \ { \
if (digits == 0 && _n < _w) \ if (_n < _w) \
{ \ { \
size_t _delta = width - _n; \ size_t _delta = _w - _n; \
if (pad == L_('0') || pad == L_('+')) \ if (pad == L_('0') || pad == L_('+')) \
memset_zero (p, _delta); \ memset_zero (p, _delta); \
else \ else \
...@@ -186,15 +187,17 @@ extern char *tzname[]; ...@@ -186,15 +187,17 @@ extern char *tzname[];
i += _incr; \ i += _incr; \
} while (0) } while (0)
#define add1(c) width_add1 (width, c)
#if FPRINTFTIME #if FPRINTFTIME
# define add1(C) add (1, fputc (C, p)) # define width_add1(width, c) width_add (width, 1, fputc (c, p))
#else #else
# define add1(C) add (1, *p = C) # define width_add1(width, c) width_add (width, 1, *p = c)
#endif #endif
#define cpy(n, s) width_cpy (width, n, s)
#if FPRINTFTIME #if FPRINTFTIME
# define cpy(n, s) \ # define width_cpy(width, n, s) \
add ((n), \ width_add (width, n, \
do \ do \
{ \ { \
if (to_lowcase) \ if (to_lowcase) \
...@@ -214,8 +217,8 @@ extern char *tzname[]; ...@@ -214,8 +217,8 @@ extern char *tzname[];
while (0) \ while (0) \
) )
#else #else
# define cpy(n, s) \ # define width_cpy(width, n, s) \
add ((n), \ width_add (width, n, \
if (to_lowcase) \ if (to_lowcase) \
memcpy_lowcase (p, (s), _n LOCALE_ARG); \ memcpy_lowcase (p, (s), _n LOCALE_ARG); \
else if (to_uppcase) \ else if (to_uppcase) \
...@@ -435,9 +438,10 @@ my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) ...@@ -435,9 +438,10 @@ my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
libc_hidden_def (my_strftime) libc_hidden_def (my_strftime)
#endif #endif
/* Just like my_strftime, above, but with two more parameters. /* Just like my_strftime, above, but with more parameters.
UPCASE indicate that the result should be converted to upper case, UPCASE indicates that the result should be converted to upper case.
and *TZSET_CALLED indicates whether tzset has been called here. */ YR_SPEC and WIDTH specify the padding and width for the year.
*TZSET_CALLED indicates whether tzset has been called here. */
static size_t static size_t
__strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
const CHAR_T *format, const CHAR_T *format,
...@@ -556,7 +560,7 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) ...@@ -556,7 +560,7 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
for (f = format; *f != '\0'; width = -1, f++) for (f = format; *f != '\0'; width = -1, f++)
{ {
int pad = 0; /* Padding for number ('-', '_', or 0). */ int pad = 0; /* Padding for number ('_', '-', '+', '0', or 0). */
int modifier; /* Field modifier ('E', 'O', or 0). */ int modifier; /* Field modifier ('E', 'O', or 0). */
int digits = 0; /* Max digits for numeric format. */ int digits = 0; /* Max digits for numeric format. */
int number_value; /* Numeric value to be printed. */ int number_value; /* Numeric value to be printed. */
...@@ -565,7 +569,6 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) ...@@ -565,7 +569,6 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
bool always_output_a_sign; /* +/- should always be output. */ bool always_output_a_sign; /* +/- should always be output. */
int tz_colon_mask; /* Bitmask of where ':' should appear. */ int tz_colon_mask; /* Bitmask of where ':' should appear. */
const CHAR_T *subfmt; const CHAR_T *subfmt;
CHAR_T sign_char;
CHAR_T *bufp; CHAR_T *bufp;
CHAR_T buf[1 CHAR_T buf[1
+ 2 /* for the two colons in a %::z or %:::z time zone */ + 2 /* for the two colons in a %::z or %:::z time zone */
...@@ -1035,59 +1038,34 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) ...@@ -1035,59 +1038,34 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
while (u_number_value != 0 || tz_colon_mask != 0); while (u_number_value != 0 || tz_colon_mask != 0);
do_number_sign_and_padding: do_number_sign_and_padding:
if (digits < width) if (pad == 0)
digits = width; pad = L_('0');
if (width < 0)
sign_char = (negative_number ? L_('-') width = digits;
: always_output_a_sign ? L_('+')
: 0);
if (pad == L_('-'))
{
if (sign_char)
add1 (sign_char);
}
else
{
int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0]))
- bufp) - !!sign_char;
if (padding > 0)
{
if (pad == L_('_'))
{
if ((size_t) padding >= maxsize - i)
return 0;
if (p)
memset_space (p, padding);
i += padding;
width = width > padding ? width - padding : 0;
if (sign_char)
add1 (sign_char);
}
else
{
if ((size_t) digits >= maxsize - i)
return 0;
if (sign_char)
add1 (sign_char);
if (p) {
memset_zero (p, padding); CHAR_T sign_char = (negative_number ? L_('-')
i += padding; : always_output_a_sign ? L_('+')
width = 0; : 0);
} int numlen = buf + sizeof buf / sizeof buf[0] - bufp;
} int shortage = width - !!sign_char - numlen;
else int padding = pad == L_('-') || shortage <= 0 ? 0 : shortage;
{
if (sign_char) if (sign_char)
add1 (sign_char); {
} if (pad == L_('_'))
} {
if (p)
memset_space (p, padding);
i += padding;
width -= padding;
}
width_add1 (0, sign_char);
width--;
}
cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp); cpy (numlen, bufp);
}
break; break;
case L_('F'): case L_('F'):
...@@ -1153,19 +1131,21 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize) ...@@ -1153,19 +1131,21 @@ __strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
case L_('N'): /* GNU extension. */ case L_('N'): /* GNU extension. */
if (modifier == L_('E')) if (modifier == L_('E'))
goto bad_format; goto bad_format;
{
number_value = ns; int n = ns, ns_digits = 9;
if (width == -1) if (width <= 0)
width = 9; width = ns_digits;
else int ndigs = ns_digits;
{ while (width < ndigs || (1 < ndigs && n % 10 == 0))
/* Take an explicit width less than 9 as a precision. */ ndigs--, n /= 10;
int j; for (int i = ndigs; 0 < i; i--)
for (j = width; j < 9; j++) buf[i - 1] = n % 10 + L_('0'), n /= 10;
number_value /= 10; if (!pad)
} pad = L_('0');
width_cpy (0, ndigs, buf);
DO_NUMBER (width, number_value); width_add (width - ndigs, 0, (void) 0);
}
break;
#endif #endif
case L_('n'): case L_('n'):
......
# gnulib-common.m4 serial 45 # gnulib-common.m4 serial 46
dnl Copyright (C) 2007-2019 Free Software Foundation, Inc. dnl Copyright (C) 2007-2019 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
...@@ -19,7 +19,14 @@ AC_DEFUN([gl_COMMON_BODY], [ ...@@ -19,7 +19,14 @@ AC_DEFUN([gl_COMMON_BODY], [
#ifndef _Noreturn #ifndef _Noreturn
# if (defined __cplusplus \ # if (defined __cplusplus \
&& ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
|| (defined _MSC_VER && 1900 <= _MSC_VER))) || (defined _MSC_VER && 1900 <= _MSC_VER)) \
&& 0)
/* [[noreturn]] is not practically usable, because with it the syntax
extern _Noreturn void func (...);
would not be valid; such a declaration would only be valid with 'extern'
and '_Noreturn' swapped, or without the 'extern' keyword. However, some
AIX system header files and several gnulib header files use precisely
this syntax with 'extern'. */
# define _Noreturn [[noreturn]] # define _Noreturn [[noreturn]]
# elif ((!defined __cplusplus || defined __clang__) \ # elif ((!defined __cplusplus || defined __clang__) \
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
......
# timer_time.m4 serial 3 # timer_time.m4 serial 4
dnl Copyright (C) 2011-2019 Free Software Foundation, Inc. dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
...@@ -16,7 +16,7 @@ AC_DEFUN([gl_TIMER_TIME], ...@@ -16,7 +16,7 @@ AC_DEFUN([gl_TIMER_TIME],
dnl Some packages like Emacs use --avoid=threadlib. dnl Some packages like Emacs use --avoid=threadlib.
dnl Write the symbol in such a way that it does not cause 'aclocal' to pick dnl Write the symbol in such a way that it does not cause 'aclocal' to pick
dnl the threadlib.m4 file that is installed in $PREFIX/share/aclocal/. dnl the threadlib.m4 file that is installed in $PREFIX/share/aclocal/.
m4_ifdef([gl_][THREADLIB], [AC_REQUIRE([gl_][THREADLIB])]) m4_ifdef([gl_][PTHREADLIB], [AC_REQUIRE([gl_][PTHREADLIB])])
LIB_TIMER_TIME= LIB_TIMER_TIME=
AC_SUBST([LIB_TIMER_TIME]) AC_SUBST([LIB_TIMER_TIME])
...@@ -24,7 +24,7 @@ AC_DEFUN([gl_TIMER_TIME], ...@@ -24,7 +24,7 @@ AC_DEFUN([gl_TIMER_TIME],
AC_SEARCH_LIBS([timer_settime], [rt posix4], AC_SEARCH_LIBS([timer_settime], [rt posix4],
[test "$ac_cv_search_timer_settime" = "none required" || [test "$ac_cv_search_timer_settime" = "none required" ||
LIB_TIMER_TIME=$ac_cv_search_timer_settime]) LIB_TIMER_TIME=$ac_cv_search_timer_settime])
m4_ifdef([gl_][THREADLIB], m4_ifdef([gl_][PTHREADLIB],
[dnl GLIBC uses threads to emulate posix timers when kernel support [dnl GLIBC uses threads to emulate posix timers when kernel support
dnl is not available (like Linux < 2.6 or when used with kFreeBSD) dnl is not available (like Linux < 2.6 or when used with kFreeBSD)
dnl Now the pthread lib is linked automatically in the normal case, dnl Now the pthread lib is linked automatically in the normal case,
...@@ -38,7 +38,7 @@ AC_DEFUN([gl_TIMER_TIME], ...@@ -38,7 +38,7 @@ AC_DEFUN([gl_TIMER_TIME],
#endif #endif
#endif #endif
], ],
[LIB_TIMER_TIME="$LIB_TIMER_TIME $LIBMULTITHREAD"])]) [LIB_TIMER_TIME="$LIB_TIMER_TIME $LIBPMULTITHREAD"])])
AC_CHECK_FUNCS([timer_settime]) AC_CHECK_FUNCS([timer_settime])
LIBS=$gl_saved_libs LIBS=$gl_saved_libs
]) ])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment