1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picodbg.h
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Provides functions and macros to debug the Pico system and to trace
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the execution of its code.
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picodbg
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------\n
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico Debug Support </b>\n
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------\n
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * GENERAL REMARKS
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * This module provides a set of macros to help debug the Pico system.
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * The usage of macros allows for completely removing debug code from
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the binaries delivered to customers. To enable diagnostic output
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the preprocessor symbol PICO_DEBUG has to be defined.
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By using global variables (to store the current log level etc.)
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * this module violates a basic Pico design principle!
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Justification:\n
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - going without global data would reduce the functionality
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   of this module considerably (e.g., log level could not be
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   changed at runtime etc.)
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - at the moment, the only known system interdicting global
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   variables is Symbian; but even there global variables are
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   possible by using thread-local storage
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - allocating global data on the heap would require to pass
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   a handle to this memory block to all routines of this
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   module which in turn implies that _every_ function in the
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   Pico system would require a pointer to some global data;
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   obviously, this would be very awkward
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Furthermore, this module uses the non-standardized but handy
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * __FUNCTION__ macro. It expands to the name of the enclosing
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * function. For compilers not supporting this macro simply
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * define __FUNCTION__ as an empty string.
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * INITIALIZATION/TERMINATION\n
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * --------------------------\n
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Before using any debug macros, this module has to be initialized
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * by calling PICODBG_INITIALIZE(). If the routines are not needed
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * anymore, PICODBG_TERMINATE() has to be called to terminate the
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * module (e.g., to close the log file).
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * TRACING\n
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -------\n
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Each tracing message is associated with a log level which describes
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * its severity. The following levels are supported:
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Trace - Very detailed log messages, potentially of a high
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            frequency and volume
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Debug - Less detailed and/or less frequent debugging messages
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Info  - Informational messages
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Warn  - Warnings which don't appear to the Pico user
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Error - Error messages
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Tracing messages can use the well-known printf format specification.
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * But because variadic macros (macros with a variable no. arguments)
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * are not commonly supported by compilers a little trick is used
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * which requires the format string and its arguments to be enclosed
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * in double parenthesis:
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - PICODBG_INFO(("hello, world!"));
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - PICODBG_TRACE(("argc=%d", argc));
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    ...
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Each tracing message is expected to be a single line of text. Some
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * contextual information (e.g., log level, time and date, source file
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * and line number) and a newline are automatically added. The output
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * format can be customized by a call to PICODBG_SET_OUTPUT_FORMAT().
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Sample output:
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    - *** info|2008-04-03|14:51:36|dbgdemo.c(15)|hello world
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    - *** trace|2008-04-03|14:51:36|dbgdemo.c(16)|argc=2
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    - ...
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * To compose a tracing message line consisting of, e.g. the elements
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * of an array, on the Info level two additional macros shown in the
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * following example are provided:
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    PICODBG_INFO_CTX();\n
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    for (i = 0; i < len; i++)\n
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *        ...some calc with arr and i\n
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *        PICODBG_INFO_MSG((" %d", arr[i]));\n
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    }\n
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *    PICODBG_INFO_MSG(("\n"));\n
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Colored output of tracing messages helps to capture severe problems
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * quickly. This feature is supported on the Windows platform and on
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * platforms supporting ANSI escape codes. PICODBG_ENABLE_COLORS() lets
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you turn on and off colored output.
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * FILTERING\n
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------\n
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By calling PICODBG_SET_LOG_LEVEL() the log level may be changed at
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * any time to increase/decrease the amount of debugging output.
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By calling PICODBG_SET_LOG_FILTERFN() the log filter may be changed
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * at any time to change the source file name being used as filter for
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * log messages (ie. only tracing info of the specified file will be
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * logged). To disable the file name based filter set the filter file
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * name to an empty string.
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Future version of this module might provide further filtering
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * possibilities (e.g., filtering based on function names * etc.).
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * LOGGING\n
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -------\n
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By default, tracing messages are output to the console (stderr).
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * This allows for separating diagnostic output from other console
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * output to stdout. In addition, tracing messages may be saved to
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * a file by calling PICODBG_SET_LOG_FILE().
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Currently, file output is the only additional output target; but
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * on embedded systems, more output targets may be required (e.g.,
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * sending output to a serial port or over the network).
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ASSERTIONS\n
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ----------\n
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * To support the 'design/programming by contract' paradigm, this
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * module also provides assertions. PICODBG_ASSERT(expr) evualuates
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * an expression and, when the result is false, prints a diagnostic
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * message and aborts the program.
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * FUTURE EXTENSIONS\n
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -----------------\n
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - advanced tracing functions to dump complex data
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - debug memory allocation that can be used to assist in
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   finding memory problems
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if !defined(__PICODBG_H__)
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define __PICODBG_H__
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Not all compilers support the __FUNCTION__ macro */
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if !defined(__FUNCTION__) && !defined(__GNUC__)
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define __FUNCTION__ ""
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Log levels sorted by severity */
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_ERROR     1
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_WARN      2
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_INFO      3
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_DEBUG     4
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_TRACE     5
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Output format flags */
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_LEVEL          0x0001
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_DATE           0x0002
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_TIME           0x0004
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCNAME        0x0008
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCLINE        0x0010
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCALL         (PICODBG_SHOW_SRCNAME | PICODBG_SHOW_SRCLINE)
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_FUNCTION       0x0020
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_POS            (PICODBG_SHOW_SRCALL | PICODBG_SHOW_FUNCTION)
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* definition of PICO_DEBUG enables debugging code */
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INITIALIZE(level) \
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_initialize(level)
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TERMINATE() \
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_terminate()
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_LEVEL(level) \
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_setLogLevel(level)
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILTERFN(name) \
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_setLogFilterFN(name)
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILE(name) \
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_setLogFile(name)
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ENABLE_COLORS(flag) \
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_enableColors(flag)
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_OUTPUT_FORMAT(format) \
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_setOutputFormat(format)
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT(expr) \
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (;!(expr);picodbg_assert(__FILE__, __LINE__, __FUNCTION__, #expr))
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT_RANGE(val, min, max) \
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_ASSERT(((val) >= (min)) && ((val) <= (max)))
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG(level, msg) \
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_log(level, 1,  __FILE__, __LINE__, __FUNCTION__, picodbg_varargs msg)
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ERROR(msg) \
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_LOG(PICODBG_LOG_LEVEL_ERROR, msg)
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_WARN(msg) \
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_LOG(PICODBG_LOG_LEVEL_WARN, msg)
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO(msg) \
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_LOG(PICODBG_LOG_LEVEL_INFO, msg)
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_DEBUG(msg) \
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_LOG(PICODBG_LOG_LEVEL_DEBUG, msg)
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TRACE(msg) \
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_LOG(PICODBG_LOG_LEVEL_TRACE, msg)
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_CTX() \
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_log(PICODBG_LOG_LEVEL_INFO, 0, __FILE__, __LINE__, __FUNCTION__, "")
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG(msg) \
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_log_msg(PICODBG_LOG_LEVEL_INFO, __FILE__, picodbg_varargs msg)
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG_F(filterfn, msg) \
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodbg_log_msg(PICODBG_LOG_LEVEL_INFO, (const char *)filterfn, picodbg_varargs msg)
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* helper routines; should NOT be used directly! */
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_initialize(int level);
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_terminate();
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogLevel(int level);
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogFilterFN(const char *name);
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogFile(const char *name);
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_enableColors(int flag);
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setOutputFormat(unsigned int format);
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenconst char *picodbg_varargs(const char *format, ...);
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_log(int level, int donewline, const char *file, int line,
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                 const char *func, const char *msg);
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_assert(const char *file, int line, const char *func,
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    const char *expr);
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_log_msg(int level, const char *file, const char *msg);
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#else  /* release version; omit debugging code */
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INITIALIZE(level)
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TERMINATE()
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_LEVEL(level)
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILTERFN(name)
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILE(name)
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ENABLE_COLORS(flag)
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_OUTPUT_FORMAT(format)
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT(expr)
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT_RANGE(val, min, max)
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG(level, msg)
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ERROR(msg)
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_WARN(msg)
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO(msg)
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_DEBUG(msg)
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TRACE(msg)
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_CTX()
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG(msg)
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG_F(filterfn, msg)
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* defined(PICO_DEBUG) */
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* !defined(__PICODBG_H__) */
312