Rely on C89 sprintf() return value semantics
authorAaron Crane <arc@cpan.org>
Fri, 13 Oct 2017 08:03:59 +0000 (10:03 +0200)
committerAaron Crane <arc@cpan.org>
Sat, 21 Oct 2017 15:52:44 +0000 (16:52 +0100)
25 files changed:
Configure
Cross/config.sh-arm-linux
Cross/config.sh-arm-linux-n770
NetWare/config.wc
Porting/Glossary
Porting/config.sh
Porting/config_H
config_h.SH
configure.com
embed.fnc
makedef.pl
perl.h
plan9/config_sh.sample
proto.h
symbian/config.sh
uconfig.h
uconfig.sh
uconfig64.sh
util.c
win32/config.ce
win32/config.gc
win32/config.vc
win32/config_H.ce
win32/config_H.gc
win32/config_H.vc

index 7df8e67..6da1268 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -830,7 +830,6 @@ sockethdr=''
 socketlib=''
 d_socklen_t=''
 d_socks5_init=''
-d_sprintf_returns_strlen=''
 d_sqrtl=''
 d_srand48_r=''
 srand48_r_proto=''
@@ -18537,69 +18536,6 @@ eval $hasproto
 set socks5_init d_socks5_init
 eval $inlibc
 
-: see if sprintf returns the length of the string in the buffer as per ANSI
-$echo "Checking whether sprintf returns the length of the string..." >&4
-$cat <<EOP >try.c
-#include <stdio.h>
-#$i_stdlib I_STDLIB
-#ifdef I_STDLIB
-#include <stdlib.h>
-#endif
-#$i_string I_STRING
-#ifdef I_STRING
-#  include <string.h>
-#else
-#  include <strings.h>
-#endif
-#$i_math I_MATH
-#ifdef I_MATH
-#include <math.h>
-#endif
-
-char buffer[256];
-
-int check (size_t expect, int test) {
-  size_t got = strlen(buffer);
-  if (expect == got)
-    return 0;
-
-  printf("expected %ld, got %ld in test %d '%s'\n", (long) expect, (long) got,
-       test, buffer);
-  exit (test);
-}
-
-int main(int argc, char **argv) {
-  int test = 0;
-
-  check(sprintf(buffer, ""), ++test);
-  check(sprintf(buffer, "%s %s", "perl", "rules"), ++test);
-  check(sprintf(buffer, "I like %g", atan2(0,-1)), ++test);
-
-  return 0;
-}
-EOP
-set try
-
-if eval $compile; then
-    xxx="`$run ./try`"
-    case "$?" in
-       0) cat >&4 <<EOM
-sprintf returns the length of the string (as ANSI says it should)
-EOM
-       d_sprintf_returns_strlen="$define"
-       ;;
-       *) cat >&4 <<EOM
-sprintf does not return the length of the string (how old is this system?)
-EOM
-       d_sprintf_returns_strlen="$undef"
-        ;;
-    esac
-else
-    echo "(I can't seem to compile the test program--assuming it doesn't)" >&4
-    d_sprintf_returns_strlen="$undef"
-fi
-$rm_try
-
 : see if srand48_r exists
 set srand48_r d_srand48_r
 eval $inlibc
@@ -24462,7 +24398,6 @@ d_socket='$d_socket'
 d_socklen_t='$d_socklen_t'
 d_sockpair='$d_sockpair'
 d_socks5_init='$d_socks5_init'
-d_sprintf_returns_strlen='$d_sprintf_returns_strlen'
 d_sqrtl='$d_sqrtl'
 d_srand48_r='$d_srand48_r'
 d_srandom_r='$d_srandom_r'
index 0bcaba4..5ccf847 100644 (file)
@@ -537,7 +537,6 @@ d_socket='define'
 d_socklen_t='define'
 d_sockpair='define'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='define'
 d_srand48_r='undef'
 d_srandom_r='undef'
index a39cd6f..5e7a6bb 100644 (file)
@@ -420,7 +420,6 @@ d_socket='define'
 d_socklen_t='define'
 d_sockpair='define'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='define'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 1bbafd4..80a3fad 100644 (file)
@@ -527,7 +527,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='undef'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 4821813..97a5a8c 100644 (file)
@@ -2466,12 +2466,6 @@ d_socks5_init (d_socks5_init.U):
        This variable conditionally defines the HAS_SOCKS5_INIT symbol, which
        indicates to the C program that the socks5_init() routine is available.
 
-d_sprintf_returns_strlen (d_sprintf_len.U):
-       This variable defines whether sprintf returns the length of the string
-       (as per the ANSI spec). Some C libraries retain compatibility with
-       pre-ANSI C and return a pointer to the passed in buffer; for these
-       this variable will be undef.
-
 d_sqrtl (d_sqrtl.U):
        This variable conditionally defines the HAS_SQRTL symbol, which
        indicates to the C program that the sqrtl() routine is available.
index dfc62f4..ea0a08d 100644 (file)
@@ -550,7 +550,6 @@ d_socket='define'
 d_socklen_t='define'
 d_sockpair='define'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='define'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 93865a7..b3d74a9 100644 (file)
  */
 /*#define HAS_SOCKS5_INIT              / **/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-#define SPRINTF_RETURNS_STRLEN /**/
-
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
index 6c05201..bbd4261 100755 (executable)
@@ -3370,14 +3370,6 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  */
 #$d_socks5_init HAS_SOCKS5_INIT                /**/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-#$d_sprintf_returns_strlen SPRINTF_RETURNS_STRLEN      /**/
-
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
index 9730117..e4780c0 100644 (file)
@@ -6375,7 +6375,6 @@ $ WC "d_socket='" + d_socket + "'"
 $ WC "d_socklen_t='" + d_socklen_t + "'"
 $ WC "d_sockpair='" + d_sockpair + "'"
 $ WC "d_socks5_init='undef'"
-$ WC "d_sprintf_returns_strlen='define'"
 $ WC "d_sqrtl='define'"
 $ WC "d_sresgproto='undef'"
 $ WC "d_sresgproto='undef'"
index 05c5d88..71b3087 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -3005,10 +3005,6 @@ ApoP     |bool   |ckwarn_d       |U32 w
 XEopMR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
                                |NN const char *const bits|STRLEN size
 
-#ifndef SPRINTF_RETURNS_STRLEN
-Apnod  |int    |my_sprintf     |NN char *buffer|NN const char *pat|...
-#endif
-
 Apnodf |int    |my_snprintf    |NN char *buffer|const Size_t len|NN const char *format|...
 Apnod  |int    |my_vsnprintf   |NN char *buffer|const Size_t len|NN const char *format|va_list ap
 #ifdef USE_QUADMATH
index 2af197f..5f05c85 100644 (file)
@@ -108,7 +108,6 @@ my $config_h = 'config.h';
 open(CFG, '<', $config_h) || die "Cannot open $config_h: $!\n";
 while (<CFG>) {
     $define{$1} = 1 if /^\s*\#\s*define\s+(MYMALLOC|MULTIPLICITY
-                                           |SPRINTF_RETURNS_STRLEN
                                            |KILL_BY_SIGPRC
                                            |(?:PERL|USE|HAS)_\w+)\b/x;
 }
@@ -465,10 +464,6 @@ unless ($define{'PERL_DONT_CREATE_GVSV'}) {
     ++$skip{Perl_gv_SVadd};
 }
 
-if ($define{'SPRINTF_RETURNS_STRLEN'}) {
-    ++$skip{Perl_my_sprintf};
-}
-
 unless ($define{'PERL_USES_PL_PIDSTATUS'}) {
     ++$skip{PL_pidstatus};
 }
diff --git a/perl.h b/perl.h
index e7f25b1..b1e63e2 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1455,15 +1455,13 @@ EXTERN_C char *crypt(const char *, const char *);
 #undef UV
 #endif
 
-/* For the times when you want the return value of sprintf, and you want it
-   to be the length. Can't have a thread variable passed in, because C89 has
-   no varargs macros.
-*/
-#ifdef SPRINTF_RETURNS_STRLEN
-#  define my_sprintf sprintf
-#else
-#  define my_sprintf Perl_my_sprintf
-#endif
+/* This used to be conditionally defined based on whether we had a sprintf()
+ * that correctly returns the string length (as required by C89), but we no
+ * longer need that. XS modules can (and do) use this name, so it must remain
+ * a part of the API that's visible to modules. But we no longer document it
+ * either (because using sprintf() rather than snprintf() is almost always
+ * a bad idea). */
+#define my_sprintf sprintf
 
 /*
  * If we have v?snprintf() and the C99 variadic macros, we can just
index bfe7666..114a589 100644 (file)
@@ -537,7 +537,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='define'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='undef'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
diff --git a/proto.h b/proto.h
index b0a54da..70c1a63 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -4059,11 +4059,6 @@ STATIC void      S_validate_suid(pTHX_ PerlIO *rsfp);
        assert(rsfp)
 #  endif
 #endif
-#if !defined(SPRINTF_RETURNS_STRLEN)
-PERL_CALLCONV int      Perl_my_sprintf(char *buffer, const char *pat, ...);
-#define PERL_ARGS_ASSERT_MY_SPRINTF    \
-       assert(buffer); assert(pat)
-#endif
 #if !defined(USE_QUADMATH)
 #  if defined(PERL_IN_NUMERIC_C)
 STATIC NV      S_mulexp10(NV value, I32 exponent);
index 904e973..53aa972 100644 (file)
@@ -486,7 +486,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 8f1b8ad..1dd837f 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
  */
 /*#define HAS_SOCKS5_INIT              / **/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-/*#define SPRINTF_RETURNS_STRLEN       / **/
-
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
 #endif
 
 /* Generated from:
- * 946b039c5c96299edae15aed6aeb6ca541042f6e545cb5631660412885369e33 config_h.SH
- * ac7c2c95dc09327ba3d5305e3e786bcd8c6d759f88fc469a2f1b9310f03137f9 uconfig.sh
+ * a54380e85f5a0f9c6f5793c309854712008ac68f6370e6376c6a90edbecb6a7b config_h.SH
+ * d40282b246b20f1f20a5febcae42b3ac44234c5a1c1a2df89e5ac77a54830cca uconfig.sh
  * ex: set ro: */
index 14afc70..6fcd66d 100644 (file)
@@ -477,7 +477,6 @@ d_socket='undef'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='undef'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 94b0936..6446f02 100644 (file)
@@ -477,7 +477,6 @@ d_socket='undef'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='undef'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
diff --git a/util.c b/util.c
index a4a6fb6..7525a7e 100644 (file)
--- a/util.c
+++ b/util.c
@@ -4867,28 +4867,6 @@ Perl_mem_log_del_sv(const SV *sv,
 
 #endif /* PERL_MEM_LOG */
 
-/*
-=for apidoc my_sprintf
-
-The C library C<sprintf>, wrapped if necessary, to ensure that it will return
-the length of the string written to the buffer.  Only rare pre-ANSI systems
-need the wrapper function - usually this is a direct call to C<sprintf>.
-
-=cut
-*/
-#ifndef SPRINTF_RETURNS_STRLEN
-int
-Perl_my_sprintf(char *buffer, const char* pat, ...)
-{
-    va_list args;
-    PERL_ARGS_ASSERT_MY_SPRINTF;
-    va_start(args, pat);
-    vsprintf(buffer, pat, args);
-    va_end(args);
-    return strlen(buffer);
-}
-#endif
-
 /*
 =for apidoc quadmath_format_single
 
index adaea89..da654aa 100644 (file)
@@ -525,7 +525,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 5916946..e1d276e 100644 (file)
@@ -526,7 +526,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index 44baf36..3ed2114 100644 (file)
@@ -525,7 +525,6 @@ d_socket='define'
 d_socklen_t='undef'
 d_sockpair='undef'
 d_socks5_init='undef'
-d_sprintf_returns_strlen='define'
 d_sqrtl='undef'
 d_srand48_r='undef'
 d_srandom_r='undef'
index b7cd127..4fde9e6 100644 (file)
  */
 /*#define      HAS_SOCKATMARK_PROTO    /**/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-#define SPRINTF_RETURNS_STRLEN /**/
-
 /* HAS_SETRESGID_PROTO:
  *     This symbol, if defined, indicates that the system provides
  *     a prototype for the setresgid() function.  Otherwise, it is up
index 76f331d..7aaf192 100644 (file)
  */
 /*#define HAS_SOCKS5_INIT              / **/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-#define SPRINTF_RETURNS_STRLEN /**/
-
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.
index ce796ab..795a6b1 100644 (file)
  */
 /*#define HAS_SOCKS5_INIT              / **/
 
-/* SPRINTF_RETURNS_STRLEN:
- *     This variable defines whether sprintf returns the length of the string
- *     (as per the ANSI spec). Some C libraries retain compatibility with
- *     pre-ANSI C and return a pointer to the passed in buffer; for these
- *     this variable will be undef.
- */
-#define SPRINTF_RETURNS_STRLEN /**/
-
 /* HAS_SQRTL:
  *     This symbol, if defined, indicates that the sqrtl routine is
  *     available to do long double square roots.