rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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:
Mcmake/CMakeLists.txt | 4++--
Msrc/logger.c | 29+++++++++++++++++++++--------
Msrc/logger.h | 8++++++++
Msrc/test_logger.c | 23+++++++++++++++++++++++
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);