diff options
author | Jari Aalto <jari.aalto@cante.net> | 2002-07-17 14:10:11 +0000 |
---|---|---|
committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:55 +0000 |
commit | 7117c2d221b2aed4ede8600f6a36b7c1454b4f55 (patch) | |
tree | b792f26ecca68813c51ed5ba2e381790758ef31b /error.c | |
parent | f73dda092b33638d2d5e9c35375f687a607b5403 (diff) | |
download | android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.gz android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.bz2 android_external_bash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.zip |
Imported from ../bash-2.05b.tar.gz.
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 249 |
1 files changed, 76 insertions, 173 deletions
@@ -29,9 +29,7 @@ #if defined (PREFER_STDARG) # include <stdarg.h> #else -# if defined (PREFER_VARARGS) -# include <varargs.h> -# endif +# include <varargs.h> #endif #include <stdio.h> @@ -53,7 +51,9 @@ extern int errno; # include "bashhist.h" #endif -extern int interactive_shell, interactive; +extern int executing_line_number __P((void)); + +extern int interactive_shell, interactive, startup_state; extern char *dollar_vars[]; extern char *shell_name; #if defined (JOB_CONTROL) @@ -61,6 +61,8 @@ extern pid_t shell_pgrp; extern int give_terminal_to __P((pid_t, int)); #endif /* JOB_CONTROL */ +static void error_prolog __P((int)); + /* The current maintainer of the shell. You change this in the Makefile. */ #if !defined (MAINTAINER) @@ -69,6 +71,22 @@ extern int give_terminal_to __P((pid_t, int)); char *the_current_maintainer = MAINTAINER; +static void +error_prolog (print_lineno) + int print_lineno; +{ + int line; + + fprintf (stderr, "%s: ", get_name_for_error ()); + + if (print_lineno && interactive_shell == 0) + { + line = executing_line_number (); + if (line > 0) + fprintf (stderr, "line %d: ", line); + } +} + /* Return the name of the shell or the shell script for error reporting. */ char * get_name_for_error () @@ -100,120 +118,6 @@ file_error (filename) report_error ("%s: %s", filename, strerror (errno)); } -#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 - -#if 0 - fprintf (stderr, "Report this to %s\n", the_current_maintainer); -#endif - - fprintf (stderr, "Stopping myself..."); - fflush (stderr); - - abort (); -} - -void -report_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, "\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) - char *format; -{ - fprintf (stderr, "%s: ", get_name_for_error ()); - - fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5); - fprintf (stderr, "\n"); - - exit (2); -} - -void -internal_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, "\n"); -} - -void -internal_warning (format, arg1, arg2, arg3, arg4, arg5) - char *format; -{ - fprintf (stderr, "%s: warning: ", get_name_for_error ()); - - fprintf (stderr, 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 #if defined (PREFER_STDARG) programming_error (const char *format, ...) @@ -230,11 +134,7 @@ programming_error (format, va_alist) give_terminal_to (shell_pgrp, 0); #endif /* JOB_CONTROL */ -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -258,6 +158,10 @@ programming_error (format, va_alist) abort (); } +/* Print an error message and, if `set -e' has been executed, exit the + shell. Used in this file by file_error and programming_error. Used + outside this file mostly to report substitution and expansion errors, + and for bad invocation options. */ void #if defined (PREFER_STDARG) report_error (const char *format, ...) @@ -269,20 +173,16 @@ report_error (format, va_alist) { va_list args; - fprintf (stderr, "%s: ", get_name_for_error ()); + error_prolog (1); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); if (exit_immediately_on_error) - exit (1); + sh_exit (1); } void @@ -296,19 +196,15 @@ fatal_error (format, va_alist) { va_list args; - fprintf (stderr, "%s: ", get_name_for_error ()); + error_prolog (0); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); va_end (args); - exit (2); + sh_exit (2); } void @@ -322,13 +218,9 @@ internal_error (format, va_alist) { va_list args; - fprintf (stderr, "%s: ", get_name_for_error ()); + error_prolog (1); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -349,11 +241,7 @@ internal_warning (format, va_alist) fprintf (stderr, "%s: warning: ", get_name_for_error ()); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -370,18 +258,16 @@ sys_error (format, va_alist) va_dcl #endif { + int e; va_list args; - fprintf (stderr, "%s: ", get_name_for_error ()); + e = errno; + error_prolog (0); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); - fprintf (stderr, ": %s\n", strerror (errno)); + fprintf (stderr, ": %s\n", strerror (e)); va_end (args); } @@ -408,7 +294,7 @@ parser_error (lineno, format, va_alist) char *ename, *iname; ename = get_name_for_error (); - iname = bash_input.name ? bash_input.name : "stdin"; + iname = yy_input_name (); if (interactive) fprintf (stderr, "%s: ", ename); @@ -419,11 +305,7 @@ parser_error (lineno, format, va_alist) else fprintf (stderr, "%s: %s: line %d: ", ename, iname, lineno); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -431,7 +313,7 @@ parser_error (lineno, format, va_alist) va_end (args); if (exit_immediately_on_error) - exit (2); + sh_exit (2); } #ifdef DEBUG @@ -448,11 +330,7 @@ itrace (format, va_alist) fprintf(stderr, "TRACE: pid %ld: ", (long)getpid()); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (stderr, format, args); fprintf (stderr, "\n"); @@ -486,11 +364,7 @@ trace (format, va_alist) fprintf(tracefp, "TRACE: pid %ld: ", (long)getpid()); -#if defined (PREFER_STDARG) - va_start (args, format); -#else - va_start (args); -#endif + SH_VA_START (args, format); vfprintf (tracefp, format, args); fprintf (tracefp, "\n"); @@ -500,9 +374,15 @@ trace (format, va_alist) fflush(tracefp); } -#endif /* USE_VARARGS */ #endif /* DEBUG */ +/* **************************************************************** */ +/* */ +/* Common error reporting */ +/* */ +/* **************************************************************** */ + + static char *cmd_error_table[] = { "unknown command error", /* CMDERR_DEFAULT */ "bad command type", /* CMDERR_BADTYPE */ @@ -531,3 +411,26 @@ command_errstr (code) return (cmd_error_table[code]); } + +#ifdef ARRAY_VARS +void +err_badarraysub (s) + const char *s; +{ + report_error ("%s: bad array subscript", s); +} +#endif + +void +err_unboundvar (s) + const char *s; +{ + report_error ("%s: unbound variable", s); +} + +void +err_readonly (s) + const char *s; +{ + report_error ("%s: readonly variable", s); +} |