| Since we do not use relocation (and it was not easy to get to compile on |
| Windows) we have removed it, as well as OS/2 compatibility. Also, we |
| do not install or use locale.alias, and charset.alias is compiled in |
| (via charsetalias.h) rather than read at runtime. |
| |
| Since the packages will need libintl.h, we need to install it. We also |
| need to ensure that we get our version and not, e.g. the Solaris version. |
| |
| Since this is made with visibility hidden, we need to add visibility |
| to some entry points. |
| |
| On Windows we needed to override the way the locale_charset is found, |
| and map some Windows locale names to XPG ones. And we use localeCP |
| not getACP, since the latter refers to the default codepage |
| irrespective of locales. |
| |
| Various small changes were made to avoid warnings. |
| |
| BDR |
| |
| One more change for macOS: the locale detection is simply off-loaded |
| to locale2charset, because the built-in detection in gettext doesn't work. |
| This also ensures that R and gettext are in sync wrt the charset used. |
| |
| SU |
| |
| diff -ru intl/dcigettext.c ../extra/intl/dcigettext.c |
| --- intl/dcigettext.c 2007-10-21 19:41:41.000000000 +0100 |
| +++ ../extra/intl/dcigettext.c 2008-01-13 14:39:54.703125000 +0000 |
| @@ -152,7 +152,10 @@ |
| # if VMS |
| # define getcwd(buf, max) (getcwd) (buf, max, 0) |
| # else |
| +/* This is naughty if already declared, but harmful on Win64 */ |
| +# ifndef _WIN64 |
| char *getcwd (); |
| +# endif |
| # endif |
| # endif |
| # ifndef HAVE_STPCPY |
| @@ -269,6 +272,9 @@ |
| size_t translation_length; |
| |
| /* Pointer to the string in question. */ |
| +#ifdef __GNUC__ |
| + __extension__ |
| +#endif |
| char msgid[ZERO]; |
| }; |
| |
| @@ -1535,6 +1541,22 @@ |
| locale_defaulted = 1; |
| } |
| } |
| +# ifdef _WIN32 |
| + /* Need to translate some Windows locale names */ |
| + if(strcmp(locale, "chs") == 0) locale = "zh_CN"; |
| + if(strcmp(locale, "chinese") == 0) locale = "zh_TW"; |
| + if(strcmp(locale, "cht") == 0) locale = "zh_TW"; |
| + if(strcmp(locale, "ptb") == 0) locale = "pt_BR"; |
| + /* Vista has got a lot pickier, so e.g. 'LC_ALL=ru' does not work */ |
| + if(strncmp(locale, "de", 2) == 0) locale = "de_DE"; |
| + if(strcmp(locale, "esp") == 0) locale = "es_ES"; |
| + if(strncmp(locale, "fr", 2) == 0) locale = "fr_FR"; |
| + if(strncmp(locale, "it", 2) == 0) locale = "it_IT"; |
| + if(strncmp(locale, "ko", 2) == 0) locale = "ko_KO"; |
| + if(strcmp(locale, "jpn") == 0) locale = "ja_JP"; |
| + if(strncmp(locale, "rus", 3) == 0) locale = "ru_RU"; |
| + if(strcmp(locale, "spanish") == 0) locale = "es_ES"; |
| +# endif |
| # endif |
| #endif |
| |
| diff -ru intl/dgettext.c ../extra/intl/dgettext.c |
| --- intl/dgettext.c 2005-05-20 22:05:58.000000000 +0100 |
| +++ ../extra/intl/dgettext.c 2007-05-12 05:55:38.000000000 +0100 |
| @@ -46,7 +46,10 @@ |
| |
| /* Look up MSGID in the DOMAINNAME message catalog of the current |
| LC_MESSAGES locale. */ |
| -char * |
| +#ifdef HAVE_VISIBILITY_ATTRIBUTE |
| +__attribute__ ((visibility ("default"))) |
| +#endif |
| +char * |
| DGETTEXT (const char *domainname, const char *msgid) |
| { |
| return DCGETTEXT (domainname, msgid, LC_MESSAGES); |
| diff -ru intl/finddomain.c ../extra/intl/finddomain.c |
| --- intl/finddomain.c 2007-10-13 16:55:41.000000000 +0100 |
| +++ ../extra/intl/finddomain.c 2008-01-13 15:02:30.468750000 +0000 |
| @@ -67,7 +67,9 @@ |
| const char *territory; |
| const char *codeset; |
| const char *normalized_codeset; |
| +#ifdef NOT_USED |
| const char *alias_value; |
| +#endif |
| int mask; |
| |
| /* LOCALE can consist of up to four recognized parts for the XPG syntax: |
| @@ -120,6 +122,7 @@ |
| /* NOTREACHED */ |
| } |
| |
| +#ifdef NOT_USED /* R change */ |
| /* See whether the locale value is an alias. If yes its value |
| *overwrites* the alias name. No test for the original value is |
| done. */ |
| @@ -139,6 +142,7 @@ |
| memcpy (locale, alias_value, len); |
| #endif |
| } |
| +#endif |
| |
| /* Now we determine the single parts of the locale name. First |
| look for the language. Termination symbols are `_', '.', and `@'. */ |
| @@ -178,9 +182,12 @@ |
| } |
| } |
| |
| + |
| +#ifdef NOT_USED |
| /* The room for an alias was dynamically allocated. Free it now. */ |
| if (alias_value != NULL) |
| free (locale); |
| +#endif |
| |
| out: |
| /* The space for normalized_codeset is dynamically allocated. Free it. */ |
| diff -ru intl/gettext.c ../extra/intl/gettext.c |
| --- intl/gettext.c 2005-05-20 22:05:58.000000000 +0100 |
| +++ ../extra/intl/gettext.c 2007-05-12 05:56:24.000000000 +0100 |
| @@ -51,6 +51,9 @@ |
| /* Look up MSGID in the current default message catalog for the current |
| LC_MESSAGES locale. If not found, returns MSGID itself (the default |
| text). */ |
| +#ifdef HAVE_VISIBILITY_ATTRIBUTE |
| +__attribute__ ((visibility ("default"))) |
| +#endif |
| char * |
| GETTEXT (const char *msgid) |
| { |
| diff -ru intl/gettextP.h ../extra/intl/gettextP.h |
| --- intl/gettextP.h 2007-10-13 17:18:11.000000000 +0100 |
| +++ ../extra/intl/gettextP.h 2008-01-13 14:36:23.671875000 +0000 |
| @@ -214,6 +214,9 @@ |
| struct binding *next; |
| char *dirname; |
| char *codeset; |
| +#ifdef __GNUC__ |
| + __extension__ |
| +#endif |
| char domainname[ZERO]; |
| }; |
| |
| diff -ru intl/l10nflist.c ../extra/intl/l10nflist.c |
| --- intl/l10nflist.c 2006-06-23 17:29:25.000000000 +0100 |
| +++ ../extra/intl/l10nflist.c 2007-08-21 09:38:31.656250000 +0100 |
| @@ -318,10 +318,9 @@ |
| if (dirlist_count > 1) |
| { |
| /* Iterate over all elements of the DIRLIST. */ |
| - char *dir = NULL; |
| + char *dir = NULL, *nd = (char *) dirlist; |
| |
| - while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) |
| - != NULL) |
| + while ((dir = __argz_next (nd, dirlist_len, dir)) != NULL) |
| retval->successor[entries++] |
| = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, |
| cnt, language, territory, codeset, |
| diff -ru intl/localcharset.c ../extra/intl/localcharset.c |
| --- intl/localcharset.c 2006-10-18 12:56:41.000000000 +0100 |
| +++ ../extra/intl/localcharset.c 2008-01-13 14:36:25.171875000 +0000 |
| @@ -19,7 +19,9 @@ |
| |
| /* Written by Bruno Haible <bruno@clisp.org>. */ |
| |
| -#include <config.h> |
| +#ifdef HAVE_CONFIG_H |
| +# include <config.h> |
| +#endif |
| |
| /* Specification. */ |
| #include "localcharset.h" |
| @@ -65,10 +67,12 @@ |
| # define relocate(pathname) (pathname) |
| #endif |
| |
| +#if 0 |
| /* Get LIBDIR. */ |
| #ifndef LIBDIR |
| # include "configmake.h" |
| #endif |
| +#endif |
| |
| #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ |
| /* Win32, Cygwin, OS/2, DOS */ |
| @@ -112,6 +116,9 @@ |
| if (cp == NULL) |
| { |
| #if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) |
| +/* we convert charset.alias to a header file at compile time */ |
| +#include "charsetalias.h" |
| +#if 0 |
| FILE *fp; |
| const char *dir; |
| const char *base = "charset.alias"; |
| @@ -209,7 +216,7 @@ |
| |
| if (file_name != NULL) |
| free (file_name); |
| - |
| +#endif |
| #else |
| |
| # if defined VMS |
| @@ -280,6 +287,8 @@ |
| If the canonical name cannot be determined, the result is a non-canonical |
| name. */ |
| |
| +extern unsigned int localeCP; /* from Defn.h */ |
| + |
| #ifdef STATIC |
| STATIC |
| #endif |
| @@ -377,8 +386,9 @@ |
| |
| static char buf[2 + 10 + 1]; |
| |
| - /* Woe32 has a function returning the locale's codepage as a number. */ |
| - sprintf (buf, "CP%u", GetACP ()); |
| + /* Woe32 has a function returning the locale's codepage as a number. |
| + sprintf (buf, "CP%u", GetACP ()); */ |
| + sprintf (buf, "CP%u", localeCP); |
| codeset = buf; |
| |
| #elif defined OS2 |
| diff -ru intl/localename.c ../extra/intl/localename.c |
| --- intl/localename.c 2007-06-07 20:49:32.000000000 +0100 |
| +++ ../extra/intl/localename.c 2008-01-13 14:36:26.000000000 +0000 |
| @@ -20,7 +20,9 @@ |
| /* Win32 code written by Tor Lillqvist <tml@iki.fi>. */ |
| /* MacOS X code written by Bruno Haible <bruno@clisp.org>. */ |
| |
| -#include <config.h> |
| +#ifdef HAVE_CONFIG_H |
| +# include <config.h> |
| +#endif |
| |
| /* Specification. */ |
| #ifdef IN_LIBINTL |
| diff -ru intl/lock.c ../extra/intl/lock.c |
| --- intl/lock.c 2006-10-09 13:00:44.000000000 +0100 |
| +++ ../extra/intl/lock.c 2007-09-02 04:56:00.338369300 +0100 |
| @@ -359,7 +359,7 @@ |
| |
| /* -------------------------- gl_once_t datatype -------------------------- */ |
| |
| -static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT; |
| +static const pthread_once_t fresh_once = {PTHREAD_ONCE_INIT}; |
| |
| int |
| glthread_once_singlethreaded (pthread_once_t *once_control) |
| diff -ru intl/ngettext.c ../extra/intl/ngettext.c |
| --- intl/ngettext.c 2005-05-20 22:05:58.000000000 +0100 |
| +++ ../extra/intl/ngettext.c 2007-05-12 07:34:56.562500000 +0100 |
| @@ -53,6 +53,9 @@ |
| /* Look up MSGID in the current default message catalog for the current |
| LC_MESSAGES locale. If not found, returns MSGID itself (the default |
| text). */ |
| +#ifdef HAVE_VISIBILITY_ATTRIBUTE |
| +__attribute__ ((visibility ("default"))) |
| +#endif |
| char * |
| NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) |
| { |
| |
| Index: localcharset.c |
| =================================================================== |
| --- localcharset.c (revision 44486) |
| +++ localcharset.c (working copy) |
| @@ -288,6 +288,9 @@ |
| name. */ |
| |
| extern unsigned int localeCP; /* from Defn.h */ |
| +#if __APPLE__ /* others could use this, too ... */ |
| +extern const char *locale2charset(char*); |
| +#endif |
| |
| #ifdef STATIC |
| STATIC |
| @@ -295,6 +298,9 @@ |
| const char * |
| locale_charset (void) |
| { |
| +#if __APPLE__ |
| + return locale2charset(NULL); |
| +#else |
| const char *codeset; |
| const char *aliases; |
| |
| @@ -468,4 +474,5 @@ |
| codeset = "ASCII"; |
| |
| return codeset; |
| +#endif /* ! __APPLE__ */ |
| } |