summary refs log tree commit diff
path: root/catgets
diff options
context:
space:
mode:
Diffstat (limited to 'catgets')
-rw-r--r--catgets/catgets.c18
-rw-r--r--catgets/gencat.c91
-rw-r--r--catgets/open_catalog.c175
3 files changed, 138 insertions, 146 deletions
diff --git a/catgets/catgets.c b/catgets/catgets.c
index c6fd13d4b4..86ff0ff831 100644
--- a/catgets/catgets.c
+++ b/catgets/catgets.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper, <drepper@gnu.org>.
 
@@ -19,6 +19,7 @@
 
 #include <alloca.h>
 #include <errno.h>
+#include <locale.h>
 #include <nl_types.h>
 #include <stdlib.h>
 #include <string.h>
@@ -43,20 +44,15 @@ catopen (const char *cat_name, int flag)
   if (strchr (cat_name, '/') == NULL)
     {
       if (flag == NL_CAT_LOCALE)
-	{
-	  env_var = getenv ("LC_ALL");
-	  if (env_var == NULL)
-	    env_var = getenv ("LC_MESSAGES");
-
-	  if (env_var != NULL)
-	    goto have_env_var;
-	}
+	/* Use the current locale setting for LC_MESSAGES.  */
+	env_var = setlocale (LC_MESSAGES, NULL);
+      else
+	/* Use the LANG environment variable.  */
+	env_var = getenv ("LANG");
 
-      env_var = getenv ("LANG");
       if (env_var == NULL)
 	env_var = "C";
 
-    have_env_var:
       env_var_len = strlen (env_var) + 1;
 
       nlspath = __secure_getenv ("NLSPATH");
diff --git a/catgets/gencat.c b/catgets/gencat.c
index eaeb59ca60..4609c63681 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -1,6 +1,6 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+   Contributed by Ulrich Drepper <drepper@redhat.com>, 1996.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -32,6 +32,7 @@
 #include <limits.h>
 #include <nl_types.h>
 #include <obstack.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -237,7 +238,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");
 }
 
@@ -492,13 +493,12 @@ this is the first definition"));
 	{
 	  const char *ident = this_line;
 	  int message_number;
-	  int any_space;
 
 	  do
 	    ++this_line;
 	  while (this_line[0] != '\0' && !isspace (this_line[0]));
-	  any_space = isspace (*this_line);
-	  *this_line++ = '\0';	/* Terminate the identifier.  */
+	  if (this_line[0] != '\0')
+	    *this_line++ = '\0';	/* Terminate the identifier.  */
 
 	  /* Now we found the beginning of the message itself.  */
 
@@ -522,24 +522,12 @@ this is the first definition"));
 		  }
 	      if (runp != NULL)
 		{
-		  if (any_space)
-		    {
-		      /* Oh, oh.  There is already a message with this
-			 number in the message set.  */
-		      error_at_line (0, 0, fname, start_line,
-				     gettext ("duplicated message number"));
-		      error_at_line (0, 0, runp->fname, runp->line,
-				     gettext ("this is the first definition"));
-		    }
-		  else
-		    {
-		      /* We have to remove this message.  */
-		      if (lastp != NULL)
-			lastp->next = runp->next;
-		      else
-			current->current_set->messages = runp->next;
-		      free (runp);
-		    }
+		  /* Oh, oh.  There is already a message with this
+		     number in the message set.  */
+		  error_at_line (0, 0, fname, start_line,
+				 gettext ("duplicated message number"));
+		  error_at_line (0, 0, runp->fname, runp->line,
+				 gettext ("this is the first definition"));
 		  message_number = 0;
 		}
 	      ident = NULL;	/* We don't have a symbol.  */
@@ -564,24 +552,11 @@ this is the first definition"));
 		  runp = runp->next;
 	      if (runp != NULL)
 		{
-		  if (any_space)
-		    {
-		      /* The name is already used.  */
-		      error_at_line (0, 0, fname, start_line,
-				     gettext ("\
+		  /* The name is already used.  */
+		  error_at_line (0, 0, fname, start_line, gettext ("\
 duplicated message identifier"));
-		      error_at_line (0, 0, runp->fname, runp->line,
-				     gettext ("this is the first definition"));
-		    }
-		  else
-		    {
-		      /* We have to remove this message.  */
-		      if (lastp != NULL)
-			lastp->next = runp->next;
-		      else
-			current->current_set->messages = runp->next;
-		      free (runp);
-		    }
+		  error_at_line (0, 0, runp->fname, runp->line,
+				 gettext ("this is the first definition"));
 		  message_number = 0;
 		}
 	      else
@@ -673,7 +648,7 @@ write_out (struct catalog *catalog, const char *output_name,
   struct obstack string_pool;
   const char *strings;
   size_t strings_size;
-  u_int32_t *array1, *array2;
+  uint32_t *array1, *array2;
   size_t cnt;
   int fd;
 
@@ -751,10 +726,10 @@ write_out (struct catalog *catalog, const char *output_name,
 
   /* Allocate room for all needed arrays.  */
   array1 =
-    (u_int32_t *) alloca (best_size * best_depth * sizeof (u_int32_t) * 3);
-  memset (array1, '\0', best_size * best_depth * sizeof (u_int32_t) * 3);
+    (uint32_t *) alloca (best_size * best_depth * sizeof (uint32_t) * 3);
+  memset (array1, '\0', best_size * best_depth * sizeof (uint32_t) * 3);
   array2
-    = (u_int32_t *) alloca (best_size * best_depth * sizeof (u_int32_t) * 3);
+    = (uint32_t *) alloca (best_size * best_depth * sizeof (uint32_t) * 3);
   obstack_init (&string_pool);
 
   set_run = catalog->all_sets;
@@ -812,11 +787,11 @@ write_out (struct catalog *catalog, const char *output_name,
   /* We always write out the little endian version of the index
      arrays.  */
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-  write (fd, array1, best_size * best_depth * sizeof (u_int32_t) * 3);
-  write (fd, array2, best_size * best_depth * sizeof (u_int32_t) * 3);
+  write (fd, array1, best_size * best_depth * sizeof (uint32_t) * 3);
+  write (fd, array2, best_size * best_depth * sizeof (uint32_t) * 3);
 #elif __BYTE_ORDER == __BIG_ENDIAN
-  write (fd, array2, best_size * best_depth * sizeof (u_int32_t) * 3);
-  write (fd, array1, best_size * best_depth * sizeof (u_int32_t) * 3);
+  write (fd, array2, best_size * best_depth * sizeof (uint32_t) * 3);
+  write (fd, array1, best_size * best_depth * sizeof (uint32_t) * 3);
 #else
 # error Cannot handle __BYTE_ORDER byte order
 #endif
@@ -1034,7 +1009,8 @@ read_old (struct catalog *catalog, const char *file_name)
 
   /* OK, we have the catalog loaded.  Now read all messages and merge
      them.  When set and message number clash for any message the new
-     one is used.  */
+     one is used.  If the new one is empty it indicates that the
+     message should be deleted.  */
   for (cnt = 0; cnt < old_cat_obj.plane_size * old_cat_obj.plane_depth; ++cnt)
     {
       struct message_list *message, *last;
@@ -1043,7 +1019,7 @@ read_old (struct catalog *catalog, const char *file_name)
 	/* No message in this slot.  */
 	continue;
 
-      if (old_cat_obj.name_ptr[cnt * 3 + 0] - 1 != (u_int32_t) last_set)
+      if (old_cat_obj.name_ptr[cnt * 3 + 0] - 1 != (uint32_t) last_set)
 	{
 	  last_set = old_cat_obj.name_ptr[cnt * 3 + 0] - 1;
 	  set = find_set (catalog, old_cat_obj.name_ptr[cnt * 3 + 0] - 1);
@@ -1053,14 +1029,14 @@ read_old (struct catalog *catalog, const char *file_name)
       message = set->messages;
       while (message != NULL)
 	{
-	  if ((u_int32_t) message->number >= old_cat_obj.name_ptr[cnt * 3 + 1])
+	  if ((uint32_t) message->number >= old_cat_obj.name_ptr[cnt * 3 + 1])
 	    break;
 	  last = message;
 	  message = message->next;
 	}
 
       if (message == NULL
-	  || (u_int32_t) message->number > old_cat_obj.name_ptr[cnt * 3 + 1])
+	  || (uint32_t) message->number > old_cat_obj.name_ptr[cnt * 3 + 1])
 	{
 	  /* We have found a message which is not yet in the catalog.
 	     Insert it at the right position.  */
@@ -1082,5 +1058,14 @@ read_old (struct catalog *catalog, const char *file_name)
 
 	  ++catalog->total_messages;
 	}
+      else if (*message->message == '\0')
+	{
+	  /* The new empty message has overridden the old one thus
+	     "deleting" it as required.  Now remove the empty remains. */
+	  if (last == NULL)
+	    set->messages = message->next;
+	  else
+	    last->next = message->next;
+	}
     }
 }
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index aefa34f3fa..c5193e166d 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper, <drepper@gnu.org>.
 
@@ -84,89 +84,100 @@ __open_catalog (__nl_catd catalog)
       while (*run_nlspath != '\0')
 	{
 	  bufact = 0;
-	  while (*run_nlspath != ':' && *run_nlspath != '\0')
-	    if (*run_nlspath == '%')
-	      {
-		const char *tmp;
-
-		++run_nlspath;	/* We have seen the `%'.  */
-		switch (*run_nlspath++)
-		  {
-		  case 'N':
-		    /* Use the catalog name.  */
-		    len = strlen (catalog->cat_name);
-		    ENOUGH (len);
-		    memcpy (&buf[bufact], catalog->cat_name, len);
-		    bufact += len;
-		    break;
-		  case 'L':
-		    /* Use the current locale category value.  */
-		    len = strlen (catalog->env_var);
-		    ENOUGH (len);
-		    memcpy (&buf[bufact], catalog->env_var, len);
-		    bufact += len;
-		    break;
-		  case 'l':
-		    /* Use language element of locale category value.  */
-		    tmp = catalog->env_var;
-		    do
-		      {
-			ENOUGH (1);
-			buf[bufact++] = *tmp++;
-		      }
-		    while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
-		    break;
-		  case 't':
-		    /* Use territory element of locale category value.  */
-		    tmp = catalog->env_var;
-		    do
-		      ++tmp;
-		    while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
-		    if (*tmp == '_')
-		      {
+
+	  if (*run_nlspath == ':')
+	    {
+	      /* Leading colon or adjacent colons - treat same as %N.  */
+	      len = strlen (catalog->cat_name);
+	      ENOUGH (len);
+	      memcpy (&buf[bufact], catalog->cat_name, len);
+	      bufact += len;
+	    }
+	  else
+	    while (*run_nlspath != ':' && *run_nlspath != '\0')
+	      if (*run_nlspath == '%')
+		{
+		  const char *tmp;
+
+		  ++run_nlspath;	/* We have seen the `%'.  */
+		  switch (*run_nlspath++)
+		    {
+		    case 'N':
+		      /* Use the catalog name.  */
+		      len = strlen (catalog->cat_name);
+		      ENOUGH (len);
+		      memcpy (&buf[bufact], catalog->cat_name, len);
+		      bufact += len;
+		      break;
+		    case 'L':
+		      /* Use the current locale category value.  */
+		      len = strlen (catalog->env_var);
+		      ENOUGH (len);
+		      memcpy (&buf[bufact], catalog->env_var, len);
+		      bufact += len;
+		      break;
+		    case 'l':
+		      /* Use language element of locale category value.  */
+		      tmp = catalog->env_var;
+		      do
+			{
+			  ENOUGH (1);
+			  buf[bufact++] = *tmp++;
+			}
+		      while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
+		      break;
+		    case 't':
+		      /* Use territory element of locale category value.  */
+		      tmp = catalog->env_var;
+		      do
 			++tmp;
-			do
-			  {
-			    ENOUGH (1);
-			    buf[bufact++] = *tmp;
-			  }
-			while (*tmp != '\0' && *tmp != '.');
-		      }
-		    break;
-		  case 'c':
-		    /* Use code set element of locale category value.  */
-		    tmp = catalog->env_var;
-		    do
-		      ++tmp;
-		    while (*tmp != '\0' && *tmp != '.');
-		    if (*tmp == '.')
-		      {
+		      while (*tmp != '\0' && *tmp != '_' && *tmp != '.');
+		      if (*tmp == '_')
+			{
+			  ++tmp;
+			  do
+			    {
+			      ENOUGH (1);
+			      buf[bufact++] = *tmp++;
+			    }
+			  while (*tmp != '\0' && *tmp != '.');
+			}
+		      break;
+		    case 'c':
+		      /* Use code set element of locale category value.  */
+		      tmp = catalog->env_var;
+		      do
 			++tmp;
-			do
-			  {
-			    ENOUGH (1);
-			    buf[bufact++] = *tmp;
-			  }
-			while (*tmp != '\0');
-		      }
-		    break;
-		  case '%':
-		    ENOUGH (1);
-		    buf[bufact++] = '%';
-		    break;
-		  default:
-		    /* Unknown variable: ignore this path element.  */
-		    bufact = 0;
-		    while (*run_nlspath != '\0' && *run_nlspath != ':')
-		      ++run_nlspath;
-		    break;
-		  }
-	      }
-	    else
-	      {
-		ENOUGH (1);
-		buf[bufact++] = *run_nlspath++;
-	      }
+		      while (*tmp != '\0' && *tmp != '.');
+		      if (*tmp == '.')
+			{
+			  ++tmp;
+			  do
+			    {
+			      ENOUGH (1);
+			      buf[bufact++] = *tmp++;
+			    }
+			  while (*tmp != '\0');
+			}
+		      break;
+		    case '%':
+		      ENOUGH (1);
+		      buf[bufact++] = '%';
+		      break;
+		    default:
+		      /* Unknown variable: ignore this path element.  */
+		      bufact = 0;
+		      while (*run_nlspath != '\0' && *run_nlspath != ':')
+			++run_nlspath;
+		      break;
+		    }
+		}
+	      else
+		{
+		  ENOUGH (1);
+		  buf[bufact++] = *run_nlspath++;
+		}
+
 	  ENOUGH (1);
 	  buf[bufact] = '\0';