1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: gserror.h 8022 2007-06-05 22:23:38Z giles $ */
15
/* Error return macros */
17
#ifndef gserror_INCLUDED
18
# define gserror_INCLUDED
20
int gs_log_error(int, const char *, int);
22
# define gs_log_error(err, file, line) (err)
24
#define gs_note_error(err) gs_log_error(err, __FILE__, __LINE__)
25
#define return_error(err) return gs_note_error(err)
27
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
28
# if defined(__FUNCTION__)
29
# define __func__ __FUNCTION__
30
# elif defined(__FUNC__)
31
# define __func__ __FUNC__
33
# define __func__ "<unknown>"
38
* Error reporting macros.
43
#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
44
#define __printflike(fmtarg, firstvararg) \
45
__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
47
#define __printflike(fmtarg, firstvararg)
51
const char *gs_errstr(int code);
53
int gs_throw_imp(const char *func, const char *file, int line,
54
int op, int code, const char *fmt, ...) __printflike(6, 7);
58
/* Use throw at origin of error
60
#define gs_throw(code, fmt) \
61
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt)
62
#define gs_throw1(code, fmt, arg1) \
63
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1)
64
#define gs_throw2(code, fmt, arg1, arg2) \
65
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2)
66
#define gs_throw3(code, fmt, arg1, arg2, arg3) \
67
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3)
68
#define gs_throw4(code, fmt, arg1, arg2, arg3, arg4) \
69
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4)
70
#define gs_throw5(code, fmt, arg1, arg2, arg3, arg4, arg5) \
71
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5)
72
#define gs_throw6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
73
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
74
#define gs_throw7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
75
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
76
#define gs_throw8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
77
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
78
#define gs_throw9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \
79
gs_throw_imp(__func__, __FILE__, __LINE__, 0, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
82
/* Bubble the code up the stack
84
#define gs_rethrow(code, fmt) \
85
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt)
86
#define gs_rethrow1(code, fmt, arg1) \
87
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1)
88
#define gs_rethrow2(code, fmt, arg1, arg2) \
89
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2)
90
#define gs_rethrow3(code, fmt, arg1, arg2, arg3) \
91
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3)
92
#define gs_rethrow4(code, fmt, arg1, arg2, arg3, arg4) \
93
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4)
94
#define gs_rethrow5(code, fmt, arg1, arg2, arg3, arg4, arg5) \
95
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5)
96
#define gs_rethrow6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
97
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
98
#define gs_rethrow7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
99
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
100
#define gs_rethrow8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
101
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
102
#define gs_rethrow9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \
103
gs_throw_imp(__func__, __FILE__, __LINE__, 1, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
107
/* This will cause trouble, as it implies you are fixing an error
108
* the system will spew messages
110
#define gs_catch(code, fmt) \
111
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt)
112
#define gs_catch1(code, fmt, arg1) \
113
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1)
114
#define gs_catch2(code, fmt, arg1, arg2) \
115
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2)
116
#define gs_catch3(code, fmt, arg1, arg2, arg3) \
117
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3)
118
#define gs_catch4(code, fmt, arg1, arg2, arg3, arg4) \
119
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4)
120
#define gs_catch5(code, fmt, arg1, arg2, arg3, arg4, arg5) \
121
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5)
122
#define gs_catch6(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
123
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
124
#define gs_catch7(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
125
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
126
#define gs_catch8(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
127
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
128
#define gs_catch9(code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \
129
gs_throw_imp(__func__, __FILE__, __LINE__, 2, code, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
132
/* gs_warn is a printf
134
#define gs_warn(fmt) \
135
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt)
136
#define gs_warn1(fmt, arg1) \
137
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1)
138
#define gs_warn2(fmt, arg1, arg2) \
139
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2)
140
#define gs_warn3(fmt, arg1, arg2, arg3) \
141
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3)
142
#define gs_warn4(fmt, arg1, arg2, arg3, arg4) \
143
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4)
144
#define gs_warn5(fmt, arg1, arg2, arg3, arg4, arg5) \
145
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5)
146
#define gs_warn6(fmt, arg1, arg2, arg3, arg4, arg5, arg6) \
147
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6)
148
#define gs_warn7(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
149
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
150
#define gs_warn8(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
151
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
152
#define gs_warn9(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \
153
(void)gs_throw_imp(__func__, __FILE__, __LINE__, 3, 0, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
156
/* just in case you don't know 0 means no error
157
* other return codes are errors.
161
#endif /* gserror_INCLUDED */