mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Support building with Visual Studio 2015
Adjust the way we detect the locale. As a result the minumum Windows version supported by VS2015 and later is Windows Vista. Add some tweaks to remove new compiler warnings. Remove documentation references to the now obsolete msysGit. Michael Paquier, somewhat edited by me, reviewed by Christian Ullrich. Backpatch to 9.5
This commit is contained in:
@@ -19,6 +19,10 @@
|
||||
#include "postgres_fe.h"
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && (_MSC_VER >= 1900)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include <locale.h>
|
||||
#ifdef HAVE_LANGINFO_H
|
||||
#include <langinfo.h>
|
||||
@@ -196,6 +200,16 @@ static const struct encoding_match encoding_match_list[] = {
|
||||
* locale machinery determine the code page. See comments at IsoLocaleName().
|
||||
* For other compilers, follow the locale's predictable format.
|
||||
*
|
||||
* Visual Studio 2015 should still be able to do the same, but the declaration
|
||||
* of lc_codepage is missing in _locale_t, causing this code compilation to
|
||||
* fail, hence this falls back instead on GetLocaleInfoEx. VS 2015 may be an
|
||||
* exception and post-VS2015 versions should be able to handle properly the
|
||||
* codepage number using _create_locale(). So, instead of the same logic as
|
||||
* VS 2012 and VS 2013, this routine uses GetLocaleInfoEx to parse short
|
||||
* locale names like "de-DE", "fr-FR", etc. If those cannot be parsed correctly
|
||||
* process falls back to the pre-VS-2010 manual parsing done with
|
||||
* using <Language>_<Country>.<CodePage> as a base.
|
||||
*
|
||||
* Returns a malloc()'d string for the caller to free.
|
||||
*/
|
||||
static char *
|
||||
@@ -203,7 +217,7 @@ win32_langinfo(const char *ctype)
|
||||
{
|
||||
char *r = NULL;
|
||||
|
||||
#if (_MSC_VER >= 1700)
|
||||
#if (_MSC_VER >= 1700) && (_MSC_VER < 1900)
|
||||
_locale_t loct = NULL;
|
||||
|
||||
loct = _create_locale(LC_CTYPE, ctype);
|
||||
@@ -217,20 +231,41 @@ win32_langinfo(const char *ctype)
|
||||
#else
|
||||
char *codepage;
|
||||
|
||||
/*
|
||||
* Locale format on Win32 is <Language>_<Country>.<CodePage> . For
|
||||
* example, English_United States.1252.
|
||||
*/
|
||||
codepage = strrchr(ctype, '.');
|
||||
if (codepage != NULL)
|
||||
{
|
||||
int ln;
|
||||
#if (_MSC_VER >= 1900)
|
||||
uint32 cp;
|
||||
WCHAR wctype[LOCALE_NAME_MAX_LENGTH];
|
||||
|
||||
codepage++;
|
||||
ln = strlen(codepage);
|
||||
r = malloc(ln + 3);
|
||||
memset(wctype, 0, sizeof(wctype));
|
||||
MultiByteToWideChar(CP_ACP, 0, ctype, -1, wctype, LOCALE_NAME_MAX_LENGTH);
|
||||
|
||||
if (GetLocaleInfoEx(wctype,
|
||||
LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
|
||||
(LPWSTR) &cp, sizeof(cp) / sizeof(WCHAR)) > 0)
|
||||
{
|
||||
r = malloc(16); /* excess */
|
||||
if (r != NULL)
|
||||
sprintf(r, "CP%s", codepage);
|
||||
sprintf(r, "CP%u", cp);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
|
||||
/*
|
||||
* Locale format on Win32 is <Language>_<Country>.<CodePage> . For
|
||||
* example, English_United States.1252.
|
||||
*/
|
||||
codepage = strrchr(ctype, '.');
|
||||
if (codepage != NULL)
|
||||
{
|
||||
int ln;
|
||||
|
||||
codepage++;
|
||||
ln = strlen(codepage);
|
||||
r = malloc(ln + 3);
|
||||
if (r != NULL)
|
||||
sprintf(r, "CP%s", codepage);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user