bfd_set_error
SYNOPSIS
- void bfd_set_error (bfd_error_type error_tag, ...);
+ void bfd_set_error (bfd_error_type error_tag);
DESCRIPTION
Set the BFD error condition to be @var{error_tag}.
- If @var{error_tag} is bfd_error_on_input, then this function
- takes two more parameters, the input bfd where the error
- occurred, and the bfd_error_type error.
+
+ @var{error_tag} must not be bfd_error_on_input. Use
+ bfd_set_input_error for input errors instead.
*/
void
-bfd_set_error (bfd_error_type error_tag, ...)
+bfd_set_error (bfd_error_type error_tag)
{
bfd_error = error_tag;
- if (error_tag == bfd_error_on_input)
- {
- /* This is an error that occurred during bfd_close when
- writing an archive, but on one of the input files. */
- va_list ap;
-
- va_start (ap, error_tag);
- input_bfd = va_arg (ap, bfd *);
- input_error = (bfd_error_type) va_arg (ap, int);
- if (input_error >= bfd_error_on_input)
- abort ();
- va_end (ap);
- }
+ if (bfd_error >= bfd_error_on_input)
+ abort ();
+}
+
+/*
+FUNCTION
+ bfd_set_input_error
+
+SYNOPSIS
+ void bfd_set_input_error (bfd *input, bfd_error_type error_tag);
+
+DESCRIPTION
+
+ Set the BFD error condition to be bfd_error_on_input.
+ @var{input} is the input bfd where the error occurred, and
+ @var{error_tag} the bfd_error_type error.
+*/
+
+void
+bfd_set_input_error (bfd *input, bfd_error_type error_tag)
+{
+ /* This is an error that occurred during bfd_close when writing an
+ archive, but on one of the input files. */
+ bfd_error = bfd_error_on_input;
+ input_bfd = input;
+ input_error = error_tag;
+ if (input_error >= bfd_error_on_input)
+ abort ();
}
/*
static const char *_bfd_error_program_name;
-/* This macro and _doprnt taken from libiberty _doprnt.c, tidied a
- little and extended to handle '%A' and '%B'. 'L' as a modifer for
- integer formats is used for bfd_vma and bfd_size_type args, which
- vary in size depending on BFD configuration. */
+/* This macro and _bfd_doprnt (originally _doprint) taken from
+ libiberty _doprnt.c, tidied a little and extended to handle '%A'
+ and '%B'. 'L' as a modifer for integer formats is used for bfd_vma
+ and bfd_size_type args, which vary in size depending on BFD
+ configuration. */
#define PRINT_TYPE(TYPE) \
do \
} while (0)
static int
-_doprnt (FILE *stream, const char *format, va_list ap)
+_bfd_doprnt (FILE *stream, const char *format, va_list ap)
{
const char *ptr = format;
char specifier[128];
{
/* L modifier for bfd_vma or bfd_size_type may be
either long long or long. */
- if ((BFD_ARCH_SIZE < 64 || BFD_HOST_64BIT_LONG)
- && sptr[-2] == 'L')
- wide_width = 1;
+ if (sptr[-2] == 'L')
+ {
+ sptr[-2] = 'l';
+ if (BFD_ARCH_SIZE < 64 || BFD_HOST_64BIT_LONG)
+ wide_width = 1;
+ else
+ {
+ sptr[-1] = 'l';
+ *sptr++ = ptr[-1];
+ *sptr = '\0';
+ }
+ }
switch (wide_width)
{
break;
case 2:
default:
-#if defined (__GNUC__) || defined (HAVE_LONG_LONG)
-# if defined (__MSVCRT__)
- sptr--;
- while (sptr[-1] == 'L' || sptr[-1] == 'l')
- sptr--;
- *sptr++ = 'I';
- *sptr++ = '6';
- *sptr++ = '4';
+#if defined (__MSVCRT__)
+ sptr[-3] = 'I';
+ sptr[-2] = '6';
+ sptr[-1] = '4';
*sptr++ = ptr[-1];
*sptr = '\0';
-# endif
+#endif
+#if defined (__GNUC__) || defined (HAVE_LONG_LONG)
PRINT_TYPE (long long);
#else
/* Fake it and hope for the best. */
else
fprintf (stderr, "BFD: ");
- _doprnt (stderr, fmt, ap);
+ _bfd_doprnt (stderr, fmt, ap);
/* On AIX, putc is implemented as a macro that triggers a -Wunused-value
warning, so use the fputc function to avoid it. */