diff options
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/bfd.c | 48 |
2 files changed, 40 insertions, 12 deletions
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index dbafcf8..3791784 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2557,6 +2557,10 @@ void bfd_perror (const char *message); typedef void (*bfd_error_handler_type) (const char *, va_list); +typedef int (*bfd_print_callback) (void *, const char *, ...); +void bfd_print_error (bfd_print_callback print_func, + void *stream, const char *fmt, va_list ap); + void _bfd_error_handler (const char *fmt, ...) ATTRIBUTE_PRINTF_1; bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type); @@ -1000,10 +1000,13 @@ union _bfd_doprnt_args result = print (stream, specifier, value); \ } while (0) -typedef int (*print_func) (void *, const char *, ...); +/* +CODE_FRAGMENT +.typedef int (*bfd_print_callback) (void *, const char *, ...); +*/ static int -_bfd_doprnt (print_func print, void *stream, const char *format, +_bfd_doprnt (bfd_print_callback print, void *stream, const char *format, union _bfd_doprnt_args *args) { const char *ptr = format; @@ -1446,21 +1449,44 @@ _bfd_doprnt_scan (const char *format, va_list ap, union _bfd_doprnt_args *args) return arg_count; } -/* The standard error handler that prints to stderr. */ +/* +FUNCTION + bfd_print_error -static void -error_handler_fprintf (const char *fmt, va_list ap) +SYNOPSIS + void bfd_print_error (bfd_print_callback print_func, + void *stream, const char *fmt, va_list ap); + +DESCRIPTION + + This formats FMT and AP according to BFD "printf" rules, + sending the output to STREAM by repeated calls to PRINT_FUNC. + PRINT_FUNC is a printf-like function; it does not need to + implement the BFD printf format extensions. This can be used + in a callback that is set via bfd_set_error_handler to turn + the error into ordinary output. +*/ + +void +bfd_print_error (bfd_print_callback print_func, void *stream, + const char *fmt, va_list ap) { union _bfd_doprnt_args args[MAX_ARGS]; + print_func (stream, "%s: ", _bfd_get_error_program_name ()); _bfd_doprnt_scan (fmt, ap, args); + _bfd_doprnt (print_func, stream, fmt, args); +} +/* The standard error handler that prints to stderr. */ + +static void +error_handler_fprintf (const char *fmt, va_list ap) +{ /* PR 4992: Don't interrupt output being sent to stdout. */ fflush (stdout); - fprintf (stderr, "%s: ", _bfd_get_error_program_name ()); - - _bfd_doprnt ((print_func) fprintf, stderr, fmt, args); + bfd_print_error ((bfd_print_callback) fprintf, 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. */ @@ -1512,15 +1538,13 @@ static bfd *error_handler_bfd; static void error_handler_sprintf (const char *fmt, va_list ap) { - union _bfd_doprnt_args args[MAX_ARGS]; char error_buf[1024]; struct buf_stream error_stream; - _bfd_doprnt_scan (fmt, ap, args); - error_stream.ptr = error_buf; error_stream.left = sizeof (error_buf); - _bfd_doprnt (err_sprintf, &error_stream, fmt, args); + + bfd_print_error (err_sprintf, &error_stream, fmt, ap); size_t len = error_stream.ptr - error_buf; struct per_xvec_message **warn |