Pavel Chromy
[fw/openocd] / src / helper / log.h
1 /***************************************************************************\r
2  *   Copyright (C) 2005 by Dominic Rath                                    *\r
3  *   Dominic.Rath@gmx.de                                                   *\r
4  *                                                                         *\r
5  *   This program is free software; you can redistribute it and/or modify  *\r
6  *   it under the terms of the GNU General Public License as published by  *\r
7  *   the Free Software Foundation; either version 2 of the License, or     *\r
8  *   (at your option) any later version.                                   *\r
9  *                                                                         *\r
10  *   This program is distributed in the hope that it will be useful,       *\r
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
13  *   GNU General Public License for more details.                          *\r
14  *                                                                         *\r
15  *   You should have received a copy of the GNU General Public License     *\r
16  *   along with this program; if not, write to the                         *\r
17  *   Free Software Foundation, Inc.,                                       *\r
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
19  ***************************************************************************/\r
20 #ifndef ERROR_H\r
21 #define ERROR_H\r
22 \r
23 #include "replacements.h"\r
24 #include "command.h"\r
25 \r
26 #include <stdarg.h>\r
27 \r
28 /* logging priorities \r
29  * LOG_USER - user messages. Could be anything from information \r
30  *            to progress messags. These messages do not represent\r
31  *            incorrect or unexpected behaviour, just normal execution. \r
32  * LOG_ERROR - fatal errors, that are likely to cause program abort\r
33  * LOG_WARNING - non-fatal errors, that may be resolved later\r
34  * LOG_INFO - state information, etc.\r
35  * LOG_DEBUG - debug statements, execution trace\r
36  */\r
37 enum log_levels\r
38 {\r
39         LOG_OUTPUT = -2,\r
40         LOG_USER = -1,\r
41         LOG_ERROR = 0,\r
42         LOG_WARNING = 1,\r
43         LOG_INFO = 2,\r
44         LOG_DEBUG = 3\r
45 };\r
46 \r
47 extern void log_printf(enum log_levels level, const char *file, int line, \r
48         const char *function, const char *format, ...) \r
49         __attribute__ ((format (printf, 5, 6)));\r
50 extern int log_register_commands(struct command_context_s *cmd_ctx);\r
51 extern int log_init(struct command_context_s *cmd_ctx);\r
52 extern int set_log_output(struct command_context_s *cmd_ctx, FILE *output);\r
53 \r
54 typedef void (*log_callback_fn)(void *priv, const char *file, int line,\r
55                 const char *function, const char *format, va_list args);\r
56 \r
57 typedef struct log_callback_s\r
58 {\r
59     log_callback_fn fn;\r
60         void *priv;\r
61     struct log_callback_s *next;\r
62 } log_callback_t;\r
63 \r
64 extern int log_add_callback(log_callback_fn fn, void *priv);\r
65 extern int log_remove_callback(log_callback_fn fn, void *priv);\r
66 \r
67 char *alloc_printf(const char *fmt, va_list ap);\r
68 \r
69 extern int debug_level;\r
70 \r
71 /* Avoid fn call and building parameter list if we're not outputting the information.\r
72  * Matters on feeble CPUs for DEBUG/INFO statements that are involved frequently */\r
73 \r
74 #define DEBUG(expr ...) \\r
75         do { if (debug_level >= LOG_DEBUG) \\r
76                 log_printf (LOG_DEBUG, __FILE__, __LINE__, __FUNCTION__, expr); \\r
77         } while(0)\r
78 \r
79 #define INFO(expr ...) \\r
80         do { if (debug_level >= LOG_INFO) \\r
81                 log_printf (LOG_INFO, __FILE__, __LINE__, __FUNCTION__, expr); \\r
82         } while(0)\r
83 \r
84 #define WARNING(expr ...) \\r
85         do { \\r
86                 log_printf (LOG_WARNING, __FILE__, __LINE__, __FUNCTION__, expr); \\r
87         } while(0)\r
88 \r
89 #define ERROR(expr ...) \\r
90         do { \\r
91                 log_printf (LOG_ERROR, __FILE__, __LINE__, __FUNCTION__, expr); \\r
92         } while(0)\r
93 \r
94 #define USER(expr ...) \\r
95         do { \\r
96                 log_printf (LOG_USER, __FILE__, __LINE__, __FUNCTION__, expr); \\r
97         } while(0)\r
98 \r
99 #define OUTPUT(expr ...) \\r
100         do { \\r
101                 log_printf (LOG_OUTPUT, __FILE__, __LINE__, __FUNCTION__, expr); \\r
102         } while(0)\r
103 \r
104 \r
105 /* general failures\r
106  * error codes < 100\r
107  */\r
108 #define ERROR_OK                                        (0)\r
109 #define ERROR_INVALID_ARGUMENTS         (-1)\r
110 #define ERROR_NO_CONFIG_FILE            (-2)\r
111 #define ERROR_BUF_TOO_SMALL                     (-3)\r
112 \r
113 #endif /* LOG_H */\r