summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/logs.c60
-rw-r--r--src/core/logs.h6
-rw-r--r--src/gui/panels/log.h4
-rw-r--r--src/plugins/plugin-int.h2
-rw-r--r--src/plugins/plugin.c36
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);
-
}