Annotation of embedaddon/lrzsz/lib/error.c, revision 1.1.1.1

1.1       misho       1: /* error.c -- error handler for noninteractive utilities
                      2:    Copyright (C) 1990, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
                      3: 
                      4: This program is free software; you can redistribute it and/or modify
                      5: it under the terms of the GNU General Public License as published by
                      6: the Free Software Foundation; either version 2, or (at your option)
                      7: any later version.
                      8: 
                      9: This program is distributed in the hope that it will be useful,
                     10: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     12: GNU General Public License for more details.
                     13: 
                     14: You should have received a copy of the GNU General Public License
                     15: along with this program; if not, write to the Free Software
                     16: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
                     17: 
                     18: /* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
                     19: 
                     20: #ifdef HAVE_CONFIG_H
                     21: # include <config.h>
                     22: #endif
                     23: 
                     24: #include <stdio.h>
                     25: 
                     26: #if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC
                     27: # if __STDC__
                     28: #  include <stdarg.h>
                     29: #  define VA_START(args, lastarg) va_start(args, lastarg)
                     30: # else
                     31: #  include <varargs.h>
                     32: #  define VA_START(args, lastarg) va_start(args)
                     33: # endif
                     34: #else
                     35: # define va_alist a1, a2, a3, a4, a5, a6, a7, a8
                     36: # define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
                     37: #endif
                     38: 
                     39: #if STDC_HEADERS || _LIBC
                     40: # include <stdlib.h>
                     41: # include <string.h>
                     42: #else
                     43: void exit ();
                     44: #endif
                     45: 
                     46: #ifndef _
                     47: # define _(String) String
                     48: #endif
                     49: 
                     50: /* If NULL, error will flush stdout, then print on stderr the program
                     51:    name, a colon and a space.  Otherwise, error will call this
                     52:    function without parameters instead.  */
                     53: void (*error_print_progname) (
                     54: #if __STDC__ - 0
                     55:                              void
                     56: #endif
                     57:                              );
                     58: 
                     59: /* This variable is incremented each time `error' is called.  */
                     60: unsigned int error_message_count;
                     61: 
                     62: #ifdef _LIBC
                     63: /* In the GNU C library, there is a predefined variable for this.  */
                     64: 
                     65: # define program_name program_invocation_name
                     66: # include <errno.h>
                     67: 
                     68: #else
                     69: 
                     70: /* The calling program should define program_name and set it to the
                     71:    name of the executing program.  */
                     72: extern char *program_name;
                     73: 
                     74: # if HAVE_STRERROR
                     75: #  ifndef strerror             /* On some systems, strerror is a macro */
                     76: char *strerror ();
                     77: #  endif
                     78: # else
                     79: static char *
                     80: private_strerror (errnum)
                     81:      int errnum;
                     82: {
                     83:   extern char *sys_errlist[];
                     84:   extern int sys_nerr;
                     85: 
                     86:   if (errnum > 0 && errnum <= sys_nerr)
                     87:     return sys_errlist[errnum];
                     88:   return _("Unknown system error");
                     89: }
                     90: #  define strerror private_strerror
                     91: # endif        /* HAVE_STRERROR */
                     92: #endif /* _LIBC */
                     93: 
                     94: /* Print the program name and error message MESSAGE, which is a printf-style
                     95:    format string with optional args.
                     96:    If ERRNUM is nonzero, print its corresponding system error message.
                     97:    Exit with status STATUS if it is nonzero.  */
                     98: /* VARARGS */
                     99: 
                    100: void
                    101: #if defined(VA_START) && __STDC__
                    102: error (int status, int errnum, const char *message, ...)
                    103: #else
                    104: error (status, errnum, message, va_alist)
                    105:      int status;
                    106:      int errnum;
                    107:      char *message;
                    108:      va_dcl
                    109: #endif
                    110: {
                    111: #ifdef VA_START
                    112:   va_list args;
                    113: #endif
                    114: 
                    115:   if (error_print_progname)
                    116:     (*error_print_progname) ();
                    117:   else
                    118:     {
                    119:       fflush (stdout);
                    120:       fprintf (stderr, "%s: ", program_name);
                    121:     }
                    122: 
                    123: #ifdef VA_START
                    124:   VA_START (args, message);
                    125: # if HAVE_VPRINTF || _LIBC
                    126:   vfprintf (stderr, message, args);
                    127: # else
                    128:   _doprnt (message, args, stderr);
                    129: # endif
                    130:   va_end (args);
                    131: #else
                    132:   fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
                    133: #endif
                    134: 
                    135:   ++error_message_count;
                    136:   if (errnum)
                    137:     fprintf (stderr, ": %s", strerror (errnum));
                    138:   putc ('\n', stderr);
                    139:   fflush (stderr);
                    140:   if (status)
                    141:     exit (status);
                    142: }
                    143: 
                    144: /* Sometimes we want to have at most one error per line.  This
                    145:    variable controls whether this mode is selected or not.  */
                    146: int error_one_per_line;
                    147: 
                    148: void
                    149: #if defined(VA_START) && __STDC__
                    150: error_at_line (int status, int errnum, const char *file_name,
                    151:               unsigned int line_number, const char *message, ...)
                    152: #else
                    153: error_at_line (status, errnum, file_name, line_number, message, va_alist)
                    154:      int status;
                    155:      int errnum;
                    156:      const char *file_name;
                    157:      unsigned int line_number;
                    158:      char *message;
                    159:      va_dcl
                    160: #endif
                    161: {
                    162: #ifdef VA_START
                    163:   va_list args;
                    164: #endif
                    165: 
                    166:   if (error_one_per_line)
                    167:     {
                    168:       static const char *old_file_name;
                    169:       static unsigned int old_line_number;
                    170: 
                    171:       if (old_line_number == line_number &&
                    172:          (file_name == old_file_name || !strcmp (old_file_name, file_name)))
                    173:        /* Simply return and print nothing.  */
                    174:        return;
                    175: 
                    176:       old_file_name = file_name;
                    177:       old_line_number = line_number;
                    178:     }
                    179: 
                    180:   if (error_print_progname)
                    181:     (*error_print_progname) ();
                    182:   else
                    183:     {
                    184:       fflush (stdout);
                    185:       fprintf (stderr, "%s:", program_name);
                    186:     }
                    187: 
                    188:   if (file_name != NULL)
                    189:     fprintf (stderr, "%s:%d: ", file_name, line_number);
                    190: 
                    191: #ifdef VA_START
                    192:   VA_START (args, message);
                    193: # if HAVE_VPRINTF || _LIBC
                    194:   vfprintf (stderr, message, args);
                    195: # else
                    196:   _doprnt (message, args, stderr);
                    197: # endif
                    198:   va_end (args);
                    199: #else
                    200:   fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
                    201: #endif
                    202: 
                    203:   ++error_message_count;
                    204:   if (errnum)
                    205:     fprintf (stderr, ": %s", strerror (errnum));
                    206:   putc ('\n', stderr);
                    207:   fflush (stderr);
                    208:   if (status)
                    209:     exit (status);
                    210: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>