|
|
@@ -0,0 +1,145 @@ |
|
|
|
/* |
|
|
|
Copyright 2012 David Robillard <http://drobilla.net> |
|
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any |
|
|
|
purpose with or without fee is hereby granted, provided that the above |
|
|
|
copyright notice and this permission notice appear in all copies. |
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
|
|
*/ |
|
|
|
|
|
|
|
/** |
|
|
|
@file logger.h Convenience API for easy logging in plugin code. |
|
|
|
|
|
|
|
This file provides simple wrappers for the most common log operations for |
|
|
|
use in plugin implementations. If host support for logging is not |
|
|
|
available, then these functions will print to stderr instead. |
|
|
|
|
|
|
|
This header is non-normative, it is provided for convenience. |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifndef LV2_ATOM_LOGGER_H |
|
|
|
#define LV2_ATOM_LOGGER_H |
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
#include "log.h" |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
extern "C" { |
|
|
|
#endif |
|
|
|
|
|
|
|
/** |
|
|
|
Logger convenience API state. |
|
|
|
*/ |
|
|
|
typedef struct { |
|
|
|
LV2_Log_Log* log; |
|
|
|
|
|
|
|
LV2_URID Error; |
|
|
|
LV2_URID Note; |
|
|
|
LV2_URID Trace; |
|
|
|
LV2_URID Warning; |
|
|
|
} LV2_Log_Logger; |
|
|
|
|
|
|
|
/** |
|
|
|
Initialise @p logger. |
|
|
|
|
|
|
|
URIs will be mapped using @p map and stored, a reference to @p map itself is |
|
|
|
not held. Both @p map and @p log may be NULL when unsupported by the host, |
|
|
|
in which case the implementation will fall back to printing to stderr. |
|
|
|
*/ |
|
|
|
static inline void |
|
|
|
lv2_log_logger_init(LV2_Log_Logger* logger, |
|
|
|
LV2_URID_Map* map, |
|
|
|
LV2_Log_Log* log) |
|
|
|
{ |
|
|
|
memset(logger, 0, sizeof(LV2_Log_Logger)); |
|
|
|
logger->log = log; |
|
|
|
if (map) { |
|
|
|
logger->Error = map->map(map->handle, LV2_LOG__Error); |
|
|
|
logger->Note = map->map(map->handle, LV2_LOG__Note); |
|
|
|
logger->Trace = map->map(map->handle, LV2_LOG__Trace); |
|
|
|
logger->Warning = map->map(map->handle, LV2_LOG__Warning); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
Log a message to the host, or stderr if support is unavailable. |
|
|
|
*/ |
|
|
|
LV2_LOG_FUNC(3, 0) |
|
|
|
static inline int |
|
|
|
lv2_log_vprintf(LV2_Log_Logger* logger, |
|
|
|
LV2_URID type, |
|
|
|
const char* fmt, |
|
|
|
va_list args) |
|
|
|
{ |
|
|
|
if (logger->log) { |
|
|
|
return logger->log->vprintf(logger->log->handle, type, fmt, args); |
|
|
|
} else { |
|
|
|
return vfprintf(stderr, fmt, args); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** Log an error via lv2_log_vprintf(). */ |
|
|
|
LV2_LOG_FUNC(2, 3) |
|
|
|
static inline int |
|
|
|
lv2_log_error(LV2_Log_Logger* logger, const char* fmt, ...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args, fmt); |
|
|
|
const int ret = lv2_log_vprintf(logger, logger->Error, fmt, args); |
|
|
|
va_end(args); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
/** Log a note via lv2_log_vprintf(). */ |
|
|
|
LV2_LOG_FUNC(2, 3) |
|
|
|
static inline int |
|
|
|
lv2_log_note(LV2_Log_Logger* logger, const char* fmt, ...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args, fmt); |
|
|
|
const int ret = lv2_log_vprintf(logger, logger->Note, fmt, args); |
|
|
|
va_end(args); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
/** Log a trace via lv2_log_vprintf(). */ |
|
|
|
LV2_LOG_FUNC(2, 3) |
|
|
|
static inline int |
|
|
|
lv2_log_trace(LV2_Log_Logger* logger, const char* fmt, ...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args, fmt); |
|
|
|
const int ret = lv2_log_vprintf(logger, logger->Trace, fmt, args); |
|
|
|
va_end(args); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
/** Log a warning via lv2_log_vprintf(). */ |
|
|
|
LV2_LOG_FUNC(2, 3) |
|
|
|
static inline int |
|
|
|
lv2_log_warning(LV2_Log_Logger* logger, const char* fmt, ...) |
|
|
|
{ |
|
|
|
va_list args; |
|
|
|
va_start(args, fmt); |
|
|
|
const int ret = lv2_log_vprintf(logger, logger->Warning, fmt, args); |
|
|
|
va_end(args); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@} |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
|
|
} /* extern "C" */ |
|
|
|
#endif |
|
|
|
|
|
|
|
#endif /* LV2_LOG_LOGGER_H */ |