about summary refs log tree commit diff
path: root/intl/dcigettext.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/dcigettext.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/dcigettext.c')
-rw-r--r--intl/dcigettext.c103
1 files changed, 55 insertions, 48 deletions
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
index 4f27cbb3d8..92732582f9 100644
--- a/intl/dcigettext.c
+++ b/intl/dcigettext.c
@@ -230,7 +230,7 @@ transcmp (const void *p1, const void *p2)
   result = strcmp (s1->msgid, s2->msgid);
   if (result == 0)
     {
-      result = strcmp (s1->msgid, s2->msgid);
+      result = strcmp (s1->domain, s2->domain);
       if (result == 0)
 	{
 	  result = s1->plindex - s2->plindex;
@@ -362,7 +362,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
 #if defined HAVE_TSEARCH || defined _LIBC
   struct known_translation_t *search;
   struct known_translation_t **foundp = NULL;
-  size_t msgid_len = strlen (msgid1) + 1;
+  size_t msgid_len;
 #endif
   size_t domainname_len;
 
@@ -372,7 +372,15 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
 
   __libc_rwlock_rdlock (_nl_state_lock);
 
+  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
+     CATEGORY is not LC_MESSAGES this might not make much sense but the
+     definition left this undefined.  */
+  if (domainname == NULL)
+    domainname = _nl_current_default_domain;
+
 #if defined HAVE_TSEARCH || defined _LIBC
+  msgid_len = strlen (msgid1) + 1;
+
   if (plural == 0)
     {
       /* Try to find the translation among those which we found at
@@ -399,12 +407,6 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
   /* See whether this is a SUID binary or not.  */
   DETERMINE_SECURE;
 
-  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
-     CATEGORY is not LC_MESSAGES this might not make much sense but the
-     definition left this undefined.  */
-  if (domainname == NULL)
-    domainname = _nl_current_default_domain;
-
   /* First find matching binding.  */
   for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
     {
@@ -529,7 +531,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
 
       /* Find structure describing the message catalog matching the
 	 DOMAINNAME and CATEGORY.  */
-      domain = _nl_find_domain (dirname, single_locale, xdomainname);
+      domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
 
       if (domain != NULL)
 	{
@@ -605,7 +607,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
 		      /* Insert the entry in the search tree.  */
 		      foundp = (struct known_translation_t **)
 			tsearch (newp, &root, transcmp);
-		      if (&newp != foundp)
+		      if (__builtin_expect (&newp != foundp, 0))
 			/* The insert failed.  */
 			free (newp);
 		    }
@@ -751,7 +753,7 @@ _nl_find_msg (domain_file, msgid, index)
 	/* Mark that we didn't succeed allocating a table.  */
 	domain->conv_tab = (char **) -1;
 
-      if (domain->conv_tab == (char **) -1)
+      if (__builtin_expect (domain->conv_tab == (char **) -1, 0))
 	/* Nothing we can do, no more memory.  */
 	goto converted;
 
@@ -787,59 +789,61 @@ _nl_find_msg (domain_file, msgid, index)
 
 	  __libc_lock_lock (lock);
 
+	  while (1)
+	    {
 # ifdef _LIBC
-	  {
-	    size_t written;
-	    int res;
-
-	    while ((res = __gconv (domain->conv,
-				   &inbuf, inbuf + resultlen,
-				   &outbuf, outbuf + freemem_size,
-				   &written)) == __GCONV_OK)
-	      {
-		if (res != __GCONV_FULL_OUTPUT)
-		  goto out;
-
-		/* We must resize the buffer.  */
-		freemem_size = MAX (2 * freemem_size, 4064);
-		freemem = (char *) malloc (freemem_size);
-		if (freemem == NULL)
-		  goto out;
-
-		inbuf = result;
-		outbuf = freemem + 4;
-	      }
-	  }
+	      size_t non_reversible;
+	      int res;
+
+	      res = __gconv (domain->conv,
+			     &inbuf, inbuf + resultlen,
+			     &outbuf, outbuf + freemem_size,
+			     &non_reversible);
+
+	      if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+		break;
+
+	      if (res != __GCONV_FULL_OUTPUT)
+		{
+		  __libc_lock_unlock (lock);
+		  goto converted;
+		}
+
+	      inbuf = result;
 # else
 #  if HAVE_ICONV
-	  for (;;)
-	    {
 	      const char *inptr = (const char *) inbuf;
 	      size_t inleft = resultlen;
 	      char *outptr = (char *) outbuf;
 	      size_t outleft = freemem_size;
 
 	      if (iconv (domain->conv, &inptr, &inleft, &outptr, &outleft)
-		  != (size_t)(-1))
+		  != (size_t) (-1))
 		{
 		  outbuf = (unsigned char *) outptr;
 		  break;
 		}
 	      if (errno != E2BIG)
-		goto out;
+		{
+		  __libc_lock_unlock (lock);
+		  goto converted;
+		}
+#  endif
+# endif
 
 	      /* We must resize the buffer.  */
 	      freemem_size = 2 * freemem_size;
 	      if (freemem_size < 4064)
 		freemem_size = 4064;
 	      freemem = (char *) malloc (freemem_size);
-	      if (freemem == NULL)
-		goto out;
+	      if (__builtin_expect (freemem == NULL, 0))
+		{
+		  __libc_lock_unlock (lock);
+		  goto converted;
+		}
 
 	      outbuf = freemem + 4;
 	    }
-#  endif
-# endif
 
 	  /* We have now in our buffer a converted string.  Put this
 	     into the table of conversions.  */
@@ -848,10 +852,9 @@ _nl_find_msg (domain_file, msgid, index)
 	  /* Shrink freemem, but keep it aligned.  */
 	  freemem_size -= outbuf - freemem;
 	  freemem = outbuf;
-	  freemem += freemem_size & 3;
-	  freemem_size = freemem_size & ~3;
+	  freemem += freemem_size & (__alignof__ (nls_uint32) - 1);
+	  freemem_size = freemem_size & ~ (__alignof__ (nls_uint32) - 1);
 
-	out:
 	  __libc_lock_unlock (lock);
 	}
 
@@ -1070,15 +1073,19 @@ free_mem (void)
   struct binding *runp;
 
   for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
-    if (runp->dirname != _nl_default_dirname)
-      /* Yes, this is a pointer comparison.  */
-      free (runp->dirname);
+    {
+      if (runp->dirname != _nl_default_dirname)
+	/* Yes, this is a pointer comparison.  */
+	free (runp->dirname);
+      if (runp->codeset != NULL)
+	free (runp->codeset);
+    }
 
   if (_nl_current_default_domain != _nl_default_default_domain)
     /* Yes, again a pointer comparison.  */
     free ((char *) _nl_current_default_domain);
 
-  /* Remove the search tree with the know translations.  */
+  /* Remove the search tree with the known translations.  */
   __tdestroy (root, free);
 }