From 482959260123683d89cadc570e4b99cea657c41a Mon Sep 17 00:00:00 2001 From: Johannes Zarl Date: Mon, 18 Apr 2011 17:01:58 +0200 Subject: [PATCH] Add support for redirecting or disabling messages from stdout to elsewhere. The newly introduced procedure wiiuse_set_output can be used to set the FILE* used for each of the loglevels LOGLEVEL_ERROR, LOGLEVEL_WARNING, LOGLEVEL_INFO, and LOGLEVEL_DEBUG. Setting the logfile to 0 disables log output for a loglevel. This adds the macro definition WIIUSE_HAS_OUTPUT_REDIRECTION, so programs can test for the feature. The internal log macros in definitions.h all honor this output redirection mechanism. --- src/definitions.h | 27 ++++++++++++++++++--------- src/wiiuse.c | 23 +++++++++++++++++++++++ src/wiiuse.h | 12 ++++++++++++ 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/definitions.h b/src/definitions.h index 13ca132..b6b92f9 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -41,25 +41,34 @@ //#define WITH_WIIUSE_DEBUG +extern FILE* logtarget[]; + +#define OUTF_ERROR logtarget[0] +#define OUTF_WARNING logtarget[1] +#define OUTF_INFO logtarget[2] +#define OUTF_DEBUG logtarget[3] + /* Error output macros */ -#define WIIUSE_ERROR(fmt, ...) fprintf(stderr, "[ERROR] " fmt "\n", ##__VA_ARGS__) +#define WIIUSE_ERROR(fmt, ...) do { if (OUTF_ERROR) fprintf(OUTF_ERROR, "[ERROR] " fmt "\n", ##__VA_ARGS__); } while(0) /* Warning output macros */ -#define WIIUSE_WARNING(fmt, ...) fprintf(stderr, "[WARNING] " fmt "\n", ##__VA_ARGS__) +#define WIIUSE_WARNING(fmt, ...) do { if (OUTF_WARNING) fprintf(OUTF_WARNING, "[WARNING] " fmt "\n", ##__VA_ARGS__); } while(0) /* Information output macros */ -#define WIIUSE_INFO(fmt, ...) fprintf(stderr, "[INFO] " fmt "\n", ##__VA_ARGS__) +#define WIIUSE_INFO(fmt, ...) do { if (OUTF_INFO) fprintf(OUTF_INFO, "[INFO] " fmt "\n", ##__VA_ARGS__); } while(0) #ifdef WITH_WIIUSE_DEBUG #ifdef WIN32 - #define WIIUSE_DEBUG(fmt, ...) do { \ - char* file = __FILE__; \ - int i = strlen(file) - 1; \ - for (; i && (file[i] != '\\'); --i); \ - fprintf(stderr, "[DEBUG] %s:%i: " fmt "\n", file+i+1, __LINE__, ##__VA_ARGS__); \ + #define WIIUSE_DEBUG(fmt, ...) do { \ + if (OUTF_DEBUG) { \ + char* file = __FILE__; \ + int i = strlen(file) - 1; \ + for (; i && (file[i] != '\\'); --i); \ + fprintf(OUTF_DEBUG, "[DEBUG] %s:%i: " fmt "\n", file+i+1, __LINE__, ##__VA_ARGS__); \ + } \ } while (0) #else - #define WIIUSE_DEBUG(fmt, ...) fprintf(stderr, "[DEBUG] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__) + #define WIIUSE_DEBUG(fmt, ...) do { if (OUTF_DEBUG) fprintf(OUTF_DEBUG, "[DEBUG] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__); } while (0) #endif #else #define WIIUSE_DEBUG(fmt, ...) diff --git a/src/wiiuse.c b/src/wiiuse.c index cca162f..6339324 100644 --- a/src/wiiuse.c +++ b/src/wiiuse.c @@ -58,6 +58,24 @@ const char* wiiuse_version() { return WIIUSE_VERSION; } +/** + * @brief Output FILE stream for each wiiuse_loglevel. + */ +FILE* logtarget[4]; + +/** + * @brief Initialize an array of wiimote structures. + * + * @param loglevel The loglevel, for which the output should be set. + * + * @param logfile A valid, writeable FILE*, or 0, if output should be disabled. + * + * The default FILE* for all loglevels is stderr + */ +void wiiuse_set_output(enum wiiuse_loglevel loglevel, FILE *logfile) +{ + logtarget[(int)loglevel] = logfile; +} /** * @brief Clean up wiimote_t array created by wiiuse_init() @@ -112,6 +130,11 @@ struct wiimote_t** wiiuse_init(int wiimotes) { g_banner = 1; } + logtarget[0] = stderr; + logtarget[1] = stderr; + logtarget[2] = stderr; + logtarget[3] = stderr; + if (!wiimotes) return NULL; diff --git a/src/wiiuse.h b/src/wiiuse.h index 2c198f4..2b8f304 100644 --- a/src/wiiuse.h +++ b/src/wiiuse.h @@ -612,6 +612,16 @@ typedef struct wiimote_t { WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */ } wiimote; +/** + * @enum WIIUSE_LOGLEVEL + * @brief Loglevels supported by wiiuse. + */ +typedef enum wiiuse_loglevel { + LOGLEVEL_ERROR = 0, + LOGLEVEL_WARNING = 1, + LOGLEVEL_INFO = 2, + LOGLEVEL_DEBUG = 3 +} wiiuse_loglevel; /***************************************** * @@ -639,6 +649,8 @@ extern "C" { /* wiiuse.c */ WIIUSE_EXPORT extern const char* wiiuse_version(); +#define WIIUSE_HAS_OUTPUT_REDIRECTION +WIIUSE_EXPORT extern void wiiuse_set_output(enum wiiuse_loglevel loglevel, FILE *logtarget); WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes); WIIUSE_EXPORT extern void wiiuse_disconnected(struct wiimote_t* wm);