summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/logs.c60
-rw-r--r--src/core/logs.h6
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 *, ...);