about summary refs log tree commit diff
path: root/intl/loadmsgcat.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-05-04 02:46:54 +0000
committerUlrich Drepper <drepper@redhat.com>2000-05-04 02:46:54 +0000
commit17c389fc2b8bdc74ae136c933988ad5d89f6350e (patch)
treed9f06e66be27ed5a2b1b021684de02745b3e594b /intl/loadmsgcat.c
parent160016c945d49cfe43f6d34aa077ea04309c983b (diff)
downloadglibc-17c389fc2b8bdc74ae136c933988ad5d89f6350e.tar.gz
glibc-17c389fc2b8bdc74ae136c933988ad5d89f6350e.tar.xz
glibc-17c389fc2b8bdc74ae136c933988ad5d89f6350e.zip
Update.
	* libio/stdio.h: Make fseeko and ftello prototypes available is
	__USE_LARGEFILE.  Patch by Paul Eggert <eggert@twinsun.com>.

	* sysdeps/generic/dl-environ.c (unsetenv): Follow change to the
	real unsetenv implementation from 1999-07-29 [PR libc/1714].

2000-05-03  Bruno Haible  <haible@clisp.cons.org>

	* intl/dcigettext.c (dcigettext): Do the defaulting of 'domainname'
	before calling tfind.

2000-03-05  Jakub Jelinek  <jakub@redhat.com>

	* resolv/resolv.h (res_querydomain): Remove redefinition to
	__res_querydomain (reported by Owen Taylor <otaylor@redhat.com>).

2000-05-03  Ulrich Drepper  <drepper@redhat.com>

	* po/gl.po: Update from translation team.

	* manual/intro.texi (Program Basics): Change section title.
	* manual/process.texi: Fix reference.
	(Executing a File): Add reference exec in other section.
	* manual/signal.texi: Fix reference.
	* manual/startup.texi: Document syscall function.
	Patches by Bryan Henderson <bryanh@giraffe-data.com>.

2000-04-29  Bruno Haible  <haible@clisp.cons.org>

	* intl/libintl.h (bind_textdomain_codeset): New declaration.
	* intl/bindtextdom.c (set_binding_values): New function.
	(bindtextdomain): Call it.
	(bind_textdomain_codeset): New function.
	* intl/dcigettext.c (dcigettext): Pass binding to _nl_find_domain.
	(free_mem): Free each binding's codeset.
	* intl/gettextP.h (struct binding): Add codeset field.
	(_nl_find_domain): Add domainbinding argument.
	* intl/finddomain.c (_nl_find_domain): Add domainbinding argument.
	Pass it to _nl_make_l10nflist.
	* intl/loadinfo.h (struct loaded_l10nfile): Add domainbinding field.
	(_nl_make_l10nflist): Add domainbinding argument.
	* intl/l10nflist.c (_nl_make_l10nflist): Add domainbinding argument.
	* intl/loadmsgcat.c (_nl_load_domain): Look at the domainbinding's
	codeset when determining outcharset. If !_LIBC && HAVE_ICONV, call
	locale_charset().
	* manual/message.texi: New node "Charset conversion in gettext".

2000-04-30  Bruno Haible  <haible@clisp.cons.org>

	* catgets/open_catalog.c (__open_catalog): Use __builtin_expect where
	appropriate.  Handle possible __read error.

2000-04-29  Bruno Haible  <haible@clisp.cons.org>

	* intl/gettextP.h (__builtin_expect): Define as empty if not a
	compiler builtin.
	* intl/loadinfo.h (__builtin_expect): Likewise.
	* intl/dcigettext.c (dcigettext, _nl_find_msg): Use
	__builtin_expect where appropriate.
	* intl/loadmsgcat.c (_nl_load_domain): Likewise.
	* intl/localealias.c (extend_alias_table): Return an error indicator.
	(read_alias_file): Bail out if extend_alias_table fails.

2000-04-29  Bruno Haible  <haible@clisp.cons.org>

	* intl/loadmsgcat.c: Define _GNU_SOURCE as early as possible.
	* intl/localealias.c: Likewise.

2000-05-01  Bruno Haible  <haible@clisp.cons.org>

	* intl/loadmsgcat.c (_nl_load_domain): Initialize domain->conv_tab.
	Initialize domain->plural and domain->nplurals even if there is no
	nullentry.

2000-05-01  Bruno Haible  <haible@clisp.cons.org>

	* intl/dcigettext.c (_nl_find_msg): Terminate __gconv loop if return
	value is == __GCONV_OK or == __GCONV_EMPTY_INPUT, not != __GCONV_OK.
	In case of failure, goto converted.

2000-05-01  Bruno Haible  <haible@clisp.cons.org>

	* wcsmbs/wcsmbsload.c (norm_add_slashes): Move away.
	* iconv/gconv_int.h (norm_add_slashes): Move to here.
	* intl/loadmsgcat.c (_nl_load_domain): Normalize strings passed to
	__gconv_open.

2000-04-29  Bruno Haible  <haible@clisp.cons.org>

	* intl/dcigettext.c (transcmp): Compare the domains as well.
	(dcigettext): Call strlen (msgid1) after testing msgid1 against NULL,
	not before.
	* intl/loadmsgcat.c (_nl_load_domain): Deal with EINTR. Include
	<errno.h>.

2000-05-03  Ulrich Drepper  <drepper@redhat.com>
Diffstat (limited to 'intl/loadmsgcat.c')
-rw-r--r--intl/loadmsgcat.c89
1 files changed, 63 insertions, 26 deletions
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
index 75265c84a8..4009525fe8 100644
--- a/intl/loadmsgcat.c
+++ b/intl/loadmsgcat.c
@@ -16,11 +16,19 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
 #include <ctype.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -30,9 +38,6 @@
 #endif
 
 #if defined HAVE_STRING_H || defined _LIBC
-# ifndef _GNU_SOURCE
-#  define _GNU_SOURCE	1
-# endif
 # include <string.h>
 #else
 # include <strings.h>
@@ -138,9 +143,9 @@ _nl_load_domain (domain_file)
     return;
 
   /* We must know about the size of the file.  */
-  if (fstat (fd, &st) != 0
-      || (size = (size_t) st.st_size) != st.st_size
-      || size < sizeof (struct mo_file_header))
+  if (__builtin_expect (fstat (fd, &st) != 0, 0)
+      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+      || __builtin_expect (size < sizeof (struct mo_file_header), 0))
     {
       /* Something went wrong.  */
       close (fd);
@@ -153,7 +158,7 @@ _nl_load_domain (domain_file)
   data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
 					 MAP_PRIVATE, fd, 0);
 
-  if (data != (struct mo_file_header *) -1)
+  if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
     {
       /* mmap() call was successful.  */
       close (fd);
@@ -177,12 +182,15 @@ _nl_load_domain (domain_file)
       do
 	{
 	  long int nb = (long int) read (fd, read_ptr, to_read);
-	  if (nb == -1)
+	  if (nb <= 0)
 	    {
+#ifdef EINTR
+	      if (nb == -1 && errno == EINTR)
+		continue;
+#endif
 	      close (fd);
 	      return;
 	    }
-
 	  read_ptr += nb;
 	  to_read -= nb;
 	}
@@ -193,7 +201,8 @@ _nl_load_domain (domain_file)
 
   /* Using the magic number we can test whether it really is a message
      catalog file.  */
-  if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
+  if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+			0))
     {
       /* The magic number is wrong: not a message catalog file.  */
 #ifdef HAVE_MMAP
@@ -254,14 +263,13 @@ _nl_load_domain (domain_file)
   domain->conv = (iconv_t) -1;
 # endif
 #endif
+  domain->conv_tab = NULL;
   nullentry = _nl_find_msg (domain_file, "", 0);
   if (nullentry != NULL)
     {
+#if defined _LIBC || HAVE_ICONV
       const char *charsetstr;
-      const char *plural;
-      const char *nplurals;
 
-#if defined _LIBC || HAVE_ICONV
       charsetstr = strstr (nullentry, "charset=");
       if (charsetstr != NULL)
 	{
@@ -282,12 +290,33 @@ _nl_load_domain (domain_file)
 
 	  /* The output charset should normally be determined by the
 	     locale.  But sometimes the locale is not used or not correctly
-	     set up so we provide a possibility to override this.  */
-	  outcharset = getenv ("OUTPUT_CHARSET");
-	  if (outcharset == NULL || outcharset[0] == '\0')
-	    outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
+	     set up, so we provide a possibility for the user to override
+	     this.  Moreover, the value specified through
+	     bind_textdomain_codeset overrides both.  */
+	  if (domain_file->domainbinding != NULL
+	      && domain_file->domainbinding->codeset != NULL)
+	    outcharset = domain_file->domainbinding->codeset;
+	  else
+	    {
+	      outcharset = getenv ("OUTPUT_CHARSET");
+	      if (outcharset == NULL || outcharset[0] == '\0')
+		{
+# ifdef _LIBC
+		  outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
+# else
+#  if HAVE_ICONV
+		  extern const char *locale_charset (void);
+		  outcharset = locale_charset ();
+		  if (outcharset == NULL)
+		    outcharset = "";
+#  endif
+# endif
+		}
+	    }
 
 # ifdef _LIBC
+	  outcharset = norm_add_slashes (outcharset);
+	  charset = norm_add_slashes (charset);
 	  if (__gconv_open (outcharset, charset, &domain->conv,
 			    GCONV_AVOID_NOCONV)
 	      != __GCONV_OK)
@@ -299,19 +328,18 @@ _nl_load_domain (domain_file)
 # endif
 	}
 #endif /* _LIBC || HAVE_ICONV */
+    }
+
+  /* Also look for a plural specification.  */
+  if (nullentry != NULL)
+    {
+      const char *plural;
+      const char *nplurals;
 
-      /* Also look for a plural specification.  */
       plural = strstr (nullentry, "plural=");
       nplurals = strstr (nullentry, "nplurals=");
       if (plural == NULL || nplurals == NULL)
-	{
-	  /* By default we are using the Germanic form: singular form only
-	     for `one', the plural form otherwise.  Yes, this is also what
-	     English is using since English is a Germanic language.  */
-	no_plural:
-	  domain->plural = &germanic_plural;
-	  domain->nplurals = 2;
-	}
+	goto no_plural;
       else
 	{
 	  /* First get the number.  */
@@ -336,6 +364,15 @@ _nl_load_domain (domain_file)
 	  domain->plural = args.res;
 	}
     }
+  else
+    {
+      /* By default we are using the Germanic form: singular form only
+         for `one', the plural form otherwise.  Yes, this is also what
+         English is using since English is a Germanic language.  */
+    no_plural:
+      domain->plural = &germanic_plural;
+      domain->nplurals = 2;
+    }
 }