Simplify replacement code for strtof.
authorThomas Munro <[email protected]>
Sun, 7 Aug 2022 00:42:11 +0000 (12:42 +1200)
committerThomas Munro <[email protected]>
Sun, 7 Aug 2022 00:42:41 +0000 (12:42 +1200)
strtof() is in C99 and all targeted systems have it.  We can remove the
configure probe and some dead code, but we still need replacement code
for a couple of systems that have known buggy implementations selected
via platform template.

Reviewed-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/152683.1659830125%40sss.pgh.pa.us

configure
configure.ac
src/include/pg_config.h.in
src/include/port.h
src/port/strtof.c
src/tools/msvc/Solution.pm

index 0e73edb9ffa499a950545521a5951aa378febc3b..5ee7c2c1a21fb647f9073b96d68605076016b8e8 100755 (executable)
--- a/configure
+++ b/configure
@@ -16734,19 +16734,6 @@ esac
 
 fi
 
-ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
-if test "x$ac_cv_func_strtof" = xyes; then :
-  $as_echo "#define HAVE_STRTOF 1" >>confdefs.h
-
-else
-  case " $LIBOBJS " in
-  *" strtof.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS strtof.$ac_objext"
- ;;
-esac
-
-fi
-
 
 
 if test "$enable_thread_safety" = yes; then
@@ -16770,8 +16757,7 @@ if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
    # Cygwin and (apparently, based on test results) Mingw both
    # have a broken strtof(), so substitute its implementation.
    # That's not a perfect fix, since it doesn't avoid double-rounding,
-   # but we have no better options. To get that, though, we have to
-   # force the file to be compiled despite HAVE_STRTOF.
+   # but we have no better options.
    case " $LIBOBJS " in
   *" strtof.$ac_objext "* ) ;;
   *) LIBOBJS="$LIBOBJS strtof.$ac_objext"
index efd3be91cd47c4051e2e1f97e987784a4878689e..be52e17ea75476782a4e15f86ebbb343cef1ebfa 100644 (file)
@@ -1874,7 +1874,6 @@ AC_REPLACE_FUNCS(m4_normalize([
    strlcat
    strlcpy
    strnlen
-   strtof
 ]))
 
 if test "$enable_thread_safety" = yes; then
@@ -1885,8 +1884,7 @@ if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then
    # Cygwin and (apparently, based on test results) Mingw both
    # have a broken strtof(), so substitute its implementation.
    # That's not a perfect fix, since it doesn't avoid double-rounding,
-   # but we have no better options. To get that, though, we have to
-   # force the file to be compiled despite HAVE_STRTOF.
+   # but we have no better options.
    AC_LIBOBJ([strtof])
    AC_MSG_NOTICE([On $host_os we will use our strtof wrapper.])
 fi
index 2d9a1cdc8ab06fafa3b4be280237fee55665143b..c243a906c9b541d8782b1a166ebd385826f06965 100644 (file)
 /* Define to 1 if you have the `strsignal' function. */
 #undef HAVE_STRSIGNAL
 
-/* Define to 1 if you have the `strtof' function. */
-#undef HAVE_STRTOF
-
 /* Define to 1 if the system has the type `struct addrinfo'. */
 #undef HAVE_STRUCT_ADDRINFO
 
index ad76384fb195888c25cb7be2d8f467253dcb2b4a..cec41eae713232fe0069da2c765e7cdad0d20f47 100644 (file)
@@ -387,10 +387,6 @@ extern int getpeereid(int sock, uid_t *uid, gid_t *gid);
 extern void explicit_bzero(void *buf, size_t len);
 #endif
 
-#ifndef HAVE_STRTOF
-extern float strtof(const char *nptr, char **endptr);
-#endif
-
 #ifdef HAVE_BUGGY_STRTOF
 extern float pg_strtof(const char *nptr, char **endptr);
 #define strtof(a,b) (pg_strtof((a),(b)))
index 314fcc9851f190a7d36dc9dddcd573c174370d49..21b3f8f7122156ae34bc8087fc0383534457e5e4 100644 (file)
 #include <float.h>
 #include <math.h>
 
-#ifndef HAVE_STRTOF
-/*
- * strtof() is part of C99; this version is only for the benefit of obsolete
- * platforms. As such, it is known to return incorrect values for edge cases,
- * which have to be allowed for in variant files for regression test results
- * for any such platform.
- */
-
-float
-strtof(const char *nptr, char **endptr)
-{
-   int         caller_errno = errno;
-   double      dresult;
-   float       fresult;
-
-   errno = 0;
-   dresult = strtod(nptr, endptr);
-   fresult = (float) dresult;
 
-   if (errno == 0)
-   {
-       /*
-        * Value might be in-range for double but not float.
-        */
-       if (dresult != 0 && fresult == 0)
-           caller_errno = ERANGE;  /* underflow */
-       if (!isinf(dresult) && isinf(fresult))
-           caller_errno = ERANGE;  /* overflow */
-   }
-   else
-       caller_errno = errno;
-
-   errno = caller_errno;
-   return fresult;
-}
-
-#elif HAVE_BUGGY_STRTOF
 /*
  * Cygwin has a strtof() which is literally just (float)strtod(), which means
  * we can't avoid the double-rounding problem; but using this wrapper does get
@@ -119,5 +83,3 @@ pg_strtof(const char *nptr, char **endptr)
        }
    }
 }
-
-#endif
index 4916a86f5cf41d084a0b3400ac18090ade26db3a..caacb965bbd0fb906e96b64caacaac3faa3556b0 100644 (file)
@@ -349,7 +349,6 @@ sub GenerateFiles
        HAVE_STRLCPY                             => undef,
        HAVE_STRNLEN                             => 1,
        HAVE_STRSIGNAL                           => undef,
-       HAVE_STRTOF                              => 1,
        HAVE_STRUCT_ADDRINFO                     => 1,
        HAVE_STRUCT_CMSGCRED                     => undef,
        HAVE_STRUCT_OPTION                       => undef,