Commit 270166e66646ce916f091abb980e59303a042dc5
authorMichel Pollet <buserror@gmail.com>
Wed, 27 Nov 2013 21:16:36 +0000 (21:16 +0000)
committerMichel Pollet <buserror@gmail.com>
Wed, 27 Nov 2013 21:16:36 +0000 (21:16 +0000)
It was not very clean; Instead there is a new accessor for
setting/getting a global logging function pointer.
Also made sure it is not compiled for the cores, since they use AVR
headers and have no stdarg.h anyway

Signed-off-by: Michel Pollet <buserror@gmail.com>
3 files changed:
Makefile.common
simavr/sim/sim_avr.c
simavr/sim/sim_avr.h

index d44058b769d8d04dc55d5a021800e460f292eeed..3976b6571d32b0a5dca7d0afdccac5bae8695310 100644 (file)
@@ -41,7 +41,7 @@ ARCH          = ${shell $(CC) -dumpmachine | sed -e 's/^x/i/' -e 's/\(.\).*/\1/'}
 
 CFLAGS         += -O2 -Wall
 CFLAGS         += -g
-CORE_CFLAGS    = -nostdinc
+CORE_CFLAGS    = -nostdinc -DAVR_CORE=1
 
 ifeq (${shell uname}, Darwin)
 # gcc 4.2 from MacOS is really not up to scratch anymore 
index 894bc0bb89f742b10a4797d434ef18c2c9495ae5..fe53d1806f3249d64b35d45ebcce8bec2ce4932f 100644 (file)
 #define AVR_KIND_DECL
 #include "sim_core_decl.h"
 
-static void std_logger(avr_t * avr, const int level, const char * format, ...);
-avr_logger_p avr_global_logger = std_logger;
+static void std_logger(avr_t * avr, const int level, const char * format, va_list ap);
+static avr_logger_p _avr_global_logger = std_logger;
+
+void
+avr_global_logger(
+               struct avr_t* avr, 
+               const int level, 
+               const char * format, 
+               ... )
+{
+       va_list args;
+       va_start(args, format);
+       if (_avr_global_logger)
+               _avr_global_logger(avr, level, format, args);
+       va_end(args);   
+}
+
+void
+avr_global_logger_set(
+               avr_logger_p logger)
+{
+       _avr_global_logger = logger ? logger : std_logger;
+}
+
+avr_logger_p
+avr_global_logger_get()
+{
+       return _avr_global_logger;
+}
+
 
 int avr_init(avr_t * avr)
 {
@@ -353,13 +381,10 @@ avr_make_mcu_by_name(
        return avr;
 }
 
-static void std_logger(avr_t* avr, const int level, const char * format, ...)
+static void std_logger(avr_t* avr, const int level, const char * format, va_list ap)
 {
        if (!avr || avr->log >= level) {
-               va_list args;
-               va_start(args, format);
-               vfprintf((level > LOG_ERROR) ?  stdout : stderr , format, args);
-               va_end(args);
+               vfprintf((level > LOG_ERROR) ?  stdout : stderr , format, ap);
        }
 }
 
index dde8873527f6904dcb5f88d8c860ab48f9985d04..00bfb3a2858f7470dc449213df0d1ebe79059193 100644 (file)
@@ -72,8 +72,7 @@ enum {
        LOG_TRACE,
 };
 
-typedef void (*avr_logger_p)(struct avr_t* avr, const int level, const char * format, ... );
-extern avr_logger_p avr_global_logger;
+
 #ifndef AVR_LOG
 #define AVR_LOG(avr, level, ...) \
        do { \
@@ -373,6 +372,31 @@ avr_sadly_crashed(
                avr_t *avr,
                uint8_t signal);
 
+/*
+ * Logs a message using the current logger
+ */
+void
+avr_global_logger(
+               struct avr_t* avr, 
+               const int level, 
+               const char * format, 
+               ... );
+
+#ifndef AVR_CORE
+#include <stdarg.h>
+/*
+ * Type for custom logging functions
+ */
+typedef void (*avr_logger_p)(struct avr_t* avr, const int level, const char * format, va_list ap);
+
+/* Sets a global logging function in place of the default */
+void
+avr_global_logger_set(
+               avr_logger_p logger);
+/* Gets the current global logger function */
+avr_logger_p
+avr_global_logger_get();
+#endif
 
 /*
  * These are callbacks for the two 'main' behaviour in simavr