about summary refs log tree commit diff
path: root/locale/programs/ld-messages.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-09-12 08:28:56 +0000
committerUlrich Drepper <drepper@redhat.com>1999-09-12 08:28:56 +0000
commitb9eb05d6bfd4c42c8ea614b77cbc50d95fee51d1 (patch)
tree7d42913f77a3db0fe5f54807a248578fe747e3d1 /locale/programs/ld-messages.c
parent0f0e233c0e6a7c3df341566bbbd60917439f9cc9 (diff)
downloadglibc-b9eb05d6bfd4c42c8ea614b77cbc50d95fee51d1.tar.gz
glibc-b9eb05d6bfd4c42c8ea614b77cbc50d95fee51d1.tar.xz
glibc-b9eb05d6bfd4c42c8ea614b77cbc50d95fee51d1.zip
Update.
1999-09-12  Ulrich Drepper  <drepper@cygnus.com>

	* locale/programs/ld-address.c: Fix handling of non-existing
	definitions for this category.  Correctly ignore content of this
	category is this is necessary.
	* locale/programs/ld-collate.c: Likewise.
	* locale/programs/ld-ctype.c: Likewise.
	* locale/programs/ld-identification.c: Likewise.
	* locale/programs/ld-measurement.c: Likewise.
	* locale/programs/ld-messages.c: Likewise.
	* locale/programs/ld-monetary.c: Likewise.
	* locale/programs/ld-name.c: Likewise.
	* locale/programs/ld-numeric.c: Likewise.
	* locale/programs/ld-paper.c: Likewise.
	* locale/programs/ld-telephone.c: Likewise.
	* locale/programs/ld-time.c: Likewise.
	* locale/programs/locfile.h (handle_copy): Take extra parameter
	with result pointer.  Fill in name of locale from which to copy.
	Correctly read token after `END'.

	* locale/programs/localedef.c (main): Correct handling copy.
	(add_to_readlist): Take extra parameter which says whether we
	are supposed to read the file or not.
	(find_locale): Call add_to_readlist with extra parameter set to 0.

	* locale/programs/localedef.h (struct localedef_t): Use __LC_LAST
	instead of wrong number in array definitions.
	(add_to_readlist): Update prototype.

	* locale/programs/locfile.c (locfile_read): Mark categories not
	available in source file as read.
	(write_all_categories): Fix typo.
Diffstat (limited to 'locale/programs/ld-messages.c')
-rw-r--r--locale/programs/ld-messages.c57
1 files changed, 51 insertions, 6 deletions
diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c
index 33b7735b7d..159c9c7897 100644
--- a/locale/programs/ld-messages.c
+++ b/locale/programs/ld-messages.c
@@ -54,8 +54,11 @@ messages_startup (struct linereader *lr, struct localedef_t *locale,
       (struct locale_messages_t *) xcalloc (1,
 					    sizeof (struct locale_messages_t));
 
-  lr->translate_strings = 1;
-  lr->return_widestr = 0;
+  if (lr != NULL)
+    {
+      lr->translate_strings = 1;
+      lr->return_widestr = 0;
+    }
 }
 
 
@@ -64,6 +67,40 @@ messages_finish (struct localedef_t *locale, struct charmap_t *charmap)
 {
   struct locale_messages_t *messages
     = locale->categories[LC_MESSAGES].messages;
+  int nothing = 0;
+
+  /* Now resolve copying and also handle completely missing definitions.  */
+  if (messages == NULL)
+    {
+      /* First see whether we were supposed to copy.  If yes, find the
+	 actual definition.  */
+      if (locale->copy_name[LC_MESSAGES] != NULL)
+	{
+	  /* Find the copying locale.  This has to happen transitively since
+	     the locale we are copying from might also copying another one.  */
+	  struct localedef_t *from = locale;
+
+	  do
+	    from = find_locale (LC_MESSAGES, from->copy_name[LC_MESSAGES],
+				from->repertoire_name, charmap);
+	  while (from->categories[LC_MESSAGES].messages == NULL
+		 && from->copy_name[LC_MESSAGES] != NULL);
+
+	  messages = locale->categories[LC_MESSAGES].messages
+	    = from->categories[LC_MESSAGES].messages;
+	}
+
+      /* If there is still no definition issue an warning and create an
+	 empty one.  */
+      if (messages == NULL)
+	{
+	  error (0, 0, _("No definition for %s category found"),
+		 "LC_MESSAGES");
+	  messages_startup (NULL, locale, 0);
+	  messages = locale->categories[LC_MESSAGES].messages;
+	  nothing = 1;
+	}
+    }
 
   /* The fields YESSTR and NOSTR are optional.  */
   if (messages->yesstr == NULL)
@@ -73,7 +110,7 @@ messages_finish (struct localedef_t *locale, struct charmap_t *charmap)
 
   if (messages->yesexpr == NULL)
     {
-      if (!be_quiet)
+      if (! be_quiet && ! nothing)
 	error (0, 0, _("%s: field `%s' undefined"), "LC_MESSAGES", "yesexpr");
       messages->yesexpr = "";
     }
@@ -106,7 +143,7 @@ messages_finish (struct localedef_t *locale, struct charmap_t *charmap)
 
   if (messages->noexpr == NULL)
     {
-      if (!be_quiet)
+      if (! be_quiet && ! nothing)
 	error (0, 0, _("%s: field `%s' undefined"), "LC_MESSAGES", "noexpr");
       messages->noexpr = "";
     }
@@ -215,8 +252,8 @@ messages_read (struct linereader *ldfile, struct localedef_t *result,
   /* If we see `copy' now we are almost done.  */
   if (nowtok == tok_copy)
     {
-      handle_copy (ldfile, charmap, repertoire, tok_lc_messages, LC_MESSAGES,
-		   "LC_MESSAGES", ignore_content);
+      handle_copy (ldfile, charmap, repertoire, result, tok_lc_messages,
+		   LC_MESSAGES, "LC_MESSAGES", ignore_content);
       return;
     }
 
@@ -244,6 +281,14 @@ messages_read (struct linereader *ldfile, struct localedef_t *result,
 	{
 #define STR_ELEM(cat) \
 	case tok_##cat:							      \
+	  /* Ignore the rest of the line if we don't need the input of	      \
+	     this line.  */						      \
+	  if (ignore_content)						      \
+	    {								      \
+	      lr_ignore_rest (ldfile, 0);				      \
+	      break;							      \
+	    }								      \
+									      \
 	  if (messages->cat != NULL)					      \
 	    {								      \
 	      lr_error (ldfile, _("\