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 Mac OS X: 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 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__ */
 }
