aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--conf.c2
-rw-r--r--irc.c58
-rw-r--r--irc_commands.c2
-rw-r--r--nick.c2
-rw-r--r--protocols/nogaim.c53
-rw-r--r--protocols/nogaim.h2
-rw-r--r--query.c4
-rw-r--r--root_commands.c6
-rw-r--r--set.c121
-rw-r--r--set.h36
-rw-r--r--storage_xml.c5
-rw-r--r--user.c2
12 files changed, 143 insertions, 150 deletions
diff --git a/conf.c b/conf.c
index d8b8be72..13f150a7 100644
--- a/conf.c
+++ b/conf.c
@@ -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 )
{
diff --git a/irc.c b/irc.c
index f6e7cbb7..60769735 100644
--- a/irc.c
+++ b/irc.c
@@ -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;
diff --git a/nick.c b/nick.c
index 68dd9802..56d6d378 100644
--- a/nick.c
+++ b/nick.c
@@ -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 );
diff --git a/query.c b/query.c
index 39821f3a..40dbb439 100644
--- a/query.c
+++ b/query.c
@@ -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 );
}
diff --git a/set.c b/set.c
index a26bc17b..b511a358 100644
--- a/set.c
+++ b/set.c
@@ -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;
}
diff --git a/set.h b/set.h
index 8a7b6747..15e97b5d 100644
--- a/set.h
+++ b/set.h
@@ -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 ) )
diff --git a/user.c b/user.c
index 5f0952f5..30228c70 100644
--- a/user.c
+++ b/user.c
@@ -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 );