aboutsummaryrefslogtreecommitdiff
path: root/lib/mlibc/options/glibc/generic/error.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mlibc/options/glibc/generic/error.cpp')
-rw-r--r--lib/mlibc/options/glibc/generic/error.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/mlibc/options/glibc/generic/error.cpp b/lib/mlibc/options/glibc/generic/error.cpp
new file mode 100644
index 0000000..45203b2
--- /dev/null
+++ b/lib/mlibc/options/glibc/generic/error.cpp
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <error.h>
+
+unsigned int error_message_count = 0;
+int error_one_per_line = 0;
+void (*error_print_progname)(void) = NULL;
+
+void error(int status, int errnum, const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+
+ error_message_count++;
+
+ fflush(stdout);
+ if(error_print_progname) {
+ error_print_progname();
+ } else {
+ fprintf(stderr, "%s: ", program_invocation_name);
+ }
+ vfprintf(stderr, format, args);
+ va_end(args);
+
+ if(errnum) {
+ fprintf(stderr, ": %s\n", strerror(errnum));
+ }
+
+ if(status) {
+ exit(status);
+ }
+}
+
+void error_at_line(int status, int errnum, const char *filename, unsigned int linenum, const char *format, ...) {
+ va_list args;
+ va_start(args, format);
+
+ static bool first_call = true;
+ static unsigned int last_line = 0;
+ if(!(last_line == linenum && error_one_per_line && !first_call)) {
+ first_call = false;
+ last_line = linenum;
+ error_message_count++;
+
+ fflush(stdout);
+ if(error_print_progname) {
+ error_print_progname();
+ } else {
+ fprintf(stderr, "%s:", program_invocation_name);
+ }
+ fprintf(stderr, "%s:%u: ", filename, linenum);
+ vfprintf(stderr, format, args);
+
+ if(errnum) {
+ fprintf(stderr, ": %s\n", strerror(errnum));
+ }
+ }
+ va_end(args);
+
+ if(status) {
+ exit(status);
+ }
+}