lr_error (lr, _("<%s> and <%s> are invalid names for range"));
lr_error (lr, _("<%s> and <%s> are invalid names for range"), from, to);
repertoire_new_char (struct linereader *lr, hash_table *ht, hash_table *rt,		     struct obstack *ob, uint32_t value, const char *from,		     const char *to, int decimal_ellipsis){  char *from_end;  char *to_end;  const char *cp;  char *buf = NULL;  int prefix_len, len1, len2;  unsigned int from_nr, to_nr, cnt;  if (to == NULL)    {      insert_entry (ht, from, strlen (from),		    (void *) (unsigned long int) value);      /* Please note that it isn't a bug if a symbol is defined more	 than once.  All later definitions are simply discarded.  */      insert_entry (rt, obstack_copy (ob, &value, sizeof (value)),		    sizeof (value), (void *) from);      return;    }  /* We have a range: the names must have names with equal prefixes     and an equal number of digits, where the second number is greater     or equal than the first.  */  len1 = strlen (from);  len2 = strlen (to);  if (len1 != len2)    {    invalid_range:      lr_error (lr, _("invalid names for character range"));      return;    }  cp = &from[len1 - 1];  if (decimal_ellipsis)    while (isdigit (*cp) && cp >= from)      --cp;  else    while (isxdigit (*cp) && cp >= from)      {	if (!isdigit (*cp) && !isupper (*cp))	  lr_error (lr, _("\hexadecimal range format should use only capital characters"));	--cp;      }  prefix_len = (cp - from) + 1;  if (cp == &from[len1 - 1] || strncmp (from, to, prefix_len) != 0)    goto invalid_range;  errno = 0;  from_nr = strtoul (&from[prefix_len], &from_end, decimal_ellipsis ? 10 : 16);  if (*from_end != '\0' || (from_nr == ULONG_MAX && errno == ERANGE)      || ((to_nr = strtoul (&to[prefix_len], &to_end,			    decimal_ellipsis ? 10 : 16)) == ULONG_MAX          && errno == ERANGE)      || *to_end != '\0')    {      lr_error (lr, _("<%s> and <%s> are invalid names for range"));      return;    }  if (from_nr > to_nr)    {      lr_error (lr, _("upper limit in range is not smaller then lower limit"));      return;    }  for (cnt = from_nr; cnt <= to_nr; ++cnt)    {      uint32_t this_value = value + (cnt - from_nr);      obstack_printf (ob, decimal_ellipsis ? "%.*s%0*d" : "%.*s%0*X",		      prefix_len, from, len1 - prefix_len, cnt);      insert_entry (ht, buf, len1,		    (void *) (unsigned long int) this_value);      /* Please note we don't examine the return value since it is no error	 if we have two definitions for a symbol.  */      insert_entry (rt, obstack_copy (ob, &this_value, sizeof (this_value)),		    sizeof (this_value), (void *) from);    }}