(trunk libT) add an accessor for the formatter unit strings

This commit is contained in:
Charles Kerr 2010-06-22 13:34:46 +00:00
parent 1d63aa4cda
commit e6cf296a68
2 changed files with 56 additions and 23 deletions

View File

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

View File

@ -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 );
/***
****
***/