summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-10-11 07:22:18 +0000
committerRoland McGrath <roland@gnu.org>2002-10-11 07:22:18 +0000
commit679e4c434f755644cc2093c9940ac58d0c2b51cf (patch)
tree9b854f1c5d1bb85bdb6698b6051e77dfd877147e /locale
parent704bb2fd8e613322b308ed53c98b3d0d1bd98526 (diff)
downloadglibc-679e4c434f755644cc2093c9940ac58d0c2b51cf.tar.gz
glibc-679e4c434f755644cc2093c9940ac58d0c2b51cf.tar.xz
glibc-679e4c434f755644cc2093c9940ac58d0c2b51cf.zip
* 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.

2002-10-07  Roland McGrath  <roland@frob.com>

	* config.h.in (HAVE_I386_SET_GDT): New #undef.
	* sysdeps/mach/configure.in: Define it with new check for i386_set_gdt.
	* sysdeps/mach/configure: Regenerated.

2002-10-06  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (INLINE_SYSCALL):
	Add all necessary register outputs for syscall-clobbered registers.

2002-10-02  David Mosberger  <davidm@hpl.hp.com>

	* sysdeps/ia64/bzero.S: Rewritten by Sverre Jarp to tune for
	Itanium 2 (and Itanium).
	Fix unwind directives and make it fit in 80 columns.
	* sysdeps/ia64/memset.S: Ditto.
	* sysdeps/ia64/memcpy.S: Ditto.
	Move jump table to .rodata section.

2002-10-03  Roland McGrath  <roland@frob.com>

	* sysdeps/mach/hurd/i386/init-first.c (_hurd_stack_setup): Add
	clobbers to asm.
Diffstat (limited to 'locale')
-rw-r--r--locale/duplocale.c4
-rw-r--r--locale/freelocale.c4
-rw-r--r--locale/newlocale.c11
3 files changed, 19 insertions, 0 deletions
diff --git a/locale/duplocale.c b/locale/duplocale.c
index 2fa29d14d6..77dfc01046 100644
--- a/locale/duplocale.c
+++ b/locale/duplocale.c
@@ -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;
diff --git a/locale/freelocale.c b/locale/freelocale.c
index ba0ae85d84..ec169bcb66 100644
--- a/locale/freelocale.c
+++ b/locale/freelocale.c
@@ -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);
 
diff --git a/locale/newlocale.c b/locale/newlocale.c
index 3b8676ceeb..1131f62c0b 100644
--- a/locale/newlocale.c
+++ b/locale/newlocale.c
@@ -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;