diff options
| -rw-r--r-- | conf.c | 2 | ||||
| -rw-r--r-- | irc.c | 58 | ||||
| -rw-r--r-- | irc_commands.c | 2 | ||||
| -rw-r--r-- | nick.c | 2 | ||||
| -rw-r--r-- | protocols/nogaim.c | 53 | ||||
| -rw-r--r-- | protocols/nogaim.h | 2 | ||||
| -rw-r--r-- | query.c | 4 | ||||
| -rw-r--r-- | root_commands.c | 6 | ||||
| -rw-r--r-- | set.c | 121 | ||||
| -rw-r--r-- | set.h | 36 | ||||
| -rw-r--r-- | storage_xml.c | 5 | ||||
| -rw-r--r-- | user.c | 2 | 
12 files changed, 143 insertions, 150 deletions
| @@ -322,7 +322,7 @@ void conf_loaddefaults( irc_t *irc )  	{  		if( g_strcasecmp( ini->section, "defaults" ) == 0 )  		{ -			set_t *s = set_find( irc, ini->key ); +			set_t *s = set_find( &irc->set, ini->key );  			if( s )  			{ @@ -120,26 +120,26 @@ irc_t *irc_new( int fd )  	irc_connection_list = g_slist_append( irc_connection_list, irc ); -	set_add( irc, "away_devoice", "true",  set_eval_away_devoice ); -	set_add( irc, "auto_connect", "true", set_eval_bool ); -	set_add( irc, "auto_reconnect", "false", set_eval_bool ); -	set_add( irc, "auto_reconnect_delay", "300", set_eval_int ); -	set_add( irc, "buddy_sendbuffer", "false", set_eval_bool ); -	set_add( irc, "buddy_sendbuffer_delay", "200", set_eval_int ); -	set_add( irc, "charset", "iso8859-1", set_eval_charset ); -	set_add( irc, "debug", "false", set_eval_bool ); -	set_add( irc, "default_target", "root", NULL ); -	set_add( irc, "display_namechanges", "false", set_eval_bool ); -	set_add( irc, "handle_unknown", "root", NULL ); -	set_add( irc, "lcnicks", "true", set_eval_bool ); -	set_add( irc, "ops", "both", set_eval_ops ); -	set_add( irc, "private", "true", set_eval_bool ); -	set_add( irc, "query_order", "lifo", NULL ); -	set_add( irc, "save_on_quit", "true", set_eval_bool ); -	set_add( irc, "strip_html", "true", NULL ); -	set_add( irc, "to_char", ": ", set_eval_to_char ); -	set_add( irc, "typing_notice", "false", set_eval_bool ); -	set_add( irc, "password", NULL, passchange); +	set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc ); +	set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc ); +	set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc ); +	set_add( &irc->set, "auto_reconnect_delay", "300", set_eval_int, irc ); +	set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc ); +	set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc ); +	set_add( &irc->set, "charset", "iso8859-1", set_eval_charset, irc ); +	set_add( &irc->set, "debug", "false", set_eval_bool, irc ); +	set_add( &irc->set, "default_target", "root", NULL, irc ); +	set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc ); +	set_add( &irc->set, "handle_unknown", "root", NULL, irc ); +	set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc ); +	set_add( &irc->set, "ops", "both", set_eval_ops, irc ); +	set_add( &irc->set, "password", NULL, passchange, irc ); +	set_add( &irc->set, "private", "true", set_eval_bool, irc ); +	set_add( &irc->set, "query_order", "lifo", NULL, irc ); +	set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc ); +	set_add( &irc->set, "strip_html", "true", NULL, irc ); +	set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc ); +	set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );  	conf_loaddefaults( irc ); @@ -211,7 +211,7 @@ void irc_free(irc_t * irc)  	log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd ); -	if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )  +	if( irc->status & USTATUS_IDENTIFIED && set_getint( &irc->set, "save_on_quit" ) )   		if( storage_save( irc, TRUE ) != STORAGE_OK )  			irc_usermsg( irc, "Error while saving settings!" ); @@ -363,7 +363,7 @@ void irc_process( irc_t *irc )  				break;  			} -			if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) +			if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )  			{  				conv[IRC_MAX_LINE] = 0;  				if( do_iconv( cs, "UTF-8", lines[i], conv, 0, IRC_MAX_LINE - 2 ) != -1 ) @@ -583,7 +583,7 @@ void irc_vawrite( irc_t *irc, char *format, va_list params )  	g_vsnprintf( line, IRC_MAX_LINE - 2, format, params );  	strip_newlines( line ); -	if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) +	if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )  	{  		char conv[IRC_MAX_LINE+1]; @@ -665,7 +665,7 @@ void irc_names( irc_t *irc, char *channel )  		{  			if( u->gc && control )  			{ -				if( set_getint( irc, "away_devoice" ) && !u->away ) +				if( set_getint( &irc->set, "away_devoice" ) && !u->away )  					s = "+";  				else  					s = ""; @@ -674,9 +674,9 @@ void irc_names( irc_t *irc, char *channel )  			}  			else if( !u->gc )  			{ -				if( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( set_getstr( irc, "ops" ), "root" ) == 0 || strcmp( set_getstr( irc, "ops" ), "both" ) == 0 ) ) +				if( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( set_getstr( &irc->set, "ops" ), "root" ) == 0 || strcmp( set_getstr( &irc->set, "ops" ), "both" ) == 0 ) )  					s = "@"; -				else if( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( set_getstr( irc, "ops" ), "user" ) == 0 || strcmp( set_getstr( irc, "ops" ), "both" ) == 0 ) ) +				else if( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( set_getstr( &irc->set, "ops" ), "user" ) == 0 || strcmp( set_getstr( &irc->set, "ops" ), "both" ) == 0 ) )  					s = "@";  				else  					s = ""; @@ -1083,7 +1083,7 @@ void buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags )  {  	if( !u || !u->gc ) return; -	if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 ) +	if( set_getint( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 )  	{  		int delay; @@ -1110,7 +1110,7 @@ void buddy_send_handler( irc_t *irc, user_t *u, char *msg, int flags )  		strcat( u->sendbuf, msg );  		strcat( u->sendbuf, "\n" ); -		delay = set_getint( irc, "buddy_sendbuffer_delay" ); +		delay = set_getint( &irc->set, "buddy_sendbuffer_delay" );  		if( delay <= 5 )  			delay *= 1000; @@ -1175,7 +1175,7 @@ int irc_msgfrom( irc_t *irc, char *nick, char *msg )  	{  		int len = strlen( irc->nick) + 3;  		prefix = g_new (char, len ); -		g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) ); +		g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) );  		prefix[len-1] = 0;  	}  	else diff --git a/irc_commands.c b/irc_commands.c index 3a7ace1c..a3fa0e6e 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -229,7 +229,7 @@ static void irc_cmd_privmsg( irc_t *irc, char **cmd )  		if( g_strcasecmp( cmd[1], irc->channel ) == 0 )  		{  			unsigned int i; -			char *t = set_getstr( irc, "default_target" ); +			char *t = set_getstr( &irc->set, "default_target" );  			if( g_strcasecmp( t, "last" ) == 0 && irc->last_target )  				cmd[1] = irc->last_target; @@ -85,7 +85,7 @@ char *nick_get( irc_t *irc, const char *handle, struct prpl *proto, const char *  			g_snprintf( nick, MAX_NICK_LENGTH, "%s", realname );  		nick_strip( nick ); -		if (set_getint(irc, "lcnicks"))  +		if( set_getint( &irc->set, "lcnicks" ) )  			nick_lc( nick );  	} diff --git a/protocols/nogaim.c b/protocols/nogaim.c index 04d1ee3e..f94d936d 100644 --- a/protocols/nogaim.c +++ b/protocols/nogaim.c @@ -219,8 +219,8 @@ void serv_got_crap( struct gaim_connection *gc, char *format, ... )  	text = g_strdup_vprintf( format, params );  	va_end( params ); -	if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) || -	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) ) +	if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || +	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )  		strip_html( text );  	/* Try to find a different connection on the same protocol. */ @@ -323,9 +323,9 @@ void signoff( struct gaim_connection *gc )  	{  		/* Uhm... This is very sick. */  	} -	else if( !gc->wants_to_die && set_getint( irc, "auto_reconnect" ) ) +	else if( !gc->wants_to_die && set_getint( &irc->set, "auto_reconnect" ) )  	{ -		int delay = set_getint( irc, "auto_reconnect_delay" ); +		int delay = set_getint( &irc->set, "auto_reconnect_delay" );  		serv_got_crap( gc, "Reconnecting in %d seconds..", delay );  		a->reconnect = b_timeout_add( delay * 1000, auto_reconnect, a ); @@ -364,12 +364,12 @@ void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *rea  	char *s;  	irc_t *irc = gc->irc; -	if( set_getint( irc, "debug" ) && 0 ) /* This message is too useless */ +	if( set_getint( &irc->set, "debug" ) && 0 ) /* This message is too useless */  		serv_got_crap( gc, "Receiving user add from handle: %s", handle );  	if( user_findhandle( gc, handle ) )  	{ -		if( set_getint( irc, "debug" ) ) +		if( set_getint( &irc->set, "debug" ) )  			serv_got_crap( gc, "User already exists, ignoring add request: %s", handle );  		return; @@ -457,7 +457,7 @@ void serv_buddy_rename( struct gaim_connection *gc, char *handle, char *realname  		u->realname = g_strdup( realname ); -		if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( gc->irc, "display_namechanges" ) ) +		if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( &gc->irc->set, "display_namechanges" ) )  			serv_got_crap( gc, "User `%s' changed name to `%s'", u->nick, u->realname );  	}  } @@ -513,14 +513,14 @@ void serv_got_update( struct gaim_connection *gc, char *handle, int loggedin, in  	if( !u )  	{ -		if( g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "add" ) == 0 ) +		if( g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "add" ) == 0 )  		{  			add_buddy( gc, NULL, handle, NULL );  			u = user_findhandle( gc, handle );  		}  		else  		{ -			if( set_getint( gc->irc, "debug" ) || g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "ignore" ) != 0 ) +			if( set_getint( &gc->irc->set, "debug" ) || g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "ignore" ) != 0 )  			{  				serv_got_crap( gc, "serv_got_update() for handle %s:", handle );  				serv_got_crap( gc, "loggedin = %d, type = %d", loggedin, type ); @@ -579,7 +579,7 @@ void serv_got_update( struct gaim_connection *gc, char *handle, int loggedin, in  		u->away = NULL;  	/* LISPy... */ -	if( ( set_getint( gc->irc, "away_devoice" ) ) &&		/* Don't do a thing when user doesn't want it */ +	if( ( set_getint( &gc->irc->set, "away_devoice" ) ) &&		/* Don't do a thing when user doesn't want it */  	    ( u->online ) &&						/* Don't touch offline people */  	    ( ( ( u->online != oo ) && !u->away ) ||			/* Voice joining people */  	      ( ( u->online == oo ) && ( oa == !u->away ) ) ) )		/* (De)voice people changing state */ @@ -598,18 +598,18 @@ void serv_got_im( struct gaim_connection *gc, char *handle, char *msg, guint32 f  	if( !u )  	{ -		char *h = set_getstr( irc, "handle_unknown" ); +		char *h = set_getstr( &irc->set, "handle_unknown" );  		if( g_strcasecmp( h, "ignore" ) == 0 )  		{ -			if( set_getint( irc, "debug" ) ) +			if( set_getint( &irc->set, "debug" ) )  				serv_got_crap( gc, "Ignoring message from unknown handle %s", handle );  			return;  		}  		else if( g_strncasecmp( h, "add", 3 ) == 0 )  		{ -			int private = set_getint( irc, "private" ); +			int private = set_getint( &irc->set, "private" );  			if( h[3] )  			{ @@ -630,8 +630,8 @@ void serv_got_im( struct gaim_connection *gc, char *handle, char *msg, guint32 f  		}  	} -	if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) || -	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) ) +	if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || +	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )  		strip_html( msg );  	while( strlen( msg ) > 425 ) @@ -671,7 +671,7 @@ void serv_got_typing( struct gaim_connection *gc, char *handle, int timeout, int  {  	user_t *u; -	if( !set_getint( gc->irc, "typing_notice" ) ) +	if( !set_getint( &gc->irc->set, "typing_notice" ) )  		return;  	if( ( u = user_findhandle( gc, handle ) ) ) { @@ -693,7 +693,7 @@ void serv_got_chat_left( struct gaim_connection *gc, int id )  	struct conversation *c, *l = NULL;  	GList *ir; -	if( set_getint( gc->irc, "debug" ) ) +	if( set_getint( &gc->irc->set, "debug" ) )  		serv_got_crap( gc, "You were removed from conversation %d", (int) id );  	for( c = gc->conversations; c && c->id != id; c = (l=c)->next ); @@ -738,8 +738,8 @@ void serv_got_chat_in( struct gaim_connection *gc, int id, char *who, int whispe  	u = user_findhandle( gc, who );  	for( c = gc->conversations; c && c->id != id; c = c->next ); -	if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) || -	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) ) +	if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || +	    ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) )  		strip_html( msg );  	if( c && u ) @@ -772,7 +772,7 @@ struct conversation *serv_got_joined_chat( struct gaim_connection *gc, int id, c  	c->channel = g_strdup( s );  	g_free( s ); -	if( set_getint( gc->irc, "debug" ) ) +	if( set_getint( &gc->irc->set, "debug" ) )  		serv_got_crap( gc, "Creating new conversation: (id=%d,handle=%s)", id, handle );  	return( c ); @@ -786,7 +786,7 @@ void add_chat_buddy( struct conversation *b, char *handle )  	user_t *u = user_findhandle( b->gc, handle );  	int me = 0; -	if( set_getint( b->gc->irc, "debug" ) ) +	if( set_getint( &b->gc->irc->set, "debug" ) )  		serv_got_crap( b->gc, "User %s added to conversation %d", handle, b->id );  	/* It might be yourself! */ @@ -820,7 +820,7 @@ void remove_chat_buddy( struct conversation *b, char *handle, char *reason )  	user_t *u;  	int me = 0; -	if( set_getint( b->gc->irc, "debug" ) ) +	if( set_getint( &b->gc->irc->set, "debug" ) )  		serv_got_crap( b->gc, "User %s removed from conversation %d (%s)", handle, b->id, reason ? reason : "" );  	/* It might be yourself! */ @@ -882,8 +882,9 @@ struct conversation *conv_findchannel( char *channel )  	return( NULL );  } -char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value ) +char *set_eval_away_devoice( set_t *set, char *value )  { +	irc_t *irc = set->data;  	int st;  	if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) ) @@ -897,7 +898,7 @@ char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value )  	/* Horror.... */ -	if( st != set_getint( irc, "away_devoice" ) ) +	if( st != set_getint( &irc->set, "away_devoice" ) )  	{  		char list[80] = "";  		user_t *u = irc->users; @@ -937,7 +938,7 @@ char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value )  		                                            irc->channel, pm, v, list );  	} -	return( set_eval_bool( irc, set, value ) ); +	return( set_eval_bool( set, value ) );  } @@ -1017,7 +1018,7 @@ int bim_set_away( struct gaim_connection *gc, char *away )  		if( s )  		{  			gc->prpl->set_away( gc, s, away ); -			if( set_getint( gc->irc, "debug" ) ) +			if( set_getint( &gc->irc->set, "debug" ) )  				serv_got_crap( gc, "Setting away state to %s", s );  		}  		else diff --git a/protocols/nogaim.h b/protocols/nogaim.h index 2080465c..4d71da24 100644 --- a/protocols/nogaim.h +++ b/protocols/nogaim.h @@ -205,7 +205,7 @@ void bim_add_block( struct gaim_connection *gc, char *handle );  void bim_rem_block( struct gaim_connection *gc, char *handle );  void nogaim_init(); -char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value ); +char *set_eval_away_devoice( set_t *set, char *value );  gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond );  void cancel_auto_reconnect( struct account *a ); @@ -62,7 +62,7 @@ query_t *query_add( irc_t *irc, struct gaim_connection *gc, char *question, void  		irc->queries = q;  	} -	if( g_strcasecmp( set_getstr( irc, "query_order" ), "lifo" ) == 0 || irc->queries == q ) +	if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "lifo" ) == 0 || irc->queries == q )  		query_display( irc, q );  	return( q ); @@ -171,7 +171,7 @@ static query_t *query_default( irc_t *irc )  {  	query_t *q; -	if( g_strcasecmp( set_getstr( irc, "query_order" ), "fifo" ) == 0 ) +	if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "fifo" ) == 0 )  		q = irc->queries;  	else  		for( q = irc->queries; q && q->next; q = q->next ); diff --git a/root_commands.c b/root_commands.c index 47143531..815d618b 100644 --- a/root_commands.c +++ b/root_commands.c @@ -143,7 +143,7 @@ static void cmd_identify( irc_t *irc, char **cmd )  	case STORAGE_OK:  		irc_usermsg( irc, "Password accepted, settings and accounts loaded" );  		irc_umode_set( irc, "+R", 1 ); -		if( set_getint( irc, "auto_connect" ) ) +		if( set_getint( &irc->set, "auto_connect" ) )  			cmd_account( irc, account_on );  		break;  	case STORAGE_OTHER_ERROR: @@ -671,14 +671,14 @@ static void cmd_set( irc_t *irc, char **cmd )  {  	if( cmd[1] && cmd[2] )  	{ -		set_setstr( irc, cmd[1], cmd[2] ); +		set_setstr( &irc->set, cmd[1], cmd[2] );  		if( ( strcmp( cmd[2], "=" ) ) == 0 && cmd[3] )  			irc_usermsg( irc, "Warning: Correct syntax: \002set <variable> <value>\002 (without =)" );  	}  	if( cmd[1] ) /* else 'forgotten' on purpose.. Must show new value after changing */  	{ -		char *s = set_getstr( irc, cmd[1] ); +		char *s = set_getstr( &irc->set, cmd[1] );  		if( s )  			irc_usermsg( irc, "%s = `%s'", cmd[1], s );  	} @@ -25,23 +25,24 @@  #define BITLBEE_CORE  #include "bitlbee.h" -set_t *set_add( irc_t *irc, char *key, char *def, void *eval ) +set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data )  { -	set_t *s = set_find( irc, key ); +	set_t *s = set_find( head, key ); +	/* Possibly the setting already exists. If it doesn't exist yet, +	   we create it. If it does, we'll just change the default. */  	if( !s )  	{ -		if( ( s = irc->set ) ) +		if( ( s = *head ) )  		{  			while( s->next ) s = s->next; -			s->next = g_new ( set_t, 1 ); +			s->next = g_new0( set_t, 1 );  			s = s->next;  		}  		else  		{ -			s = irc->set = g_new( set_t, 1 ); +			s = *head = g_new0( set_t, 1 );  		} -		memset( s, 0, sizeof( set_t ) );  		s->key = g_strdup( key );  	} @@ -52,19 +53,15 @@ set_t *set_add( irc_t *irc, char *key, char *def, void *eval )  	}  	if( def ) s->def = g_strdup( def ); -	if( s->eval ) -	{ -		g_free( s->eval ); -		s->eval = NULL; -	} -	if( eval ) s->eval = eval; +	s->eval = eval; +	s->data = data; -	return( s ); +	return s;  } -set_t *set_find( irc_t *irc, char *key ) +set_t *set_find( set_t **head, char *key )  { -	set_t *s = irc->set; +	set_t *s = *head;  	while( s )  	{ @@ -73,46 +70,46 @@ set_t *set_find( irc_t *irc, char *key )  		s = s->next;  	} -	return( s ); +	return s;  } -char *set_getstr( irc_t *irc, char *key ) +char *set_getstr( set_t **head, char *key )  { -	set_t *s = set_find( irc, key ); +	set_t *s = set_find( head, key );  	if( !s || ( !s->value && !s->def ) ) -		return( NULL ); +		return NULL; -	return( s->value?s->value:s->def ); +	return s->value ? s->value : s->def;  } -int set_getint( irc_t *irc, char *key ) +int set_getint( set_t **head, char *key )  { -	char *s = set_getstr( irc, key ); +	char *s = set_getstr( head, key );  	int i = 0;  	if( !s ) -		return( 0 ); +		return 0;  	if( ( g_strcasecmp( s, "true" ) == 0 ) || ( g_strcasecmp( s, "yes" ) == 0 ) || ( g_strcasecmp( s, "on" ) == 0 ) ) -		return( 1 ); +		return 1;  	if( sscanf( s, "%d", &i ) != 1 ) -		return( 0 ); +		return 0; -	return( i ); +	return i;  } -int set_setstr( irc_t *irc, char *key, char *value ) +int set_setstr( set_t **head, char *key, char *value )  { -	set_t *s = set_find( irc, key ); +	set_t *s = set_find( head, key );  	char *nv = value;  	if( !s ) -		s = set_add( irc, key, NULL, NULL ); +		s = set_add( head, key, NULL, NULL, NULL ); -	if( s->eval && !( nv = s->eval( irc, s, value ) ) ) -		return( 0 ); +	if( s->eval && !( nv = s->eval( s, value ) ) ) +		return 0;  	if( s->value )  	{ @@ -120,26 +117,28 @@ int set_setstr( irc_t *irc, char *key, char *value )  		s->value = NULL;  	} +	/* If there's a default setting and it's equal to what we're trying to +	   set, stick with s->value = NULL. Otherwise, remember the setting. */  	if( !s->def || ( strcmp( nv, s->def ) != 0 ) )  		s->value = g_strdup( nv );  	if( nv != value )  		g_free( nv ); -	return( 1 ); +	return 1;  } -int set_setint( irc_t *irc, char *key, int value ) +int set_setint( set_t **head, char *key, int value )  {  	char s[24];	/* Not quite 128-bit clean eh? ;-) */ -	sprintf( s, "%d", value ); -	return( set_setstr( irc, key, s ) ); +	g_snprintf( s, sizeof( s ), "%d", value ); +	return set_setstr( head, key, s );  } -void set_del( irc_t *irc, char *key ) +void set_del( set_t **head, char *key )  { -	set_t *s = irc->set, *t = NULL; +	set_t *s = *head, *t = NULL;  	while( s )  	{ @@ -152,7 +151,7 @@ void set_del( irc_t *irc, char *key )  		if( t )  			t->next = s->next;  		else -			irc->set = s->next; +			*head = s->next;  		g_free( s->key );  		if( s->value ) g_free( s->value ); @@ -161,27 +160,27 @@ void set_del( irc_t *irc, char *key )  	}  } -char *set_eval_int( irc_t *irc, set_t *set, char *value ) +char *set_eval_int( set_t *set, char *value )  { -	char *s = value; +	char *s; -	for( ; *s; s ++ ) +	for( s = value; *s; s ++ )  		if( *s < '0' || *s > '9' ) -			return( NULL ); +			return NULL; -	return( value ); +	return value;  } -char *set_eval_bool( irc_t *irc, set_t *set, char *value ) +char *set_eval_bool( set_t *set, char *value )  {  	if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) )  		return( value );  	if( ( g_strcasecmp( value, "false" ) == 0 ) || ( g_strcasecmp( value, "no" ) == 0 ) || ( g_strcasecmp( value, "off" ) == 0 ) )  		return( value ); -	return( set_eval_int( irc, set, value ) ); +	return( set_eval_int( set, value ) );  } -char *set_eval_to_char( irc_t *irc, set_t *set, char *value ) +char *set_eval_to_char( set_t *set, char *value )  {  	char *s = g_new( char, 3 ); @@ -190,50 +189,42 @@ char *set_eval_to_char( irc_t *irc, set_t *set, char *value )  	else  		sprintf( s, "%c ", *value ); -	return( s ); +	return s;  } -char *set_eval_ops( irc_t *irc, set_t *set, char *value ) +char *set_eval_ops( set_t *set, char *value )  { +	irc_t *irc = set->data; +	  	if( g_strcasecmp( value, "user" ) == 0 ) -	{  		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,  		                                              irc->channel, "+o-o", irc->nick, irc->mynick ); -		return( value ); -	}  	else if( g_strcasecmp( value, "root" ) == 0 ) -	{  		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,  		                                              irc->channel, "-o+o", irc->nick, irc->mynick ); -		return( value ); -	}  	else if( g_strcasecmp( value, "both" ) == 0 ) -	{  		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,  		                                              irc->channel, "+oo", irc->nick, irc->mynick ); -		return( value ); -	}  	else if( g_strcasecmp( value, "none" ) == 0 ) -	{  		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,  		                                              irc->channel, "-oo", irc->nick, irc->mynick ); -		return( value ); -	} +	else +		return NULL; -	return( NULL ); +	return value;  } -char *set_eval_charset( irc_t *irc, set_t *set, char *value ) +char *set_eval_charset( set_t *set, char *value )  {  	GIConv cd;  	if ( g_strncasecmp( value, "none", 4 ) == 0 ) -		return( value ); +		return value;  	cd = g_iconv_open( "UTF-8", value );  	if( cd == (GIConv) -1 ) -		return( NULL ); +		return NULL;  	g_iconv_close( cd ); -	return( value ); +	return value;  } @@ -1,7 +1,7 @@    /********************************************************************\    * BitlBee -- An IRC to other IM-networks gateway                     *    *                                                                    * -  * Copyright 2002-2004 Wilmer van der Gaast and others                * +  * Copyright 2002-2006 Wilmer van der Gaast and others                *    \********************************************************************/  /* Some stuff to register, handle and save user preferences             */ @@ -25,28 +25,30 @@  typedef struct set  { +	void *data; +	  	char *key;  	char *value;  	char *def;	/* Default */ -	/* Eval: Returns NULL if the value is incorrect. Can return a -	   corrected value. set_setstr() should be able to free() the -	   returned string! */ -	char *(*eval) ( irc_t *irc, struct set *set, char *value ); +	/* Eval: Returns NULL if the value is incorrect or exactly the +	   passed value variable. When returning a corrected value, +	   set_setstr() should be able to free() the returned string! */ +	char *(*eval) ( struct set *set, char *value );  	struct set *next;  } set_t; -set_t *set_add( irc_t *irc, char *key, char *def, void *eval ); -G_MODULE_EXPORT set_t *set_find( irc_t *irc, char *key ); -G_MODULE_EXPORT char *set_getstr( irc_t *irc, char *key ); -G_MODULE_EXPORT int set_getint( irc_t *irc, char *key ); -int set_setstr( irc_t *irc, char *key, char *value ); -int set_setint( irc_t *irc, char *key, int value ); -void set_del( irc_t *irc, char *key ); +set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data ); +G_MODULE_EXPORT set_t *set_find( set_t **head, char *key ); +G_MODULE_EXPORT char *set_getstr( set_t **head, char *key ); +G_MODULE_EXPORT int set_getint( set_t **head, char *key ); +int set_setstr( set_t **head, char *key, char *value ); +int set_setint( set_t **head, char *key, int value ); +void set_del( set_t **head, char *key ); -char *set_eval_int( irc_t *irc, set_t *set, char *value ); -char *set_eval_bool( irc_t *irc, set_t *set, char *value ); +char *set_eval_int( set_t *set, char *value ); +char *set_eval_bool( set_t *set, char *value ); -char *set_eval_to_char( irc_t *irc, set_t *set, char *value ); -char *set_eval_ops( irc_t *irc, set_t *set, char *value ); -char *set_eval_charset( irc_t *irc, set_t *set, char *value ); +char *set_eval_to_char( set_t *set, char *value ); +char *set_eval_ops( set_t *set, char *value ); +char *set_eval_charset( set_t *set, char *value ); diff --git a/storage_xml.c b/storage_xml.c index 5a8b51ef..e0ffc481 100644 --- a/storage_xml.c +++ b/storage_xml.c @@ -245,7 +245,7 @@ static void xml_text( GMarkupParseContext *ctx, const gchar *text, gsize text_le  	else if( g_strcasecmp( g_markup_parse_context_get_element( ctx ), "setting" ) == 0 &&  	         xd->current_setting && xd->current_account == NULL )  	{ -		set_setstr( irc, xd->current_setting, (char*) text ); +		set_setstr( &irc->set, xd->current_setting, (char*) text );  		g_free( xd->current_setting );  		xd->current_setting = NULL;  	} @@ -420,14 +420,13 @@ static storage_status_t xml_save( irc_t *irc, int overwrite )  		pass_len = rc4_encode( (unsigned char*) acc->pass, strlen( acc->pass ), (unsigned char**) &pass_rc4, irc->password );  		pass_b64 = base64_encode( pass_rc4, pass_len ); +		g_free( pass_rc4 );  		if( !xml_printf( fd, "\t<account protocol=\"%s\" handle=\"%s\" password=\"%s\" autoconnect=\"%d\"", acc->prpl->name, acc->user, pass_b64, acc->auto_connect ) )  		{ -			g_free( pass_rc4 );  			g_free( pass_b64 );  			goto write_error;  		} -		g_free( pass_rc4 );  		g_free( pass_b64 );  		if( acc->server && acc->server[0] && !xml_printf( fd, " server=\"%s\"", acc->server ) ) @@ -66,7 +66,7 @@ user_t *user_add( irc_t *irc, char *nick )  	}  	u->user = u->realname = u->host = u->nick = g_strdup( nick ); -	u->is_private = set_getint( irc, "private" ); +	u->is_private = set_getint( &irc->set, "private" );  	key = g_strdup( nick );  	nick_lc( key ); | 
