1*820c1a8dSHiroo HAYASHI# locale-zh.m4 serial 15 2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2003, 2005-2021 Free Software Foundation, Inc. 3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation 4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it, 5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved. 6*820c1a8dSHiroo HAYASHI 7*820c1a8dSHiroo HAYASHIdnl From Bruno Haible. 8*820c1a8dSHiroo HAYASHI 9*820c1a8dSHiroo HAYASHIdnl Determine the name of a chinese locale with GB18030 encoding. 10*820c1a8dSHiroo HAYASHIAC_DEFUN([gt_LOCALE_ZH_CN], 11*820c1a8dSHiroo HAYASHI[ 12*820c1a8dSHiroo HAYASHI AC_REQUIRE([AC_CANONICAL_HOST]) 13*820c1a8dSHiroo HAYASHI AC_REQUIRE([AM_LANGINFO_CODESET]) 14*820c1a8dSHiroo HAYASHI AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [ 15*820c1a8dSHiroo HAYASHI AC_LANG_CONFTEST([AC_LANG_SOURCE([[ 16*820c1a8dSHiroo HAYASHI#include <locale.h> 17*820c1a8dSHiroo HAYASHI#include <stdlib.h> 18*820c1a8dSHiroo HAYASHI#include <time.h> 19*820c1a8dSHiroo HAYASHI#if HAVE_LANGINFO_CODESET 20*820c1a8dSHiroo HAYASHI# include <langinfo.h> 21*820c1a8dSHiroo HAYASHI#endif 22*820c1a8dSHiroo HAYASHI#include <stdlib.h> 23*820c1a8dSHiroo HAYASHI#include <string.h> 24*820c1a8dSHiroo HAYASHIstruct tm t; 25*820c1a8dSHiroo HAYASHIchar buf[16]; 26*820c1a8dSHiroo HAYASHIint main () 27*820c1a8dSHiroo HAYASHI{ 28*820c1a8dSHiroo HAYASHI /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl 29*820c1a8dSHiroo HAYASHI imitates locale dependent behaviour by looking at the environment 30*820c1a8dSHiroo HAYASHI variables, and all locales use the UTF-8 encoding. */ 31*820c1a8dSHiroo HAYASHI#if defined __BEOS__ || defined __HAIKU__ 32*820c1a8dSHiroo HAYASHI return 1; 33*820c1a8dSHiroo HAYASHI#else 34*820c1a8dSHiroo HAYASHI /* Check whether the given locale name is recognized by the system. */ 35*820c1a8dSHiroo HAYASHI# if defined _WIN32 && !defined __CYGWIN__ 36*820c1a8dSHiroo HAYASHI /* On native Windows, setlocale(category, "") looks at the system settings, 37*820c1a8dSHiroo HAYASHI not at the environment variables. Also, when an encoding suffix such 38*820c1a8dSHiroo HAYASHI as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE 39*820c1a8dSHiroo HAYASHI category of the locale to "C". */ 40*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL 41*820c1a8dSHiroo HAYASHI || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0) 42*820c1a8dSHiroo HAYASHI return 1; 43*820c1a8dSHiroo HAYASHI# else 44*820c1a8dSHiroo HAYASHI if (setlocale (LC_ALL, "") == NULL) return 1; 45*820c1a8dSHiroo HAYASHI# endif 46*820c1a8dSHiroo HAYASHI /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646". 47*820c1a8dSHiroo HAYASHI On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET) 48*820c1a8dSHiroo HAYASHI is empty, and the behaviour of Tcl 8.4 in this locale is not useful. 49*820c1a8dSHiroo HAYASHI On OpenBSD 4.0, when an unsupported locale is specified, setlocale() 50*820c1a8dSHiroo HAYASHI succeeds but then nl_langinfo(CODESET) is "646". In this situation, 51*820c1a8dSHiroo HAYASHI some unit tests fail. 52*820c1a8dSHiroo HAYASHI On MirBSD 10, when an unsupported locale is specified, setlocale() 53*820c1a8dSHiroo HAYASHI succeeds but then nl_langinfo(CODESET) is "UTF-8". */ 54*820c1a8dSHiroo HAYASHI# if HAVE_LANGINFO_CODESET 55*820c1a8dSHiroo HAYASHI { 56*820c1a8dSHiroo HAYASHI const char *cs = nl_langinfo (CODESET); 57*820c1a8dSHiroo HAYASHI if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0 58*820c1a8dSHiroo HAYASHI || strcmp (cs, "UTF-8") == 0) 59*820c1a8dSHiroo HAYASHI return 1; 60*820c1a8dSHiroo HAYASHI } 61*820c1a8dSHiroo HAYASHI# endif 62*820c1a8dSHiroo HAYASHI# ifdef __CYGWIN__ 63*820c1a8dSHiroo HAYASHI /* On Cygwin, avoid locale names without encoding suffix, because the 64*820c1a8dSHiroo HAYASHI locale_charset() function relies on the encoding suffix. Note that 65*820c1a8dSHiroo HAYASHI LC_ALL is set on the command line. */ 66*820c1a8dSHiroo HAYASHI if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1; 67*820c1a8dSHiroo HAYASHI# endif 68*820c1a8dSHiroo HAYASHI /* Check whether in a month name, no byte in the range 0x80..0x9F occurs. 69*820c1a8dSHiroo HAYASHI This excludes the UTF-8 encoding (except on MirBSD). */ 70*820c1a8dSHiroo HAYASHI { 71*820c1a8dSHiroo HAYASHI const char *p; 72*820c1a8dSHiroo HAYASHI t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4; 73*820c1a8dSHiroo HAYASHI if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1; 74*820c1a8dSHiroo HAYASHI for (p = buf; *p != '\0'; p++) 75*820c1a8dSHiroo HAYASHI if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0) 76*820c1a8dSHiroo HAYASHI return 1; 77*820c1a8dSHiroo HAYASHI } 78*820c1a8dSHiroo HAYASHI /* Check whether a typical GB18030 multibyte sequence is recognized as a 79*820c1a8dSHiroo HAYASHI single wide character. This excludes the GB2312 and GBK encodings. */ 80*820c1a8dSHiroo HAYASHI if (mblen ("\203\062\332\066", 5) != 4) 81*820c1a8dSHiroo HAYASHI return 1; 82*820c1a8dSHiroo HAYASHI return 0; 83*820c1a8dSHiroo HAYASHI#endif 84*820c1a8dSHiroo HAYASHI} 85*820c1a8dSHiroo HAYASHI ]])]) 86*820c1a8dSHiroo HAYASHI if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then 87*820c1a8dSHiroo HAYASHI case "$host_os" in 88*820c1a8dSHiroo HAYASHI # Handle native Windows specially, because there setlocale() interprets 89*820c1a8dSHiroo HAYASHI # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256", 90*820c1a8dSHiroo HAYASHI # "fr" or "fra" as "French" or "French_France.1252", 91*820c1a8dSHiroo HAYASHI # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252", 92*820c1a8dSHiroo HAYASHI # "ja" as "Japanese" or "Japanese_Japan.932", 93*820c1a8dSHiroo HAYASHI # and similar. 94*820c1a8dSHiroo HAYASHI mingw*) 95*820c1a8dSHiroo HAYASHI # Test for the hypothetical native Windows locale name. 96*820c1a8dSHiroo HAYASHI if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then 97*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=Chinese_China.54936 98*820c1a8dSHiroo HAYASHI else 99*820c1a8dSHiroo HAYASHI # None found. 100*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=none 101*820c1a8dSHiroo HAYASHI fi 102*820c1a8dSHiroo HAYASHI ;; 103*820c1a8dSHiroo HAYASHI solaris2.8) 104*820c1a8dSHiroo HAYASHI # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are 105*820c1a8dSHiroo HAYASHI # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK. 106*820c1a8dSHiroo HAYASHI # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core. 107*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=none 108*820c1a8dSHiroo HAYASHI ;; 109*820c1a8dSHiroo HAYASHI *) 110*820c1a8dSHiroo HAYASHI # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because 111*820c1a8dSHiroo HAYASHI # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the 112*820c1a8dSHiroo HAYASHI # configure script would override the LC_ALL setting. Likewise for 113*820c1a8dSHiroo HAYASHI # LC_CTYPE, which is also set at the beginning of the configure script. 114*820c1a8dSHiroo HAYASHI # Test for the locale name without encoding suffix. 115*820c1a8dSHiroo HAYASHI if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then 116*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=zh_CN 117*820c1a8dSHiroo HAYASHI else 118*820c1a8dSHiroo HAYASHI # Test for the locale name with explicit encoding suffix. 119*820c1a8dSHiroo HAYASHI if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then 120*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=zh_CN.GB18030 121*820c1a8dSHiroo HAYASHI else 122*820c1a8dSHiroo HAYASHI # None found. 123*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=none 124*820c1a8dSHiroo HAYASHI fi 125*820c1a8dSHiroo HAYASHI fi 126*820c1a8dSHiroo HAYASHI ;; 127*820c1a8dSHiroo HAYASHI esac 128*820c1a8dSHiroo HAYASHI else 129*820c1a8dSHiroo HAYASHI # If there was a link error, due to mblen(), the system is so old that 130*820c1a8dSHiroo HAYASHI # it certainly doesn't have a chinese locale. 131*820c1a8dSHiroo HAYASHI gt_cv_locale_zh_CN=none 132*820c1a8dSHiroo HAYASHI fi 133*820c1a8dSHiroo HAYASHI rm -fr conftest* 134*820c1a8dSHiroo HAYASHI ]) 135*820c1a8dSHiroo HAYASHI LOCALE_ZH_CN=$gt_cv_locale_zh_CN 136*820c1a8dSHiroo HAYASHI AC_SUBST([LOCALE_ZH_CN]) 137*820c1a8dSHiroo HAYASHI]) 138