__open_catalog (&old_cat_obj, 0);
__open_catalog (&old_cat_obj);
read_old (struct catalog *catalog, const char *file_name){  struct catalog_info old_cat_obj;  struct set_list *set = NULL;  int last_set = -1;  size_t cnt;  old_cat_obj.status = closed;  old_cat_obj.cat_name = file_name;  /* Try to open catalog, but don't look through the NLSPATH.  */  __open_catalog (&old_cat_obj, 0);  if (old_cat_obj.status != mmapped && old_cat_obj.status != malloced)    if (errno == ENOENT)      /* No problem, the catalog simply does not exist.  */      return;    else      error (EXIT_FAILURE, errno, gettext ("while opening old catalog file"));  /* 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.  */  for (cnt = 0; cnt < old_cat_obj.plane_size * old_cat_obj.plane_depth; ++cnt)    {      struct message_list *message, *last;      if (old_cat_obj.name_ptr[cnt * 3 + 0] == 0)	/* No message in this slot.  */	continue;      if (old_cat_obj.name_ptr[cnt * 3 + 0] - 1 != (u_int32_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);	}      last = NULL;      message = set->messages;      while (message != NULL)	{	  if ((u_int32_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])	{	  /* We have found a message which is not yet in the catalog.	     Insert it at the right position.  */	  struct message_list *newp;	  newp = (struct message_list *) xmalloc (sizeof(*newp));	  newp->number = old_cat_obj.name_ptr[cnt * 3 + 1];	  newp->message =	    &old_cat_obj.strings[old_cat_obj.name_ptr[cnt * 3 + 2]];	  newp->fname = NULL;	  newp->line = 0;	  newp->symbol = NULL;	  newp->next = message;	  if (last == NULL)	    set->messages = newp;	  else	    last->next = newp;	  ++catalog->total_messages;	}    }}