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