diff options
Diffstat (limited to 'print_error.c')
-rw-r--r-- | print_error.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/print_error.c b/print_error.c new file mode 100644 index 0000000..4675bab --- /dev/null +++ b/print_error.c @@ -0,0 +1,68 @@ +/* See LICENSE file for copyright and license details. */ +#include "internal.h" + + +static void +print_error_description(struct liberror_error *error, FILE *fp, const char *prefix) +{ + if (*error->description) { + if (*error->source) + fprintf(fp, "%sError in function %s: %s\n", prefix, error->source, error->description); + else + fprintf(fp, "%sError: %s\n", prefix, error->description); + } else if (*error->source) { + fprintf(fp, "%sError in function %s: %s error %lli\n", prefix, error->source, error->code_group, error->code); + } else { + fprintf(fp, "%sError: %s error %lli\n", prefix, error->code_group, error->code); + } +} + + +void +liberror_print_error(struct liberror_error *error, FILE *fp, int reset, const char *prefix_) +{ + struct liberror_error *err = error; + char *prefix = (char []){" "}; + char *p, *q; + + if (!err) { + err = liberror_get_error(); + if (!err) + return; + } + + if (prefix_ && *prefix_) { + prefix = alloca(strlen(prefix) + sizeof(": ")); + stpcpy(q = stpcpy(p = stpcpy(stpcpy(prefix, prefix_), ": "), " "), " "); + } else { + p = &prefix[0]; + q = &prefix[2]; + } + + if (!fp) + fp = stderr; + + *p = *q = '\0'; + print_error_description(err, fp, prefix); + + *p = ' '; + liberror_print_backtrace(err, fp, prefix); + + while ((err = err->cause)) { + *p = *q = '\0'; + fprintf(fp, "%sCaused by:\n", prefix); + + *p = ' '; + print_error_description(err, fp, prefix); + + *q = ' '; + liberror_print_backtrace(err, fp, prefix); + } + + if (reset) { + if (error) + liberror_free_error(error); + else + liberror_reset_error(); + } +} |