Fix problems translating messages when a percentage sign appears at the end of a string.

PR 28051
gas	* config/tc-i386.c (offset_in_range): Reformat error messages in
	order to fix problems when translating.
	(md_assemble): Likewise.
	* messages.c (as_internal_value_out_of_range): Likewise.
	* read.c (emit_expr_with_reloc): Likewise.
	* testsuite/gas/all/overflow.l Change expected output format.
	* po/gas.pot: Regenerate.

bfd	* coff-rs6000.c (xcoff_reloc_type_tls): Reformat error messages in
	order to fix problems when translating.
	* cofflink.c (_bfd_coff_write_global_sym): Likewise.
	* elfnn-aarch64.c (_bfd_aarch64_erratum_843419_branch_to_stub):
	Likewise.
	* po/bfd.pot: Regenerate.
This commit is contained in:
Nick Clifton
2021-07-07 10:25:41 +01:00
parent 1f00b55dba
commit ffa5352c0c
11 changed files with 479 additions and 403 deletions

View File

@ -366,9 +366,15 @@ as_internal_value_out_of_range (const char *prefix,
offsetT max,
const char *file,
unsigned line,
int bad)
bool bad)
{
const char * err;
/* These buffer sizes are excessive, but better to be safe than sorry.
Note - these buffers are used in order to make the error message
string translateable. */
char val_buf [128];
char min_buf [128];
char max_buf [128];
if (prefix == NULL)
prefix = "";
@ -380,41 +386,38 @@ as_internal_value_out_of_range (const char *prefix,
if (max <= 1)
abort ();
sprintf (val_buf, "%" BFD_VMA_FMT "d", val);
sprintf (min_buf, "%" BFD_VMA_FMT "d", right);
/* xgettext:c-format */
err = _("%s out of domain (%" BFD_VMA_FMT "d is not a multiple of %" \
BFD_VMA_FMT "d)");
err = _("%s out of domain (%s is not a multiple of %s)");
if (bad)
as_bad_where (file, line, err, prefix, val, right);
as_bad_where (file, line, err, prefix, val_buf, min_buf);
else
as_warn_where (file, line, err, prefix, val, right);
return;
as_warn_where (file, line, err, prefix, val_buf, min_buf);
}
if ( val < HEX_MAX_THRESHOLD
&& min < HEX_MAX_THRESHOLD
&& max < HEX_MAX_THRESHOLD
&& val > HEX_MIN_THRESHOLD
&& min > HEX_MIN_THRESHOLD
&& max > HEX_MIN_THRESHOLD)
else if ( val < HEX_MAX_THRESHOLD
&& min < HEX_MAX_THRESHOLD
&& max < HEX_MAX_THRESHOLD
&& val > HEX_MIN_THRESHOLD
&& min > HEX_MIN_THRESHOLD
&& max > HEX_MIN_THRESHOLD)
{
/* xgettext:c-format */
err = _("%s out of range (%" BFD_VMA_FMT "d is not between %" \
BFD_VMA_FMT "d and %" BFD_VMA_FMT "d)");
sprintf (val_buf, "%" BFD_VMA_FMT "d", val);
sprintf (min_buf, "%" BFD_VMA_FMT "d", min);
sprintf (max_buf, "%" BFD_VMA_FMT "d", max);
/* xgettext:c-format. */
err = _("%s out of range (%s is not between %s and %s)");
if (bad)
as_bad_where (file, line, err, prefix, val, min, max);
as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
else
as_warn_where (file, line, err, prefix, val, min, max);
as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
}
else
{
char val_buf [sizeof (val) * 3 + 2];
char min_buf [sizeof (val) * 3 + 2];
char max_buf [sizeof (val) * 3 + 2];
if (sizeof (val) > sizeof (bfd_vma))
abort ();
sprintf_vma (val_buf, (bfd_vma) val);
sprintf_vma (min_buf, (bfd_vma) min);
sprintf_vma (max_buf, (bfd_vma) max);
@ -437,7 +440,7 @@ as_warn_value_out_of_range (const char *prefix,
const char *file,
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
as_internal_value_out_of_range (prefix, value, min, max, file, line, false);
}
void
@ -448,5 +451,5 @@ as_bad_value_out_of_range (const char *prefix,
const char *file,
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);
as_internal_value_out_of_range (prefix, value, min, max, file, line, true);
}