]> Savannah Git Hosting - gnulib.git/commitdiff
sprintf-posix: Use vzsprintf.
authorBruno Haible <bruno@clisp.org>
Sat, 22 Jun 2024 10:16:30 +0000 (12:16 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 22 Jun 2024 10:16:55 +0000 (12:16 +0200)
* lib/stdio.in.h (sprintf): Move specification to here.
* lib/sprintf.c: Don't include <stdlib.h>, vasnprintf.h. Include
<stdint.h>.
(sprintf): Implement based on vzsprintf.
* modules/sprintf-posix (Depends-on): Add vzsprintf. Remove vasnprintf.

ChangeLog
lib/sprintf.c
lib/stdio.in.h
modules/sprintf-posix

index 96dc1dff2c558ad7579b2b0965243223a1ebc898..76c8dc4dce73e9aa26853a477fe12f962909afcb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2024-06-22  Bruno Haible  <bruno@clisp.org>
 
+       sprintf-posix: Use vzsprintf.
+       * lib/stdio.in.h (sprintf): Move specification to here.
+       * lib/sprintf.c: Don't include <stdlib.h>, vasnprintf.h. Include
+       <stdint.h>.
+       (sprintf): Implement based on vzsprintf.
+       * modules/sprintf-posix (Depends-on): Add vzsprintf. Remove vasnprintf.
+
        zsprintf: New module.
        * lib/stdio.in.h (zsprintf): New declaration, based on
        lib/sprintf.c.
index ba0108d08ca737820d6f7dbeef7f5b5fa407ac45..d781b8c7b5114ba5dbe07d3649742bd9f3e1ae7b 100644 (file)
 #include <limits.h>
 #include <stdarg.h>
 #include <stdint.h>
-#include <stdlib.h>
 
-#include "vasnprintf.h"
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-/* Print formatted output to string STR.
-   Return string length of formatted string.  On error, return a negative
-   value.  */
 int
 sprintf (char *str, const char *format, ...)
 {
-  char *output;
-  size_t len;
-  size_t lenbuf;
   va_list args;
-
-  /* vasnprintf fails with EOVERFLOW when the buffer size argument is larger
-     than INT_MAX (if that fits into a 'size_t' at all).
-     Also note that glibc's iconv fails with E2BIG when we pass a length that
-     is so large that str + lenbuf wraps around, i.e.
-     (uintptr_t) (str + lenbuf) < (uintptr_t) str.
-     Therefore set lenbuf = min (SIZE_MAX, INT_MAX, - (uintptr_t) str - 1).  */
-  lenbuf = (SIZE_MAX < INT_MAX ? SIZE_MAX : INT_MAX);
-  if (lenbuf > ~ (uintptr_t) str)
-    lenbuf = ~ (uintptr_t) str;
+  ptrdiff_t ret;
 
   va_start (args, format);
-  output = vasnprintf (str, &lenbuf, format, args);
-  len = lenbuf;
+  ret = vzsprintf (str, format, args);
   va_end (args);
 
-  if (!output)
-    return -1;
-
-  if (output != str)
-    {
-      /* len is near SIZE_MAX.  */
-      free (output);
-      errno = EOVERFLOW;
-      return -1;
-    }
-
-  if (len > INT_MAX)
+#if PTRDIFF_MAX > INT_MAX
+  if (ret > INT_MAX)
     {
       errno = EOVERFLOW;
       return -1;
     }
+#endif
 
-  return len;
+  return ret;
 }
index 17c662f45abe907ea6ccfc2525a9e4ef0ecc7962..5a70aa20bace5c4fcff5ce776dc8eeec9f59ef13 100644 (file)
@@ -1521,6 +1521,9 @@ _GL_CXXALIAS_SYS (zsprintf, ptrdiff_t,
    GNULIB_POSIXCHECK is defined.  */
 
 #if @GNULIB_SPRINTF_POSIX@
+/* Prints formatted output to string STR.
+   Returns the string length of the formatted string.  Upon failure,
+   returns a negative value.  */
 # if @REPLACE_SPRINTF@
 #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
 #   define sprintf rpl_sprintf
index 589ad104ce43d7cbcc4a255db4731e51ecf3b63c..a1eb6127adaf012bcda5b1bc6903013f8632dfe1 100644 (file)
@@ -18,7 +18,7 @@ stdio
 nocrash
 printf-safe
 multiarch
-vasnprintf      [test $REPLACE_SPRINTF = 1]
+vzsprintf       [test $REPLACE_SPRINTF = 1]
 isnand-nolibm   [test $REPLACE_SPRINTF = 1]
 isnanl-nolibm   [test $REPLACE_SPRINTF = 1]
 frexp-nolibm    [test $REPLACE_SPRINTF = 1]