X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fmessages.c;h=cb544136bddc66110b166685938d4b3ed8fb6e24;hb=7699bb0ba2d5db5e0f40938ba9b1ca07a8e42da7;hp=ef07fc4ac1f530d83aa6bbfb1d9c1899454b940d;hpb=6efd877de5ab683fc5d7c216049f9f888bf18828;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/messages.c b/gas/messages.c index ef07fc4ac1..cb544136bd 100644 --- a/gas/messages.c +++ b/gas/messages.c @@ -17,7 +17,7 @@ along with GAS; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include /* define stderr */ +#include #include #include "as.h" @@ -36,6 +36,12 @@ #endif /* NO_VARARGS */ #endif /* NO_STDARG */ +extern char *strerror (); + +static void as_show_where PARAMS ((void)); +static void as_warn_internal PARAMS ((char *, unsigned int, char *)); +static void as_bad_internal PARAMS ((char *, unsigned int, char *)); + /* * Despite the rest of the comments in this file, (FIXME-SOON), * here is the current scheme for error messages etc: @@ -74,29 +80,23 @@ * continues as though no error occurred. */ -/* - ERRORS - - JF: this is now bogus. We now print more standard error messages - that try to look like everyone else's. - - We print the error message 1st, beginning in column 1. - All ancillary info starts in column 2 on lines after the - key error text. - We try to print a location in logical and physical file - just after the main error text. - Caller then prints any appendices after that, begining all - lines with at least 1 space. - - Optionally, we may die. - There is no need for a trailing '\n' in your error text format - because we supply one. - - as_warn(fmt,args) Like fprintf(stderr,fmt,args) but also call errwhere(). +static void +identify (file) + char *file; +{ + static int identified; + if (identified) + return; + identified++; - as_fatal(fmt,args) Like as_warn() but exit with a fatal status. + if (!file) + { + unsigned int x; + as_where (&file, &x); + } - */ + fprintf (stderr, "%s: Assembler messages:\n", file); +} static int warning_count; /* Count of number of warnings issued */ @@ -118,25 +118,45 @@ had_errors () } /* had_errors() */ +/* Print the current location to stderr. */ + +static void +as_show_where () +{ + char *file; + unsigned int line; + + as_where (&file, &line); + identify (file); + fprintf (stderr, "%s:%u: ", file, line); +} + /* * a s _ p e r r o r * * Like perror(3), but with more info. */ + void as_perror (gripe, filename) - char *gripe; /* Unpunctuated error theme. */ - char *filename; + const char *gripe; /* Unpunctuated error theme. */ + const char *filename; { -#ifndef HAVE_STRERROR - extern char *strerror (); -#endif /* HAVE_STRERROR */ + const char *errtxt; - as_where (); + as_show_where (); fprintf (stderr, gripe, filename); - fprintf (stderr, ": %s\n", strerror (errno)); - errno = 0; /* After reporting, clear it. */ -} /* as_perror() */ +#ifdef BFD_ASSEMBLER + errtxt = bfd_errmsg (bfd_get_error ()); +#else + errtxt = strerror (errno); +#endif + fprintf (stderr, ": %s\n", errtxt); + errno = 0; +#ifdef BFD_ASSEMBLER + bfd_set_error (bfd_error_no_error); +#endif +} /* * a s _ t s k t s k () @@ -149,13 +169,13 @@ as_perror (gripe, filename) #ifndef NO_STDARG void -as_tsktsk (const char *Format,...) +as_tsktsk (const char *format,...) { va_list args; - as_where (); - va_start (args, Format); - vfprintf (stderr, Format, args); + as_show_where (); + va_start (args, format); + vfprintf (stderr, format, args); va_end (args); (void) putc ('\n', stderr); } /* as_tsktsk() */ @@ -163,33 +183,54 @@ as_tsktsk (const char *Format,...) #else #ifndef NO_VARARGS void -as_tsktsk (Format, va_alist) - char *Format; +as_tsktsk (format, va_alist) + char *format; va_dcl { va_list args; - as_where (); + as_show_where (); va_start (args); - vfprintf (stderr, Format, args); + vfprintf (stderr, format, args); va_end (args); (void) putc ('\n', stderr); } /* as_tsktsk() */ #else /*VARARGS1 */ -as_tsktsk (Format, args) - char *Format; +as_tsktsk (format, args) + char *format; { - as_where (); - _doprnt (Format, &args, stderr); + as_show_where (); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); - /* as_where(); */ } /* as_tsktsk */ #endif /* not NO_VARARGS */ #endif /* not NO_STDARG */ +/* The common portion of as_warn and as_warn_where. */ + +static void +as_warn_internal (file, line, buffer) + char *file; + unsigned int line; + char *buffer; +{ + ++warning_count; + + if (file == NULL) + as_where (&file, &line); + + identify (file); + fprintf (stderr, "%s:%u: Warning: ", file, line); + fputs (buffer, stderr); + (void) putc ('\n', stderr); +#ifndef NO_LISTING + listing_warning (buffer); +#endif +} + /* * a s _ w a r n () * @@ -201,32 +242,84 @@ as_tsktsk (Format, args) #ifndef NO_STDARG void -as_warn (const char *Format,...) +as_warn (const char *format,...) +{ + va_list args; + char buffer[200]; + + if (!flagseen['W']) + { + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal ((char *) NULL, 0, buffer); + } +} /* as_warn() */ + +#else +#ifndef NO_VARARGS +void +as_warn (format, va_alist) + char *format; + va_dcl { va_list args; char buffer[200]; + if (!flagseen['W']) + { + va_start (args); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal ((char *) NULL, 0, buffer); + } +} /* as_warn() */ + +#else +/*VARARGS1 */ +as_warn (format, args) + char *format; +{ if (!flagseen['W']) { ++warning_count; - as_where (); - va_start (args, Format); + as_show_where (); fprintf (stderr, "Warning: "); - vsprintf (buffer, Format, args); - fputs (buffer, stderr); -#ifndef NO_LISTING - listing_warning (buffer); -#endif - va_end (args); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); } } /* as_warn() */ +#endif /* not NO_VARARGS */ +#endif /* not NO_STDARG */ + +/* as_warn_where, like as_bad but the file name and line number are + passed in. Unfortunately, we have to repeat the function in order + to handle the varargs correctly and portably. */ + +#ifndef NO_STDARG +void +as_warn_where (char *file, unsigned int line, const char *format,...) +{ + va_list args; + char buffer[200]; + + if (!flagseen['W']) + { + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal (file, line, buffer); + } +} /* as_warn() */ + #else #ifndef NO_VARARGS void -as_warn (Format, va_alist) - char *Format; +as_warn_where (file, line, format, va_alist) + char *file; + unsigned int line; + char *format; va_dcl { va_list args; @@ -234,39 +327,55 @@ as_warn (Format, va_alist) if (!flagseen['W']) { - ++warning_count; - as_where (); va_start (args); - fprintf (stderr, "Warning: "); - vsprintf (buffer, Format, args); - fputs (buffer, stderr); -#ifndef NO_LISTING - listing_warning (buffer); -#endif + vsprintf (buffer, format, args); va_end (args); - (void) putc ('\n', stderr); + as_warn_internal (file, line, buffer); } } /* as_warn() */ #else /*VARARGS1 */ -as_warn (Format, args) - char *Format; +as_warn_where (file, line, format, args) + char *file; + unsigned int line; + char *format; { - /* -W supresses warning messages. */ if (!flagseen['W']) { ++warning_count; - as_where (); - _doprnt (Format, &args, stderr); + identify (file); + fprintf (stderr, "%s:%u: Warning: ", file, line); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); - /* as_where(); */ } } /* as_warn() */ #endif /* not NO_VARARGS */ #endif /* not NO_STDARG */ +/* The common portion of as_bad and as_bad_where. */ + +static void +as_bad_internal (file, line, buffer) + char *file; + unsigned int line; + char *buffer; +{ + ++error_count; + + if (file == NULL) + as_where (&file, &line); + + identify (file); + fprintf (stderr, "%s:%u: Error: ", file, line); + fputs (buffer, stderr); + (void) putc ('\n', stderr); +#ifndef NO_LISTING + listing_error (buffer); +#endif +} + /* * a s _ b a d () * @@ -278,60 +387,101 @@ as_warn (Format, args) #ifndef NO_STDARG void -as_bad (const char *Format,...) +as_bad (const char *format,...) { va_list args; char buffer[200]; - ++error_count; - as_where (); - va_start (args, Format); - fprintf (stderr, "Error: "); + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); - vsprintf (buffer, Format, args); - fputs (buffer, stderr); -#ifndef NO_LISTING - listing_error (buffer); -#endif + as_bad_internal ((char *) NULL, 0, buffer); +} + +#else +#ifndef NO_VARARGS +void +as_bad (format, va_alist) + char *format; + va_dcl +{ + va_list args; + char buffer[200]; + + va_start (args); + vsprintf (buffer, format, args); va_end (args); + + as_bad_internal ((char *) NULL, 0, buffer); +} + +#else +/*VARARGS1 */ +as_bad (format, args) + char *format; +{ + ++error_count; + + as_show_where (); + fprintf (stderr, "Error: "); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); } /* as_bad() */ +#endif /* not NO_VARARGS */ +#endif /* not NO_STDARG */ + +/* as_bad_where, like as_bad but the file name and line number are + passed in. Unfortunately, we have to repeat the function in order + to handle the varargs correctly and portably. */ + +#ifndef NO_STDARG +void +as_bad_where (char *file, unsigned int line, const char *format,...) +{ + va_list args; + char buffer[200]; + + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + + as_bad_internal (file, line, buffer); +} + #else #ifndef NO_VARARGS void -as_bad (Format, va_alist) - char *Format; +as_bad_where (file, line, format, va_alist) + char *file; + unsigned int line; + char *format; va_dcl { va_list args; char buffer[200]; - ++error_count; - as_where (); va_start (args); - vsprintf (buffer, Format, args); - fputs (buffer, stderr); -#ifndef NO_LISTING - listing_error (buffer); -#endif - + vsprintf (buffer, format, args); va_end (args); - (void) putc ('\n', stderr); -} /* as_bad() */ + + as_bad_internal (file, line, buffer); +} #else /*VARARGS1 */ -as_bad (Format, args) - char *Format; +as_bad_where (file, line, format, args) + char *file; + unsigned int line; + char *format; { ++error_count; - as_where (); - fprintf (stderr, "Error: "); - _doprnt (Format, &args, stderr); + identify (file); + fprintf (stderr, "%s:%u: Error: ", file, line); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); - /* as_where(); */ } /* as_bad() */ #endif /* not NO_VARARGS */ @@ -348,14 +498,14 @@ as_bad (Format, args) #ifndef NO_STDARG void -as_fatal (const char *Format,...) +as_fatal (const char *format,...) { va_list args; - as_where (); - va_start (args, Format); - fprintf (stderr, "FATAL:"); - vfprintf (stderr, Format, args); + as_show_where (); + va_start (args, format); + fprintf (stderr, "Fatal error:"); + vfprintf (stderr, format, args); (void) putc ('\n', stderr); va_end (args); exit (33); @@ -364,16 +514,16 @@ as_fatal (const char *Format,...) #else #ifndef NO_VARARGS void -as_fatal (Format, va_alist) - char *Format; +as_fatal (format, va_alist) + char *format; va_dcl { va_list args; - as_where (); + as_show_where (); va_start (args); - fprintf (stderr, "FATAL:"); - vfprintf (stderr, Format, args); + fprintf (stderr, "Fatal error:"); + vfprintf (stderr, format, args); (void) putc ('\n', stderr); va_end (args); exit (33); @@ -381,18 +531,57 @@ as_fatal (Format, va_alist) #else /*VARARGS1 */ -as_fatal (Format, args) - char *Format; +as_fatal (format, args) + char *format; { - as_where (); - fprintf (stderr, "FATAL:"); - _doprnt (Format, &args, stderr); + as_show_where (); + fprintf (stderr, "Fatal error:"); + _doprnt (format, &args, stderr); (void) putc ('\n', stderr); - /* as_where(); */ exit (33); /* What is a good exit status? */ } /* as_fatal() */ #endif /* not NO_VARARGS */ #endif /* not NO_STDARG */ +void +fprint_value (file, val) + FILE *file; + valueT val; +{ + if (sizeof (val) <= sizeof (long)) + { + fprintf (file, "%ld", val); + return; + } +#ifdef BFD_ASSEMBLER + if (sizeof (val) <= sizeof (bfd_vma)) + { + fprintf_vma (file, val); + return; + } +#endif + abort (); +} + +void +sprint_value (buf, val) + char *buf; + valueT val; +{ + if (sizeof (val) <= sizeof (long)) + { + sprintf (buf, "%ld", val); + return; + } +#ifdef BFD_ASSEMBLER + if (sizeof (val) <= sizeof (bfd_vma)) + { + sprintf_vma (buf, val); + return; + } +#endif + abort (); +} + /* end of messages.c */