Don't expose Windows' mbstowcs_l() and wcstombs_l().
authorThomas Munro <tmunro@postgresql.org>
Mon, 10 Jul 2023 21:34:22 +0000 (09:34 +1200)
committerThomas Munro <tmunro@postgresql.org>
Mon, 10 Jul 2023 21:34:22 +0000 (09:34 +1200)
Windows has similar functions with leading underscores.  Previously, we
provided the rename via a macro in win32_port.h.  In fact its functions
are not always good replacements for the Unix functions, since they
can't deal with UTF-8.  They are only currently used by pg_locale.c,
which is careful to redirect to other Windows routines for UTF-8.  Given
that portability hazard, it seem unlikely to be a good idea to encourage
any other code to think of these functions as being available outside
pg_locale.c.  Any code that thinks it wants these functions probably
wants our wchar2char() or char2wchar() routines instead, or it won't
actually work on Windows in UTF-8 databases.

Furthermore, some major libc implementations including glibc don't have
them (they only have the standard variants without _l), so external code
is very unlikely to require them to exist.

Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/CA%2BhUKG%2Bt_CHPzEoPnKyARJBJgE9-GxNajJo6ZuSfRK_KWFO%2B6w%40mail.gmail.com

src/backend/utils/adt/pg_locale.c
src/include/port/win32_port.h

index 40a68b9b2c2b96854c8ecee53fda2edd87aca74a..aa9da99308af5c98501653dcb24b03ee68a26d18 100644 (file)
@@ -154,36 +154,41 @@ static void icu_set_collation_attributes(UCollator *collator, const char *loc,
                                                                                 UErrorCode *status);
 #endif
 
-#ifndef WIN32
 /*
  * POSIX doesn't define _l-variants of these functions, but several systems
- * have them.  We provide our own replacements here.  For Windows, we have
- * macros in win32_port.h.
+ * have them.  We provide our own replacements here.
  */
 #ifndef HAVE_MBSTOWCS_L
 static size_t
 mbstowcs_l(wchar_t *dest, const char *src, size_t n, locale_t loc)
 {
+#ifdef WIN32
+       return _mbstowcs_l(dest, src, n, loc);
+#else
        size_t          result;
        locale_t        save_locale = uselocale(loc);
 
        result = mbstowcs(dest, src, n);
        uselocale(save_locale);
        return result;
+#endif
 }
 #endif
 #ifndef HAVE_WCSTOMBS_L
 static size_t
 wcstombs_l(char *dest, const wchar_t *src, size_t n, locale_t loc)
 {
+#ifdef WIN32
+       return _wcstombs_l(dest, src, n, loc);
+#else
        size_t          result;
        locale_t        save_locale = uselocale(loc);
 
        result = wcstombs(dest, src, n);
        uselocale(save_locale);
        return result;
-}
 #endif
+}
 #endif
 
 /*
index b957d5c598149d806d2b3d46ef719b75c61f24ee..0e6d60833083ccceeab989bafc5b98c46c77bae8 100644 (file)
@@ -455,8 +455,6 @@ extern int  _pglstat64(const char *name, struct stat *buf);
 #define strcoll_l _strcoll_l
 #define strxfrm_l _strxfrm_l
 #define wcscoll_l _wcscoll_l
-#define wcstombs_l _wcstombs_l
-#define mbstowcs_l _mbstowcs_l
 
 /*
  * Versions of libintl >= 0.18? try to replace setlocale() with a macro