summaryrefslogtreecommitdiff
path: root/src/helper/log.c
diff options
context:
space:
mode:
authormifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-02-13 19:02:17 +0000
committermifi <mifi@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-02-13 19:02:17 +0000
commit2a0317e6f40a4f2d5d20ccdaae82100f0ad4340a (patch)
tree6703093498504afc671980ff8d506b23eefe448c /src/helper/log.c
parentedc0db163aafc78b68ad23878225703742425df5 (diff)
downloadopenocd+libswd-2a0317e6f40a4f2d5d20ccdaae82100f0ad4340a.tar.gz
openocd+libswd-2a0317e6f40a4f2d5d20ccdaae82100f0ad4340a.tar.bz2
openocd+libswd-2a0317e6f40a4f2d5d20ccdaae82100f0ad4340a.tar.xz
openocd+libswd-2a0317e6f40a4f2d5d20ccdaae82100f0ad4340a.zip
- added patch to Improving progress/error output for telnet & GDB monitor
(thanks to Øyvind for the patch) git-svn-id: svn://svn.berlios.de/openocd/trunk@293 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/helper/log.c')
-rw-r--r--src/helper/log.c64
1 files changed, 53 insertions, 11 deletions
diff --git a/src/helper/log.c b/src/helper/log.c
index 74407078..db0bc0bd 100644
--- a/src/helper/log.c
+++ b/src/helper/log.c
@@ -33,6 +33,16 @@ int debug_level = -1;
static FILE* log_output;
+
+static void *privData;
+static logCallback callback;
+
+void log_setCallback(logCallback c, void *p)
+{
+ callback=c;
+ privData=p;
+}
+
static char *log_strings[4] =
{
"Error: ",
@@ -56,25 +66,18 @@ void log_printf(enum log_levels level, const char *file, int line, const char *f
fflush(log_output);
va_end(args);
-}
-void short_log_printf(enum log_levels level, const char *format, ...)
+ if (callback)
{
- va_list args;
- char buffer[512];
-
- if (level > debug_level)
- return;
-
va_start(args, format);
- vsnprintf(buffer, 512, format, args);
- fprintf(log_output, "%s %s\n", log_strings[level], buffer);
- fflush(log_output);
+ callback(privData, file, line, function, format, args);
va_end(args);
}
+}
+
/* change the current debug level on the fly
* 0: only ERRORS
* 1: + WARNINGS
@@ -136,3 +139,42 @@ int log_init(struct command_context_s *cmd_ctx)
return ERROR_OK;
}
+
+int set_log_output(struct command_context_s *cmd_ctx, FILE *output)
+{
+ log_output=output;
+ return ERROR_OK;
+}
+
+/* return allocated string w/printf() result */
+char *allocPrintf(const char *fmt, va_list ap)
+{
+ char *string=NULL;
+ int size=0; // start by 0 to exercise all the code paths. Need minimum 2 bytes to fit 1 char and 0 terminator.
+ int first=1;
+ for (;;)
+ {
+ if ((string==NULL)||(!first))
+ {
+ size=size*2+2;
+ char *t=string;
+ string=realloc(string, size);
+ if (string==NULL)
+ {
+ if (t!=NULL)
+ free(t);
+ return NULL;
+ }
+ }
+
+ int ret;
+ ret = vsnprintf(string, size, fmt, ap);
+ // NB! The result of the vsnprintf() might be an *EMPTY* string!
+ if ((ret>=0)&&((ret+1)<size))
+ {
+ return string;
+ }
+ // there was just enough or not enough space, allocate more.
+ first=0;
+ }
+}