mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-04-08 03:24:13 +00:00
Format scaled integers using strbuf
Replaces uint32_scaled_to_str() with strbuf_append_uint32_scaled().
This commit is contained in:
parent
5dfb7c1b68
commit
cea2221f47
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user