2002-10-08 Roland McGrath <roland@redhat.com>
authorroland <roland>
Fri, 11 Oct 2002 07:21:16 +0000 (07:21 +0000)
committerroland <roland>
Fri, 11 Oct 2002 07:21:16 +0000 (07:21 +0000)
* locale/newlocale.c (__newlocale): If setting all categories to "C",
just return &_nl_C_locobj instead of copying it.
* locale/freelocale.c (__freelocale): Check for &_nl_C_locobj.
* locale/duplocale.c (__duplocale): Likewise.

locale/duplocale.c
locale/freelocale.c
locale/newlocale.c

index 2fa29d1..77dfc01 100644 (file)
@@ -33,6 +33,10 @@ __libc_lock_define (extern , __libc_setlocale_lock attribute_hidden)
 __locale_t
 __duplocale (__locale_t dataset)
 {
+  /* This static object is returned for newlocale (LC_ALL_MASK, "C").  */
+  if (dataset == &_nl_C_locobj)
+    return dataset;
+
   __locale_t result;
   int cnt;
   size_t names_len = 0;
index ba0ae85..ec169bc 100644 (file)
@@ -34,6 +34,10 @@ __freelocale (__locale_t dataset)
 {
   int cnt;
 
+  /* This static object is returned for newlocale (LC_ALL_MASK, "C").  */
+  if (dataset == &_nl_C_locobj)
+    return;
+
   /* We modify global data (the usage counts).  */
   __libc_lock_lock (__libc_setlocale_lock);
 
index 3b8676c..1131f62 100644 (file)
@@ -60,6 +60,17 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
   if (locale == NULL)
     ERROR_RETURN;
 
+  if (base == &_nl_C_locobj)
+    /* We're to modify BASE, returned for a previous call with "C".
+       We can't really modify the read-only structure, so instead
+       start over by copying it.  */
+    base = NULL;
+
+  if ((base == NULL || category_mask == (1 << __LC_LAST) - 1 - (1 << LC_ALL))
+      && (category_mask == 0 || !strcmp (locale, "C")))
+    /* Asking for the "C" locale needn't allocate a new object.  */
+    return &_nl_C_locobj;
+
   /* Allocate memory for the result.  */
   if (base != NULL)
     result = *base;