HACK: pinfo->private_data points to smb_info again
[wireshark-wip.git] / epan / except.h
bloba9dcfb437c369152a543a23477b2e0010a859efc
1 /*
2 * Portable Exception Handling for ANSI C.
3 * Copyright (C) 1999 Kaz Kylheku <kaz@ashi.footprints.net>
5 * Free Software License:
7 * All rights are reserved by the author, with the following exceptions:
8 * Permission is granted to freely reproduce and distribute this software,
9 * possibly in exchange for a fee, provided that this copyright notice appears
10 * intact. Permission is also granted to adapt this software to produce
11 * derivative works, as long as the modified versions carry this copyright
12 * notice and additional notices stating that the work has been modified.
13 * This source code may be translated into executable form and incorporated
14 * into proprietary software; there is no requirement for such software to
15 * contain a copyright notice related to this source.
17 * $Id$
18 * $Name: $
21 /**
22 * @file
23 * Portable Exception Handling for ANSI C.<BR>
24 * Modified to support throwing an exception with a null message pointer,
25 * and to have the message not be const (as we generate messages with
26 * "g_strdup_sprintf()", which means they need to be freed; using
27 * a null message means that we don't have to use a special string
28 * for exceptions with no message, and don't have to worry about
29 * not freeing that).
32 #ifndef XCEPT_H
33 #define XCEPT_H
35 #include <glib.h>
36 #include <setjmp.h>
37 #include <stdlib.h>
38 #include <assert.h>
39 #include "ws_symbol_export.h"
41 #define XCEPT_GROUP_ANY 0
42 #define XCEPT_CODE_ANY 0
43 #define XCEPT_BAD_ALLOC 1
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
49 enum { except_no_call, except_call };
51 typedef struct {
52 unsigned long except_group;
53 unsigned long except_code;
54 } except_id_t;
56 typedef struct {
57 except_id_t volatile except_id;
58 const char *volatile except_message;
59 void *volatile except_dyndata;
60 } except_t;
62 struct except_cleanup {
63 void (*except_func)(void *);
64 void *except_context;
67 struct except_catch {
68 const except_id_t *except_id;
69 size_t except_size;
70 except_t except_obj;
71 jmp_buf except_jmp;
74 enum except_stacktype {
75 XCEPT_CLEANUP, XCEPT_CATCHER
78 struct except_stacknode {
79 struct except_stacknode *except_down;
80 enum except_stacktype except_type;
81 union {
82 struct except_catch *except_catcher;
83 struct except_cleanup *except_cleanup;
84 } except_info;
87 /* private functions made external so they can be used in macros */
88 extern void except_setup_clean(struct except_stacknode *,
89 struct except_cleanup *, void (*)(void *), void *);
90 WS_DLL_PUBLIC void except_setup_try(struct except_stacknode *,
91 struct except_catch *, const except_id_t [], size_t);
92 WS_DLL_PUBLIC struct except_stacknode *except_pop(void);
94 /* public interface functions */
95 WS_DLL_PUBLIC int except_init(void);
96 WS_DLL_PUBLIC void except_deinit(void);
97 WS_DLL_PUBLIC WS_MSVC_NORETURN void except_rethrow(except_t *) G_GNUC_NORETURN;
98 WS_DLL_PUBLIC WS_MSVC_NORETURN void except_throw(long, long, const char *) G_GNUC_NORETURN;
99 WS_DLL_PUBLIC WS_MSVC_NORETURN void except_throwd(long, long, const char *, void *) G_GNUC_NORETURN;
100 WS_DLL_PUBLIC WS_MSVC_NORETURN void except_throwf(long, long, const char *, ...) G_GNUC_NORETURN;
101 WS_DLL_PUBLIC void (*except_unhandled_catcher(void (*)(except_t *)))(except_t *);
102 extern unsigned long except_code(except_t *);
103 extern unsigned long except_group(except_t *);
104 extern const char *except_message(except_t *);
105 extern void *except_data(except_t *);
106 WS_DLL_PUBLIC void *except_take_data(except_t *);
107 WS_DLL_PUBLIC void except_set_allocator(void *(*)(size_t), void (*)(void *));
108 WS_DLL_PUBLIC void *except_alloc(size_t);
109 WS_DLL_PUBLIC void except_free(void *);
111 #define except_code(E) ((E)->except_id.except_code)
112 #define except_group(E) ((E)->except_id.except_group)
113 #define except_message(E) ((E)->except_message)
114 #define except_data(E) ((E)->except_dyndata)
116 #ifdef __cplusplus
118 #endif
121 * void except_cleanup_push(void (*)(void *), void *);
122 * void except_cleanup_pop(int);
123 * void except_checked_cleanup_pop(void (*)(void *), int);
124 * void except_try_push(const except_id_t [], size_t, except_t **);
125 * void except_try_pop(void);
128 #define except_cleanup_push(F, C) \
130 struct except_stacknode except_sn; \
131 struct except_cleanup except_cl; \
132 except_setup_clean(&except_sn, &except_cl, F, C)
134 #define except_cleanup_pop(E) \
135 except_pop(); \
136 if (E) \
137 except_cl.except_func(except_cl.except_context); \
140 #define except_checked_cleanup_pop(F, E) \
141 except_pop(); \
142 assert (except_cl.except_func == (F)); \
143 if (E) \
144 except_cl.except_func(except_cl.except_context); \
148 /* --- Variants to allow nesting of except_cleanup_push w/o "shadowing" variables */
149 #define except_cleanup_push_pfx(pfx, F, C) \
151 struct except_stacknode pfx##_except_sn; \
152 struct except_cleanup pfx##_except_cl; \
153 except_setup_clean(&pfx##_except_sn, &pfx##_except_cl, F, C)
155 #define except_cleanup_pop_pfx(pfx, E) \
156 except_pop(); \
157 if (E) \
158 pfx##_except_cl.except_func(pfx##_except_cl.except_context);\
161 #define except_checked_cleanup_pop_pfx(pfx, F, E) \
162 except_pop(); \
163 assert (pfx##_except_cl.except_func == (F)); \
164 if (E) \
165 pfx##_except_cl.except_func(pfx##_except_cl.except_context);\
167 /* ---------- */
170 #define except_try_push(ID, NUM, PPE) \
172 struct except_stacknode except_sn; \
173 struct except_catch except_ch; \
174 except_setup_try(&except_sn, &except_ch, ID, NUM); \
175 if (setjmp(except_ch.except_jmp)) \
176 *(PPE) = &except_ch.except_obj; \
177 else \
178 *(PPE) = 0
180 #define except_try_pop() \
181 except_free(except_ch.except_obj.except_dyndata); \
182 except_pop(); \
185 #endif /* XCEPT_H */