aboutsummaryrefslogtreecommitdiffstats
path: root/print_error.c
blob: 4675babdf9a1ae32c17afa9d334b3f681099cc0e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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();
	}
}