(add_to_readlist): Take locale pointer as extra parameter from which
[kopensolaris-gnu/glibc.git] / locale / programs / localedef.c
index 86b8bff..d0eb711 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1995,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
 
@@ -135,9 +135,6 @@ main (int argc, char *argv[])
   struct localedef_t global;
   int remaining;
 
-  /* Enable `malloc' debugging.  */
-  mcheck (NULL);
-
   /* Set initial values for global variables.  */
   copy_list = NULL;
   posix_conformance = getenv ("POSIXLY_CORRECT") != NULL;
@@ -299,7 +296,7 @@ print_version (FILE *stream, struct argp_state *state)
 Copyright (C) %s Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "1999");
+"), "2000");
   fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
 }
 
@@ -367,7 +364,7 @@ construct_output_path (char *path)
         memory allocation.  */
       size_t len = strlen (path) + 1;
       result = xmalloc (len + 1);
-      endp = mempcpy (result, path, len);
+      endp = mempcpy (result, path, len) - 1;
     }
 
   errno = 0;
@@ -434,7 +431,7 @@ normalize_codeset (codeset, name_len)
 
 struct localedef_t *
 add_to_readlist (int locale, const char *name, const char *repertoire_name,
-                int generate)
+                int generate, struct localedef_t *copy_locale)
 {
   struct localedef_t *runp = locales;
 
@@ -466,6 +463,16 @@ add_to_readlist (int locale, const char *name, const char *repertoire_name,
   if (generate && (runp->needed & (1 << locale)) != 0)
     error (5, 0, _("circular dependencies between locale definitions"));
 
+  if (copy_locale != NULL)
+    {
+      if (runp->categories[locale].generic != NULL)
+       error (5, 0, _("cannot add already read locale `%s' a second time"),
+              name);
+      else
+       runp->categories[locale].generic =
+         copy_locale->categories[locale].generic;
+    }
+
   runp->needed |= 1 << locale;
 
   return runp;
@@ -479,7 +486,7 @@ find_locale (int locale, const char *name, const char *repertoire_name,
   struct localedef_t *result;
 
   /* Find the locale, but do not generate it since this would be a bug.  */
-  result = add_to_readlist (locale, name, repertoire_name, 0);
+  result = add_to_readlist (locale, name, repertoire_name, 0, NULL);
 
   assert (result != NULL);
 
@@ -494,12 +501,12 @@ find_locale (int locale, const char *name, const char *repertoire_name,
 
 struct localedef_t *
 load_locale (int locale, const char *name, const char *repertoire_name,
-            struct charmap_t *charmap)
+            struct charmap_t *charmap, struct localedef_t *copy_locale)
 {
   struct localedef_t *result;
 
   /* Generate the locale if it does not exist.  */
-  result = add_to_readlist (locale, name, repertoire_name, 1);
+  result = add_to_readlist (locale, name, repertoire_name, 1, copy_locale);
 
   assert (result != NULL);
 
@@ -510,3 +517,14 @@ load_locale (int locale, const char *name, const char *repertoire_name,
 
   return result;
 }
+
+static void
+turn_on_mcheck (void)
+{
+  /* Enable `malloc' debugging.  */
+  mcheck (NULL);
+  /* Use the following line for a more thorough but much slower testing.  */
+  /* mcheck_pedantic (NULL); */
+}
+
+void (*__malloc_initialize_hook) (void) = turn_on_mcheck;