diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/logs.c | 60 | ||||
-rw-r--r-- | src/core/logs.h | 6 |
2 files changed, 51 insertions, 15 deletions
diff --git a/src/core/logs.c b/src/core/logs.c index aedc78e..ae69758 100644 --- a/src/core/logs.c +++ b/src/core/logs.c @@ -34,6 +34,9 @@ +/* Tranche d'allocation pour les messages complexes */ +#define VARIADIC_LOG_BUFSIZE 256 + /* Conserve le niveau de filtre des messages */ static LogMessageType _verbosity = LMT_COUNT; @@ -115,33 +118,32 @@ void log_simple_message(LogMessageType type, const char *msg) /****************************************************************************** * * -* Paramètres : type = espèce du message à ajouter. * -* fmt = format du message à faire apparaître à l'écran. * -* ... = éventuels arguments venant compléter le message. * +* Paramètres : fmt = format du message à faire apparaître à l'écran. * +* args = éventuels arguments venant compléter le message. * * * -* Description : Affiche un message dans le journal des messages système. * +* Description : Construit un message pour le journal des messages système. * * * -* Retour : - * +* Retour : Message prêt à emploi à libérer après usage. * * * * Remarques : - * * * ******************************************************************************/ -void log_variadic_message(LogMessageType type, const char *fmt, ...) +char *build_variadic_message(const char *fmt, va_list args) { + char *result; /* Tampon constitué à renvoyer */ size_t len; /* Taille tampon disponible */ - char *buffer; /* Tampon du msg reconstitué */ int ret; /* Bilan d'une impression */ char *ptr; /* Nouvelle allocation */ va_list ap; /* Liste d'arguments variable */ len = VARIADIC_LOG_BUFSIZE; - buffer = calloc(len, sizeof(char)); + result = calloc(len, sizeof(char)); - while (buffer != NULL) + while (result != NULL) { - va_start(ap, fmt); - ret = vsnprintf(buffer, len, fmt, ap); + va_copy(ap, args); + ret = vsnprintf(result, len, fmt, ap); va_end(ap); if (ret >= 0 && ret < len) break; @@ -151,17 +153,45 @@ void log_variadic_message(LogMessageType type, const char *fmt, ...) if (ret > -1) len += 1; /* glibc 2.1 */ else len *= 2; /* glibc 2.0 */ - if ((ptr = realloc(buffer, len)) == NULL) + if ((ptr = realloc(result, len)) == NULL) { - free(buffer); - buffer = NULL; + free(result); + result = NULL; } - else buffer = ptr; + else result = ptr; } } + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : type = espèce du message à ajouter. * +* fmt = format du message à faire apparaître à l'écran. * +* ... = éventuels arguments venant compléter le message. * +* * +* Description : Affiche un message dans le journal des messages système. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void log_variadic_message(LogMessageType type, const char *fmt, ...) +{ + va_list ap; /* Liste d'arguments variable */ + char *buffer; /* Tampon du msg reconstitué */ + + va_start(ap, fmt); + buffer = build_variadic_message(fmt, ap); + va_end(ap); + if (buffer != NULL) { log_simple_message(type, buffer); diff --git a/src/core/logs.h b/src/core/logs.h index 3ef4e9d..238c3ba 100644 --- a/src/core/logs.h +++ b/src/core/logs.h @@ -25,6 +25,9 @@ #define _CORE_LOGS_H +#include <stdarg.h> + + #include <i18n.h> @@ -52,6 +55,9 @@ void set_log_verbosity(LogMessageType); /* Affiche un message dans le journal des messages système. */ void log_simple_message(LogMessageType, const char *); +/* Construit un message pour le journal des messages système. */ +char *build_variadic_message(const char *, va_list); + /* Affiche un message dans le journal des messages système. */ void log_variadic_message(LogMessageType, const char *, ...); |