1 /*************************************************************************** 2 * Copyright (C) 2005 by Dominic Rath * 3 * Dominic.Rath@gmx.de * 4 * * 5 * Copyright (C) 2007,2008 Øyvind Harboe * 6 * oyvind.harboe@zylin.com * 7 * * 8 * Copyright (C) 2008 by Spencer Oliver * 9 * spen@spen-soft.co.uk * 10 * * 11 * This program is free software; you can redistribute it and/or modify * 12 * it under the terms of the GNU General Public License as published by * 13 * the Free Software Foundation; either version 2 of the License, or * 14 * (at your option) any later version. * 15 * * 16 * This program is distributed in the hope that it will be useful, * 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 19 * GNU General Public License for more details. * 20 * * 21 * You should have received a copy of the GNU General Public License * 22 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 23 ***************************************************************************/ 24 25 #ifndef OPENOCD_HELPER_LOG_H 26 #define OPENOCD_HELPER_LOG_H 27 28 #include <helper/command.h> 29 30 /* To achieve C99 printf compatibility in MinGW, gnu_printf should be 31 * used for __attribute__((format( ... ))), with GCC v4.4 or later 32 */ 33 #if (defined(IS_MINGW) && (((__GNUC__ << 16) + __GNUC_MINOR__) >= 0x00040004)) 34 #define PRINTF_ATTRIBUTE_FORMAT gnu_printf 35 #else 36 #define PRINTF_ATTRIBUTE_FORMAT printf 37 #endif 38 39 /* logging priorities 40 * LOG_LVL_SILENT - turn off all output. In lieu of try + catch this can be used as a 41 * feeble ersatz. 42 * LOG_LVL_USER - user messages. Could be anything from information 43 * to progress messages. These messages do not represent 44 * incorrect or unexpected behaviour, just normal execution. 45 * LOG_LVL_ERROR - fatal errors, that are likely to cause program abort 46 * LOG_LVL_WARNING - non-fatal errors, that may be resolved later 47 * LOG_LVL_INFO - state information, etc. 48 * LOG_LVL_DEBUG - debug statements, execution trace 49 * LOG_LVL_DEBUG_IO - verbose debug, low-level I/O trace 50 */ 51 enum log_levels { 52 LOG_LVL_SILENT = -3, 53 LOG_LVL_OUTPUT = -2, 54 LOG_LVL_USER = -1, 55 LOG_LVL_ERROR = 0, 56 LOG_LVL_WARNING = 1, 57 LOG_LVL_INFO = 2, 58 LOG_LVL_DEBUG = 3, 59 LOG_LVL_DEBUG_IO = 4, 60 }; 61 62 void log_printf(enum log_levels level, const char *file, unsigned line, 63 const char *function, const char *format, ...) 64 __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 5, 6))); 65 void log_vprintf_lf(enum log_levels level, const char *file, unsigned line, 66 const char *function, const char *format, va_list args); 67 void log_printf_lf(enum log_levels level, const char *file, unsigned line, 68 const char *function, const char *format, ...) 69 __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 5, 6))); 70 71 /** 72 * Initialize logging module. Call during program startup. 73 */ 74 void log_init(void); 75 int set_log_output(struct command_context *cmd_ctx, FILE *output); 76 77 int log_register_commands(struct command_context *cmd_ctx); 78 79 void keep_alive(void); 80 void kept_alive(void); 81 82 void alive_sleep(uint64_t ms); 83 void busy_sleep(uint64_t ms); 84 85 void log_socket_error(const char *socket_desc); 86 87 typedef void (*log_callback_fn)(void *priv, const char *file, unsigned line, 88 const char *function, const char *string); 89 90 struct log_callback { 91 log_callback_fn fn; 92 void *priv; 93 struct log_callback *next; 94 }; 95 96 int log_add_callback(log_callback_fn fn, void *priv); 97 int log_remove_callback(log_callback_fn fn, void *priv); 98 99 char *alloc_vprintf(const char *fmt, va_list ap); 100 char *alloc_printf(const char *fmt, ...) 101 __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 1, 2))); 102 103 extern int debug_level; 104 105 /* Avoid fn call and building parameter list if we're not outputting the information. 106 * Matters on feeble CPUs for DEBUG/INFO statements that are involved frequently */ 107 108 #define LOG_LEVEL_IS(FOO) ((debug_level) >= (FOO)) 109 110 #define LOG_DEBUG_IO(expr ...) \ 111 do { \ 112 if (debug_level >= LOG_LVL_DEBUG_IO) \ 113 log_printf_lf(LOG_LVL_DEBUG, \ 114 __FILE__, __LINE__, __func__, \ 115 expr); \ 116 } while (0) 117 118 #define LOG_DEBUG(expr ...) \ 119 do { \ 120 if (debug_level >= LOG_LVL_DEBUG) \ 121 log_printf_lf(LOG_LVL_DEBUG, \ 122 __FILE__, __LINE__, __func__, \ 123 expr); \ 124 } while (0) 125 126 #define LOG_INFO(expr ...) \ 127 log_printf_lf(LOG_LVL_INFO, __FILE__, __LINE__, __func__, expr) 128 129 #define LOG_WARNING(expr ...) \ 130 log_printf_lf(LOG_LVL_WARNING, __FILE__, __LINE__, __func__, expr) 131 132 #define LOG_ERROR(expr ...) \ 133 log_printf_lf(LOG_LVL_ERROR, __FILE__, __LINE__, __func__, expr) 134 135 #define LOG_USER(expr ...) \ 136 log_printf_lf(LOG_LVL_USER, __FILE__, __LINE__, __func__, expr) 137 138 #define LOG_USER_N(expr ...) \ 139 log_printf(LOG_LVL_USER, __FILE__, __LINE__, __func__, expr) 140 141 #define LOG_OUTPUT(expr ...) \ 142 log_printf(LOG_LVL_OUTPUT, __FILE__, __LINE__, __func__, expr) 143 144 /* general failures 145 * error codes < 100 146 */ 147 #define ERROR_OK (0) 148 #define ERROR_NO_CONFIG_FILE (-2) 149 #define ERROR_BUF_TOO_SMALL (-3) 150 /* see "Error:" log entry for meaningful message to the user. The caller should 151 * make no assumptions about what went wrong and try to handle the problem. 152 */ 153 #define ERROR_FAIL (-4) 154 #define ERROR_WAIT (-5) 155 /* ERROR_TIMEOUT is already taken by winerror.h. */ 156 #define ERROR_TIMEOUT_REACHED (-6) 157 #define ERROR_NOT_IMPLEMENTED (-7) 158 159 160 #endif /* OPENOCD_HELPER_LOG_H */ 161