xref: /aosp_15_r20/external/icu/libicu/cts_headers/utracimp.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker *
6*0e209d39SAndroid Build Coastguard Worker *   Copyright (C) 2003-2009, International Business Machines
7*0e209d39SAndroid Build Coastguard Worker *   Corporation and others.  All Rights Reserved.
8*0e209d39SAndroid Build Coastguard Worker *
9*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
10*0e209d39SAndroid Build Coastguard Worker *   file name:  utracimp.h
11*0e209d39SAndroid Build Coastguard Worker *   encoding:   UTF-8
12*0e209d39SAndroid Build Coastguard Worker *   tab size:   8 (not used)
13*0e209d39SAndroid Build Coastguard Worker *   indentation:4
14*0e209d39SAndroid Build Coastguard Worker *
15*0e209d39SAndroid Build Coastguard Worker *   created on: 2003aug06
16*0e209d39SAndroid Build Coastguard Worker *   created by: Markus W. Scherer
17*0e209d39SAndroid Build Coastguard Worker *
18*0e209d39SAndroid Build Coastguard Worker *   Internal header for ICU tracing/logging.
19*0e209d39SAndroid Build Coastguard Worker *
20*0e209d39SAndroid Build Coastguard Worker *
21*0e209d39SAndroid Build Coastguard Worker *   Various notes:
22*0e209d39SAndroid Build Coastguard Worker *   - using a trace level variable to only call trace functions
23*0e209d39SAndroid Build Coastguard Worker *     when the level is sufficient
24*0e209d39SAndroid Build Coastguard Worker *   - using the same variable for tracing on/off to never make a function
25*0e209d39SAndroid Build Coastguard Worker *     call when off
26*0e209d39SAndroid Build Coastguard Worker *   - the function number is put into a local variable by the entry macro
27*0e209d39SAndroid Build Coastguard Worker *     and used implicitly to avoid copy&paste/typing mistakes by the developer
28*0e209d39SAndroid Build Coastguard Worker *   - the application must call utrace_setFunctions() and pass in
29*0e209d39SAndroid Build Coastguard Worker *     implementations for the trace functions
30*0e209d39SAndroid Build Coastguard Worker *   - ICU trace macros call ICU functions that route through the function
31*0e209d39SAndroid Build Coastguard Worker *     pointers if they have been set;
32*0e209d39SAndroid Build Coastguard Worker *     this avoids an indirection at the call site
33*0e209d39SAndroid Build Coastguard Worker *     (which would cost more code for another check and for the indirection)
34*0e209d39SAndroid Build Coastguard Worker *
35*0e209d39SAndroid Build Coastguard Worker *   ### TODO Issues:
36*0e209d39SAndroid Build Coastguard Worker *   - Verify that va_list is portable among compilers for the same platform.
37*0e209d39SAndroid Build Coastguard Worker *     va_list should be portable because printf() would fail otherwise!
38*0e209d39SAndroid Build Coastguard Worker *   - Should enum values like UTraceLevel be passed into int32_t-type arguments,
39*0e209d39SAndroid Build Coastguard Worker *     or should enum types be used?
40*0e209d39SAndroid Build Coastguard Worker */
41*0e209d39SAndroid Build Coastguard Worker 
42*0e209d39SAndroid Build Coastguard Worker #ifndef __UTRACIMP_H__
43*0e209d39SAndroid Build Coastguard Worker #define __UTRACIMP_H__
44*0e209d39SAndroid Build Coastguard Worker 
45*0e209d39SAndroid Build Coastguard Worker #include "unicode/utrace.h"
46*0e209d39SAndroid Build Coastguard Worker #include <stdarg.h>
47*0e209d39SAndroid Build Coastguard Worker 
48*0e209d39SAndroid Build Coastguard Worker U_CDECL_BEGIN
49*0e209d39SAndroid Build Coastguard Worker 
50*0e209d39SAndroid Build Coastguard Worker /**
51*0e209d39SAndroid Build Coastguard Worker  *   Traced Function Exit return types.
52*0e209d39SAndroid Build Coastguard Worker  *   Flags indicating the number and types of varargs included in a call
53*0e209d39SAndroid Build Coastguard Worker  *   to a UTraceExit function.
54*0e209d39SAndroid Build Coastguard Worker  *   Bits 0-3:  The function return type.  First variable param.
55*0e209d39SAndroid Build Coastguard Worker  *   Bit    4:  Flag for presence of U_ErrorCode status param.
56*0e209d39SAndroid Build Coastguard Worker  *   @internal
57*0e209d39SAndroid Build Coastguard Worker  */
58*0e209d39SAndroid Build Coastguard Worker typedef enum UTraceExitVal {
59*0e209d39SAndroid Build Coastguard Worker     /** The traced function returns no value  @internal */
60*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_NONE   = 0,
61*0e209d39SAndroid Build Coastguard Worker     /** The traced function returns an int32_t, or compatible, type.  @internal */
62*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_I32    = 1,
63*0e209d39SAndroid Build Coastguard Worker     /** The traced function returns a pointer  @internal */
64*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_PTR    = 2,
65*0e209d39SAndroid Build Coastguard Worker     /** The traced function returns a UBool  @internal */
66*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_BOOL   = 3,
67*0e209d39SAndroid Build Coastguard Worker     /** Mask to extract the return type values from a UTraceExitVal  @internal */
68*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_MASK   = 0xf,
69*0e209d39SAndroid Build Coastguard Worker     /** Bit indicating that the traced function includes a UErrorCode parameter  @internal */
70*0e209d39SAndroid Build Coastguard Worker     UTRACE_EXITV_STATUS = 0x10
71*0e209d39SAndroid Build Coastguard Worker } UTraceExitVal;
72*0e209d39SAndroid Build Coastguard Worker 
73*0e209d39SAndroid Build Coastguard Worker /**
74*0e209d39SAndroid Build Coastguard Worker  * Trace function for the entry point of a function.
75*0e209d39SAndroid Build Coastguard Worker  * Do not use directly, use UTRACE_ENTRY instead.
76*0e209d39SAndroid Build Coastguard Worker  * @param fnNumber The UTraceFunctionNumber for the current function.
77*0e209d39SAndroid Build Coastguard Worker  * @internal
78*0e209d39SAndroid Build Coastguard Worker  */
79*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
80*0e209d39SAndroid Build Coastguard Worker utrace_entry(int32_t fnNumber);
81*0e209d39SAndroid Build Coastguard Worker 
82*0e209d39SAndroid Build Coastguard Worker /**
83*0e209d39SAndroid Build Coastguard Worker  * Trace function for each exit point of a function.
84*0e209d39SAndroid Build Coastguard Worker  * Do not use directly, use UTRACE_EXIT* instead.
85*0e209d39SAndroid Build Coastguard Worker  * @param fnNumber The UTraceFunctionNumber for the current function.
86*0e209d39SAndroid Build Coastguard Worker  * @param returnType The type of the value returned by the function.
87*0e209d39SAndroid Build Coastguard Worker  * @param errorCode The UErrorCode value at function exit. See UTRACE_EXIT.
88*0e209d39SAndroid Build Coastguard Worker  * @internal
89*0e209d39SAndroid Build Coastguard Worker  */
90*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
91*0e209d39SAndroid Build Coastguard Worker utrace_exit(int32_t fnNumber, int32_t returnType, ...);
92*0e209d39SAndroid Build Coastguard Worker 
93*0e209d39SAndroid Build Coastguard Worker 
94*0e209d39SAndroid Build Coastguard Worker /**
95*0e209d39SAndroid Build Coastguard Worker  * Trace function used inside functions that have a UTRACE_ENTRY() statement.
96*0e209d39SAndroid Build Coastguard Worker  * Do not use directly, use UTRACE_DATAX() macros instead.
97*0e209d39SAndroid Build Coastguard Worker  *
98*0e209d39SAndroid Build Coastguard Worker  * @param utraceFnNumber The number of the current function, from the local
99*0e209d39SAndroid Build Coastguard Worker  *        variable of the same name.
100*0e209d39SAndroid Build Coastguard Worker  * @param level The trace level for this message.
101*0e209d39SAndroid Build Coastguard Worker  * @param fmt The trace format string.
102*0e209d39SAndroid Build Coastguard Worker  *
103*0e209d39SAndroid Build Coastguard Worker  * @internal
104*0e209d39SAndroid Build Coastguard Worker  */
105*0e209d39SAndroid Build Coastguard Worker U_CAPI void U_EXPORT2
106*0e209d39SAndroid Build Coastguard Worker utrace_data(int32_t utraceFnNumber, int32_t level, const char *fmt, ...);
107*0e209d39SAndroid Build Coastguard Worker 
108*0e209d39SAndroid Build Coastguard Worker U_CDECL_END
109*0e209d39SAndroid Build Coastguard Worker 
110*0e209d39SAndroid Build Coastguard Worker #if U_ENABLE_TRACING
111*0e209d39SAndroid Build Coastguard Worker 
112*0e209d39SAndroid Build Coastguard Worker /**
113*0e209d39SAndroid Build Coastguard Worker  * Boolean expression to see if ICU tracing is turned on
114*0e209d39SAndroid Build Coastguard Worker  * to at least the specified level.
115*0e209d39SAndroid Build Coastguard Worker  * @internal
116*0e209d39SAndroid Build Coastguard Worker  */
117*0e209d39SAndroid Build Coastguard Worker #define UTRACE_LEVEL(level) (utrace_getLevel()>=(level))
118*0e209d39SAndroid Build Coastguard Worker 
119*0e209d39SAndroid Build Coastguard Worker /**
120*0e209d39SAndroid Build Coastguard Worker   *  Flag bit in utraceFnNumber, the local variable added to each function
121*0e209d39SAndroid Build Coastguard Worker   *  with tracing code to contains the function number.
122*0e209d39SAndroid Build Coastguard Worker   *
123*0e209d39SAndroid Build Coastguard Worker   *  Set the flag if the function's entry is traced, which will cause the
124*0e209d39SAndroid Build Coastguard Worker   *  function's exit to also be traced.  utraceFnNumber is uncoditionally
125*0e209d39SAndroid Build Coastguard Worker   *  set at entry, whether or not the entry is traced, so that it will
126*0e209d39SAndroid Build Coastguard Worker   *  always be available for error trace output.
127*0e209d39SAndroid Build Coastguard Worker   *  @internal
128*0e209d39SAndroid Build Coastguard Worker   */
129*0e209d39SAndroid Build Coastguard Worker #define UTRACE_TRACED_ENTRY 0x80000000
130*0e209d39SAndroid Build Coastguard Worker 
131*0e209d39SAndroid Build Coastguard Worker /**
132*0e209d39SAndroid Build Coastguard Worker  * Trace statement for the entry point of a function.
133*0e209d39SAndroid Build Coastguard Worker  * Stores the function number in a local variable.
134*0e209d39SAndroid Build Coastguard Worker  * In C code, must be placed immediately after the last variable declaration.
135*0e209d39SAndroid Build Coastguard Worker  * Must be matched with UTRACE_EXIT() at all function exit points.
136*0e209d39SAndroid Build Coastguard Worker  *
137*0e209d39SAndroid Build Coastguard Worker  * Tracing should start with UTRACE_ENTRY after checking for
138*0e209d39SAndroid Build Coastguard Worker  * U_FAILURE at function entry, so that if a function returns immediately
139*0e209d39SAndroid Build Coastguard Worker  * because of a pre-existing error condition, it does not show up in the trace,
140*0e209d39SAndroid Build Coastguard Worker  * consistent with ICU's error handling model.
141*0e209d39SAndroid Build Coastguard Worker  *
142*0e209d39SAndroid Build Coastguard Worker  * @param fnNumber The UTraceFunctionNumber for the current function.
143*0e209d39SAndroid Build Coastguard Worker  * @internal
144*0e209d39SAndroid Build Coastguard Worker  */
145*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY(fnNumber) \
146*0e209d39SAndroid Build Coastguard Worker     int32_t utraceFnNumber=(fnNumber); \
147*0e209d39SAndroid Build Coastguard Worker UPRV_BLOCK_MACRO_BEGIN { \
148*0e209d39SAndroid Build Coastguard Worker     if(utrace_getLevel()>=UTRACE_INFO) { \
149*0e209d39SAndroid Build Coastguard Worker         utrace_entry(fnNumber); \
150*0e209d39SAndroid Build Coastguard Worker         utraceFnNumber |= UTRACE_TRACED_ENTRY; \
151*0e209d39SAndroid Build Coastguard Worker     } \
152*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
153*0e209d39SAndroid Build Coastguard Worker 
154*0e209d39SAndroid Build Coastguard Worker 
155*0e209d39SAndroid Build Coastguard Worker /**
156*0e209d39SAndroid Build Coastguard Worker  * Trace statement for the entry point of open and close functions.
157*0e209d39SAndroid Build Coastguard Worker  * Produces trace output at a less verbose setting than plain UTRACE_ENTRY
158*0e209d39SAndroid Build Coastguard Worker  * Stores the function number in a local variable.
159*0e209d39SAndroid Build Coastguard Worker  * In C code, must be placed immediately after the last variable declaration.
160*0e209d39SAndroid Build Coastguard Worker  * Must be matched with UTRACE_EXIT() at all function exit points.
161*0e209d39SAndroid Build Coastguard Worker  *
162*0e209d39SAndroid Build Coastguard Worker  * @param fnNumber The UTraceFunctionNumber for the current function.
163*0e209d39SAndroid Build Coastguard Worker  * @internal
164*0e209d39SAndroid Build Coastguard Worker  */
165*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY_OC(fnNumber) \
166*0e209d39SAndroid Build Coastguard Worker     int32_t utraceFnNumber=(fnNumber); \
167*0e209d39SAndroid Build Coastguard Worker UPRV_BLOCK_MACRO_BEGIN { \
168*0e209d39SAndroid Build Coastguard Worker     if(utrace_getLevel()>=UTRACE_OPEN_CLOSE) { \
169*0e209d39SAndroid Build Coastguard Worker         utrace_entry(fnNumber); \
170*0e209d39SAndroid Build Coastguard Worker         utraceFnNumber |= UTRACE_TRACED_ENTRY; \
171*0e209d39SAndroid Build Coastguard Worker     } \
172*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
173*0e209d39SAndroid Build Coastguard Worker 
174*0e209d39SAndroid Build Coastguard Worker /**
175*0e209d39SAndroid Build Coastguard Worker  * Trace statement for each exit point of a function that has a UTRACE_ENTRY()
176*0e209d39SAndroid Build Coastguard Worker  * statement.
177*0e209d39SAndroid Build Coastguard Worker  *
178*0e209d39SAndroid Build Coastguard Worker  * @param errorCode The function's ICU UErrorCode value at function exit,
179*0e209d39SAndroid Build Coastguard Worker  *                  or U_ZERO_ERROR if the function does not use a UErrorCode.
180*0e209d39SAndroid Build Coastguard Worker  *                  0==U_ZERO_ERROR indicates success,
181*0e209d39SAndroid Build Coastguard Worker  *                  positive values an error (see u_errorName()),
182*0e209d39SAndroid Build Coastguard Worker  *                  negative values an informational status.
183*0e209d39SAndroid Build Coastguard Worker  *
184*0e209d39SAndroid Build Coastguard Worker  * @internal
185*0e209d39SAndroid Build Coastguard Worker  */
186*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT() UPRV_BLOCK_MACRO_BEGIN { \
187*0e209d39SAndroid Build Coastguard Worker     if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
188*0e209d39SAndroid Build Coastguard Worker         utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_NONE); \
189*0e209d39SAndroid Build Coastguard Worker     } \
190*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
191*0e209d39SAndroid Build Coastguard Worker 
192*0e209d39SAndroid Build Coastguard Worker /**
193*0e209d39SAndroid Build Coastguard Worker  * Trace statement for each exit point of a function that has a UTRACE_ENTRY()
194*0e209d39SAndroid Build Coastguard Worker  * statement, and that returns a value.
195*0e209d39SAndroid Build Coastguard Worker  *
196*0e209d39SAndroid Build Coastguard Worker  * @param val       The function's return value, int32_t or compatible type.
197*0e209d39SAndroid Build Coastguard Worker  *
198*0e209d39SAndroid Build Coastguard Worker  * @internal
199*0e209d39SAndroid Build Coastguard Worker  */
200*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE(val) UPRV_BLOCK_MACRO_BEGIN { \
201*0e209d39SAndroid Build Coastguard Worker     if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
202*0e209d39SAndroid Build Coastguard Worker         utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_I32, val); \
203*0e209d39SAndroid Build Coastguard Worker     } \
204*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
205*0e209d39SAndroid Build Coastguard Worker 
206*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_STATUS(status) UPRV_BLOCK_MACRO_BEGIN { \
207*0e209d39SAndroid Build Coastguard Worker     if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
208*0e209d39SAndroid Build Coastguard Worker         utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, UTRACE_EXITV_STATUS, status); \
209*0e209d39SAndroid Build Coastguard Worker     } \
210*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
211*0e209d39SAndroid Build Coastguard Worker 
212*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE_STATUS(val, status) UPRV_BLOCK_MACRO_BEGIN { \
213*0e209d39SAndroid Build Coastguard Worker     if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
214*0e209d39SAndroid Build Coastguard Worker         utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_I32 | UTRACE_EXITV_STATUS), val, status); \
215*0e209d39SAndroid Build Coastguard Worker     } \
216*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
217*0e209d39SAndroid Build Coastguard Worker 
218*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_PTR_STATUS(ptr, status) UPRV_BLOCK_MACRO_BEGIN { \
219*0e209d39SAndroid Build Coastguard Worker     if(utraceFnNumber & UTRACE_TRACED_ENTRY) { \
220*0e209d39SAndroid Build Coastguard Worker         utrace_exit(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (UTRACE_EXITV_PTR | UTRACE_EXITV_STATUS), ptr, status); \
221*0e209d39SAndroid Build Coastguard Worker     } \
222*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
223*0e209d39SAndroid Build Coastguard Worker 
224*0e209d39SAndroid Build Coastguard Worker /**
225*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
226*0e209d39SAndroid Build Coastguard Worker  * Takes no data arguments.
227*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
228*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
229*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
230*0e209d39SAndroid Build Coastguard Worker  * @internal
231*0e209d39SAndroid Build Coastguard Worker  */
232*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA0(level, fmt) UPRV_BLOCK_MACRO_BEGIN { \
233*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
234*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt)); \
235*0e209d39SAndroid Build Coastguard Worker     } \
236*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
237*0e209d39SAndroid Build Coastguard Worker 
238*0e209d39SAndroid Build Coastguard Worker /**
239*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
240*0e209d39SAndroid Build Coastguard Worker  * Takes one data argument.
241*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
242*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
243*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
244*0e209d39SAndroid Build Coastguard Worker  * @internal
245*0e209d39SAndroid Build Coastguard Worker  */
246*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA1(level, fmt, a) UPRV_BLOCK_MACRO_BEGIN { \
247*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
248*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a)); \
249*0e209d39SAndroid Build Coastguard Worker     } \
250*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
251*0e209d39SAndroid Build Coastguard Worker 
252*0e209d39SAndroid Build Coastguard Worker /**
253*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
254*0e209d39SAndroid Build Coastguard Worker  * Takes two data arguments.
255*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
256*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
257*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
258*0e209d39SAndroid Build Coastguard Worker  * @internal
259*0e209d39SAndroid Build Coastguard Worker  */
260*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA2(level, fmt, a, b) UPRV_BLOCK_MACRO_BEGIN { \
261*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
262*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY , (level), (fmt), (a), (b)); \
263*0e209d39SAndroid Build Coastguard Worker     } \
264*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
265*0e209d39SAndroid Build Coastguard Worker 
266*0e209d39SAndroid Build Coastguard Worker /**
267*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
268*0e209d39SAndroid Build Coastguard Worker  * Takes three data arguments.
269*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
270*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
271*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
272*0e209d39SAndroid Build Coastguard Worker  * @internal
273*0e209d39SAndroid Build Coastguard Worker  */
274*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA3(level, fmt, a, b, c) UPRV_BLOCK_MACRO_BEGIN { \
275*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
276*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c)); \
277*0e209d39SAndroid Build Coastguard Worker     } \
278*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
279*0e209d39SAndroid Build Coastguard Worker 
280*0e209d39SAndroid Build Coastguard Worker /**
281*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
282*0e209d39SAndroid Build Coastguard Worker  * Takes four data arguments.
283*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
284*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
285*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
286*0e209d39SAndroid Build Coastguard Worker  * @internal
287*0e209d39SAndroid Build Coastguard Worker  */
288*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA4(level, fmt, a, b, c, d) UPRV_BLOCK_MACRO_BEGIN { \
289*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
290*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d)); \
291*0e209d39SAndroid Build Coastguard Worker     } \
292*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
293*0e209d39SAndroid Build Coastguard Worker 
294*0e209d39SAndroid Build Coastguard Worker /**
295*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
296*0e209d39SAndroid Build Coastguard Worker  * Takes five data arguments.
297*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
298*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
299*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
300*0e209d39SAndroid Build Coastguard Worker  * @internal
301*0e209d39SAndroid Build Coastguard Worker  */
302*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA5(level, fmt, a, b, c, d, e) UPRV_BLOCK_MACRO_BEGIN { \
303*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
304*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e)); \
305*0e209d39SAndroid Build Coastguard Worker     } \
306*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
307*0e209d39SAndroid Build Coastguard Worker 
308*0e209d39SAndroid Build Coastguard Worker /**
309*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
310*0e209d39SAndroid Build Coastguard Worker  * Takes six data arguments.
311*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
312*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
313*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
314*0e209d39SAndroid Build Coastguard Worker  * @internal
315*0e209d39SAndroid Build Coastguard Worker  */
316*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA6(level, fmt, a, b, c, d, e, f) UPRV_BLOCK_MACRO_BEGIN { \
317*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
318*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f)); \
319*0e209d39SAndroid Build Coastguard Worker     } \
320*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
321*0e209d39SAndroid Build Coastguard Worker 
322*0e209d39SAndroid Build Coastguard Worker /**
323*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
324*0e209d39SAndroid Build Coastguard Worker  * Takes seven data arguments.
325*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
326*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
327*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
328*0e209d39SAndroid Build Coastguard Worker  * @internal
329*0e209d39SAndroid Build Coastguard Worker  */
330*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g) UPRV_BLOCK_MACRO_BEGIN { \
331*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
332*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g)); \
333*0e209d39SAndroid Build Coastguard Worker     } \
334*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
335*0e209d39SAndroid Build Coastguard Worker 
336*0e209d39SAndroid Build Coastguard Worker /**
337*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
338*0e209d39SAndroid Build Coastguard Worker  * Takes eight data arguments.
339*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
340*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
341*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
342*0e209d39SAndroid Build Coastguard Worker  * @internal
343*0e209d39SAndroid Build Coastguard Worker  */
344*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h) UPRV_BLOCK_MACRO_BEGIN { \
345*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
346*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h)); \
347*0e209d39SAndroid Build Coastguard Worker     } \
348*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
349*0e209d39SAndroid Build Coastguard Worker 
350*0e209d39SAndroid Build Coastguard Worker /**
351*0e209d39SAndroid Build Coastguard Worker  * Trace statement used inside functions that have a UTRACE_ENTRY() statement.
352*0e209d39SAndroid Build Coastguard Worker  * Takes nine data arguments.
353*0e209d39SAndroid Build Coastguard Worker  * The number of arguments for this macro must match the number of inserts
354*0e209d39SAndroid Build Coastguard Worker  * in the format string. Vector inserts count as two arguments.
355*0e209d39SAndroid Build Coastguard Worker  * Calls utrace_data() if the level is high enough.
356*0e209d39SAndroid Build Coastguard Worker  * @internal
357*0e209d39SAndroid Build Coastguard Worker  */
358*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i) UPRV_BLOCK_MACRO_BEGIN { \
359*0e209d39SAndroid Build Coastguard Worker     if(UTRACE_LEVEL(level)) { \
360*0e209d39SAndroid Build Coastguard Worker         utrace_data(utraceFnNumber & ~UTRACE_TRACED_ENTRY, (level), (fmt), (a), (b), (c), (d), (e), (f), (g), (h), (i)); \
361*0e209d39SAndroid Build Coastguard Worker     } \
362*0e209d39SAndroid Build Coastguard Worker } UPRV_BLOCK_MACRO_END
363*0e209d39SAndroid Build Coastguard Worker 
364*0e209d39SAndroid Build Coastguard Worker #else
365*0e209d39SAndroid Build Coastguard Worker 
366*0e209d39SAndroid Build Coastguard Worker /*
367*0e209d39SAndroid Build Coastguard Worker  * When tracing is disabled, the following macros become empty
368*0e209d39SAndroid Build Coastguard Worker  */
369*0e209d39SAndroid Build Coastguard Worker 
370*0e209d39SAndroid Build Coastguard Worker #define UTRACE_LEVEL(level) 0
371*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY(fnNumber)
372*0e209d39SAndroid Build Coastguard Worker #define UTRACE_ENTRY_OC(fnNumber)
373*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT()
374*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE(val)
375*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_STATUS(status)
376*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_VALUE_STATUS(val, status)
377*0e209d39SAndroid Build Coastguard Worker #define UTRACE_EXIT_PTR_STATUS(ptr, status)
378*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA0(level, fmt)
379*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA1(level, fmt, a)
380*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA2(level, fmt, a, b)
381*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA3(level, fmt, a, b, c)
382*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA4(level, fmt, a, b, c, d)
383*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA5(level, fmt, a, b, c, d, e)
384*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA6(level, fmt, a, b, c, d, e, f)
385*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA7(level, fmt, a, b, c, d, e, f, g)
386*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA8(level, fmt, a, b, c, d, e, f, g, h)
387*0e209d39SAndroid Build Coastguard Worker #define UTRACE_DATA9(level, fmt, a, b, c, d, e, f, g, h, i)
388*0e209d39SAndroid Build Coastguard Worker 
389*0e209d39SAndroid Build Coastguard Worker #endif
390*0e209d39SAndroid Build Coastguard Worker 
391*0e209d39SAndroid Build Coastguard Worker #endif
392