Format scaled integers using strbuf

Replaces uint32_scaled_to_str() with strbuf_append_uint32_scaled().
This commit is contained in:
Andrew Bettison 2016-09-20 15:40:04 +09:30
parent 5dfb7c1b68
commit cea2221f47
3 changed files with 27 additions and 25 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -20,6 +20,7 @@
#ifndef __SERVAL_DNA__NUMERIC_STR_H__
#define __SERVAL_DNA__NUMERIC_STR_H__
#include "strbuf.h"
#include <sys/types.h> // for size_t
#include <stdint.h>
@ -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 <andrew@servalproject.com>
*/
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