diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2011-01-29 20:50:05 +0000 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2011-01-29 20:50:05 +0000 |
commit | 00fd005cd04ce4f68ff2d72de75a313868564f54 (patch) | |
tree | c6cd04fbdf8828c4f11f4538c088f0f27882e000 /irc.c | |
parent | 02e06b5686650ddae5d9b1b3b2a09a89a7644cba (diff) |
Cleaning up irc_umode_set() a little bit, but it's still a disaster.
Diffstat (limited to 'irc.c')
-rw-r--r-- | irc.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -803,17 +803,18 @@ void irc_umode_set( irc_t *irc, const char *s, gboolean allow_priv ) char m[128], st = 1; const char *t; int i; - char changes[512], *p, st2 = 2; + char changes[512], st2 = 2; char badflag = 0; memset( m, 0, sizeof( m ) ); + /* Keep track of which modes are enabled in this array. */ for( t = irc->umode; *t; t ++ ) if( *t < sizeof( m ) ) m[(int)*t] = 1; - p = changes; - for( t = s; *t; t ++ ) + i = 0; + for( t = s; *t && i < sizeof( changes ) - 3; t ++ ) { if( *t == '+' || *t == '-' ) st = *t == '+'; @@ -823,19 +824,21 @@ void irc_umode_set( irc_t *irc, const char *s, gboolean allow_priv ) { if( m[(int)*t] != st) { + /* If we're actually making a change, remember this + for the response. */ if( st != st2 ) - st2 = st, *p++ = st ? '+' : '-'; - *p++ = *t; + st2 = st, changes[i++] = st ? '+' : '-'; + changes[i++] = *t; } m[(int)*t] = st; } else badflag = 1; } - *p = '\0'; + changes[i] = '\0'; + /* Convert the m array back into an umode string. */ memset( irc->umode, 0, sizeof( irc->umode ) ); - for( i = 'A'; i <= 'z' && strlen( irc->umode ) < ( sizeof( irc->umode ) - 1 ); i ++ ) if( m[i] ) irc->umode[strlen(irc->umode)] = i; |