[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r4235 - in /fsf/trunk/libc: ChangeLog intl/dcigettext.c
- To: commits@xxxxxxxxxx
- Subject: [commits] r4235 - in /fsf/trunk/libc: ChangeLog intl/dcigettext.c
- From: eglibc@xxxxxxxxxx
- Date: Sat, 17 Nov 2007 08:03:36 -0000
Author: eglibc
Date: Sat Nov 17 00:03:35 2007
New Revision: 4235
Log:
Import glibc-mainline for 2007-11-17
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/intl/dcigettext.c
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Sat Nov 17 00:03:35 2007
@@ -1,3 +1,13 @@
+2007-11-15 Bruno Haible <bruno@xxxxxxxxx>
+
+ [BZ #5346]
+ * intl/dcigettext.c (struct known_translation_t): Turn msgid into a
+ union.
+ (transcmp): Use the appropriate part of s1->msgid and s2->msgid.
+ (DCIGETTEXT): Change the allocation of the 'search' variable so that
+ it needs only fixed stack space. Delay the initialization of
+ msgid_len until it is needed.
+
2007-11-15 Andreas Jaeger <aj@xxxxxxx>
* sysdeps/ieee754/dbl-64/sincos.tbl: Fix size of union.
Modified: fsf/trunk/libc/intl/dcigettext.c
==============================================================================
--- fsf/trunk/libc/intl/dcigettext.c (original)
+++ fsf/trunk/libc/intl/dcigettext.c Sat Nov 17 00:03:35 2007
@@ -203,7 +203,12 @@
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 @@
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 @@
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 @@
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 @@
__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 @@
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 @@
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;