X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Flog.h;h=6c7c3de68482cc4e4f900ac886af7b94ddba7f45;hp=6e799ad36f933252e5c8f2b6428557595624087f;hb=3d6bcf07921753141a3905ee5619724573460cb3;hpb=b499b5cbd2337382142e5d532c370599fa35f865 diff --git a/src/helper/log.h b/src/helper/log.h index 6e799ad36f..6c7c3de684 100644 --- a/src/helper/log.h +++ b/src/helper/log.h @@ -26,6 +26,9 @@ #include /* logging priorities + * LOG_USER - user messages. Could be anything from information + * to progress messags. These messages do not represent + * incorrect or unexpected behaviour, just normal execution. * LOG_ERROR - fatal errors, that are likely to cause program abort * LOG_WARNING - non-fatal errors, that may be resolved later * LOG_INFO - state information, etc. @@ -33,6 +36,8 @@ */ enum log_levels { + LOG_OUTPUT = -2, + LOG_USER = -1, LOG_ERROR = 0, LOG_WARNING = 1, LOG_INFO = 2, @@ -44,16 +49,35 @@ extern void log_printf(enum log_levels level, const char *file, int line, __attribute__ ((format (printf, 5, 6))); extern int log_register_commands(struct command_context_s *cmd_ctx); extern int log_init(struct command_context_s *cmd_ctx); +extern int set_log_output(struct command_context_s *cmd_ctx, FILE *output); + +typedef void (*log_callback_fn)(void *priv, const char *file, int line, + const char *function, const char *format, va_list args); + +typedef struct log_callback_s +{ + log_callback_fn fn; + void *priv; + struct log_callback_s *next; +} log_callback_t; + +extern int log_add_callback(log_callback_fn fn, void *priv); +extern int log_remove_callback(log_callback_fn fn, void *priv); + +char *alloc_printf(const char *fmt, va_list ap); extern int debug_level; +/* Avoid fn call and building parameter list if we're not outputting the information. + * Matters on feeble CPUs for DEBUG/INFO statements that are involved frequently */ + #define DEBUG(expr ...) \ - do { \ + do { if (debug_level >= LOG_DEBUG) \ log_printf (LOG_DEBUG, __FILE__, __LINE__, __FUNCTION__, expr); \ } while(0) #define INFO(expr ...) \ - do { \ + do { if (debug_level >= LOG_INFO) \ log_printf (LOG_INFO, __FILE__, __LINE__, __FUNCTION__, expr); \ } while(0) @@ -67,25 +91,16 @@ extern int debug_level; log_printf (LOG_ERROR, __FILE__, __LINE__, __FUNCTION__, expr); \ } while(0) -#define SDEBUG(expr ...) \ - do { \ - short_log_printf (LOG_DEBUG, expr); \ - } while(0) - -#define SINFO(expr ...) \ +#define USER(expr ...) \ do { \ - short_log_printf (LOG_INFO, expr); \ + log_printf (LOG_USER, __FILE__, __LINE__, __FUNCTION__, expr); \ } while(0) -#define SWARNING(expr ...) \ +#define OUTPUT(expr ...) \ do { \ - short_log_printf (LOG_WARNING, expr); \ + log_printf (LOG_OUTPUT, __FILE__, __LINE__, __FUNCTION__, expr); \ } while(0) -#define SERROR(expr ...) \ - do { \ - short_log_printf (LOG_ERROR, expr); \ - } while(0) /* general failures * error codes < 100 @@ -95,4 +110,4 @@ extern int debug_level; #define ERROR_NO_CONFIG_FILE (-2) #define ERROR_BUF_TOO_SMALL (-3) -#endif /* ERROR_H */ +#endif /* LOG_H */