0,0 → 1,117 |
/* Error handler for noninteractive utilities |
Copyright (C) 1990-1998, 2000-2005, 2006 Free Software Foundation, Inc. |
This file is part of the GNU C Library. |
|
The GNU C Library is free software; you can redistribute it and/or |
modify it under the terms of the GNU Lesser General Public |
License as published by the Free Software Foundation; either |
version 2.1 of the License, or (at your option) any later version. |
|
The GNU C Library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
Lesser General Public License for more details. |
|
You should have received a copy of the GNU Lesser General Public |
License along with the GNU C Library; if not, write to the Free |
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA |
02111-1307 USA. */ |
|
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ |
|
#include <stdarg.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <errno.h> |
|
#include "error.h" |
|
/* This variable is incremented each time `error' is called. */ |
unsigned int error_message_count; |
|
char *strerror_r (); |
|
/* The calling program should define program_name and set it to the |
name of the executing program. */ |
//extern char *program_name; |
|
static void |
print_errno_message (int errnum) |
{ |
char const *s; |
|
s = strerror (errnum); |
fprintf (stderr, ": %s", s); |
} |
|
static void |
error_tail (int status, int errnum, const char *message, va_list args) |
{ |
vfprintf (stderr, message, args); |
va_end (args); |
|
++error_message_count; |
if (errnum) |
print_errno_message (errnum); |
putc ('\n', stderr); |
fflush (stderr); |
if (status) |
exit (status); |
} |
|
|
/* Print the program name and error message MESSAGE, which is a printf-style |
format string with optional args. |
If ERRNUM is nonzero, print its corresponding system error message. |
Exit with status STATUS if it is nonzero. */ |
void |
error (int status, int errnum, const char *message, ...) |
{ |
va_list args; |
|
// fflush (stdout); |
|
// fprintf (stderr, "%s: ", program_name); |
|
va_start (args, message); |
error_tail (status, errnum, message, args); |
|
}; |
|
/* Sometimes we want to have at most one error per line. This |
variable controls whether this mode is selected or not. */ |
|
int error_one_per_line; |
|
void |
error_at_line (int status, int errnum, const char *file_name, |
unsigned int line_number, const char *message, ...) |
{ |
va_list args; |
|
if (error_one_per_line) |
{ |
static const char *old_file_name; |
static unsigned int old_line_number; |
|
if (old_line_number == line_number |
&& (file_name == old_file_name |
|| strcmp (old_file_name, file_name) == 0)) |
/* Simply return and print nothing. */ |
return; |
|
old_file_name = file_name; |
old_line_number = line_number; |
} |
|
// fflush (stdout); |
|
fprintf (stderr, file_name != NULL ? "%s:%d: " : " ", |
file_name, line_number); |
|
va_start (args, message); |
error_tail (status, errnum, message, args); |
|
} |
|