aboutsummaryrefslogtreecommitdiffstats
path: root/irc.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2011-01-29 20:50:05 +0000
committerWilmer van der Gaast <wilmer@gaast.net>2011-01-29 20:50:05 +0000
commit00fd005cd04ce4f68ff2d72de75a313868564f54 (patch)
treec6cd04fbdf8828c4f11f4538c088f0f27882e000 /irc.c
parent02e06b5686650ddae5d9b1b3b2a09a89a7644cba (diff)
Cleaning up irc_umode_set() a little bit, but it's still a disaster.
Diffstat (limited to 'irc.c')
-rw-r--r--irc.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/irc.c b/irc.c
index 56adc12b..c9d1cc39 100644
--- a/irc.c
+++ b/irc.c
@@ -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;