Changes in set.c [dd89a55:6237ded]
Legend:
- Unmodified
- Added
- Removed
-
set.c
rdd89a55 r6237ded 26 26 #include "bitlbee.h" 27 27 28 set_t *set_add( irc_t *irc, char *key, char *def, void *eval ) 29 { 30 set_t *s = set_find( irc, key ); 31 32 if( !s ) 33 { 34 if( ( s = irc->set ) ) 28 set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data ) 29 { 30 set_t *s = set_find( head, key ); 31 32 /* Possibly the setting already exists. If it doesn't exist yet, 33 we create it. If it does, we'll just change the default. */ 34 if( !s ) 35 { 36 if( ( s = *head ) ) 35 37 { 36 38 while( s->next ) s = s->next; 37 s->next = g_new 39 s->next = g_new0( set_t, 1 ); 38 40 s = s->next; 39 41 } 40 42 else 41 43 { 42 s = irc->set = g_new( set_t, 1 );44 s = *head = g_new0( set_t, 1 ); 43 45 } 44 memset( s, 0, sizeof( set_t ) );45 46 s->key = g_strdup( key ); 46 47 } … … 53 54 if( def ) s->def = g_strdup( def ); 54 55 55 if( s->eval ) 56 { 57 g_free( s->eval ); 58 s->eval = NULL; 59 } 60 if( eval ) s->eval = eval; 61 62 return( s ); 63 } 64 65 set_t *set_find( irc_t *irc, char *key ) 66 { 67 set_t *s = irc->set; 56 s->eval = eval; 57 s->data = data; 58 59 return s; 60 } 61 62 set_t *set_find( set_t **head, char *key ) 63 { 64 set_t *s = *head; 68 65 69 66 while( s ) … … 74 71 } 75 72 76 return ( s );77 } 78 79 char *set_getstr( irc_t *irc, char *key )80 { 81 set_t *s = set_find( irc, key );73 return s; 74 } 75 76 char *set_getstr( set_t **head, char *key ) 77 { 78 set_t *s = set_find( head, key ); 82 79 83 80 if( !s || ( !s->value && !s->def ) ) 84 return ( NULL );85 86 return ( s->value?s->value:s->def );87 } 88 89 int set_getint( irc_t *irc, char *key )90 { 91 char *s = set_getstr( irc, key );81 return NULL; 82 83 return s->value ? s->value : s->def; 84 } 85 86 int set_getint( set_t **head, char *key ) 87 { 88 char *s = set_getstr( head, key ); 92 89 int i = 0; 93 90 94 91 if( !s ) 95 return ( 0 );92 return 0; 96 93 97 94 if( ( g_strcasecmp( s, "true" ) == 0 ) || ( g_strcasecmp( s, "yes" ) == 0 ) || ( g_strcasecmp( s, "on" ) == 0 ) ) 98 return ( 1 );95 return 1; 99 96 100 97 if( sscanf( s, "%d", &i ) != 1 ) 101 return( 0 ); 102 103 return( i ); 104 } 105 106 int set_setstr( irc_t *irc, char *key, char *value ) 107 { 108 set_t *s = set_find( irc, key ); 98 return 0; 99 100 return i; 101 } 102 103 int set_getbool( set_t **head, char *key ) 104 { 105 char *s = set_getstr( head, key ); 106 107 if( !s ) 108 return 0; 109 110 return bool2int( s ); 111 } 112 113 int set_setstr( set_t **head, char *key, char *value ) 114 { 115 set_t *s = set_find( head, key ); 109 116 char *nv = value; 110 117 111 118 if( !s ) 112 s = set_add( irc, key, NULL, NULL );113 114 if( s->eval && !( nv = s->eval( irc,s, value ) ) )115 return ( 0 );119 s = set_add( head, key, NULL, NULL, NULL ); 120 121 if( s->eval && !( nv = s->eval( s, value ) ) ) 122 return 0; 116 123 117 124 if( s->value ) … … 121 128 } 122 129 130 /* If there's a default setting and it's equal to what we're trying to 131 set, stick with s->value = NULL. Otherwise, remember the setting. */ 123 132 if( !s->def || ( strcmp( nv, s->def ) != 0 ) ) 124 133 s->value = g_strdup( nv ); … … 127 136 g_free( nv ); 128 137 129 return ( 1 );130 } 131 132 int set_setint( irc_t *irc, char *key, int value )138 return 1; 139 } 140 141 int set_setint( set_t **head, char *key, int value ) 133 142 { 134 143 char s[24]; /* Not quite 128-bit clean eh? ;-) */ 135 144 136 sprintf( s, "%d", value );137 return ( set_setstr( irc, key, s ));138 } 139 140 void set_del( irc_t *irc, char *key )141 { 142 set_t *s = irc->set, *t = NULL;145 g_snprintf( s, sizeof( s ), "%d", value ); 146 return set_setstr( head, key, s ); 147 } 148 149 void set_del( set_t **head, char *key ) 150 { 151 set_t *s = *head, *t = NULL; 143 152 144 153 while( s ) … … 153 162 t->next = s->next; 154 163 else 155 irc->set= s->next;164 *head = s->next; 156 165 157 166 g_free( s->key ); … … 162 171 } 163 172 164 char *set_eval_int( irc_t *irc,set_t *set, char *value )173 char *set_eval_int( set_t *set, char *value ) 165 174 { 166 175 char *s = value; 167 176 177 /* Allow a minus at the first position. */ 178 if( *s == '-' ) 179 s ++; 180 168 181 for( ; *s; s ++ ) 169 if( *s < '0' || *s > '9' ) 170 return( NULL ); 171 172 return( value ); 173 } 174 175 char *set_eval_bool( irc_t *irc, set_t *set, char *value ) 176 { 177 if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) ) 178 return( value ); 179 if( ( g_strcasecmp( value, "false" ) == 0 ) || ( g_strcasecmp( value, "no" ) == 0 ) || ( g_strcasecmp( value, "off" ) == 0 ) ) 180 return( value ); 181 return( set_eval_int( irc, set, value ) ); 182 } 183 184 char *set_eval_to_char( irc_t *irc, set_t *set, char *value ) 182 if( !isdigit( *s ) ) 183 return NULL; 184 185 return value; 186 } 187 188 char *set_eval_bool( set_t *set, char *value ) 189 { 190 return is_bool( value ) ? value : NULL; 191 } 192 193 char *set_eval_to_char( set_t *set, char *value ) 185 194 { 186 195 char *s = g_new( char, 3 ); … … 191 200 sprintf( s, "%c ", *value ); 192 201 193 return( s ); 194 } 195 196 char *set_eval_ops( irc_t *irc, set_t *set, char *value ) 197 { 202 return s; 203 } 204 205 char *set_eval_ops( set_t *set, char *value ) 206 { 207 irc_t *irc = set->data; 208 198 209 if( g_strcasecmp( value, "user" ) == 0 ) 199 {200 210 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 201 211 irc->channel, "+o-o", irc->nick, irc->mynick ); 202 return( value );203 }204 212 else if( g_strcasecmp( value, "root" ) == 0 ) 205 {206 213 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 207 214 irc->channel, "-o+o", irc->nick, irc->mynick ); 208 return( value );209 }210 215 else if( g_strcasecmp( value, "both" ) == 0 ) 211 {212 216 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 213 217 irc->channel, "+oo", irc->nick, irc->mynick ); 214 return( value );215 }216 218 else if( g_strcasecmp( value, "none" ) == 0 ) 217 {218 219 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 219 220 irc->channel, "-oo", irc->nick, irc->mynick ); 220 return( value ); 221 } 222 223 return( NULL ); 224 } 225 221 else 222 return NULL; 223 224 return value; 225 } 226 227 char *set_eval_charset( set_t *set, char *value ) 228 { 229 GIConv cd; 230 231 if ( g_strncasecmp( value, "none", 4 ) == 0 ) 232 return value; 233 234 cd = g_iconv_open( "UTF-8", value ); 235 if( cd == (GIConv) -1 ) 236 return NULL; 237 238 g_iconv_close( cd ); 239 return value; 240 }
Note: See TracChangeset
for help on using the changeset viewer.