X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=error.c;h=a80810fb7e9abd974953238ff97a4903049684a5;hb=ccc6cda312fea9f0468ee65b8f368e9653e1380b;hp=5ffd4abc3e9459148124000cfaea9949d6cd5dc3;hpb=726f63884db0132f01745f1fb4465e6621088ccf;p=platform%2Fupstream%2Fbash.git diff --git a/error.c b/error.c index 5ffd4ab..a80810f 100644 --- a/error.c +++ b/error.c @@ -17,12 +17,22 @@ with Bash; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "config.h" + #include #include #include -#if defined (HAVE_VFPRINTF) -#include +#if defined (HAVE_UNISTD_H) +# include +#endif + +#if defined (PREFER_STDARG) +# include +#else +# if defined (PREFER_VARARGS) +# include +# endif #endif #include @@ -35,32 +45,53 @@ extern int errno; #include "error.h" #include "command.h" #include "general.h" +#include "externs.h" +#include "input.h" -extern int interactive_shell; +#if defined (HISTORY) +# include "bashhist.h" +#endif + +extern int interactive_shell, interactive; extern char *dollar_vars[]; extern char *shell_name; -extern char *the_current_maintainer; #if defined (JOB_CONTROL) extern pid_t shell_pgrp; +extern int give_terminal_to (); #endif /* JOB_CONTROL */ +/* The current maintainer of the shell. You change this in the + Makefile. */ +#if !defined (MAINTAINER) +#define MAINTAINER "bash-maintainers@prep.ai.mit.edu" +#endif + +char *the_current_maintainer = MAINTAINER; + /* Return the name of the shell or the shell script for error reporting. */ char * get_name_for_error () { - char *name = (char *) NULL; + char *name; - if (!interactive_shell) + name = (char *)NULL; + if (interactive_shell == 0) name = dollar_vars[0]; - if (!name && shell_name && *shell_name) + if (name == 0 && shell_name && *shell_name) name = base_pathname (shell_name); - if (!name) + if (name == 0) +#if defined (PROGRAM) + name = PROGRAM; +#else name = "bash"; +#endif return (name); } -/* Report an error having to do with FILENAME. */ +/* Report an error having to do with FILENAME. This does not use + sys_error so the filename is not interpreted as a printf-style + format string. */ void file_error (filename) char *filename; @@ -68,19 +99,31 @@ file_error (filename) report_error ("%s: %s", filename, strerror (errno)); } -#if !defined (HAVE_VFPRINTF) +#if !defined (USE_VARARGS) void programming_error (reason, arg1, arg2, arg3, arg4, arg5) char *reason; { + char *h; + #if defined (JOB_CONTROL) give_terminal_to (shell_pgrp); #endif /* JOB_CONTROL */ report_error (reason, arg1, arg2); + +#if defined (HISTORY) + if (remember_on_history) + { + h = last_history_line (); + fprintf (stderr, "last command: %s\n", h ? h : "(null)"); + } +#endif + fprintf (stderr, "Report this to %s\n", the_current_maintainer); fprintf (stderr, "Stopping myself..."); fflush (stderr); + abort (); } @@ -94,7 +137,34 @@ report_error (format, arg1, arg2, arg3, arg4, arg5) fprintf (stderr, "\n"); if (exit_immediately_on_error) exit (1); -} +} + +void +parser_error (lineno, format, arg1, arg2, arg3, arg4, arg5); + int lineno; + char *format; + va_dcl +{ + char *ename, *iname; + + ename = get_name_for_error (); + iname = bash_input.name ? bash_input.name : "stdin"; + + if (interactive) + fprintf (stderr, "%s: ", ename); + else if (interactive_shell) + fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno); + else if (STREQ (ename, iname)) + fprintf (stderr, "%s: line %d: ", ename, lineno); + else + fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno); + + fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5); + fprintf (stderr, "\n"); + + if (exit_immediately_on_error) + exit (2); +} void fatal_error (format, arg1, arg2, arg3, arg4, arg5) @@ -118,41 +188,78 @@ internal_error (format, arg1, arg2, arg3, arg4, arg5) fprintf (stderr, "\n"); } +void +sys_error (format, arg1, arg2, arg3, arg4, arg5) + char *format; +{ + fprintf (stderr, "%s: ", get_name_for_error ()); + + fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5); + fprintf (stderr, ": %s\n", strerror (errno)); +} + #else /* We have VARARGS support, so use it. */ void -programming_error (va_alist) +#if defined (PREFER_STDARG) +programming_error (const char *format, ...) +#else +programming_error (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; + char *h; #if defined (JOB_CONTROL) give_terminal_to (shell_pgrp); #endif /* JOB_CONTROL */ +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); +#if defined (HISTORY) + if (remember_on_history) + { + h = last_history_line (); + fprintf (stderr, "last command: %s\n", h ? h : "(null)"); + } +#endif + fprintf (stderr, "Tell %s to fix this someday.\n", the_current_maintainer); fprintf (stderr, "Stopping myself..."); fflush (stderr); + abort (); } void -report_error (va_alist) +#if defined (PREFER_STDARG) +report_error (const char *format, ...) +#else +report_error (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; fprintf (stderr, "%s: ", get_name_for_error ()); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -162,15 +269,24 @@ report_error (va_alist) } void -fatal_error (va_alist) +#if defined (PREFER_STDARG) +fatal_error (const char *format, ...) +#else +fatal_error (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; fprintf (stderr, "%s: ", get_name_for_error ()); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -179,30 +295,122 @@ fatal_error (va_alist) } void -internal_error (va_alist) +#if defined (PREFER_STDARG) +internal_error (const char *format, ...) +#else +internal_error (format, va_alist) + const char *format; + va_dcl +#endif +{ + va_list args; + + fprintf (stderr, "%s: ", get_name_for_error ()); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); +#endif + + vfprintf (stderr, format, args); + fprintf (stderr, "\n"); + + va_end (args); +} + +void +#if defined (PREFER_STDARG) +sys_error (const char *format, ...) +#else +sys_error (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; fprintf (stderr, "%s: ", get_name_for_error ()); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else + va_start (args); +#endif + + vfprintf (stderr, format, args); + fprintf (stderr, ": %s\n", strerror (errno)); + + va_end (args); +} + +/* An error from the parser takes the general form + + shell_name: input file name: line number: message + + The input file name and line number are omitted if the shell is + currently interactive. If the shell is not currently interactive, + the input file name is inserted only if it is different from the + shell name. */ +void +#if defined (PREFER_STDARG) +parser_error (int lineno, const char *format, ...) +#else +parser_error (lineno, format, va_alist) + int lineno; + const char *format; + va_dcl +#endif +{ + va_list args; + char *ename, *iname; + + ename = get_name_for_error (); + iname = bash_input.name ? bash_input.name : "stdin"; + + if (interactive) + fprintf (stderr, "%s: ", ename); + else if (interactive_shell) + fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno); + else if (STREQ (ename, iname)) + fprintf (stderr, "%s: line %d: ", ename, lineno); + else + fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); + + if (exit_immediately_on_error) + exit (2); } -itrace (va_alist) +void +#if defined (PREFER_STDARG) +itrace (const char *format, ...) +#else +itrace (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; - fprintf(stderr, "TRACE: pid %d: ", getpid()); + fprintf(stderr, "TRACE: pid %d: ", (int)getpid()); + +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -214,11 +422,16 @@ itrace (va_alist) #if 0 /* A trace function for silent debugging -- doesn't require a control terminal. */ -trace (va_alist) +void +#if defined (PREFER_STDARG) +trace (const char *format, ...) +#else +trace (format, va_alist) + const char *format; va_dcl +#endif { va_list args; - char *format; static FILE *tracefp = (FILE *)NULL; if (tracefp == NULL) @@ -231,8 +444,12 @@ trace (va_alist) fprintf(tracefp, "TRACE: pid %d: ", getpid()); +#if defined (PREFER_STDARG) + va_start (args, format); +#else va_start (args); - format = va_arg (args, char *); +#endif + vfprintf (tracefp, format, args); fprintf (tracefp, "\n"); @@ -240,5 +457,6 @@ trace (va_alist) fflush(tracefp); } -#endif -#endif /* HAVE_VFPRINTF */ +#endif /* 0 */ + +#endif /* USE_VARARGS */