commit 9702af707dbb1f763be2b02f20ac2c46e3c5d0b9
parent 70753d6a82d531e7ed9a622e11d0b4c6f5669e44
Author: vaplv <vaplv@free.fr>
Date: Mon, 5 Oct 2015 15:15:07 +0200
Add and test the logger_vprint function
Print a formatted string with respect to variable list of arguments
submitted in a va_list argument.
Diffstat:
4 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -35,8 +35,8 @@ include(rcmake)
# Configure and define targets
################################################################################
set(VERSION_MAJOR 0)
-set(VERSION_MINOR 2)
-set(VERSION_PATCH 1)
+set(VERSION_MINOR 3)
+set(VERSION_PATCH 0)
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
set(RSYS_FILES_SRC
diff --git a/src/logger.c b/src/logger.c
@@ -22,25 +22,39 @@ logger_print
(struct logger* logger, const enum log_type type, const char* log, ...)
{
va_list vargs_list;
+ res_T res;
+ ASSERT(logger && log && (unsigned)type < LOG_TYPES_COUNT__);
+ va_start(vargs_list, log);
+ res = logger_vprint(logger, type, log, vargs_list);
+ va_end(vargs_list);
+ return res;
+}
+
+res_T
+logger_vprint
+ (struct logger* logger,
+ const enum log_type type,
+ const char* log,
+ va_list vargs_list)
+{
+ va_list vargs_list_cp;
int sz;
ASSERT(logger && log && (unsigned)type < LOG_TYPES_COUNT__);
if(logger == LOGGER_DEFAULT) {
- va_start(vargs_list, log);
vfprintf(type == LOG_OUTPUT ? stdout : stderr, log, vargs_list);
- va_end(vargs_list);
return RES_OK;
}
if(!logger->streams[type].writer)
return RES_OK;
- va_start(vargs_list, log);
+ VA_COPY(vargs_list_cp, vargs_list);
sz = vsnprintf
(darray_char_data_get(&logger->buffer),
darray_char_size_get(&logger->buffer),
- log, vargs_list);
- va_end(vargs_list);
+ log, vargs_list_cp);
+ va_end(vargs_list_cp);
ASSERT(sz > 0);
/* If there is not sufficient space in the logger buffer, resize it */
@@ -49,12 +63,12 @@ logger_print
if(res != RES_OK)
return res;
- va_start(vargs_list, log);
+ VA_COPY(vargs_list_cp, vargs_list);
sz = vsnprintf
(darray_char_data_get(&logger->buffer),
darray_char_size_get(&logger->buffer),
log, vargs_list);
- va_end(vargs_list);
+ va_end(vargs_list_cp);
ASSERT((size_t)sz < darray_char_size_get(&logger->buffer));
}
/* Print the formatted string */
@@ -62,4 +76,3 @@ logger_print
(darray_char_cdata_get(&logger->buffer), logger->streams[type].ctx);
return RES_OK;
}
-
diff --git a/src/logger.h b/src/logger.h
@@ -104,6 +104,14 @@ logger_print
#endif
;
+/* The value of vargs is undefined after the call of logger_vprint */
+RSYS_API res_T
+logger_vprint
+ (struct logger* logger,
+ const enum log_type type,
+ const char* log,
+ va_list vargs);
+
END_DECLS
#endif /* LOGGER_H */
diff --git a/src/test_logger.c b/src/test_logger.c
@@ -44,6 +44,18 @@ func_stream_warn(const char* fmt, void* data)
CHECK(strcmp( fmt, "warning" ), 0);
}
+static void
+test_vprint(struct logger* logger, const char* fmt, ...)
+{
+ va_list vargs_list;
+ NCHECK(logger, NULL);
+ NCHECK(fmt, NULL);
+
+ va_start(vargs_list, fmt);
+ logger_vprint(logger, LOG_OUTPUT, fmt, vargs_list);
+ va_end(vargs_list);
+}
+
int
main(int argc, char** argv)
{
@@ -197,6 +209,17 @@ LBH'ER FGHPX BA GUR FUBERF BS URYY. GUR BAYL JNL BHG VF GUEBHTU.\n\n",
"GB PBAGVAHR GUR QBBZ RKCREVRAPR, CYNL GUR FUBERF BS URYY NAQ VGF NZNMVAT\n\
FRDHRY, VASREAB!\n");
+ test_vprint(&logger, "%s%s%s%s",
+"Rcvfbqr 2, GUR FUBERF BS URYY:\n\
+------------------------------\n\n",
+"LBH'IR QBAR VG! GUR UVQRBHF PLORE- QRZBA YBEQ GUNG EHYRQ GUR YBFG QRVZBF ZBBA\n\
+ONFR UNF ORRA FYNVA NAQ LBH NER GEVHZCUNAG! OHG ... JURER NER LBH? LBH\n\
+PYNZORE GB GUR RQTR BS GUR ZBBA NAQ YBBX QBJA GB FRR GUR NJSHY GEHGU.\n\n",
+"QRVZBF SYBNGF NOBIR URYY VGFRYS! LBH'IR ARIRE URNEQ BS NALBAR RFPNCVAT SEBZ\n\
+URYY, OHG LBH'YY ZNXR GUR ONFGNEQF FBEEL GURL RIRE URNEQ BS LBH! DHVPXYL, LBH\n\
+ENCCRY QBJA GB GUR FHESNPR BS URYY.\n\n",
+"ABJ, VG'F BA GB GUR SVANY PUNCGRE BS QBBZ! -- VASREAB.\n");
+
logger_release(&logger);
check_memory_allocator(&allocator_proxy);