Imported from ../bash-2.0.tar.gz.

This commit is contained in:
Jari Aalto 1996-12-23 17:02:34 +00:00
commit ccc6cda312
502 changed files with 91988 additions and 69123 deletions

282
error.c
View file

@ -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 <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#if defined (HAVE_VFPRINTF)
#include <varargs.h>
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
#if defined (PREFER_STDARG)
# include <stdarg.h>
#else
# if defined (PREFER_VARARGS)
# include <varargs.h>
# endif
#endif
#include <errno.h>
@ -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;
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");
va_end (args);
}
itrace (va_alist)
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, "TRACE: pid %d: ", getpid());
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, ": %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);
#endif
vfprintf (stderr, format, args);
fprintf (stderr, "\n");
va_end (args);
if (exit_immediately_on_error)
exit (2);
}
void
#if defined (PREFER_STDARG)
itrace (const char *format, ...)
#else
itrace (format, va_alist)
const char *format;
va_dcl
#endif
{
va_list args;
fprintf(stderr, "TRACE: pid %d: ", (int)getpid());
#if defined (PREFER_STDARG)
va_start (args, format);
#else
va_start (args);
#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 */