1 /*
2  * = = == === ===== ======== ============= =====================
3  * == pt::rde (critcl) - General utilities
4  */
5 
6 #ifndef _RDE_UTIL_H
7 #define _RDE_UTIL_H 1
8 
9 #include <tcl.h>
10 
11 /*
12  * Default scope, global
13  */
14 
15 #ifndef SCOPE
16 #define SCOPE
17 #endif
18 
19 /*
20  * Allocation macros for common situations.
21  */
22 
23 #define ALLOC(type)    (type *) ckalloc (sizeof (type))
24 #define NALLOC(n,type) (type *) ckalloc ((n) * sizeof (type))
25 
26 /*
27  * General assertions, and asserting the proper range of an array index.
28  */
29 
30 #undef  RDE_DEBUG
31 #define RDE_DEBUG 1
32 
33 #undef  RDE_TRACE
34 /* #define RDE_TRACE 1 */
35 
36 /*
37  * = = == === ===== ======== ============= =====================
38  */
39 
40 #ifdef RDE_DEBUG
41 #define STOPAFTER(x) { static int count = (x); count --; if (!count) { Tcl_Panic ("stop"); } }
42 #define XSTR(x) #x
43 #define STR(x) XSTR(x)
44 #define RANGEOK(i,n) ((0 <= (i)) && (i < (n)))
45 #define ASSERT(x,msg) if (!(x)) { Tcl_Panic (msg " (" #x "), in file " __FILE__ " @line " STR(__LINE__));}
46 #define ASSERT_BOUNDS(i,n) ASSERT (RANGEOK(i,n),"array index out of bounds: " STR(i) " >= " STR(n))
47 #else
48 #define STOPAFTER(x)
49 #define ASSERT(x,msg)
50 #define ASSERT_BOUNDS(i,n)
51 #endif
52 
53 #ifdef RDE_TRACE
54 SCOPE void trace_enter (const char* fun);
55 SCOPE void trace_return (const char *pat, ...);
56 SCOPE void trace_printf (const char *pat, ...);
57 
58 #define ENTER(fun)          trace_enter (fun)
59 #define RETURN(format,x)    trace_return (format,x) ; return x
60 #define RETURNVOID          trace_return ("%s","(void)") ; return
61 #define TRACE0(x)           trace_printf0 x
62 #define TRACE(x)            trace_printf x
63 #else
64 #define ENTER(fun)
65 #define RETURN(f,x) return x
66 #define RETURNVOID  return
67 #define TRACE0(x)
68 #define TRACE(x)
69 #endif
70 
71 #endif /* _RDE_UTIL_H */
72 
73 /*
74  * Local Variables:
75  * mode: c
76  * c-basic-offset: 4
77  * fill-column: 78
78  * End:
79  */
80