1 #ifndef _ERROR_H_
2 #define _ERROR_H_
3
4 #include <stdarg.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <errno.h>
9
10 #warning usage of non-standard #include <error.h> is deprecated
11
12 static unsigned int error_message_count = 0;
13
error(int status,int errnum,const char * format,...)14 static inline void error(int status, int errnum, const char* format, ...)
15 {
16 /* should be fflush(stdout), but that's unspecified if stdout has been closed;
17 * stick with fflush(NULL) for simplicity (glibc checks if the fd is still valid) */
18 fflush(NULL);
19
20 va_list ap;
21 fprintf(stderr, "%s: ", program_invocation_name);
22 va_start(ap, format);
23 vfprintf(stderr, format, ap);
24 va_end(ap);
25 if (errnum)
26 fprintf(stderr, ": %s", strerror(errnum));
27 fprintf(stderr, "\n");
28 error_message_count++;
29 if (status)
30 exit(status);
31 }
32
33 static int error_one_per_line = 0;
34
error_at_line(int status,int errnum,const char * filename,unsigned int linenum,const char * format,...)35 static inline void error_at_line(int status, int errnum, const char *filename,
36 unsigned int linenum, const char *format, ...)
37 {
38 va_list ap;
39 if (error_one_per_line) {
40 static const char *old_filename;
41 static int old_linenum;
42 if (linenum == old_linenum && filename == old_filename)
43 return;
44 old_filename = filename;
45 old_linenum = linenum;
46 }
47 fprintf(stderr, "%s: %s:%u: ", program_invocation_name, filename, linenum);
48 va_start(ap, format);
49 vfprintf(stderr, format, ap);
50 va_end(ap);
51 if (errnum)
52 fprintf(stderr, ": %s", strerror(errnum));
53 fprintf(stderr, "\n");
54 error_message_count++;
55 if (status)
56 exit(status);
57 }
58
59
60 #endif /* _ERROR_H_ */
61