From cea2221f47606b39358ea1aa1822f76dea991e43 Mon Sep 17 00:00:00 2001 From: Andrew Bettison Date: Tue, 20 Sep 2016 15:40:04 +0930 Subject: [PATCH] Format scaled integers using strbuf Replaces uint32_scaled_to_str() with strbuf_append_uint32_scaled(). --- conf_schema.c | 16 ++++++++-------- numeric_str.c | 18 ++++++++---------- numeric_str.h | 18 +++++++++++------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/conf_schema.c b/conf_schema.c index 37d9aaf3..38662fcc 100644 --- a/conf_schema.c +++ b/conf_schema.c @@ -443,10 +443,10 @@ int cf_opt_uint32_scaled(uint32_t *intp, const char *text) int cf_fmt_uint32_scaled(const char **textp, const uint32_t *uintp) { - char buf[25]; - int n = uint32_scaled_to_str(buf, sizeof buf, *uintp); - assert(n != 0); - *textp = str_edup(buf); + strbuf sb = strbuf_alloca(25); + strbuf_append_uint32_scaled(sb, *uintp); + assert(!strbuf_overrun(sb)); + *textp = str_edup(strbuf_str(sb)); return CFOK; } @@ -467,10 +467,10 @@ int cf_opt_uint64_scaled(uint64_t *intp, const char *text) int cf_fmt_uint64_scaled(const char **textp, const uint64_t *uintp) { - char buf[25]; - int n = uint64_scaled_to_str(buf, sizeof buf, *uintp); - assert(n != 0); - *textp = str_edup(buf); + strbuf sb = strbuf_alloca(25); + strbuf_append_uint64_scaled(sb, *uintp); + assert(!strbuf_overrun(sb)); + *textp = str_edup(strbuf_str(sb)); return CFOK; } diff --git a/numeric_str.c b/numeric_str.c index ba24b9ed..c826bb02 100644 --- a/numeric_str.c +++ b/numeric_str.c @@ -226,7 +226,7 @@ int str_to_uint32_scaled(const char *str, unsigned base, uint32_t *result, const return 1; } -int uint32_scaled_to_str(char *str, size_t len, uint32_t value) +strbuf strbuf_append_uint32_scaled(strbuf sb, uint32_t value) { char symbol = '\0'; int i; @@ -236,11 +236,10 @@ int uint32_scaled_to_str(char *str, size_t len, uint32_t value) symbol = scale_factors[i].symbol; break; } - strbuf b = strbuf_local(str, len); - strbuf_sprintf(b, "%lu", (unsigned long) value); + strbuf_sprintf(sb, "%lu", (unsigned long) value); if (symbol) - strbuf_putc(b, symbol); - return strbuf_overrun(b) ? 0 : 1; + strbuf_putc(sb, symbol); + return sb; } int str_to_uint64_scaled(const char *str, unsigned base, uint64_t *result, const char **afterp) @@ -262,7 +261,7 @@ int str_to_uint64_scaled(const char *str, unsigned base, uint64_t *result, const return 1; } -int uint64_scaled_to_str(char *str, size_t len, uint64_t value) +strbuf strbuf_append_uint64_scaled(strbuf sb, uint64_t value) { char symbol = '\0'; int i; @@ -272,11 +271,10 @@ int uint64_scaled_to_str(char *str, size_t len, uint64_t value) symbol = scale_factors[i].symbol; break; } - strbuf b = strbuf_local(str, len); - strbuf_sprintf(b, "%llu", (unsigned long long) value); + strbuf_sprintf(sb, "%llu", (unsigned long long) value); if (symbol) - strbuf_putc(b, symbol); - return strbuf_overrun(b) ? 0 : 1; + strbuf_putc(sb, symbol); + return sb; } int str_to_uint64_interval_ms(const char *str, int64_t *result, const char **afterp) diff --git a/numeric_str.h b/numeric_str.h index 21d15d9c..7f7cb453 100644 --- a/numeric_str.h +++ b/numeric_str.h @@ -20,6 +20,7 @@ #ifndef __SERVAL_DNA__NUMERIC_STR_H__ #define __SERVAL_DNA__NUMERIC_STR_H__ +#include "strbuf.h" #include // for size_t #include @@ -91,17 +92,20 @@ int str_to_int64_scaled(const char *str, unsigned base, int64_t *result, const c int str_to_uint64_scaled(const char *str, unsigned base, uint64_t *result, const char **afterp); uint64_t scale_factor(const char *str, const char **afterp); -/* Format a string as a decimal integer in ASCII radix notation with a scale suffix character in the - * set {kKmMgG}: 'k' = 1e3, 'K' = 1<<10, 'm' = 1e6, 'M' = 1<<20, 'g' = 1e9, 'G' = * 1<<30 if the - * value is an exact multiple. +/* Append an integer value to a strbuf in ASCII decimal format, optionally scaled with a scale + * suffix character in the set {kKmMgGtTpP}: 'k' = 1e3, 'K' = 1<<10, 'm' = 1e6, 'M' = 1<<20, 'g' = + * 1e9, 'G' = * 1<<30, etc. This format is lossless because the value is only scaled if it is an + * exact multiple of the scaling factor. * - * Return 1 if the supplied string buffer was large enough to hold the formatted result plus a - * terminating nul character, 0 otherwise. + * Eg, 1000 -> "1k" + * 1001 -> "1001" + * 1024 -> "1K" + * 1025 -> "1025" * * @author Andrew Bettison */ -int uint32_scaled_to_str(char *str, size_t len, uint32_t value); -int uint64_scaled_to_str(char *str, size_t len, uint64_t value); +strbuf strbuf_append_uint32_scaled(strbuf sb, uint32_t value); +strbuf strbuf_append_uint64_scaled(strbuf sb, uint64_t value); /* Parse a string as a time interval (seconds) in millisecond resolution. Return the number of * milliseconds. Valid strings are all unsigned ASCII decimal numbers with up to three digits after