Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4680 right-hear 1
#include "fitz.h"
2
 
3
enum { LINE_LEN = 160, LINE_COUNT = 25 };
4
 
5
static char warn_message[LINE_LEN] = "";
6
static int warn_count = 0;
7
 
8
void fz_flush_warnings(void)
9
{
10
	if (warn_count > 1)
11
		fprintf(stderr, "warning: ... repeated %d times ...\n", warn_count);
12
	warn_message[0] = 0;
13
	warn_count = 0;
14
}
15
 
16
void fz_warn(char *fmt, ...)
17
{
18
	va_list ap;
19
	char buf[LINE_LEN];
20
 
21
	va_start(ap, fmt);
22
	vsnprintf(buf, sizeof buf, fmt, ap);
23
	va_end(ap);
24
 
25
	if (!strcmp(buf, warn_message))
26
	{
27
		warn_count++;
28
	}
29
	else
30
	{
31
		fz_flush_warnings();
32
		fprintf(stderr, "warning: %s\n", buf);
33
		fz_strlcpy(warn_message, buf, sizeof warn_message);
34
		warn_count = 1;
35
	}
36
}
37
 
38
static char error_message[LINE_COUNT][LINE_LEN];
39
static int error_count = 0;
40
 
41
static void
42
fz_emit_error(char what, char *location, char *message)
43
{
44
	fz_flush_warnings();
45
 
46
	fprintf(stderr, "%c %s%s\n", what, location, message);
47
 
48
	if (error_count < LINE_COUNT)
49
	{
50
		fz_strlcpy(error_message[error_count], location, LINE_LEN);
51
		fz_strlcat(error_message[error_count], message, LINE_LEN);
52
		error_count++;
53
	}
54
}
55
 
56
int
57
fz_get_error_count(void)
58
{
59
	return error_count;
60
}
61
 
62
char *
63
fz_get_error_line(int n)
64
{
65
	return error_message[n];
66
}
67
 
68
fz_error
69
fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...)
70
{
71
	va_list ap;
72
	char one[LINE_LEN], two[LINE_LEN];
73
 
74
	error_count = 0;
75
 
76
	snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
77
	va_start(ap, fmt);
78
	vsnprintf(two, sizeof two, fmt, ap);
79
	va_end(ap);
80
 
81
	fz_emit_error('+', one, two);
82
 
83
	return -1;
84
}
85
 
86
fz_error
87
fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
88
{
89
	va_list ap;
90
	char one[LINE_LEN], two[LINE_LEN];
91
 
92
	snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
93
	va_start(ap, fmt);
94
	vsnprintf(two, sizeof two, fmt, ap);
95
	va_end(ap);
96
 
97
	fz_emit_error('|', one, two);
98
 
99
	return cause;
100
}
101
 
102
void
103
fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
104
{
105
	va_list ap;
106
	char one[LINE_LEN], two[LINE_LEN];
107
 
108
	snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
109
	va_start(ap, fmt);
110
	vsnprintf(two, sizeof two, fmt, ap);
111
	va_end(ap);
112
 
113
	fz_emit_error('\\', one, two);
114
}
115
 
116
fz_error
117
fz_throw_impx(char *fmt, ...)
118
{
119
	va_list ap;
120
	char buf[LINE_LEN];
121
 
122
	error_count = 0;
123
 
124
	va_start(ap, fmt);
125
	vsnprintf(buf, sizeof buf, fmt, ap);
126
	va_end(ap);
127
 
128
	fz_emit_error('+', "", buf);
129
 
130
	return -1;
131
}
132
 
133
fz_error
134
fz_rethrow_impx(fz_error cause, char *fmt, ...)
135
{
136
	va_list ap;
137
	char buf[LINE_LEN];
138
 
139
	va_start(ap, fmt);
140
	vsnprintf(buf, sizeof buf, fmt, ap);
141
	va_end(ap);
142
 
143
	fz_emit_error('|', "", buf);
144
 
145
	return cause;
146
}
147
 
148
void
149
fz_catch_impx(fz_error cause, char *fmt, ...)
150
{
151
	va_list ap;
152
	char buf[LINE_LEN];
153
 
154
	va_start(ap, fmt);
155
	vsnprintf(buf, sizeof buf, fmt, ap);
156
	va_end(ap);
157
 
158
	fz_emit_error('\\', "", buf);
159
}