diff options
-rw-r--r-- | src/core/logs.c | 60 | ||||
-rw-r--r-- | src/core/logs.h | 6 | ||||
-rw-r--r-- | src/gui/panels/log.h | 4 | ||||
-rw-r--r-- | src/plugins/plugin-int.h | 2 | ||||
-rw-r--r-- | src/plugins/plugin.c | 36 |
5 files changed, 59 insertions, 49 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 *, ...); diff --git a/src/gui/panels/log.h b/src/gui/panels/log.h index dab8581..3b7bb2c 100644 --- a/src/gui/panels/log.h +++ b/src/gui/panels/log.h @@ -37,10 +37,6 @@ #define PANEL_LOG_ID _("Messages") -/* Tranche d'allocation pour les messages complexes */ -#define VARIADIC_LOG_BUFSIZE 256 - - #define G_TYPE_LOG_PANEL g_log_panel_get_type() #define G_LOG_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_log_panel_get_type(), GLogPanel)) #define G_IS_LOG_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_log_panel_get_type())) diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index ee7c442..03040d1 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -33,7 +33,7 @@ #include "plugin-def.h" #include "../analysis/content.h" #include "../common/bits.h" -#include "../gui/panels/log.h" +#include "../core/logs.h" diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 3d1350d..d1e90c8 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -664,43 +664,21 @@ void g_plugin_module_log_simple_message(const GPluginModule *plugin, LogMessageT void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessageType type, const char *fmt, ...) { - 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 */ + char *buffer; /* Tampon du msg reconstitué */ - len = VARIADIC_LOG_BUFSIZE; - buffer = calloc(len, sizeof(char)); + va_start(ap, fmt); + buffer = build_variadic_message(fmt, ap); + va_end(ap); - while (buffer != NULL) + if (buffer != NULL) { - va_start(ap, fmt); - ret = vsnprintf(buffer, len, fmt, ap); - va_end(ap); - - if (ret >= 0 && ret < len) break; - - else - { - if (ret > -1) len += 1; /* glibc 2.1 */ - else len *= 2; /* glibc 2.0 */ + g_plugin_module_log_simple_message(plugin, type, buffer); - if ((ptr = realloc(buffer, len)) == NULL) - { - free(buffer); - buffer = NULL; - } - else buffer = ptr; - - } + free(buffer); } - g_plugin_module_log_simple_message(plugin, type, buffer); - - free(buffer); - } |