about summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
Diffstat (limited to 'locale')
-rw-r--r--locale/programs/charmap-dir.c10
-rw-r--r--locale/programs/charmap.c26
-rw-r--r--locale/programs/ld-address.c87
-rw-r--r--locale/programs/ld-collate.c56
-rw-r--r--locale/programs/ld-ctype.c230
-rw-r--r--locale/programs/ld-identification.c16
-rw-r--r--locale/programs/ld-measurement.c15
-rw-r--r--locale/programs/ld-messages.c30
-rw-r--r--locale/programs/ld-monetary.c44
-rw-r--r--locale/programs/ld-name.c21
-rw-r--r--locale/programs/ld-numeric.c19
-rw-r--r--locale/programs/ld-paper.c12
-rw-r--r--locale/programs/ld-telephone.c27
-rw-r--r--locale/programs/ld-time.c101
-rw-r--r--locale/programs/linereader.c10
-rw-r--r--locale/programs/linereader.h4
-rw-r--r--locale/programs/localedef.c35
-rw-r--r--locale/programs/localedef.h14
-rw-r--r--locale/programs/locfile.c16
-rw-r--r--locale/programs/repertoire.c12
20 files changed, 420 insertions, 365 deletions
diff --git a/locale/programs/charmap-dir.c b/locale/programs/charmap-dir.c
index 14cf765632..a7a453552b 100644
--- a/locale/programs/charmap-dir.c
+++ b/locale/programs/charmap-dir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -28,11 +28,9 @@
 #include <unistd.h>
 #include <sys/stat.h>
 
+#include "localedef.h"
 #include "charmap-dir.h"
 
-extern void *xmalloc (size_t n);
-extern void *xrealloc (void *p, size_t n);
-
 /* The data type of a charmap directory being traversed.  */
 struct charmap_dir
 {
@@ -58,8 +56,8 @@ charmap_opendir (const char *directory)
   dir = opendir (directory);
   if (dir == NULL)
     {
-      error (1, errno, gettext ("cannot read character map directory `%s'"),
-             directory);
+      WITH_CUR_LOCALE (error (1, errno, gettext ("\
+cannot read character map directory `%s'"), directory));
       return NULL;
     }
 
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 815a28d419..ee755ba50a 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -29,8 +29,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <error.h>
 
-#include "error.h"
+#include "localedef.h"
 #include "linereader.h"
 #include "charmap.h"
 #include "charmap-dir.h"
@@ -43,8 +44,6 @@
 #include "charmap-kw.h"
 
 
-extern void *xmalloc (size_t __n);
-
 /* Prototypes for local functions.  */
 static struct charmap_t *parse_charmap (struct linereader *cmfile,
 					int verbose, int be_quiet);
@@ -133,7 +132,8 @@ charmap_read (const char *filename, int verbose, int be_quiet, int use_default)
 	  result = parse_charmap (cmfile, verbose, be_quiet);
 
 	  if (result == NULL && !be_quiet)
-	    error (0, errno, _("character map file `%s' not found"), filename);
+	    WITH_CUR_LOCALE (error (0, errno, _("\
+character map file `%s' not found"), filename));
 	}
     }
 
@@ -190,8 +190,8 @@ charmap_read (const char *filename, int verbose, int be_quiet, int use_default)
 	result = parse_charmap (cmfile, verbose, be_quiet);
 
       if (result == NULL)
-	error (4, errno, _("default character map file `%s' not found"),
-	       DEFAULT_CHARMAP);
+	WITH_CUR_LOCALE (error (4, errno, _("\
+default character map file `%s' not found"), DEFAULT_CHARMAP));
     }
 
   /* Test of ASCII compatibility of locale encoding.
@@ -247,9 +247,9 @@ charmap_read (const char *filename, int verbose, int be_quiet, int use_default)
       while (*p++ != '\0');
 
       if (failed)
-	fprintf (stderr, _("\
+	WITH_CUR_LOCALE (fprintf (stderr, _("\
 character map `%s' is not ASCII compatible, locale not ISO C compliant\n"),
-		 result->code_set_name);
+				  result->code_set_name));
     }
 
   return result;
@@ -324,9 +324,9 @@ parse_charmap (struct linereader *cmfile, int verbose, int be_quiet)
 	      if (result->mb_cur_min > result->mb_cur_max)
 		{
 		  if (!be_quiet)
-		    error (0, 0, _("\
+		    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: <mb_cur_max> must be greater than <mb_cur_min>\n"),
-			   cmfile->fname);
+					    cmfile->fname));
 
 		  result->mb_cur_min = result->mb_cur_max;
 		}
@@ -829,14 +829,16 @@ only WIDTH definitions are allowed to follow the CHARMAP definition"));
 	  continue;
 
 	default:
-	  error (5, 0, _("%s: error in state machine"), __FILE__);
+	  WITH_CUR_LOCALE (error (5, 0, _("%s: error in state machine"),
+				  __FILE__));
 	  /* NOTREACHED */
 	}
       break;
     }
 
   if (state != 91 && !be_quiet)
-    error (0, 0, _("%s: premature end of file"), cmfile->fname);
+    WITH_CUR_LOCALE (error (0, 0, _("%s: premature end of file"),
+			    cmfile->fname));
 
   lr_close (cmfile);
 
diff --git a/locale/programs/ld-address.c b/locale/programs/ld-address.c
index adf6bbeb28..52b91cfc28 100644
--- a/locale/programs/ld-address.c
+++ b/locale/programs/ld-address.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -29,6 +29,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -128,8 +129,8 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (address == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_ADDRESS");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_ADDRESS"));
 	  address_startup (NULL, locale, 0);
 	  address = locale->categories[LC_ADDRESS].address;
 	  nothing = 1;
@@ -139,8 +140,8 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (address->postal_fmt == NULL)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_ADDRESS", "postal_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "postal_fmt"));
       /* Use as the default value the value of the i18n locale.  */
       address->postal_fmt = "%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N";
     }
@@ -151,8 +152,8 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       const char *cp = address->postal_fmt;
 
       if (*cp == '\0')
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_ADDRESS", "postal_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_ADDRESS", "postal_fmt"));
       else
 	while (*cp != '\0')
 	  {
@@ -163,9 +164,9 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		  ++cp;
 		if (strchr ("afdbshNtreCzTSc%", *cp) == NULL)
 		  {
-		    error (0, 0, _("\
+		    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: invalid escape `%%%c' sequence in field `%s'"),
-			   "LC_ADDRESS", *cp, "postal_fmt");
+					    "LC_ADDRESS", *cp, "postal_fmt"));
 		    break;
 		  }
 	      }
@@ -177,7 +178,8 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (address->cat == NULL)						      \
     {									      \
       if (verbose && ! nothing)						      \
-	error (0, 0, _("%s: field `%s' not defined"), "LC_ADDRESS", #cat);    \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_ADDRESS", #cat));  	    		      \
       address->cat = "";						      \
     }
 
@@ -194,16 +196,16 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (address->lang_term == NULL)
     {
       if (verbose && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"), "LC_ADDRESS",
-	       "lang_term");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "lang_term"));
       address->lang_term = "";
       cnt = sizeof (iso639) / sizeof (iso639[0]);
     }
   else if (address->lang_term[0] == '\0')
     {
       if (verbose)
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_ADDRESS", "lang_term");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_ADDRESS", "lang_term"));
       cnt = sizeof (iso639) / sizeof (iso639[0]);
     }
   else
@@ -213,22 +215,23 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	if (strcmp (address->lang_term, iso639[cnt].term) == 0)
 	  break;
       if (cnt == sizeof (iso639) / sizeof (iso639[0]))
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: terminology language code `%s' not defined"),
-	       "LC_ADDRESS", address->lang_term);
+				"LC_ADDRESS", address->lang_term));
     }
 
   if (address->lang_ab == NULL)
     {
       if (verbose && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"), "LC_ADDRESS", "lang_ab");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "lang_ab"));
       address->lang_ab = "";
     }
   else if (address->lang_ab[0] == '\0')
     {
       if (verbose)
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_ADDRESS", "lang_ab");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_ADDRESS", "lang_ab"));
     }
   else
     {
@@ -239,15 +242,15 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	    if (strcmp (address->lang_ab, iso639[cnt].ab) == 0)
 	      break;
 	  if (cnt == sizeof (iso639) / sizeof (iso639[0]))
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: language abbreviation `%s' not defined"),
-		   "LC_ADDRESS", address->lang_ab);
+				    "LC_ADDRESS", address->lang_ab));
 	}
       else
 	if (strcmp (iso639[cnt].ab, address->lang_ab) != 0)
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: `%s' value does not match `%s' value"),
-		 "LC_ADDRESS", "lang_ab", "lang_term");
+				  "LC_ADDRESS", "lang_ab", "lang_term"));
     }
 
   if (address->lang_lib == NULL)
@@ -256,8 +259,8 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   else if (address->lang_lib[0] == '\0')
     {
       if (verbose)
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_ADDRESS", "lang_lib");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_ADDRESS", "lang_lib"));
     }
   else
     {
@@ -267,22 +270,22 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	    if (strcmp (address->lang_lib, iso639[cnt].lib) == 0)
 	      break;
 	  if (cnt == sizeof (iso639) / sizeof (iso639[0]))
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: language abbreviation `%s' not defined"),
-		   "LC_ADDRESS", address->lang_lib);
+				    "LC_ADDRESS", address->lang_lib));
 	}
       else
 	if (strcmp (iso639[cnt].ab, address->lang_ab) != 0)
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: `%s' value does not match `%s' value"), "LC_ADDRESS", "lang_lib",
-		 helper == 1 ? "lang_term" : "lang_ab");
+				  helper == 1 ? "lang_term" : "lang_ab"));
     }
 
   if (address->country_num == 0)
     {
       if (verbose && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_ADDRESS", "country_num");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "country_num"));
       cnt = sizeof (iso3166) / sizeof (iso3166[0]);
     }
   else
@@ -292,34 +295,36 @@ address_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  break;
 
       if (cnt == sizeof (iso3166) / sizeof (iso3166[0]))
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: numeric country code `%d' not valid"),
-	       "LC_ADDRESS", address->country_num);
+				"LC_ADDRESS", address->country_num));
     }
 
   if (address->country_ab2 == NULL)
     {
       if (verbose && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_ADDRESS", "country_ab2");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "country_ab2"));
       address->country_ab2 = "  ";
     }
   else if (cnt != sizeof (iso3166) / sizeof (iso3166[0])
 	   && strcmp (address->country_ab2, iso3166[cnt].ab2) != 0)
-    error (0, 0, _("%s: `%s' value does not match `%s' value"),
-	   "LC_ADDRESS", "country_ab2", "country_num");
+    WITH_CUR_LOCALE (error (0, 0,
+			    _("%s: `%s' value does not match `%s' value"),
+			    "LC_ADDRESS", "country_ab2", "country_num"));
 
   if (address->country_ab3 == NULL)
     {
       if (verbose && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_ADDRESS", "country_ab3");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_ADDRESS", "country_ab3"));
       address->country_ab3 = "   ";
     }
   else if (cnt != sizeof (iso3166) / sizeof (iso3166[0])
 	   && strcmp (address->country_ab3, iso3166[cnt].ab3) != 0)
-    error (0, 0, _("%s: `%s' value does not match `%s' value"),
-	   "LC_ADDRESS", "country_ab3", "country_num");
+    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: `%s' value does not match `%s' value"),
+			    "LC_ADDRESS", "country_ab3", "country_num"));
 }
 
 
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index 0da1261bd8..b9ea186d31 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -27,11 +27,11 @@
 #include <wchar.h>
 #include <sys/param.h>
 
+#include "localedef.h"
 #include "charmap.h"
 #include "localeinfo.h"
 #include "linereader.h"
 #include "locfile.h"
-#include "localedef.h"
 #include "elem-hash.h"
 
 /* Uncomment the following line in the production version.  */
@@ -1516,7 +1516,8 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
     {
       /* No data, no check.  */
       if (! be_quiet)
-	error (0, 0, _("No definition for %s category found"), "LC_COLLATE");
+	WITH_CUR_LOCALE (error (0, 0, _("No definition for %s category found"),
+				"LC_COLLATE"));
       return;
     }
 
@@ -1531,9 +1532,9 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  && ((sect->rules[i] & sort_position)
 	      != (collate->sections->rules[i] & sort_position)))
 	{
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: `position' must be used for a specific level in all sections or none"),
-		 "LC_COLLATE");
+				  "LC_COLLATE"));
 	  break;
 	}
 
@@ -1554,9 +1555,10 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		  {
 		    if (runp->weights[i].w[j]->weights == NULL)
 		      {
-			error_at_line (0, 0, runp->file, runp->line,
-				       _("symbol `%s' not defined"),
-				       runp->weights[i].w[j]->name);
+			WITH_CUR_LOCALE (error_at_line (0, 0, runp->file,
+							runp->line,
+							_("symbol `%s' not defined"),
+							runp->weights[i].w[j]->name));
 
 			need_undefined = 1;
 			runp->weights[i].w[j] = &collate->undefined;
@@ -1629,11 +1631,14 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		      /* This should not happen.  It means that we have
 			 to symbols with the same byte sequence.  It is
 			 of course an error.  */
-		      error_at_line (0, 0, (*eptr)->file, (*eptr)->line,
-				     _("symbol `%s' has the same encoding as"),
-				     (*eptr)->name);
-		      error_at_line (0, 0, runp->file, runp->line,
-				     _("symbol `%s'"), runp->name);
+		      WITH_CUR_LOCALE (error_at_line (0, 0, (*eptr)->file,
+						      (*eptr)->line,
+						      _("\
+symbol `%s' has the same encoding as"), (*eptr)->name);
+				       error_at_line (0, 0, runp->file,
+						      runp->line,
+						      _("symbol `%s'"),
+						      runp->name));
 		      goto dont_insert;
 		    }
 		  else if (c < 0)
@@ -1732,11 +1737,14 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		      /* This should not happen.  It means that we have
 			 two symbols with the same byte sequence.  It is
 			 of course an error.  */
-		      error_at_line (0, 0, (*eptr)->file, (*eptr)->line,
-				     _("symbol `%s' has the same encoding as"),
-				     (*eptr)->name);
-		      error_at_line (0, 0, runp->file, runp->line,
-				     _("symbol `%s'"), runp->name);
+		      WITH_CUR_LOCALE (error_at_line (0, 0, (*eptr)->file,
+						      (*eptr)->line,
+						      _("\
+symbol `%s' has the same encoding as"), (*eptr)->name);
+				       error_at_line (0, 0, runp->file,
+						      runp->line,
+						      _("symbol `%s'"),
+						      runp->name));
 		      goto dont_insertwc;
 		    }
 		  else if (c < 0)
@@ -1777,7 +1785,7 @@ collate_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  /* This seems not to be enforced by recent standards.  Don't
 	     emit an error, simply append UNDEFINED at the end.  */
 	  if (0)
-	    error (0, 0, _("no definition of `UNDEFINED'"));
+	    WITH_CUR_LOCALE (error (0, 0, _("no definition of `UNDEFINED'")));
 
 	  /* Add UNDEFINED at the end.  */
 	  collate->undefined.mborder =
@@ -3389,8 +3397,8 @@ error while adding equivalent collating symbol"));
 	    }
 	  else if (state == 3)
 	    {
-	      error (0, 0, _("%s: missing `reorder-end' keyword"),
-		     "LC_COLLATE");
+	      WITH_CUR_LOCALE (error (0, 0, _("\
+%s: missing `reorder-end' keyword"), "LC_COLLATE"));
 	      state = 4;
 	    }
 	  else if (state != 2 && state != 4)
@@ -3739,11 +3747,11 @@ error while adding equivalent collating symbol"));
 		    }
 		}
 	      else if (state == 3)
-		error (0, 0, _("%s: missing `reorder-end' keyword"),
-		       "LC_COLLATE");
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: missing `reorder-end' keyword"), "LC_COLLATE"));
 	      else if (state == 5)
-		error (0, 0, _("%s: missing `reorder-sections-end' keyword"),
-		       "LC_COLLATE");
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: missing `reorder-sections-end' keyword"), "LC_COLLATE"));
 	    }
 	  arg = lr_token (ldfile, charmap, result, NULL, verbose);
 	  if (arg->tok == tok_eof)
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index c1a92d861d..1026133dc2 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -33,13 +33,13 @@
 #include <wctype.h>
 #include <sys/uio.h>
 
+#include "localedef.h"
 #include "charmap.h"
 #include "localeinfo.h"
 #include "langinfo.h"
 #include "linereader.h"
 #include "locfile-token.h"
 #include "locfile.h"
-#include "localedef.h"
 
 #include <assert.h>
 
@@ -413,7 +413,8 @@ ctype_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (ctype == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"), "LC_CTYPE");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_CTYPE"));
 	  ctype_startup (NULL, locale, charmap, NULL, 0);
 	  ctype = locale->categories[LC_CTYPE].ctype;
 	}
@@ -431,7 +432,8 @@ ctype_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (ctype->codeset_name == NULL)
     {
       if (! be_quiet)
-	error (0, 0, _("No character set name specified in charmap"));
+	WITH_CUR_LOCALE (error (0, 0, _("\
+No character set name specified in charmap")));
       ctype->codeset_name = "//UNKNOWN//";
     }
 
@@ -459,11 +461,12 @@ ctype_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 			    uint32_t value = ctype->charnames[cnt];
 
 			    if (!be_quiet)
-			      error (0, 0, _("\
+			      WITH_CUR_LOCALE (error (0, 0, _("\
 character L'\\u%0*x' in class `%s' must be in class `%s'"),
-				     value > 0xffff ? 8 : 4, value,
-				     valid_table[cls1].name,
-				     valid_table[cls2].name);
+						      value > 0xffff ? 8 : 4,
+						      value,
+						      valid_table[cls1].name,
+						      valid_table[cls2].name));
 			  }
 			break;
 
@@ -473,11 +476,12 @@ character L'\\u%0*x' in class `%s' must be in class `%s'"),
 			    uint32_t value = ctype->charnames[cnt];
 
 			    if (!be_quiet)
-			      error (0, 0, _("\
+			      WITH_CUR_LOCALE (error (0, 0, _("\
 character L'\\u%0*x' in class `%s' must not be in class `%s'"),
-				     value > 0xffff ? 8 : 4, value,
-				     valid_table[cls1].name,
-				     valid_table[cls2].name);
+						      value > 0xffff ? 8 : 4,
+						      value,
+						      valid_table[cls1].name,
+						      valid_table[cls2].name));
 			  }
 			break;
 
@@ -486,8 +490,8 @@ character L'\\u%0*x' in class `%s' must not be in class `%s'"),
 			break;
 
 		      default:
-			error (5, 0, _("internal error in %s, line %u"),
-			       __FUNCTION__, __LINE__);
+			WITH_CUR_LOCALE (error (5, 0, _("\
+internal error in %s, line %u"), __FUNCTION__, __LINE__));
 		      }
 		  }
 	}
@@ -515,10 +519,11 @@ character L'\\u%0*x' in class `%s' must not be in class `%s'"),
 			    snprintf (buf, sizeof buf, "\\%Zo", cnt);
 
 			    if (!be_quiet)
-			      error (0, 0, _("\
+			      WITH_CUR_LOCALE (error (0, 0, _("\
 character '%s' in class `%s' must be in class `%s'"),
-				     buf, valid_table[cls1].name,
-				     valid_table[cls2].name);
+						      buf,
+						      valid_table[cls1].name,
+						      valid_table[cls2].name));
 			  }
 			break;
 
@@ -530,10 +535,11 @@ character '%s' in class `%s' must be in class `%s'"),
 			    snprintf (buf, sizeof buf, "\\%Zo", cnt);
 
 			    if (!be_quiet)
-			      error (0, 0, _("\
+			      WITH_CUR_LOCALE (error (0, 0, _("\
 character '%s' in class `%s' must not be in class `%s'"),
-				     buf, valid_table[cls1].name,
-				     valid_table[cls2].name);
+						      buf,
+						      valid_table[cls1].name,
+						      valid_table[cls2].name));
 			  }
 			break;
 
@@ -542,8 +548,8 @@ character '%s' in class `%s' must not be in class `%s'"),
 			break;
 
 		      default:
-			error (5, 0, _("internal error in %s, line %u"),
-			       __FUNCTION__, __LINE__);
+			WITH_CUR_LOCALE (error (5, 0, _("\
+internal error in %s, line %u"), __FUNCTION__, __LINE__));
 		      }
 		  }
 	}
@@ -559,8 +565,8 @@ character '%s' in class `%s' must not be in class `%s'"),
 	    & BITw (tok_blank)) == 0)))
     {
       if (!be_quiet)
-	error (0, 0, _("<SP> character not in class `%s'"),
-	       valid_table[cnt].name);
+	WITH_CUR_LOCALE (error (0, 0, _("<SP> character not in class `%s'"),
+				valid_table[cnt].name));
     }
   else if (((cnt = BITPOS (tok_punct),
 	     (ELEM (ctype, class_collection, , space_value)
@@ -571,8 +577,9 @@ character '%s' in class `%s' must not be in class `%s'"),
 		!= 0)))
     {
       if (!be_quiet)
-	error (0, 0, _("<SP> character must not be in class `%s'"),
-	       valid_table[cnt].name);
+	WITH_CUR_LOCALE (error (0, 0, _("\
+<SP> character must not be in class `%s'"),
+				valid_table[cnt].name));
     }
   else
     ELEM (ctype, class_collection, , space_value) |= BITw (tok_print);
@@ -585,7 +592,8 @@ character '%s' in class `%s' must not be in class `%s'"),
   if (space_seq == NULL || space_seq->nbytes != 1)
     {
       if (!be_quiet)
-	error (0, 0, _("character <SP> not defined in character map"));
+	WITH_CUR_LOCALE (error (0, 0, _("\
+character <SP> not defined in character map")));
     }
   else if (((cnt = BITPOS (tok_space),
 	     (ctype->class256_collection[space_seq->bytes[0]]
@@ -595,8 +603,8 @@ character '%s' in class `%s' must not be in class `%s'"),
 		 & BIT (tok_blank)) == 0)))
     {
       if (!be_quiet)
-	error (0, 0, _("<SP> character not in class `%s'"),
-	       valid_table[cnt].name);
+	WITH_CUR_LOCALE (error (0, 0, _("<SP> character not in class `%s'"),
+				valid_table[cnt].name));
     }
   else if (((cnt = BITPOS (tok_punct),
 	     (ctype->class256_collection[space_seq->bytes[0]]
@@ -606,8 +614,9 @@ character '%s' in class `%s' must not be in class `%s'"),
 		 & BIT (tok_graph)) != 0)))
     {
       if (!be_quiet)
-	error (0, 0, _("<SP> character must not be in class `%s'"),
-	       valid_table[cnt].name);
+	WITH_CUR_LOCALE (error (0, 0, _("\
+<SP> character must not be in class `%s'"),
+				valid_table[cnt].name));
     }
   else
     ctype->class256_collection[space_seq->bytes[0]] |= BIT (tok_print);
@@ -697,7 +706,8 @@ character '%s' in class `%s' must not be in class `%s'"),
       assert (ctype->mbdigits_act == ctype->wcdigits_act);
       ctype->wcdigits_act -= ctype->mbdigits_act % 10;
       ctype->mbdigits_act -= ctype->mbdigits_act % 10;
-      error (0, 0, _("`digit' category has not entries in groups of ten"));
+      WITH_CUR_LOCALE (error (0, 0, _("\
+`digit' category has not entries in groups of ten")));
     }
 
   /* Check the input digits.  There must be a multiple of ten available.
@@ -745,8 +755,8 @@ character '%s' in class `%s' must not be in class `%s'"),
 	      if (ctype->mbdigits[cnt] == NULL)
 		{
 		  /* Hum, this ain't good.  */
-		  error (0, 0, _("\
-no input digits defined and none of the standard names in the charmap"));
+		  WITH_CUR_LOCALE (error (0, 0, _("\
+no input digits defined and none of the standard names in the charmap")));
 
 		  ctype->mbdigits[cnt] = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
 							sizeof (struct charseq) + 1);
@@ -810,8 +820,8 @@ no input digits defined and none of the standard names in the charmap"));
 
 	if (!warned)
 	  {
-	    error (0, 0, _("\
-not all characters used in `outdigit' are available in the charmap"));
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+not all characters used in `outdigit' are available in the charmap")));
 	    warned = 1;
 	  }
 
@@ -827,8 +837,8 @@ not all characters used in `outdigit' are available in the charmap"));
       {
 	if (!warned)
 	  {
-	    error (0, 0, _("\
-not all characters used in `outdigit' are available in the repertoire"));
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+not all characters used in `outdigit' are available in the repertoire")));
 	    warned = 1;
 	  }
 
@@ -1227,9 +1237,9 @@ ctype_class_new (struct linereader *lr, struct locale_ctype_t *ctype,
 
   if (ctype->nr_charclass == MAX_NR_CHARCLASS)
     /* Exit code 2 is prescribed in P1003.2b.  */
-    error (2, 0, _("\
+    WITH_CUR_LOCALE (error (2, 0, _("\
 implementation limit: no more than %Zd character classes allowed"),
-	   MAX_NR_CHARCLASS);
+			    MAX_NR_CHARCLASS));
 
   ctype->classnames[ctype->nr_charclass++] = name;
 }
@@ -1259,9 +1269,9 @@ ctype_map_new (struct linereader *lr, struct locale_ctype_t *ctype,
 
   if (ctype->map_collection_nr == MAX_NR_CHARMAP)
     /* Exit code 2 is prescribed in P1003.2b.  */
-    error (2, 0, _("\
+    WITH_CUR_LOCALE (error (2, 0, _("\
 implementation limit: no more than %d character maps allowed"),
-	   MAX_NR_CHARMAP);
+			    MAX_NR_CHARMAP));
 
   ctype->mapnames[cnt] = name;
 
@@ -2824,10 +2834,11 @@ with character code range values one must use the absolute ellipsis `...'"));
 			    {
 			      lr_error (ldfile, _("\
 %s: duplicate `default_missing' definition"), "LC_CTYPE");
-			      error_at_line (0, 0, ctype->default_missing_file,
-					     ctype->default_missing_lineno,
-					     _("\
-previous definition was here"));
+			      WITH_CUR_LOCALE (error_at_line (0, 0,
+							      ctype->default_missing_file,
+							      ctype->default_missing_lineno,
+							      _("\
+previous definition was here")));
 			    }
 			  else
 			    {
@@ -3001,14 +3012,14 @@ set_class_defaults (struct locale_ctype_t *ctype,
 	  if (seq == NULL)
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("\
+		WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined in charmap while needed as default value"),
-		       "LC_CTYPE", tmp);
+					"LC_CTYPE", tmp));
 	    }
 	  else if (seq->nbytes != 1)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-		   "LC_CTYPE", tmp);
+				    "LC_CTYPE", tmp));
 	  else
 	    ctype->class256_collection[seq->bytes[0]] |= bit;
 
@@ -3085,14 +3096,14 @@ set_class_defaults (struct locale_ctype_t *ctype,
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<space>");
+				    "LC_CTYPE", "<space>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<space>");
+				"LC_CTYPE", "<space>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3105,14 +3116,14 @@ set_class_defaults (struct locale_ctype_t *ctype,
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<form-feed>");
+				    "LC_CTYPE", "<form-feed>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<form-feed>");
+				"LC_CTYPE", "<form-feed>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3126,14 +3137,14 @@ set_class_defaults (struct locale_ctype_t *ctype,
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 character `%s' not defined while needed as default value"),
-		   "<newline>");
+				    "<newline>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<newline>");
+				"LC_CTYPE", "<newline>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3147,14 +3158,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<carriage-return>");
+				    "LC_CTYPE", "<carriage-return>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<carriage-return>");
+				"LC_CTYPE", "<carriage-return>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3168,14 +3179,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<tab>");
+				    "LC_CTYPE", "<tab>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<tab>");
+				"LC_CTYPE", "<tab>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3189,14 +3200,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<vertical-tab>");
+				    "LC_CTYPE", "<vertical-tab>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<vertical-tab>");
+				"LC_CTYPE", "<vertical-tab>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_space);
 
@@ -3229,14 +3240,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<space>");
+				    "LC_CTYPE", "<space>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<space>");
+				"LC_CTYPE", "<space>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_blank);
 
@@ -3250,14 +3261,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<tab>");
+				    "LC_CTYPE", "<tab>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<tab>");
+				"LC_CTYPE", "<tab>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_blank);
 
@@ -3317,14 +3328,14 @@ character `%s' not defined while needed as default value"),
       if (seq == NULL)
 	{
 	  if (!be_quiet)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		   "LC_CTYPE", "<space>");
+				    "LC_CTYPE", "<space>"));
 	}
       else if (seq->nbytes != 1)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' in charmap not representable with one byte"),
-	       "LC_CTYPE", "<space>");
+				"LC_CTYPE", "<space>"));
       else
 	ctype->class256_collection[seq->bytes[0]] |= BIT (tok_print);
 
@@ -3359,16 +3370,16 @@ character `%s' not defined while needed as default value"),
 	  if (seq_from == NULL)
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("\
+		WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-		       "LC_CTYPE", tmp);
+					"LC_CTYPE", tmp));
 	    }
 	  else if (seq_from->nbytes != 1)
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("\
+		WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' needed as default value not representable with one byte"),
-		       "LC_CTYPE", tmp);
+					"LC_CTYPE", tmp));
 	    }
 	  else
 	    {
@@ -3384,16 +3395,16 @@ character `%s' not defined while needed as default value"),
 	      if (seq_to == NULL)
 		{
 		  if (!be_quiet)
-		    error (0, 0, _("\
+		    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' not defined while needed as default value"),
-			   "LC_CTYPE", tmp);
+					    "LC_CTYPE", tmp));
 		}
 	      else if (seq_to->nbytes != 1)
 		{
 		  if (!be_quiet)
-		    error (0, 0, _("\
+		    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: character `%s' needed as default value not representable with one byte"),
-			   "LC_CTYPE", tmp);
+					    "LC_CTYPE", tmp));
 		}
 	      else
 		/* The index [0] is determined by the order of the
@@ -3425,8 +3436,9 @@ character `%s' not defined while needed as default value"),
   if (ctype->outdigits_act != 10)
     {
       if (ctype->outdigits_act != 0)
-	error (0,0, _("%s: field `%s' does not contain exactly ten entries"),
-	       "LC_CTYPE", "outdigit");
+	WITH_CUR_LOCALE (error (0, 0, _("\
+%s: field `%s' does not contain exactly ten entries"),
+				"LC_CTYPE", "outdigit"));
 
       for (cnt = ctype->outdigits_act; cnt < 10; ++cnt)
 	{
@@ -3445,8 +3457,8 @@ character `%s' not defined while needed as default value"),
 	  if (ctype->mboutdigits[cnt] == NULL)
 	    {
 	      /* Provide a replacement.  */
-	      error (0, 0, _("\
-no output digits defined and none of the standard names in the charmap"));
+	      WITH_CUR_LOCALE (error (0, 0, _("\
+no output digits defined and none of the standard names in the charmap")));
 
 	      ctype->mboutdigits[cnt] = obstack_alloc (&((struct charmap_t *) charmap)->mem_pool,
 						       sizeof (struct charseq)
@@ -3736,9 +3748,9 @@ translit_flatten (struct locale_ctype_t *ctype,
 
       if (other == NULL)
 	{
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: transliteration data from locale `%s' not available"),
-		 "LC_CTYPE", copy_locale);
+				  "LC_CTYPE", copy_locale));
 	}
       else
 	{
@@ -3832,9 +3844,10 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap,
       wctype_table_finalize (&t);
 
       if (verbose)
-	fprintf (stderr, _("%s: table for class \"%s\": %lu bytes\n"),
-		 "LC_CTYPE", ctype->classnames[nr],
-		 (unsigned long int) t.result_size);
+	WITH_CUR_LOCALE (fprintf (stderr, _("\
+%s: table for class \"%s\": %lu bytes\n"),
+				 "LC_CTYPE", ctype->classnames[nr],
+				 (unsigned long int) t.result_size));
 
       ctype->class_3level[nr].iov_base = t.result;
       ctype->class_3level[nr].iov_len = t.result_size;
@@ -3900,9 +3913,10 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap,
       wctrans_table_finalize (&t);
 
       if (verbose)
-	fprintf (stderr, _("%s: table for map \"%s\": %lu bytes\n"),
-		 "LC_CTYPE", ctype->mapnames[nr],
-		 (unsigned long int) t.result_size);
+	WITH_CUR_LOCALE (fprintf (stderr, _("\
+%s: table for map \"%s\": %lu bytes\n"),
+				 "LC_CTYPE", ctype->mapnames[nr],
+				 (unsigned long int) t.result_size));
 
       ctype->map_3level[nr].iov_base = t.result;
       ctype->map_3level[nr].iov_len = t.result_size;
@@ -4032,8 +4046,8 @@ allocate_arrays (struct locale_ctype_t *ctype, const struct charmap_t *charmap,
     wcwidth_table_finalize (&t);
 
     if (verbose)
-      fprintf (stderr, _("%s: table for width: %lu bytes\n"),
-	       "LC_CTYPE", (unsigned long int) t.result_size);
+      WITH_CUR_LOCALE (fprintf (stderr, _("%s: table for width: %lu bytes\n"),
+			       "LC_CTYPE", (unsigned long int) t.result_size));
 
     ctype->width.iov_base = t.result;
     ctype->width.iov_len = t.result_size;
diff --git a/locale/programs/ld-identification.c b/locale/programs/ld-identification.c
index 74420fcde2..481e4e79c4 100644
--- a/locale/programs/ld-identification.c
+++ b/locale/programs/ld-identification.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -29,6 +29,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -130,8 +131,8 @@ identification_finish (struct localedef_t *locale,
       if (identification == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_IDENTIFICATION");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_IDENTIFICATION"));
 	  identification_startup (NULL, locale, 0);
 	  identification
 	    = locale->categories[LC_IDENTIFICATION].identification;
@@ -143,8 +144,8 @@ identification_finish (struct localedef_t *locale,
   if (identification->cat == NULL)					      \
     {									      \
       if (verbose && ! nothing)						      \
-	error (0, 0, _("%s: field `%s' not defined"),			      \
-	       "LC_IDENTIFICATION", #cat);				      \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+			       	"LC_IDENTIFICATION", #cat));		      \
       identification->cat = "";						      \
     }
 
@@ -167,8 +168,9 @@ identification_finish (struct localedef_t *locale,
     if (num != LC_ALL && identification->category[num] == NULL)
       {
 	if (verbose && ! nothing)
-	  error (0, 0, _("%s: no identification for category `%s'"),
-		 "LC_IDENTIFICATION", category_name[num]);
+	  WITH_CUR_LOCALE (error (0, 0, _("\
+%s: no identification for category `%s'"),
+				  "LC_IDENTIFICATION", category_name[num]));
 	identification->category[num] = "";
       }
 }
diff --git a/locale/programs/ld-measurement.c b/locale/programs/ld-measurement.c
index f0b960d63d..75219bdf9f 100644
--- a/locale/programs/ld-measurement.c
+++ b/locale/programs/ld-measurement.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -28,6 +28,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -91,8 +92,8 @@ measurement_finish (struct localedef_t *locale,
       if (measurement == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_MEASUREMENT");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_MEASUREMENT"));
 	  measurement_startup (NULL, locale, 0);
 	  measurement = locale->categories[LC_MEASUREMENT].measurement;
 	  nothing = 1;
@@ -102,16 +103,16 @@ measurement_finish (struct localedef_t *locale,
   if (measurement->measurement == 0)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_MEASUREMENT", "measurement");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_MEASUREMENT", "measurement"));
       /* Use as the default value the value of the i18n locale.  */
       measurement->measurement = 1;
     }
   else
     {
       if (measurement->measurement > 3)
-	error (0, 0, _("%s: invalid value for field `%s'"),
-	       "LC_MEASUREMENT", "measurement");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: invalid value for field `%s'"),
+				"LC_MEASUREMENT", "measurement"));
     }
 }
 
diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c
index b005cb5da2..fadf82757f 100644
--- a/locale/programs/ld-messages.c
+++ b/locale/programs/ld-messages.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -29,8 +29,8 @@
 
 #include <assert.h>
 
-#include "linereader.h"
 #include "localedef.h"
+#include "linereader.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -95,8 +95,8 @@ messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (messages == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_MESSAGES");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_MESSAGES"));
 	  messages_startup (NULL, locale, 0);
 	  messages = locale->categories[LC_MESSAGES].messages;
 	  nothing = 1;
@@ -112,15 +112,16 @@ messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (messages->yesexpr == NULL)
     {
       if (! be_quiet && ! nothing)
-	error (0, 0, _("%s: field `%s' undefined"), "LC_MESSAGES", "yesexpr");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' undefined"),
+				"LC_MESSAGES", "yesexpr"));
       messages->yesexpr = "^[yY]";
     }
   else if (messages->yesexpr[0] == '\0')
     {
       if (!be_quiet)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must not be an empty string"),
-	       "LC_MESSAGES", "yesexpr");
+				"LC_MESSAGES", "yesexpr"));
     }
   else
     {
@@ -134,9 +135,9 @@ messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  char errbuf[BUFSIZ];
 
 	  (void) regerror (result, &re, errbuf, BUFSIZ);
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: no correct regular expression for field `%s': %s"),
-		 "LC_MESSAGES", "yesexpr", errbuf);
+				  "LC_MESSAGES", "yesexpr", errbuf));
 	}
       else if (result != 0)
 	regfree (&re);
@@ -145,15 +146,16 @@ messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (messages->noexpr == NULL)
     {
       if (! be_quiet && ! nothing)
-	error (0, 0, _("%s: field `%s' undefined"), "LC_MESSAGES", "noexpr");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' undefined"),
+				"LC_MESSAGES", "noexpr"));
       messages->noexpr = "^[nN]";
     }
   else if (messages->noexpr[0] == '\0')
     {
       if (!be_quiet)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must not be an empty string"),
-	       "LC_MESSAGES", "noexpr");
+				"LC_MESSAGES", "noexpr"));
     }
   else
     {
@@ -167,9 +169,9 @@ messages_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  char errbuf[BUFSIZ];
 
 	  (void) regerror (result, &re, errbuf, BUFSIZ);
-	  error (0, 0, _("\
+	  WITH_CUR_LOCALE (error (0, 0, _("\
 %s: no correct regular expression for field `%s': %s"),
-		 "LC_MESSAGES", "noexpr", errbuf);
+				  "LC_MESSAGES", "noexpr", errbuf));
 	}
       else if (result != 0)
 	regfree (&re);
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
index 0cd9579f50..4bb7c0bba4 100644
--- a/locale/programs/ld-monetary.c
+++ b/locale/programs/ld-monetary.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -30,8 +30,8 @@
 
 #include <assert.h>
 
-#include "linereader.h"
 #include "localedef.h"
+#include "linereader.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -191,8 +191,8 @@ monetary_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (monetary == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_MONETARY");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_MONETARY"));
 	  monetary_startup (NULL, locale, 0);
 	  monetary = locale->categories[LC_MONETARY].monetary;
 	  nothing = 1;
@@ -203,8 +203,8 @@ monetary_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (monetary->cat == NULL)						      \
     {									      \
       if (! be_quiet && ! nothing)					      \
-	error (0, 0, _("%s: field `%s' not defined"),			      \
-	       "LC_MONETARY", #cat);					      \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_MONETARY", #cat));			      \
       monetary->cat = initval;						      \
     }
 
@@ -221,18 +221,18 @@ monetary_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (strlen (monetary->int_curr_symbol) != 4)
 	{
 	  if (! be_quiet && ! nothing)
-	    error (0, 0, _("\
+	    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value of field `int_curr_symbol' has wrong length"),
-		   "LC_MONETARY");
+				    "LC_MONETARY"));
 	}
       else if (bsearch (monetary->int_curr_symbol, valid_int_curr,
 			NR_VALID_INT_CURR, sizeof (const char *),
 			(comparison_fn_t) curr_strcmp) == NULL
 	       && !be_quiet)
-	error (0, 0, _("\
+	WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value of field `int_curr_symbol' does \
 not correspond to a valid name in ISO 4217"),
-	       "LC_MONETARY");
+				"LC_MONETARY"));
     }
 
   /* The decimal point must not be empty.  This is not said explicitly
@@ -241,15 +241,15 @@ not correspond to a valid name in ISO 4217"),
   if (monetary->mon_decimal_point == NULL)
     {
       if (! be_quiet && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_MONETARY", "mon_decimal_point");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_MONETARY", "mon_decimal_point"));
       monetary->mon_decimal_point = ".";
     }
   else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing)
     {
-      error (0, 0, _("\
+      WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must not be the empty string"),
-	     "LC_MONETARY", "mon_decimal_point");
+			      "LC_MONETARY", "mon_decimal_point"));
     }
   if (monetary->mon_decimal_point_wc == L'\0')
     monetary->mon_decimal_point_wc = L'.';
@@ -257,8 +257,8 @@ not correspond to a valid name in ISO 4217"),
   if (monetary->mon_grouping_len == 0)
     {
       if (! be_quiet && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_MONETARY", "mon_grouping");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_MONETARY", "mon_grouping"));
 
       monetary->mon_grouping = (char *) "\177";
       monetary->mon_grouping_len = 1;
@@ -269,15 +269,15 @@ not correspond to a valid name in ISO 4217"),
   if (monetary->cat == -2)						      \
     {									      \
        if (! be_quiet && ! nothing)					      \
-	 error (0, 0, _("%s: field `%s' not defined"),			      \
-	        "LC_MONETARY", #cat);					      \
+	 WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				 "LC_MONETARY", #cat));			      \
        monetary->cat = initval;						      \
     }									      \
   else if ((monetary->cat < min || monetary->cat > max)			      \
 	   && !be_quiet && !nothing)					      \
-    error (0, 0, _("							      \
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must be in range %d...%d"),			      \
-	   "LC_MONETARY", #cat, min, max)
+			    "LC_MONETARY", #cat, min, max))
 
   TEST_ELEM (int_frac_digits, -128, 127, -1);
   TEST_ELEM (frac_digits, -128, 127, -1);
@@ -305,9 +305,9 @@ not correspond to a valid name in ISO 4217"),
     monetary->cat = monetary->alt;					      \
   else if ((monetary->cat < min || monetary->cat > max) && !be_quiet	      \
 	   && ! nothing)						      \
-    error (0, 0, _("\
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must be in range %d...%d"),			      \
-	   "LC_MONETARY", #cat, min, max)
+			    "LC_MONETARY", #cat, min, max))
 
   TEST_ELEM (int_p_cs_precedes, p_cs_precedes, -1, 1);
   TEST_ELEM (int_p_sep_by_space, p_sep_by_space, -1, 2);
diff --git a/locale/programs/ld-name.c b/locale/programs/ld-name.c
index a838b6e114..11e0ace7d6 100644
--- a/locale/programs/ld-name.c
+++ b/locale/programs/ld-name.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -27,6 +27,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -91,7 +92,8 @@ name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (name == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"), "LC_NAME");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_NAME"));
 	  name_startup (NULL, locale, 0);
 	  name = locale->categories[LC_NAME].name;
 	  nothing = 1;
@@ -101,7 +103,8 @@ name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (name->name_fmt == NULL)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"), "LC_NAME", "name_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_NAME", "name_fmt"));
       /* Use as the default value the value of the i18n locale.  */
       name->name_fmt = "%p%t%g%t%m%t%f";
     }
@@ -112,8 +115,8 @@ name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       const char *cp = name->name_fmt;
 
       if (*cp == '\0')
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_NAME", "name_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_NAME", "name_fmt"));
       else
 	while (*cp != '\0')
 	  {
@@ -124,9 +127,8 @@ name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		  ++cp;
 		if (strchr ("dfFgGlomMpsSt", *cp) == NULL)
 		  {
-		    error (0, 0, _("\
-%s: invalid escape sequence in field `%s'"),
-			   "LC_NAME", "name_fmt");
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid escape sequence in field `%s'"), "LC_NAME", "name_fmt"));
 		    break;
 		  }
 	      }
@@ -138,7 +140,8 @@ name_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (name->cat == NULL)						      \
     {									      \
       if (verbose && ! nothing)						      \
-	error (0, 0, _("%s: field `%s' not defined"), "LC_NAME", #cat);	      \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_NAME", #cat));          		      \
       name->cat = "";							      \
     }
 
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
index c0be827133..6e385f2be6 100644
--- a/locale/programs/ld-numeric.c
+++ b/locale/programs/ld-numeric.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -27,8 +27,8 @@
 
 #include <assert.h>
 
-#include "linereader.h"
 #include "localedef.h"
+#include "linereader.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -96,8 +96,8 @@ numeric_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (numeric == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_NUMERIC");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_NUMERIC"));
 	  numeric_startup (NULL, locale, 0);
 	  numeric = locale->categories[LC_NUMERIC].numeric;
 	  nothing = 1;
@@ -110,21 +110,22 @@ numeric_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (numeric->decimal_point == NULL)
     {
       if (! be_quiet && ! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_NUMERIC", "decimal_point");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_NUMERIC", "decimal_point"));
       numeric->decimal_point = ".";
     }
   else if (numeric->decimal_point[0] == '\0' && ! be_quiet && ! nothing)
     {
-      error (0, 0, _("\
+      WITH_CUR_LOCALE (error (0, 0, _("\
 %s: value for field `%s' must not be the empty string"),
-	     "LC_NUMERIC", "decimal_point");
+			      "LC_NUMERIC", "decimal_point"));
     }
   if (numeric->decimal_point_wc == L'\0')
     numeric->decimal_point_wc = L'.';
 
   if (numeric->grouping_len == 0 && ! be_quiet && ! nothing)
-    error (0, 0, _("%s: field `%s' not defined"), "LC_NUMERIC", "grouping");
+    WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+			    "LC_NUMERIC", "grouping"));
 }
 
 
diff --git a/locale/programs/ld-paper.c b/locale/programs/ld-paper.c
index 334d405ca8..2dce9ca8da 100644
--- a/locale/programs/ld-paper.c
+++ b/locale/programs/ld-paper.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -28,6 +28,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -88,7 +89,8 @@ paper_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (paper == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"), "LC_PAPER");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_PAPER"));
 	  paper_startup (NULL, locale, 0);
 	  paper = locale->categories[LC_PAPER].paper;
 	  nothing = 1;
@@ -98,7 +100,8 @@ paper_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (paper->height == 0)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"), "LC_PAPER", "height");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_PAPER", "height"));
       /* Use as default values the values from the i18n locale.  */
       paper->height = 297;
     }
@@ -106,7 +109,8 @@ paper_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (paper->width == 0)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"), "LC_PAPER", "width");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_PAPER", "width"));
       /* Use as default values the values from the i18n locale.  */
       paper->width = 210;
     }
diff --git a/locale/programs/ld-telephone.c b/locale/programs/ld-telephone.c
index a66b48d436..01dcf36008 100644
--- a/locale/programs/ld-telephone.c
+++ b/locale/programs/ld-telephone.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -28,6 +28,7 @@
 
 #include <assert.h>
 
+#include "localedef.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -91,8 +92,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (telephone == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"),
-		   "LC_TELEPHONE");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_TELEPHONE"));
 	  telephone_startup (NULL, locale, 0);
 	  telephone = locale->categories[LC_TELEPHONE].telephone;
 	  nothing = 1;
@@ -102,8 +103,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (telephone->tel_int_fmt == NULL)
     {
       if (! nothing)
-	error (0, 0, _("%s: field `%s' not defined"),
-	       "LC_TELEPHONE", "tel_int_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),
+				"LC_TELEPHONE", "tel_int_fmt"));
       /* Use as the default value the value of the i18n locale.  */
       telephone->tel_int_fmt = "+%c %a %l";
     }
@@ -114,8 +115,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       const char *cp = telephone->tel_int_fmt;
 
       if (*cp == '\0')
-	error (0, 0, _("%s: field `%s' must not be empty"),
-	       "LC_TELEPHONE", "tel_int_fmt");
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' must not be empty"),
+				"LC_TELEPHONE", "tel_int_fmt"));
       else
 	while (*cp != '\0')
 	  {
@@ -123,9 +124,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	      {
 		if (strchr ("aAlc", *++cp) == NULL)
 		  {
-		    error (0, 0, _("\
-%s: invalid escape sequence in field `%s'"),
-			   "LC_TELEPHONE", "tel_int_fmt");
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid escape sequence in field `%s'"), "LC_TELEPHONE", "tel_int_fmt"));
 		    break;
 		  }
 	      }
@@ -147,8 +147,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	    {
 	      if (strchr ("aAlc", *++cp) == NULL)
 		{
-		  error (0, 0, _("%s: invalid escape sequence in field `%s'"),
-			 "LC_TELEPHONE", "tel_dom_fmt");
+		  WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid escape sequence in field `%s'"), "LC_TELEPHONE", "tel_dom_fmt"));
 		  break;
 		}
 	    }
@@ -160,7 +160,8 @@ telephone_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (telephone->cat == NULL)						      \
     {									      \
       if (verbose && ! nothing)						      \
-	error (0, 0, _("%s: field `%s' not defined"), "LC_TELEPHONE", #cat);  \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_TELEPHONE", #cat));     		      \
       telephone->cat = "";						      \
     }
 
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
index 5883d4c31c..32d9dad971 100644
--- a/locale/programs/ld-time.c
+++ b/locale/programs/ld-time.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -30,8 +30,8 @@
 
 #include <assert.h>
 
-#include "linereader.h"
 #include "localedef.h"
+#include "linereader.h"
 #include "localeinfo.h"
 #include "locfile.h"
 
@@ -157,7 +157,8 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       if (time == NULL)
 	{
 	  if (! be_quiet)
-	    error (0, 0, _("No definition for %s category found"), "LC_TIME");
+	    WITH_CUR_LOCALE (error (0, 0, _("\
+No definition for %s category found"), "LC_TIME"));
 	  time_startup (NULL, locale, 0);
 	  time = locale->categories[LC_TIME].time;
 	  nothing = 1;
@@ -172,7 +173,8 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
       int i;								      \
 									      \
       if (! be_quiet && ! nothing)					      \
-	error (0, 0, _("%s: field `%s' not defined"), "LC_TIME", #cat);	      \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_TIME", #cat));          		      \
 									      \
       for (i = 0; i < sizeof (initval) / sizeof (initval[0]); ++i)	      \
 	time->cat[i] = initval[i];					      \
@@ -192,7 +194,8 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
   if (time->cat == NULL)						      \
     {									      \
       if (! be_quiet && ! nothing)					      \
-	error (0, 0, _("%s: field `%s' not defined"), "LC_TIME", #cat);	      \
+	WITH_CUR_LOCALE (error (0, 0, _("%s: field `%s' not defined"),	      \
+				"LC_TIME", #cat));          		      \
 									      \
       time->cat = initval;						      \
     }
@@ -242,10 +245,9 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  if (*str != '+' && *str != '-')
 	    {
 	      if (!be_quiet)
-		error (0, 0,
-		       _("%s: direction flag in string %Zd in `era' field"
-			 " is not '+' nor '-'"),
-		       "LC_TIME", idx + 1);
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: direction flag in string %Zd in `era' field is not '+' nor '-'"),
+					"LC_TIME", idx + 1));
 	      /* Default arbitrarily to '+'.  */
 	      time->era_entries[idx].direction = '+';
 	    }
@@ -254,10 +256,9 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  if (*++str != ':')
 	    {
 	      if (!be_quiet)
-		error (0, 0,
-		       _("%s: direction flag in string %Zd in `era' field"
-			 " is not a single character"),
-		       "LC_TIME", idx + 1);
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: direction flag in string %Zd in `era' field is not a single character"),
+					"LC_TIME", idx + 1));
 	      (void) strsep (&str, ":");
 	    }
 	  else
@@ -268,17 +269,17 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	  if (endp == str)
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("%s: invalid number for offset in string %Zd in"
-			       " `era' field"),
-		       "LC_TIME", idx + 1);
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid number for offset in string %Zd in `era' field"),
+					"LC_TIME", idx + 1));
 	      (void) strsep (&str, ":");
 	    }
 	  else if (*endp != ':')
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("%s: garbage at end of offset value in"
-			       " string %Zd in `era' field"),
-		       "LC_TIME", idx + 1);
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: garbage at end of offset value in string %Zd in `era' field"),
+					"LC_TIME", idx + 1));
 	      (void) strsep (&str, ":");
 	    }
 	  else
@@ -327,18 +328,18 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		{
 		invalid_start_date:
 		  if (!be_quiet)
-		    error (0, 0, _("%s: invalid starting date in string %Zd in"
-				   " `era' field"),
-			   "LC_TIME", idx + 1);
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid starting date in string %Zd in `era' field"),
+					    "LC_TIME", idx + 1));
 		  (void) strsep (&str, ":");
 		}
 	      else if (*endp != ':')
 		{
 		garbage_start_date:
 		  if (!be_quiet)
-		    error (0, 0, _("%s: garbage at end of starting date "
-				   "in string %Zd in `era' field "),
-			   "LC_TIME", idx + 1);
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: garbage at end of starting date in string %Zd in `era' field "),
+					    "LC_TIME", idx + 1));
 		  (void) strsep (&str, ":");
 		}
 	      else
@@ -355,9 +356,9 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 			   && time->era_entries[idx].start_date[2] == 29
 			   && !__isleap (time->era_entries[idx].start_date[0])))
 		      && !be_quiet)
-			  error (0, 0, _("%s: starting date is invalid in"
-					 " string %Zd in `era' field"),
-				 "LC_TIME", idx + 1);
+			  WITH_CUR_LOCALE (error (0, 0, _("\
+%s: starting date is invalid in string %Zd in `era' field"),
+						  "LC_TIME", idx + 1));
 		}
 	    }
 
@@ -404,18 +405,18 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 		{
 		invalid_stop_date:
 		  if (!be_quiet)
-		    error (0, 0, _("%s: invalid stopping date in string %Zd in"
-				   " `era' field"),
-			   "LC_TIME", idx + 1);
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: invalid stopping date in string %Zd in `era' field"),
+					    "LC_TIME", idx + 1));
 		  (void) strsep (&str, ":");
 		}
 	      else if (*endp != ':')
 		{
 		garbage_stop_date:
 		  if (!be_quiet)
-		    error (0, 0, _("%s: garbage at end of stopping date "
-				   "in string %Zd in `era' field"),
-			   "LC_TIME", idx + 1);
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: garbage at end of stopping date in string %Zd in `era' field"),
+					    "LC_TIME", idx + 1));
 		  (void) strsep (&str, ":");
 		}
 	      else
@@ -432,17 +433,17 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 			   && time->era_entries[idx].stop_date[2] == 29
 			   && !__isleap (time->era_entries[idx].stop_date[0])))
 		      && !be_quiet)
-			  error (0, 0, _("%s: stopping date is invalid in"
-					 " string %Zd in `era' field"),
-				 "LC_TIME", idx + 1);
+			  WITH_CUR_LOCALE (error (0, 0, _("\
+%s: stopping date is invalid in string %Zd in `era' field"),
+						  "LC_TIME", idx + 1));
 		}
 	    }
 
 	  if (str == NULL || *str == '\0')
 	    {
 	      if (!be_quiet)
-		error (0, 0, _("%s: missing era name in string %Zd in `era'"
-			       " field"), "LC_TIME", idx + 1);
+		WITH_CUR_LOCALE (error (0, 0, _("\
+%s: missing era name in string %Zd in `era' field"), "LC_TIME", idx + 1));
 	      time->era_entries[idx].name =
 		time->era_entries[idx].format = "";
 	    }
@@ -453,9 +454,9 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
 	      if (str == NULL || *str == '\0')
 		{
 		  if (!be_quiet)
-		    error (0, 0, _("%s: missing era format in string %Zd"
-				   " in `era' field"),
-			   "LC_TIME", idx + 1);
+		    WITH_CUR_LOCALE (error (0, 0, _("\
+%s: missing era format in string %Zd in `era' field"),
+					    "LC_TIME", idx + 1));
 		  time->era_entries[idx].name =
 		    time->era_entries[idx].format = "";
 		}
@@ -482,33 +483,33 @@ time_finish (struct localedef_t *locale, const struct charmap_t *charmap)
     time->week_1stday = 19971130;
 
   if (time->week_1stweek > time->week_ndays)
-    error (0, 0, _("\
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: third operand for value of field `%s' must not be larger than %d"),
-	   "LC_TIME", "week", 7);
+			    "LC_TIME", "week", 7));
 
   if (time->first_weekday == '\0')
     /* The definition does not specify this so the default is used.  */
     time->first_weekday = 1;
   else if (time->first_weekday > time->week_ndays)
-    error (0, 0, _("\
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: values of field `%s' must not be larger than %d"),
-	   "LC_TIME", "first_weekday", 7);
+			    "LC_TIME", "first_weekday", 7));
 
   if (time->first_workday == '\0')
     /* The definition does not specify this so the default is used.  */
     time->first_workday = 1;
   else if (time->first_workday > time->week_ndays)
-    error (0, 0, _("\
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: values of field `%s' must not be larger than %d"),
-	   "LC_TIME", "first_workday", 7);
+			    "LC_TIME", "first_workday", 7));
 
   if (time->cal_direction == '\0')
     /* The definition does not specify this so the default is used.  */
     time->cal_direction = 1;
   else if (time->cal_direction > 3)
-    error (0, 0, _("\
+    WITH_CUR_LOCALE (error (0, 0, _("\
 %s: values for field `%s' must not be larger than %d"),
-	   "LC_TIME", "cal_direction", 3);
+			    "LC_TIME", "cal_direction", 3));
 
   /* XXX We don't perform any tests on the timezone value since this is
      simply useless, stupid $&$!@...  */
diff --git a/locale/programs/linereader.c b/locale/programs/linereader.c
index 9f5191226b..f569d1b9b8 100644
--- a/locale/programs/linereader.c
+++ b/locale/programs/linereader.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
 
@@ -29,18 +29,12 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "localedef.h"
 #include "charmap.h"
 #include "error.h"
 #include "linereader.h"
-#include "localedef.h"
 #include "locfile.h"
 
-/* Prototypes for a few program-wide used functions.  */
-extern void *xmalloc (size_t __n);
-extern void *xrealloc (void *__p, size_t __n);
-extern char *xstrdup (const char *__str);
-
-
 /* Prototypes for local functions.  */
 static struct token *get_toplvl_escape (struct linereader *lr);
 static struct token *get_symname (struct linereader *lr);
diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h
index 868c50264e..a44360979b 100644
--- a/locale/programs/linereader.h
+++ b/locale/programs/linereader.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper, <drepper@gnu.org>.
 
@@ -98,7 +98,7 @@ extern struct token *lr_token (struct linereader *lr,
 
 
 #define lr_error(lr, fmt, args...) \
-  error_at_line (0, 0, lr->fname, lr->lineno, fmt, ## args)
+  WITH_CUR_LOCALE (error_at_line (0, 0, lr->fname, lr->lineno, fmt, ## args))
 
 
 
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 1d09e8b46f..3c159560e9 100644
--- a/locale/programs/localedef.c
+++ b/locale/programs/localedef.c
@@ -31,10 +31,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <error.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
 
-#include "error.h"
+#include "localedef.h"
 #include "charmap.h"
 #include "locfile.h"
 
@@ -189,7 +190,8 @@ main (int argc, char *argv[])
      defines error code 3 for this situation so I think it must be
      a fatal error (see P1003.2 4.35.8).  */
   if (sysconf (_SC_2_LOCALEDEF) < 0)
-    error (3, 0, _("FATAL: system does not define `_POSIX2_LOCALEDEF'"));
+    WITH_CUR_LOCALE (error (3, 0, _("\
+FATAL: system does not define `_POSIX2_LOCALEDEF'")));
 
   /* Process charmap file.  */
   charmap = charmap_read (charmap_file, verbose, be_quiet, 1);
@@ -202,7 +204,8 @@ main (int argc, char *argv[])
 
   /* Now read the locale file.  */
   if (locfile_read (&global, charmap) != 0)
-    error (4, errno, _("cannot open locale definition file `%s'"), input_file);
+    WITH_CUR_LOCALE (error (4, errno, _("\
+cannot open locale definition file `%s'"), input_file));
 
   /* Perhaps we saw some `copy' instructions.  */
   while (1)
@@ -217,8 +220,8 @@ main (int argc, char *argv[])
 	break;
 
       if (locfile_read (runp, charmap) != 0)
-	error (4, errno, _("cannot open locale definition file `%s'"),
-	       runp->name);
+	WITH_CUR_LOCALE (error (4, errno, _("\
+cannot open locale definition file `%s'"), runp->name));
     }
 
   /* Check the categories we processed in source form.  */
@@ -229,13 +232,14 @@ main (int argc, char *argv[])
   if (error_message_count == 0 || force_output != 0)
     {
       if (cannot_write_why != 0)
-	error (4, cannot_write_why, _("cannot write output files to `%s'"),
-	       output_path);
+	WITH_CUR_LOCALE (error (4, cannot_write_why, _("\
+cannot write output files to `%s'"), output_path));
       else
 	write_all_categories (locales, charmap, output_path);
     }
   else
-    error (4, 0, _("no output file produced because warning were issued"));
+    WITH_CUR_LOCALE (error (4, 0, _("\
+no output file produced because warning were issued")));
 
   /* This exit status is prescribed by POSIX.2 4.35.7.  */
   exit (error_message_count != 0);
@@ -485,13 +489,14 @@ 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"));
+    WITH_CUR_LOCALE (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);
+	WITH_CUR_LOCALE (error (5, 0, _("\
+cannot add already read locale `%s' a second time"), name));
       else
 	runp->categories[locale].generic =
 	  copy_locale->categories[locale].generic;
@@ -516,8 +521,8 @@ find_locale (int locale, const char *name, const char *repertoire_name,
 
   if ((result->avail & (1 << locale)) == 0
       && locfile_read (result, charmap) != 0)
-    error (4, errno, _("cannot open locale definition file `%s'"),
-	   result->name);
+    WITH_CUR_LOCALE (error (4, errno, _("\
+cannot open locale definition file `%s'"), result->name));
 
   return result;
 }
@@ -536,8 +541,8 @@ load_locale (int locale, const char *name, const char *repertoire_name,
 
   if ((result->avail & (1 << locale)) == 0
       && locfile_read (result, charmap) != 0)
-    error (4, errno, _("cannot open locale definition file `%s'"),
-	   result->name);
+    WITH_CUR_LOCALE (error (4, errno, _("\
+cannot open locale definition file `%s'"), result->name));
 
   return result;
 }
diff --git a/locale/programs/localedef.h b/locale/programs/localedef.h
index cdb08d8293..717962e10b 100644
--- a/locale/programs/localedef.h
+++ b/locale/programs/localedef.h
@@ -24,6 +24,7 @@
 /* Get the basic locale definitions.  */
 #include <locale.h>
 #include <stddef.h>
+#include <errno.h>
 
 #include "repertoire.h"
 
@@ -122,6 +123,19 @@ extern void *xrealloc (void *__p, size_t __n);
 extern char *xstrdup (const char *__str);
 
 
+/* Wrapper to switch LC_CTYPE back to the locale specified in the
+   environment for output.  */
+#define WITH_CUR_LOCALE(stmt)					\
+  do {								\
+      int saved_errno = errno;					\
+      const char *cur_locale_ = setlocale (LC_CTYPE, NULL);	\
+      setlocale (LC_CTYPE, "");					\
+      errno = saved_errno; 					\
+      stmt;							\
+      setlocale (LC_CTYPE, cur_locale_);			\
+  } while (0)
+
+
 /* Mark given locale as to be read.  */
 extern struct localedef_t *add_to_readlist (int locale, const char *name,
 					    const char *repertoire_name,
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index d2e9ba1382..07a65bbb54 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
 
@@ -568,9 +568,8 @@ write_locale_data (const char *output_path, const char *category,
       if (fd == -1)
 	{
 	  if (!be_quiet)
-	    error (0, save_err, _("\
-cannot open output file `%s' for category `%s'"),
-		   fname, category);
+	    WITH_CUR_LOCALE (error (0, save_err, _("\
+cannot open output file `%s' for category `%s'"), fname, category));
 	  free (fname);
 	  return;
 	}
@@ -593,8 +592,8 @@ cannot open output file `%s' for category `%s'"),
       if (writev (fd, &vec[cnt], step) < 0)
 	{
 	  if (!be_quiet)
-	    error (0, errno, _("failure while writing data for category `%s'"),
-		   category);
+	    WITH_CUR_LOCALE (error (0, errno, _("\
+failure while writing data for category `%s'"), category));
 	  break;
 	}
     }
@@ -690,9 +689,8 @@ cannot open output file `%s' for category `%s'"),
 			      if (rename (tmp_fname, fname) < 0)
 				{
 				  if (!be_quiet)
-				    error (0, errno, _("\
-cannot create output file `%s' for category `%s'"),
-					   fname, category);
+				    WITH_CUR_LOCALE (error (0, errno, _("\
+cannot create output file `%s' for category `%s'"), fname, category));
 				}
 			      free (tmp_fname);
 			      free (other_fname);
diff --git a/locale/programs/repertoire.c b/locale/programs/repertoire.c
index 903b620216..8251db43d3 100644
--- a/locale/programs/repertoire.c
+++ b/locale/programs/repertoire.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -30,11 +30,11 @@
 #include <string.h>
 #include <unistd.h>
 
+#include "localedef.h"
 #include "linereader.h"
 #include "charmap.h"
 #include "repertoire.h"
 #include "simple-hash.h"
-#include "localedef.h"
 
 
 /* Simple keyword hashing for the repertoiremap.  */
@@ -322,13 +322,14 @@ argument to <%s> must be a single character"),
     }
 
   if (state != 2 && state != 90 && !be_quiet)
-    error (0, 0, _("%s: premature end of file"), repfile->fname);
+    WITH_CUR_LOCALE (error (0, 0, _("%s: premature end of file"),
+			    repfile->fname));
 
   lr_close (repfile);
 
   if (tsearch (result, &known, &repertoire_compare) == NULL)
     /* Something went wrong.  */
-    error (0, errno, _("cannot safe new repertoire map"));
+    WITH_CUR_LOCALE (error (0, errno, _("cannot safe new repertoire map")));
 
   return result;
 }
@@ -339,7 +340,8 @@ repertoire_complain (const char *name)
 {
   if (tfind (name, &unavailable, (__compar_fn_t) strcmp) == NULL)
     {
-      error (0, errno, _("repertoire map file `%s' not found"), name);
+      WITH_CUR_LOCALE (error (0, errno, _("\
+repertoire map file `%s' not found"), name));
 
       /* Remember that we reported this map.  */
       tsearch (name, &unavailable, (__compar_fn_t) strcmp);