summary refs log tree commit diff
path: root/catgets
diff options
context:
space:
mode:
Diffstat (limited to 'catgets')
-rw-r--r--catgets/gencat.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/catgets/gencat.c b/catgets/gencat.c
index ff535dec1d..175f1ffd09 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -197,7 +197,7 @@ main (int argc, char *argv[])
   if (result != NULL)
     write_out (result, output_name, header_name);
 
-  return EXIT_SUCCESS;
+  return error_message_count != 0;
 }
 
 
@@ -613,11 +613,40 @@ this is the first definition"));
 		{
 		  /* 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;
+		  if (runp->symbol == NULL)
+		    {
+		      /* The existing message had its number specified
+			 by the user.  Fatal collision type uh, oh.  */
+		      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;
+		    }
+		  else
+		    {
+		      /* Collision was with number auto-assigned to a
+			 symbolic.  Change existing symbolic number
+			 and move to end the list (if not already there).  */
+		      runp->number = ++current->current_set->last_message;
+
+		      if (runp->next != NULL)
+			{
+			  struct message_list *endp;
+
+			  if (lastp == NULL)
+			    current->current_set->messages=runp->next;
+			  else
+			    lastp->next=runp->next;
+
+			  endp = runp->next;
+			  while (endp->next != NULL)
+			    endp = endp->next;
+
+			  endp->next = runp;
+			  runp->next = NULL;
+			}
+		    }
 		}
 	      ident = NULL;	/* We don't have a symbol.  */