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