Recent changes (master)
Subsystems (2)
The following changes since commit 797ef7b209d7423f34dfe513beeede21d2efddc4:
Merge branch 'pmemblk' of https://github.com/bvanassche/fio (2020-06-28 07:08:36 -0600)
are available in the Git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 5144df064b2fc011615868e59083cfc1786bd073:
Merge branch 'num2str' of https://github.com/bvanassche/fio (2020-07-02 18:08:14 -0600)
----------------------------------------------------------------
Bart Van Assche (5):
num2str(): Use asprintf() instead of malloc() num2str(): Remove the fmt[] array num2str(): Fix overflow handling
Add a num2str() unit test
num2str(): Add the E (exa) prefix
Jens Axboe (1):
Merge branch 'num2str' of https://github.com/bvanassche/fio
Makefile | 2 ++ lib/num2str.c | 31 ++++++++++++++--------------- unittests/lib/num2str.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ unittests/unittest.c | 1 + unittests/unittest.h | 1 + 5 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 unittests/lib/num2str.c
---
Diff of recent changes:
Makefile +2 -0
@@ -337,12 +337,14 @@ PROGS += $(T_PROGS) ifdef CONFIG_HAVE_CUNIT UT_OBJS = unittests/unittest.o UT_OBJS += unittests/lib/memalign.o +UT_OBJS += unittests/lib/num2str.o UT_OBJS += unittests/lib/strntol.o UT_OBJS += unittests/oslib/strlcat.o UT_OBJS += unittests/oslib/strndup.o UT_OBJS += unittests/oslib/strcasestr.o UT_OBJS += unittests/oslib/strsep.o UT_TARGET_OBJS = lib/memalign.o +UT_TARGET_OBJS += lib/num2str.o UT_TARGET_OBJS += lib/strntol.o UT_TARGET_OBJS += oslib/strlcat.o UT_TARGET_OBJS += oslib/strndup.o
lib/num2str.c +15 -16
@@ -4,6 +4,7 @@#include <string.h> #include "../compiler/compiler.h" +#include "../oslib/asprintf.h" #include "num2str.h" #define ARRAY_SIZE (x) (sizeof((x)) / (sizeof((x)[0])))
@@ -19,8 +20,8 @@*/ char *num2str (uint64_t num,int maxlen,int base,int pow2,enum n2s_unit units) { -const char *sistr[] = {"" ,"k" ,"M" ,"G" ,"T" ,"P" }; -const char *iecstr[] = {"" ,"Ki" ,"Mi" ,"Gi" ,"Ti" ,"Pi" }; +const char *sistr[] = {"" ,"k" ,"M" ,"G" ,"T" ,"P" ,"E" }; +const char *iecstr[] = {"" ,"Ki" ,"Mi" ,"Gi" ,"Ti" ,"Pi" ,"Ei" };const char **unitprefix;static const char *const unitstr[] = { [N2S_NONE ] ="" ,
@@ -33,16 +34,12 @@ char *num2str(uint64_t num, int maxlen, int base, int pow2, enum n2s_unit units)const unsigned int thousand = pow2 ?1024 :1000 ;unsigned int modulo;int post_index, carry =0 ; -char tmp[32 ], fmt[32 ]; +char tmp[32 ];char *buf;compiletime_assert (sizeof (sistr) ==sizeof (iecstr),"unit prefix arrays must be identical sizes" );assert (units <ARRAY_SIZE (unitstr)); - buf =malloc (128 ); -if (!buf) -return NULL ; -if (pow2) unitprefix = iecstr;else
@@ -83,16 +80,17 @@ char *num2str(uint64_t num, int maxlen, int base, int pow2, enum n2s_unit units) post_index++; } +if (post_index >=ARRAY_SIZE (sistr)) + post_index =0 ; +/* * If no modulo, then we're done. */ if (modulo ==-1U ) { done: -if (post_index >=ARRAY_SIZE (sistr)) - post_index =0 ; - -sprintf (buf,"%llu%s%s" , (unsigned long long ) num, - unitprefix[post_index], unitstr[units]); +if (asprintf (&buf,"%llu%s%s" , (unsigned long long ) num, + unitprefix[post_index], unitstr[units]) <0 ) + buf =NULL ;return buf; }
@@ -111,10 +109,11 @@ done:*/ assert (maxlen -strlen (tmp) -1 >0 );assert (modulo < thousand); -sprintf (fmt,"%%.%df" , (int )(maxlen -strlen (tmp) -1 )); -sprintf (tmp, fmt, (double )modulo / (double )thousand); +sprintf (tmp,"%.*f" , (int )(maxlen -strlen (tmp) -1 ), + (double )modulo / (double )thousand); -sprintf (buf,"%llu.%s%s%s" , (unsigned long long ) num, &tmp[2 ], - unitprefix[post_index], unitstr[units]); +if (asprintf (&buf,"%llu.%s%s%s" , (unsigned long long ) num, &tmp[2 ], + unitprefix[post_index], unitstr[units]) <0 ) + buf =NULL ;return buf; }
unittests/lib/num2str.c new file +53 -0
53 lines not on this page · raw message
unittests/unittest.c +1 -0
@@ -48,6 +48,7 @@ int main(void) }fio_unittest_register (fio_unittest_lib_memalign); +fio_unittest_register (fio_unittest_lib_num2str);fio_unittest_register (fio_unittest_lib_strntol);fio_unittest_register (fio_unittest_oslib_strlcat);fio_unittest_register (fio_unittest_oslib_strndup);
unittests/unittest.h +1 -0
@@ -15,6 +15,7 @@ CU_ErrorCode fio_unittest_add_suite(const char*, CU_InitializeFunc, CU_CleanupFunc, struct fio_unittest_entry*);CU_ErrorCode fio_unittest_lib_memalign (void ); +CU_ErrorCode fio_unittest_lib_num2str (void );CU_ErrorCode fio_unittest_lib_strntol (void );CU_ErrorCode fio_unittest_oslib_strlcat (void );CU_ErrorCode fio_unittest_oslib_strndup (void );