X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Flog.c;h=769816a6cdbcaaeba4c523ff8700d0e2ad8e6379;hp=a5432aa9c53756d889240aa783ad9808ccb911c0;hb=9e5a6679cac36667e51f24a6bd5670396cd06ed6;hpb=5279d519f8e98d6a134e77b54669512f618672bd diff --git a/src/helper/log.c b/src/helper/log.c index a5432aa9c5..769816a6cd 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -46,20 +46,14 @@ static char *log_strings[5] = "Debug: " }; -void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...) +static int count = 0; + +static void log_printfv(enum log_levels level, const char *file, int line, const char *function, const char *format, va_list args) { - static int count = 0; - count++; - va_list args; char buffer[512]; log_callback_t *cb; - if (level > debug_level) - return; - - va_start(args, format); vsnprintf(buffer, 512, format, args); - va_end(args); if (level == LOG_OUTPUT) { @@ -76,8 +70,8 @@ void log_printf(enum log_levels level, const char *file, int line, const char *f if (debug_level >= LOG_DEBUG) { /* print with count and time information */ - time_t t=time(NULL)-start; - fprintf(log_output, "%s %d %ld %s:%d %s(): %s\n", log_strings[level+1], count, t, file, line, function, buffer); + int t=(int)(time(NULL)-start); + fprintf(log_output, "%s %d %d %s:%d %s(): %s\n", log_strings[level+1], count, t, file, line, function, buffer); } else { @@ -86,19 +80,46 @@ void log_printf(enum log_levels level, const char *file, int line, const char *f } fflush(log_output); - + /* Never forward LOG_DEBUG, too verbose and they can be found in the log if need be */ if (level <= LOG_INFO) { for (cb = log_callbacks; cb; cb = cb->next) { - va_start(args, format); cb->fn(cb->priv, file, line, function, format, args); - va_end(args); } } } +void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...) +{ + count++; + if (level > debug_level) + return; + + va_list args; + va_start(args, format); + log_printfv(level, file, line, function, format, args); + va_end(args); + +} + +void log_printfnl(enum log_levels level, const char *file, int line, const char *function, const char *format, ...) +{ + count++; + if (level > debug_level) + return; + + char *t=malloc(strlen(format)+2); + strcpy(t, format); + strcat(t, "\n"); + + va_list args; + va_start(args, format); + log_printfv(level, file, line, function, t, args); + va_end(args); +} + /* change the current debug level on the fly * 0: only ERRORS * 1: + WARNINGS @@ -127,7 +148,7 @@ int handle_log_output_command(struct command_context_s *cmd_ctx, char *cmd, char if (argc == 1) { FILE* file = fopen(args[0], "w"); - + if (file) { log_output = file; @@ -153,15 +174,15 @@ int log_init(struct command_context_s *cmd_ctx) /* set defaults for daemon configuration, if not set by cmdline or cfgfile */ if (debug_level == -1) debug_level = LOG_INFO; - + if (log_output == NULL) { log_output = stderr; } - + return ERROR_OK; } - + int set_log_output(struct command_context_s *cmd_ctx, FILE *output) { log_output = output; @@ -215,7 +236,7 @@ int log_remove_callback(log_callback_fn fn, void *priv) char *alloc_printf(const char *fmt, va_list ap) { char *string = NULL; - + /* start by 0 to exercise all the code paths. Need minimum 2 bytes to * fit 1 char and 0 terminator. */ int size = 0; @@ -234,7 +255,7 @@ char *alloc_printf(const char *fmt, va_list ap) return NULL; } } - + int ret; ret = vsnprintf(string, size, fmt, ap); /* NB! The result of the vsnprintf() might be an *EMPTY* string! */