Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6952071

Browse files
committed
Fix MinGW build, broken by my previous patch to add a setlocale() wrapper
on Windows. ecpglib doesn't link with libpgport, but picks and compilesthe .c files it needs individually. To cope with that, move the setlocale()wrapper from chklocale.c to a separate setlocale.c file, and include thatin ecpglib.
1 parent83748f3 commit6952071

File tree

6 files changed

+126
-110
lines changed

6 files changed

+126
-110
lines changed

‎configure

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21090,6 +21090,12 @@ esac
2109021090
;;
2109121091
esac
2109221092

21093+
case " $LIBOBJS " in
21094+
*" win32setlocale.$ac_objext "* ) ;;
21095+
*) LIBOBJS="$LIBOBJS win32setlocale.$ac_objext"
21096+
;;
21097+
esac
21098+
2109321099

2109421100
cat >>confdefs.h <<\_ACEOF
2109521101
#define HAVE_SYMLINK 1

‎configure.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,7 @@ if test "$PORTNAME" = "win32"; then
13741374
AC_LIBOBJ(open)
13751375
AC_LIBOBJ(win32env)
13761376
AC_LIBOBJ(win32error)
1377+
AC_LIBOBJ(win32setlocale)
13771378
AC_DEFINE([HAVE_SYMLINK], 1,
13781379
[Define to 1 if you have the `symlink' function.])
13791380
AC_CHECK_TYPES(MINIDUMP_TYPE, [pgac_minidump_type=yes], [pgac_minidump_type=no], [

‎src/interfaces/ecpg/ecpglib/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ LIBS := $(filter-out -lpgport, $(LIBS))
2626

2727
OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o\
2828
connect.o misc.o path.o pgstrcasecmp.o\
29-
$(filter snprintf.o strlcpy.o,$(LIBOBJS))
29+
$(filter snprintf.o strlcpy.o win32setlocale.o,$(LIBOBJS))
3030

3131
# thread.c is needed only for non-WIN32 implementation of path.c
3232
ifneq ($(PORTNAME), win32)
@@ -57,7 +57,7 @@ include $(top_srcdir)/src/Makefile.shlib
5757
# necessarily use the same object files as the backend uses. Instead,
5858
# symlink the source files in here and build our own object file.
5959

60-
path.cpgstrcasecmp.csnprintf.cstrlcpy.cthread.c:% :$(top_srcdir)/src/port/%
60+
path.cpgstrcasecmp.csnprintf.cstrlcpy.cthread.cwin32setlocale.c:% :$(top_srcdir)/src/port/%
6161
rm -f$@&&$(LN_S)$<.
6262

6363
misc.o: misc.c$(top_builddir)/src/port/pg_config_paths.h
@@ -74,6 +74,6 @@ uninstall: uninstall-lib
7474

7575
cleandistclean: clean-lib
7676
rm -f$(OBJS)
77-
rm -f path.c pgstrcasecmp.c snprintf.c strlcpy.c thread.c
77+
rm -f path.c pgstrcasecmp.c snprintf.c strlcpy.c thread.c win32setlocale.c
7878

7979
maintainer-clean: distclean maintainer-clean-lib

‎src/port/chklocale.c

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -356,109 +356,3 @@ pg_get_encoding_from_locale(const char *ctype, bool write_message)
356356
}
357357

358358
#endif/* (HAVE_LANGINFO_H && CODESET) || WIN32 */
359-
360-
#ifdefWIN32
361-
/*
362-
* Windows has a problem with locale names that have a dot in the country
363-
* name. For example:
364-
*
365-
* "Chinese (Traditional)_Hong Kong S.A.R..950"
366-
*
367-
* For some reason, setlocale() doesn't accept that. Fortunately, Windows'
368-
* setlocale() accepts various alternative names for such countries, so we
369-
* provide a wrapper setlocale() function that maps the troublemaking locale
370-
* names to accepted aliases.
371-
*/
372-
373-
#undef setlocale
374-
375-
structlocale_map
376-
{
377-
constchar*locale_name_part;/* string in locale name to replace */
378-
constchar*replacement;/* string to replace it with */
379-
};
380-
381-
staticconststructlocale_maplocale_map_list[]= {
382-
383-
/*
384-
* "HKG" is listed here:
385-
* http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.71%29.aspx
386-
* (Country/Region Strings).
387-
*
388-
* "ARE" is the ISO-3166 three-letter code for U.A.E. It is not on the
389-
* above list, but seems to work anyway.
390-
*/
391-
{"Hong Kong S.A.R.","HKG" },
392-
{"U.A.E.","ARE" },
393-
394-
/*
395-
* The ISO-3166 country code for Macau S.A.R. is MAC, but Windows doesn't
396-
* seem to recognize that. And Macau isn't listed in the table of
397-
* accepted abbreviations linked above. Fortunately, "ZHM" seems to be
398-
* accepted as an alias for "Chinese (Traditional)_Macau S.A.R..950". I'm
399-
* not sure where "ZHM" comes from, must be some legacy naming scheme. But
400-
* hey, it works.
401-
*
402-
* Note that unlike HKG and ARE, ZHM is an alias for the *whole* locale
403-
* name, not just the country part.
404-
*
405-
* Some versions of Windows spell it "Macau", others "Macao".
406-
*/
407-
{"Chinese (Traditional)_Macau S.A.R..950","ZHM" },
408-
{"Chinese_Macau S.A.R..950","ZHM" },
409-
{"Chinese (Traditional)_Macao S.A.R..950","ZHM" },
410-
{"Chinese_Macao S.A.R..950","ZHM" }
411-
};
412-
413-
char*
414-
pgwin32_setlocale(intcategory,constchar*locale)
415-
{
416-
char*result;
417-
char*alias;
418-
inti;
419-
420-
if (locale==NULL)
421-
returnsetlocale(category,locale);
422-
423-
/* Check if the locale name matches any of the problematic ones. */
424-
alias=NULL;
425-
for (i=0;i<lengthof(locale_map_list);i++)
426-
{
427-
constchar*needle=locale_map_list[i].locale_name_part;
428-
constchar*replacement=locale_map_list[i].replacement;
429-
char*match;
430-
431-
match=strstr(locale,needle);
432-
if (match!=NULL)
433-
{
434-
/* Found a match. Replace the matched string. */
435-
intmatchpos=match-locale;
436-
intreplacementlen=strlen(replacement);
437-
char*rest=match+strlen(needle);
438-
intrestlen=strlen(rest);
439-
440-
alias=malloc(matchpos+replacementlen+restlen+1);
441-
if (!alias)
442-
returnNULL;
443-
444-
memcpy(&alias[0],&locale[0],matchpos);
445-
memcpy(&alias[matchpos],replacement,replacementlen);
446-
memcpy(&alias[matchpos+replacementlen],rest,restlen+1);/* includes null terminator */
447-
448-
break;
449-
}
450-
}
451-
452-
/* Call the real setlocale() function */
453-
if (alias)
454-
{
455-
result=setlocale(category,alias);
456-
free(alias);
457-
}
458-
else
459-
result=setlocale(category,locale);
460-
461-
returnresult;
462-
}
463-
464-
#endif/* WIN32 */

‎src/port/win32setlocale.c

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* win32setlocale.c
4+
*Wrapper to work around bugs in Windows setlocale() implementation
5+
*
6+
* Copyright (c) 2011, PostgreSQL Global Development Group
7+
*
8+
* IDENTIFICATION
9+
* src/port/win32setlocale.c
10+
*
11+
*
12+
* Windows has a problem with locale names that have a dot in the country
13+
* name. For example:
14+
*
15+
* "Chinese (Traditional)_Hong Kong S.A.R..950"
16+
*
17+
* For some reason, setlocale() doesn't accept that. Fortunately, Windows'
18+
* setlocale() accepts various alternative names for such countries, so we
19+
* provide a wrapper setlocale() function that maps the troublemaking locale
20+
* names to accepted aliases.
21+
*-------------------------------------------------------------------------
22+
*/
23+
24+
#include"c.h"
25+
26+
#undef setlocale
27+
28+
structlocale_map
29+
{
30+
constchar*locale_name_part;/* string in locale name to replace */
31+
constchar*replacement;/* string to replace it with */
32+
};
33+
34+
staticconststructlocale_maplocale_map_list[]= {
35+
36+
/*
37+
* "HKG" is listed here:
38+
* http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.71%29.aspx
39+
* (Country/Region Strings).
40+
*
41+
* "ARE" is the ISO-3166 three-letter code for U.A.E. It is not on the
42+
* above list, but seems to work anyway.
43+
*/
44+
{"Hong Kong S.A.R.","HKG" },
45+
{"U.A.E.","ARE" },
46+
47+
/*
48+
* The ISO-3166 country code for Macau S.A.R. is MAC, but Windows doesn't
49+
* seem to recognize that. And Macau isn't listed in the table of
50+
* accepted abbreviations linked above. Fortunately, "ZHM" seems to be
51+
* accepted as an alias for "Chinese (Traditional)_Macau S.A.R..950". I'm
52+
* not sure where "ZHM" comes from, must be some legacy naming scheme. But
53+
* hey, it works.
54+
*
55+
* Note that unlike HKG and ARE, ZHM is an alias for the *whole* locale
56+
* name, not just the country part.
57+
*
58+
* Some versions of Windows spell it "Macau", others "Macao".
59+
*/
60+
{"Chinese (Traditional)_Macau S.A.R..950","ZHM" },
61+
{"Chinese_Macau S.A.R..950","ZHM" },
62+
{"Chinese (Traditional)_Macao S.A.R..950","ZHM" },
63+
{"Chinese_Macao S.A.R..950","ZHM" }
64+
};
65+
66+
char*
67+
pgwin32_setlocale(intcategory,constchar*locale)
68+
{
69+
char*result;
70+
char*alias;
71+
inti;
72+
73+
if (locale==NULL)
74+
returnsetlocale(category,locale);
75+
76+
/* Check if the locale name matches any of the problematic ones. */
77+
alias=NULL;
78+
for (i=0;i<lengthof(locale_map_list);i++)
79+
{
80+
constchar*needle=locale_map_list[i].locale_name_part;
81+
constchar*replacement=locale_map_list[i].replacement;
82+
char*match;
83+
84+
match=strstr(locale,needle);
85+
if (match!=NULL)
86+
{
87+
/* Found a match. Replace the matched string. */
88+
intmatchpos=match-locale;
89+
intreplacementlen=strlen(replacement);
90+
char*rest=match+strlen(needle);
91+
intrestlen=strlen(rest);
92+
93+
alias=malloc(matchpos+replacementlen+restlen+1);
94+
if (!alias)
95+
returnNULL;
96+
97+
memcpy(&alias[0],&locale[0],matchpos);
98+
memcpy(&alias[matchpos],replacement,replacementlen);
99+
memcpy(&alias[matchpos+replacementlen],rest,restlen+1);/* includes null terminator */
100+
101+
break;
102+
}
103+
}
104+
105+
/* Call the real setlocale() function */
106+
if (alias)
107+
{
108+
result=setlocale(category,alias);
109+
free(alias);
110+
}
111+
else
112+
result=setlocale(category,locale);
113+
114+
returnresult;
115+
}

‎src/tools/msvc/Mkvcbuild.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ sub mkvcbuild
5353
snprintf.c strlcat.c strlcpy.c dirmod.c exec.c noblock.c path.c
5454
pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c qsort.c qsort_arg.c
5555
sprompt.c thread.c getopt.c getopt_long.c dirent.c rint.c win32env.c
56-
win32error.c);
56+
win32error.c win32setlocale.c);
5757

5858
$libpgport =$solution->AddProject('libpgport','lib','misc');
5959
$libpgport->AddDefine('FRONTEND');

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp