diff options
Diffstat (limited to 'misc/err.c')
-rw-r--r-- | misc/err.c | 105 |
1 files changed, 27 insertions, 78 deletions
diff --git a/misc/err.c b/misc/err.c index 2b836e8358..106abc4e4c 100644 --- a/misc/err.c +++ b/misc/err.c @@ -1,5 +1,5 @@ /* 4.4BSD utility functions for error messages. - Copyright (C) 1995-2018 Free Software Foundation, Inc. + Copyright (C) 1995-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -14,7 +14,7 @@ You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ + <https://www.gnu.org/licenses/>. */ #include <stdarg.h> #include <err.h> @@ -37,104 +37,53 @@ extern char *__progname; va_end (ap); \ } -static void -convert_and_print (const char *format, __gnuc_va_list ap) -{ -#define ALLOCA_LIMIT 2000 - size_t len; - wchar_t *wformat = NULL; - mbstate_t st; - size_t res; - const char *tmp; - - if (format == NULL) - return; - - len = strlen (format) + 1; - - do - { - if (len < ALLOCA_LIMIT) - wformat = (wchar_t *) alloca (len * sizeof (wchar_t)); - else - { - if (wformat != NULL && len / 2 < ALLOCA_LIMIT) - wformat = NULL; - - wformat = (wchar_t *) realloc (wformat, len * sizeof (wchar_t)); - - if (wformat == NULL) - { - fputws_unlocked (L"out of memory\n", stderr); - return; - } - } - - memset (&st, '\0', sizeof (st)); - tmp =format; - } - while ((res = __mbsrtowcs (wformat, &tmp, len, &st)) == len); - - if (res == (size_t) -1) - /* The string cannot be converted. */ - wformat = (wchar_t *) L"???"; - - __vfwprintf (stderr, wformat, ap); -} - void -vwarnx (const char *format, __gnuc_va_list ap) +__vwarnx_internal (const char *format, __gnuc_va_list ap, + unsigned int mode_flags) { flockfile (stderr); - if (_IO_fwide (stderr, 0) > 0) - { - __fwprintf (stderr, L"%s: ", __progname); - convert_and_print (format, ap); - putwc_unlocked (L'\n', stderr); - } - else - { - fprintf (stderr, "%s: ", __progname); - if (format) - vfprintf (stderr, format, ap); - putc_unlocked ('\n', stderr); - } + __fxprintf (stderr, "%s: ", __progname); + if (format != NULL) + __vfxprintf (stderr, format, ap, mode_flags); + __fxprintf (stderr, "\n"); funlockfile (stderr); } -libc_hidden_def (vwarnx) void -vwarn (const char *format, __gnuc_va_list ap) +__vwarn_internal (const char *format, __gnuc_va_list ap, + unsigned int mode_flags) { int error = errno; flockfile (stderr); - if (_IO_fwide (stderr, 0) > 0) + if (format != NULL) { - __fwprintf (stderr, L"%s: ", __progname); - if (format) - { - convert_and_print (format, ap); - fputws_unlocked (L": ", stderr); - } + __fxprintf (stderr, "%s: ", __progname); + __vfxprintf (stderr, format, ap, mode_flags); __set_errno (error); - __fwprintf (stderr, L"%m\n"); + __fxprintf (stderr, ": %m\n"); } else { - fprintf (stderr, "%s: ", __progname); - if (format) - { - vfprintf (stderr, format, ap); - fputs_unlocked (": ", stderr); - } __set_errno (error); - fprintf (stderr, "%m\n"); + __fxprintf (stderr, "%s: %m\n", __progname); } funlockfile (stderr); } + +void +vwarn (const char *format, __gnuc_va_list ap) +{ + __vwarn_internal (format, ap, 0); +} libc_hidden_def (vwarn) +void +vwarnx (const char *format, __gnuc_va_list ap) +{ + __vwarnx_internal (format, ap, 0); +} +libc_hidden_def (vwarnx) void warn (const char *format, ...) |