(struct known_translation_t): Turn msgid into a union. (transcmp): Use the appropriat...
authorUlrich Drepper <drepper@redhat.com>
Sat, 17 Nov 2007 07:37:30 +0000 (07:37 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 17 Nov 2007 07:37:30 +0000 (07:37 +0000)
intl/dcigettext.c

index a2cd801..7004cd4 100644 (file)
@@ -203,7 +203,12 @@ struct known_translation_t
   size_t translation_length;
 
   /* Pointer to the string in question.  */
-  char msgid[ZERO];
+  union
+    {
+      char appended[ZERO];  /* used if domain != NULL */
+      const char *ptr;      /* used if domain == NULL */
+    }
+  msgid;
 };
 
 /* Root of the search tree with known translations.  We can use this
@@ -231,7 +236,8 @@ transcmp (p1, p2)
   s1 = (const struct known_translation_t *) p1;
   s2 = (const struct known_translation_t *) p2;
 
-  result = strcmp (s1->msgid, s2->msgid);
+  result = strcmp (s1->domain != NULL ? s1->msgid.appended : s1->msgid.ptr,
+                  s2->domain != NULL ? s2->msgid.appended : s2->msgid.ptr);
   if (result == 0)
     {
       result = strcmp (s1->domainname, s2->domainname);
@@ -422,9 +428,8 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
   size_t retlen;
   int saved_errno;
 #if defined HAVE_TSEARCH || defined _LIBC
-  struct known_translation_t *search;
+  struct known_translation_t search;
   struct known_translation_t **foundp = NULL;
-  size_t msgid_len;
 # ifdef HAVE_PER_THREAD_LOCALE
   const char *localename;
 # endif
@@ -453,20 +458,17 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
     domainname = _nl_current_default_domain;
 
 #if defined HAVE_TSEARCH || defined _LIBC
-  msgid_len = strlen (msgid1) + 1;
-
   /* Try to find the translation among those which we found at
      some time.  */
-  search = (struct known_translation_t *)
-          alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
-  memcpy (search->msgid, msgid1, msgid_len);
-  search->domainname = domainname;
-  search->category = category;
+  search.domain = NULL;
+  search.msgid.ptr = msgid1;
+  search.domainname = domainname;
+  search.category = category;
 # ifdef HAVE_PER_THREAD_LOCALE
 #  ifdef _LIBC
   localename = __current_locale_name (category);
 #  endif
-  search->localename = localename;
+  search.localename = localename;
 # endif
 
   /* Since tfind/tsearch manage a balanced tree, concurrent tfind and
@@ -474,11 +476,10 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
   __libc_rwlock_define_initialized (static, tree_lock);
   __libc_rwlock_rdlock (tree_lock);
 
-  foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+  foundp = (struct known_translation_t **) tfind (&search, &root, transcmp);
 
   __libc_rwlock_unlock (tree_lock);
 
-  freea (search);
   if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
     {
       /* Now deal with plural.  */
@@ -662,9 +663,11 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
              if (foundp == NULL)
                {
                  /* Create a new entry and add it to the search tree.  */
+                 size_t msgid_len;
                  size_t size;
                  struct known_translation_t *newp;
 
+                 msgid_len = strlen (msgid1) + 1;
                  size = offsetof (struct known_translation_t, msgid)
                         + msgid_len + domainname_len + 1;
 # ifdef HAVE_PER_THREAD_LOCALE
@@ -678,7 +681,8 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
                      char *new_localename;
 # endif
 
-                     new_domainname = mempcpy (newp->msgid, msgid1, msgid_len);
+                     new_domainname =
+                       mempcpy (newp->msgid.appended, msgid1, msgid_len);
                      memcpy (new_domainname, domainname, domainname_len + 1);
 # ifdef HAVE_PER_THREAD_LOCALE
                      new_localename = new_domainname + domainname_len + 1;