diff options
Diffstat (limited to 'set.c')
| -rw-r--r-- | set.c | 28 | 
1 files changed, 22 insertions, 6 deletions
| @@ -25,6 +25,9 @@  #define BITLBEE_CORE  #include "bitlbee.h" +/* Used to use NULL for this, but NULL is actually a "valid" value. */ +char *SET_INVALID = "nee"; +  set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data )  {  	set_t *s = set_find( head, key ); @@ -113,9 +116,20 @@ int set_setstr( set_t **head, char *key, char *value )  	char *nv = value;  	if( !s ) +		/* +		Used to do this, but it never really made sense.  		s = set_add( head, key, NULL, NULL, NULL ); +		*/ +		return 0; +	 +	if( value == NULL && ( s->flags & SET_NULL_OK ) == 0 ) +		return 0; -	if( s->eval && !( nv = s->eval( s, value ) ) ) +	/* Call the evaluator. For invalid values, evaluators should now +	   return SET_INVALID, but previously this was NULL. Try to handle +	   that too if NULL is not an allowed value for this setting. */ +	if( s->eval && ( ( nv = s->eval( s, value ) ) == SET_INVALID || +	                 ( ( s->flags & SET_NULL_OK ) == 0 && nv == NULL ) ) )  		return 0;  	if( s->value ) @@ -167,13 +181,15 @@ void set_del( set_t **head, char *key )  	}  } -void set_reset( set_t **head, char *key ) +int set_reset( set_t **head, char *key )  {  	set_t *s;  	s = set_find( head, key );  	if( s ) -		set_setstr( head, key, s->def ); +		return set_setstr( head, key, s->def ); +	 +	return 0;  }  char *set_eval_int( set_t *set, char *value ) @@ -186,14 +202,14 @@ char *set_eval_int( set_t *set, char *value )  	for( ; *s; s ++ )  		if( !isdigit( *s ) ) -			return NULL; +			return SET_INVALID;  	return value;  }  char *set_eval_bool( set_t *set, char *value )  { -	return is_bool( value ) ? value : NULL; +	return is_bool( value ) ? value : SET_INVALID;  }  char *set_eval_to_char( set_t *set, char *value ) @@ -225,7 +241,7 @@ char *set_eval_ops( set_t *set, char *value )  		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,  		                                              irc->channel, "-oo", irc->nick, irc->mynick );  	else -		return NULL; +		return SET_INVALID;  	return value;  } | 
