better bool, real handling in (1) the gtk prefs interface, (2) the dictionary merge code, (2) the json parser

This commit is contained in:
Charles Kerr 2009-04-05 23:46:53 +00:00
parent dce5997f29
commit 6373802ca8
3 changed files with 40 additions and 28 deletions

View File

@ -257,7 +257,6 @@ double
pref_double_get( const char * key )
{
double d = 0.0;
tr_bencDictFindReal( getPrefs( ), key, &d );
return d;
}
@ -276,10 +275,9 @@ pref_double_set( const char * key,
gboolean
pref_flag_get( const char * key )
{
int64_t i;
tr_bencDictFindInt( getPrefs( ), key, &i );
return i != 0;
tr_bool boolVal;
tr_bencDictFindBool( getPrefs( ), key, &boolVal );
return boolVal != 0;
}
gboolean
@ -303,7 +301,7 @@ void
pref_flag_set( const char * key,
gboolean value )
{
pref_int_set( key, value != 0 );
tr_bencDictAddBool( getPrefs( ), key, value );
}
/***

View File

@ -413,6 +413,12 @@ tr_bencListChild( tr_benc * val,
return ret;
}
static void
tr_benc_warning( const char * err )
{
fprintf( stderr, "warning: %s\n", err );
}
tr_bool
tr_bencGetInt( const tr_benc * val,
int64_t * setme )
@ -424,7 +430,7 @@ tr_bencGetInt( const tr_benc * val,
*setme = val->val.i;
if( !success && (( success = tr_bencIsBool( val )))) {
fprintf( stderr, "warning: reading bool as an int\n" );
tr_benc_warning( "reading bool as an int" );
if( setme )
*setme = val->val.b ? 1 : 0;
}
@ -452,9 +458,12 @@ tr_bencGetBool( const tr_benc * val, tr_bool * setme )
if(( success = tr_bencIsBool( val )))
*setme = val->val.b;
if( !success && tr_bencIsInt( val ) )
if(( success = ( val->val.i==0 || val->val.i==1 ) ))
if( !success && tr_bencIsInt( val ) ) {
if(( success = ( val->val.i==0 || val->val.i==1 ) )) {
tr_benc_warning( "warning: reading bool as an int\n" );
*setme = val->val.i!=0;
}
}
if( !success && tr_bencIsString( val ) )
if(( success = ( !strcmp(val->val.s.s,"true") || !strcmp(val->val.s.s,"false"))))
@ -1541,22 +1550,33 @@ tr_bencMergeDicts( tr_benc * target, const tr_benc * source )
{
const char * key;
const tr_benc * val;
tr_benc * t;
if( tr_bencDictChild( source, i, &key, &val ) )
{
int64_t i64;
const char * str;
tr_benc * t;
if( tr_bencGetInt( val, &i64 ) )
if( tr_bencIsBool( val ) )
{
tr_bencDictRemove( target, key );
tr_bencDictAddInt( target, key, i64 );
tr_bool boolVal;
tr_bencGetBool( val, &boolVal );
tr_bencDictAddBool( target, key, boolVal );
}
else if( tr_bencGetStr( val, &str ) )
else if( tr_bencIsReal( val ) )
{
tr_bencDictRemove( target, key );
tr_bencDictAddStr( target, key, str );
double realVal;
tr_bencGetReal( val, &realVal );
tr_bencDictAddReal( target, key, realVal );
}
else if( tr_bencIsInt( val ) )
{
int64_t intVal;
tr_bencGetInt( val, &intVal );
tr_bencDictAddInt( target, key, intVal );
}
else if( tr_bencIsString( val ) )
{
const char * strVal;
tr_bencGetStr( val, &strVal );
tr_bencDictAddStr( target, key, strVal );
}
else if( tr_bencIsDict( val ) && tr_bencDictFindDict( target, key, &t ) )
{
@ -1564,7 +1584,6 @@ tr_bencMergeDicts( tr_benc * target, const tr_benc * source )
}
else
{
tr_dbg( "tr_bencMergeDicts skipping \"%s\"", key );
}
}

View File

@ -92,14 +92,9 @@ callback( void * vdata,
break;
case JSON_T_FLOAT:
{
char buf[128];
tr_snprintf( buf, sizeof( buf ), "%f",
(double)value->vu.float_value );
tr_bencInitStr( getNode( data ), buf, -1 );
data->hasContent = TRUE;
tr_bencInitReal( getNode( data ), (double)value->vu.float_value );
break;
}
case JSON_T_NULL:
data->hasContent = TRUE;
@ -113,12 +108,12 @@ callback( void * vdata,
case JSON_T_TRUE:
data->hasContent = TRUE;
tr_bencInitInt( getNode( data ), 1 );
tr_bencInitBool( getNode( data ), 1 );
break;
case JSON_T_FALSE:
data->hasContent = TRUE;
tr_bencInitInt( getNode( data ), 0 );
tr_bencInitBool( getNode( data ), 0 );
break;
case JSON_T_STRING: