(trunk libT) add an accessor for the formatter unit strings
This commit is contained in:
parent
1d63aa4cda
commit
e6cf296a68
|
@ -1509,15 +1509,15 @@ tr_realpath( const char * path, char * resolved_path )
|
|||
****
|
||||
***/
|
||||
|
||||
struct formatter_unit
|
||||
{
|
||||
char * name;
|
||||
double value;
|
||||
};
|
||||
|
||||
struct formatter_units
|
||||
{
|
||||
double KB_val;
|
||||
double MB_val;
|
||||
double GB_val;
|
||||
const char * B_str;
|
||||
const char * KB_str;
|
||||
const char * MB_str;
|
||||
const char * GB_str;
|
||||
struct formatter_unit units[4];
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -1526,14 +1526,26 @@ formatter_init( struct formatter_units * units,
|
|||
const char * b, const char * kb,
|
||||
const char * mb, const char * gb )
|
||||
{
|
||||
units->B_str = tr_strdup( b );
|
||||
units->KB_str = tr_strdup( kb );
|
||||
units->MB_str = tr_strdup( mb );
|
||||
units->GB_str = tr_strdup( gb );
|
||||
units->units[TR_FMT_B].name = tr_strdup( b );
|
||||
units->units[TR_FMT_B].value = 1;
|
||||
|
||||
units->KB_val = kilo;
|
||||
units->MB_val = kilo * kilo;
|
||||
units->GB_val = kilo * kilo * kilo;
|
||||
units->units[TR_FMT_KB].name = tr_strdup( kb );
|
||||
units->units[TR_FMT_KB].value = kilo;
|
||||
|
||||
units->units[TR_FMT_MB].name = tr_strdup( mb );
|
||||
units->units[TR_FMT_MB].value = pow( kilo, 2 );
|
||||
|
||||
units->units[TR_FMT_GB].name = tr_strdup( gb );
|
||||
units->units[TR_FMT_GB].value = pow( kilo, 3 );
|
||||
}
|
||||
|
||||
static const char*
|
||||
tr_formatter_units( const struct formatter_units * u, int size )
|
||||
{
|
||||
assert( u != NULL );
|
||||
assert( 0<=size && size<4 );
|
||||
|
||||
return u->units[size].name;
|
||||
}
|
||||
|
||||
static char*
|
||||
|
@ -1541,20 +1553,23 @@ formatter_get_size_str( const struct formatter_units * u,
|
|||
char * buf, uint64_t bytes, size_t buflen )
|
||||
{
|
||||
int precision;
|
||||
double val;
|
||||
double value;
|
||||
const char * units;
|
||||
const struct formatter_unit * unit;
|
||||
|
||||
if( bytes < u->KB_val ) { val = bytes; units = u->B_str; }
|
||||
else if( bytes < u->MB_val ) { val = bytes / u->KB_val; units = u->KB_str; }
|
||||
else if( bytes < u->GB_val ) { val = bytes / u->MB_val; units = u->MB_str; }
|
||||
else { val = bytes / u->GB_val; units = u->GB_str; }
|
||||
if( bytes < u->units[1].value ) unit = &u->units[0];
|
||||
else if( bytes < u->units[2].value ) unit = &u->units[1];
|
||||
else if( bytes < u->units[3].value ) unit = &u->units[2];
|
||||
else unit = &u->units[3];
|
||||
|
||||
precision = val < 100 ? 2 : 1;
|
||||
tr_snprintf( buf, buflen, "%.*f %s", precision, val, units );
|
||||
value = bytes / unit->value;
|
||||
units = unit->name;
|
||||
precision = value < 100 ? 2 : 1;
|
||||
tr_snprintf( buf, buflen, "%.*f %s", precision, value, units );
|
||||
return buf;
|
||||
}
|
||||
|
||||
static struct formatter_units size_units = { 0, 0, 0, NULL, NULL, NULL, NULL };
|
||||
static struct formatter_units size_units;
|
||||
|
||||
void
|
||||
tr_formatter_size_init( double kilo, const char * b, const char * kb,
|
||||
|
@ -1569,7 +1584,13 @@ tr_formatter_size( char * buf, uint64_t bytes, size_t buflen )
|
|||
return formatter_get_size_str( &size_units, buf, bytes, buflen );
|
||||
}
|
||||
|
||||
static struct formatter_units speed_units = { 0, 0, 0, NULL, NULL, NULL, NULL };
|
||||
const char*
|
||||
tr_formatter_size_units( int i )
|
||||
{
|
||||
return tr_formatter_units( &size_units, i );
|
||||
}
|
||||
|
||||
static struct formatter_units speed_units;
|
||||
|
||||
void
|
||||
tr_formatter_speed_init( double kilo, const char * b, const char * kb,
|
||||
|
@ -1583,3 +1604,9 @@ tr_formatter_speed( char * buf, uint64_t bytes_per_second, size_t buflen )
|
|||
{
|
||||
return formatter_get_size_str( &speed_units, buf, bytes_per_second, buflen );
|
||||
}
|
||||
|
||||
const char*
|
||||
tr_formatter_speed_units( int i )
|
||||
{
|
||||
return tr_formatter_units( &speed_units, i );
|
||||
}
|
||||
|
|
|
@ -569,6 +569,12 @@ char* tr_formatter_size( char * buf, uint64_t bytes, size_t buflen );
|
|||
/* format a speed into a user-readable string. */
|
||||
char* tr_formatter_speed( char * buf, uint64_t bytes_per_second, size_t buflen );
|
||||
|
||||
enum { TR_FMT_B, TR_FMT_KB, TR_FMT_MB, TR_FMT_GB };
|
||||
/* return the human-readable unit initialized by tr_formatter_size_init() */
|
||||
const char* tr_formatter_size_units( int size );
|
||||
/* return the human-readable unit initialized by tr_formatter_speed_init() */
|
||||
const char* tr_formatter_speed_units( int size );
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
|
|
Loading…
Reference in New Issue