]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Add internal implementations for argp.h, err.h, and error.h functions
authorGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Wed, 6 Jun 2018 14:48:49 +0000 (11:48 -0300)
committerGabriel F. T. Gomes <gabriel@inconstante.eti.br>
Thu, 21 Feb 2019 13:28:50 +0000 (10:28 -0300)
Since the introduction of explicit flags in the internal implementation
of the printf family of functions, the 'mode' parameter can be used to
select which format long double parameters have (with the mode flag:
PRINTF_LDBL_IS_DBL).  This patch uses this feature in the implementation
of some functions in argp.h, err.h, and error.h (only those that take a
format string and positional parameters).  Future patches will add
support for 'nldbl' and 'ieee128' versions of these functions.

Tested for powerpc64le and x86_64.

ChangeLog
argp/argp-help.c
include/stdio.h
misc/err.c
misc/error.c
stdio-common/fxprintf.c

index 326201af9b46f5092d6129442bef92b5f0d995c7..9b0bc78dbdd27558e80b25e8b814a7491d5eca95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2019-02-21  Gabriel F. T. Gomes  <gabriel@inconstante.eti.br>
+
+       * argp/argp-help.c (__argp_error_internal): New function,
+       renamed from __argp_error, but that takes a 'mode_flags'
+       parameter to control the format of long double parameters.
+       (__argp_error): Converted into a call __argp_error_internal.
+       (__argp_failure_internal): New function, renamed from
+       __argp_failure, but that takes a 'mode_flags' parameter.
+       (__argp_failure): Converted into a call __argp_failure_internal.
+       * misc/err.c (__vwarnx_internal): New function, renamed from
+       vwarnx, but that takes a 'mode_flags' parameter.
+       (vwarnx): Converted into a call to __vwarnx_internal.
+       (__vwarn_internal): New function, renamed from vwarn, but that
+       takes a 'mode_flags' parameter.
+       (vwarn): Converted into a call to __vwarn_internal.
+       * misc/error.c (error_tail): Add 'mode_flags' parameter. Update
+       call to __vfxprintf with 'mode_flags'.
+       (__error_internal): New function, renamed from error, but that
+       takes a 'mode_flags' parameter.
+       (error): Converted into a call to __error_internal.
+       (__error_at_line_internal): New function, renamed from
+       error_at_line, but that takes a 'mode_flags' parameter.
+       (error_at_line): Converted into a call to
+       __error_at_line_internal.
+       * include/stdio.h (__vfxprintf): Add mode_flags parameter.
+       * stdio-common/fxprintf.c (locked_vfxprintf, __vfxprintf):
+       Likewise.
+
 2019-02-20  Martin Liska  <mliska@suse.cz>
 
        * math/Makefile: Install math-vector-fortran.h.
index 52ec2316fadfe8dfff834ba6486a1846c0a09769..3b1727c4aafe8127caefba44ea74a9c654196877 100644 (file)
@@ -1750,7 +1750,8 @@ weak_alias (__argp_state_help, argp_state_help)
    by the program name and `:', to stderr, and followed by a `Try ... --help'
    message, then exit (1).  */
 void
-__argp_error (const struct argp_state *state, const char *fmt, ...)
+__argp_error_internal (const struct argp_state *state, const char *fmt,
+                      va_list ap, unsigned int mode_flags)
 {
   if (!state || !(state->flags & ARGP_NO_ERRS))
     {
@@ -1758,18 +1759,14 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
 
       if (stream)
        {
-         va_list ap;
-
 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
          __flockfile (stream);
 #endif
 
-         va_start (ap, fmt);
-
 #ifdef _LIBC
          char *buf;
 
-         if (__vasprintf_internal (&buf, fmt, ap, 0) < 0)
+         if (__vasprintf_internal (&buf, fmt, ap, mode_flags) < 0)
            buf = NULL;
 
          __fxprintf (stream, "%s: %s\n",
@@ -1789,14 +1786,20 @@ __argp_error (const struct argp_state *state, const char *fmt, ...)
 
          __argp_state_help (state, stream, ARGP_HELP_STD_ERR);
 
-         va_end (ap);
-
 #if _LIBC || (HAVE_FLOCKFILE && HAVE_FUNLOCKFILE)
          __funlockfile (stream);
 #endif
        }
     }
 }
+void
+__argp_error (const struct argp_state *state, const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  __argp_error_internal (state, fmt, ap, 0);
+  va_end (ap);
+}
 #ifdef weak_alias
 weak_alias (__argp_error, argp_error)
 #endif
@@ -1810,8 +1813,9 @@ weak_alias (__argp_error, argp_error)
    *parsing errors*, and the former is for other problems that occur during
    parsing but don't reflect a (syntactic) problem with the input.  */
 void
-__argp_failure (const struct argp_state *state, int status, int errnum,
-               const char *fmt, ...)
+__argp_failure_internal (const struct argp_state *state, int status,
+                        int errnum, const char *fmt, va_list ap,
+                        unsigned int mode_flags)
 {
   if (!state || !(state->flags & ARGP_NO_ERRS))
     {
@@ -1833,13 +1837,10 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
 
          if (fmt)
            {
-             va_list ap;
-
-             va_start (ap, fmt);
 #ifdef _LIBC
              char *buf;
 
-             if (__vasprintf_internal (&buf, fmt, ap, 0) < 0)
+             if (__vasprintf_internal (&buf, fmt, ap, mode_flags) < 0)
                buf = NULL;
 
              __fxprintf (stream, ": %s", buf);
@@ -1851,8 +1852,6 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
 
              vfprintf (stream, fmt, ap);
 #endif
-
-             va_end (ap);
            }
 
          if (errnum)
@@ -1889,6 +1888,15 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
        }
     }
 }
+void
+__argp_failure (const struct argp_state *state, int status, int errnum,
+               const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  __argp_failure_internal (state, status, errnum, fmt, ap, 0);
+  va_end (ap);
+}
 #ifdef weak_alias
 weak_alias (__argp_failure, argp_failure)
 #endif
index 65ccabbb058f49934884eca81f497038edc16e06..7d1877ea5ee24709e9b860e19c82aa999254ba6f 100644 (file)
@@ -134,7 +134,8 @@ extern int __fxprintf (FILE *__fp, const char *__fmt, ...)
      __attribute__ ((__format__ (__printf__, 2, 3))) attribute_hidden;
 extern int __fxprintf_nocancel (FILE *__fp, const char *__fmt, ...)
      __attribute__ ((__format__ (__printf__, 2, 3))) attribute_hidden;
-int __vfxprintf (FILE *__fp, const char *__fmt, __gnuc_va_list)
+int __vfxprintf (FILE *__fp, const char *__fmt, __gnuc_va_list,
+                unsigned int)
   attribute_hidden;
 
 /* Read the next line from FP into BUFFER, of LENGTH bytes.  LINE will
index 7c8f539554860d06c9b0ff59de25141e23055c11..988ec8f3eecc72e304b3bf78e1dd43c471463abf 100644 (file)
@@ -38,19 +38,20 @@ extern char *__progname;
 }
 
 void
-vwarnx (const char *format, __gnuc_va_list ap)
+__vwarnx_internal (const char *format, __gnuc_va_list ap,
+                  unsigned int mode_flags)
 {
   flockfile (stderr);
   __fxprintf (stderr, "%s: ", __progname);
   if (format != NULL)
-    __vfxprintf (stderr, format, ap);
+    __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;
 
@@ -58,7 +59,7 @@ vwarn (const char *format, __gnuc_va_list ap)
   if (format != NULL)
     {
       __fxprintf (stderr, "%s: ", __progname);
-      __vfxprintf (stderr, format, ap);
+      __vfxprintf (stderr, format, ap, mode_flags);
       __set_errno (error);
       __fxprintf (stderr, ": %m\n");
     }
@@ -69,8 +70,20 @@ vwarn (const char *format, __gnuc_va_list ap)
     }
   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, ...)
index 556261d87115a49ad687e5393c74db855563b0c0..e090d1bbc17403d0d0c00e0ed7c4e56ac6be093d 100644 (file)
@@ -200,10 +200,11 @@ print_errno_message (int errnum)
 }
 
 static void _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))
-error_tail (int status, int errnum, const char *message, va_list args)
+error_tail (int status, int errnum, const char *message, va_list args,
+           unsigned int mode_flags)
 {
 #if _LIBC
-  int ret = __vfxprintf (stderr, message, args);
+  int ret = __vfxprintf (stderr, message, args, mode_flags);
   if (ret < 0 && errno == ENOMEM && _IO_fwide (stderr, 0) > 0)
     /* Leave a trace in case the heap allocation of the message string
        failed.  */
@@ -232,10 +233,9 @@ error_tail (int status, int errnum, const char *message, va_list args)
    If ERRNUM is nonzero, print its corresponding system error message.
    Exit with status STATUS if it is nonzero.  */
 void
-error (int status, int errnum, const char *message, ...)
+__error_internal (int status, int errnum, const char *message,
+                 va_list args, unsigned int mode_flags)
 {
-  va_list args;
-
 #if defined _LIBC && defined __libc_ptf_call
   /* We do not want this call to be cut short by a thread
      cancellation.  Therefore disable cancellation for now.  */
@@ -259,9 +259,7 @@ error (int status, int errnum, const char *message, ...)
 #endif
     }
 
-  va_start (args, message);
-  error_tail (status, errnum, message, args);
-  va_end (args);
+  error_tail (status, errnum, message, args, mode_flags);
 
 #ifdef _LIBC
   _IO_funlockfile (stderr);
@@ -270,17 +268,25 @@ error (int status, int errnum, const char *message, ...)
 # endif
 #endif
 }
+
+void
+error (int status, int errnum, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  __error_internal (status, errnum, message, ap, 0);
+  va_end (ap);
+}
 \f
 /* Sometimes we want to have at most one error per line.  This
    variable controls whether this mode is selected or not.  */
 int error_one_per_line;
 
 void
-error_at_line (int status, int errnum, const char *file_name,
-              unsigned int line_number, const char *message, ...)
+__error_at_line_internal (int status, int errnum, const char *file_name,
+                         unsigned int line_number, const char *message,
+                         va_list args, unsigned int mode_flags)
 {
-  va_list args;
-
   if (error_one_per_line)
     {
       static const char *old_file_name;
@@ -331,9 +337,7 @@ error_at_line (int status, int errnum, const char *file_name,
           file_name, line_number);
 #endif
 
-  va_start (args, message);
-  error_tail (status, errnum, message, args);
-  va_end (args);
+  error_tail (status, errnum, message, args, mode_flags);
 
 #ifdef _LIBC
   _IO_funlockfile (stderr);
@@ -343,6 +347,17 @@ error_at_line (int status, int errnum, const char *file_name,
 #endif
 }
 
+void
+error_at_line (int status, int errnum, const char *file_name,
+              unsigned int line_number, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  __error_at_line_internal (status, errnum, file_name, line_number,
+                           message, ap, 0);
+  va_end (ap);
+}
+
 #ifdef _LIBC
 /* Make the weak alias.  */
 # undef error
index 9e71499d44b5ef3216bc97ad76920d57a0b45b88..9866c8b3be4595cf8722ada66b421dbe3f8600f1 100644 (file)
 #include <libioP.h>
 
 static int
-locked_vfxprintf (FILE *fp, const char *fmt, va_list ap)
+locked_vfxprintf (FILE *fp, const char *fmt, va_list ap,
+                 unsigned int mode_flags)
 {
   if (_IO_fwide (fp, 0) <= 0)
-    return __vfprintf_internal (fp, fmt, ap, 0);
+    return __vfprintf_internal (fp, fmt, ap, mode_flags);
 
   /* We must convert the narrow format string to a wide one.
      Each byte can produce at most one wide character.  */
@@ -53,7 +54,7 @@ locked_vfxprintf (FILE *fp, const char *fmt, va_list ap)
   res = __mbsrtowcs (wfmt, &fmt, len, &mbstate);
 
   if (res != -1)
-    res = __vfwprintf_internal (fp, wfmt, ap, 0);
+    res = __vfwprintf_internal (fp, wfmt, ap, mode_flags);
 
   if (used_malloc)
     free (wfmt);
@@ -62,12 +63,13 @@ locked_vfxprintf (FILE *fp, const char *fmt, va_list ap)
 }
 
 int
-__vfxprintf (FILE *fp, const char *fmt, va_list ap)
+__vfxprintf (FILE *fp, const char *fmt, va_list ap,
+            unsigned int mode_flags)
 {
   if (fp == NULL)
     fp = stderr;
   _IO_flockfile (fp);
-  int res = locked_vfxprintf (fp, fmt, ap);
+  int res = locked_vfxprintf (fp, fmt, ap, mode_flags);
   _IO_funlockfile (fp);
   return res;
 }
@@ -77,7 +79,7 @@ __fxprintf (FILE *fp, const char *fmt, ...)
 {
   va_list ap;
   va_start (ap, fmt);
-  int res = __vfxprintf (fp, fmt, ap);
+  int res = __vfxprintf (fp, fmt, ap, 0);
   va_end (ap);
   return res;
 }
@@ -94,7 +96,7 @@ __fxprintf_nocancel (FILE *fp, const char *fmt, ...)
   int save_flags2 = fp->_flags2;
   fp->_flags2 |= _IO_FLAGS2_NOTCANCEL;
 
-  int res = locked_vfxprintf (fp, fmt, ap);
+  int res = locked_vfxprintf (fp, fmt, ap, 0);
 
   fp->_flags2 = save_flags2;
   _IO_funlockfile (fp);