Changeset 3ddb7477 for protocols/user.c


Ignore:
Timestamp:
2010-03-26T12:14:37Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
ebaebfe
Parents:
ba7d16f
Message:

One total mess that doesn't do much yet, but reorganised some stuff and
untying the IRC and the core parts a little bit. Lots of work left to do.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • protocols/user.c

    rba7d16f r3ddb7477  
    3737        if( user_find( irc, nick ) != NULL )
    3838                return( NULL );
    39        
    40         if( ( u = irc->users ) )
    41         {
    42                 while( u )
    43                 {
    44                         if( nick_cmp( nick, u->nick ) < 0 )
    45                                 break;
    46                        
    47                         lu = u;
    48                         u = u->next;
    49                 }
    50                
    51                 u = g_new0( user_t, 1 );
    52                 if( lu )
    53                 {
    54                         u->next = lu->next;
    55                         lu->next = u;
    56                 }
    57                 else
    58                 {
    59                         u->next = irc->users;
    60                         irc->users = u;
    61                 }
    62         }
    63         else
    64         {
    65                 irc->users = u = g_new0( user_t, 1 );
    66         }
    67        
    68         u->user = u->realname = u->host = u->nick = g_strdup( nick );
    69         u->is_private = set_getbool( &irc->set, "private" );
    70        
    71         key = g_strdup( nick );
    72         nick_lc( key );
    73         g_hash_table_insert( irc->userhash, key, u );
    7439       
    7540        return( u );
     
    11378                        g_free( u );
    11479                       
    115                         if( !g_hash_table_lookup_extended( irc->userhash, key, &okey, &ovalue ) || ovalue != u )
    116                         {
    117                                 g_free( key );
    118                                 return( 1 );    /* Although this is a severe error, the user is removed from the list... */
    119                         }
    120                         g_hash_table_remove( irc->userhash, key );
    121                         g_free( key );
    122                         g_free( okey );
    123                        
    12480                        return( 1 );
    12581                }
     
    12884       
    12985        return( 0 );
    130 }
    131 
    132 user_t *user_find( irc_t *irc, char *nick )
    133 {
    134         char key[512] = "";
    135        
    136         strncpy( key, nick, sizeof( key ) - 1 );
    137         if( nick_lc( key ) )
    138                 return( g_hash_table_lookup( irc->userhash, key ) );
    139         else
    140                 return( NULL );
    14186}
    14287
     
    160105        return NULL;
    161106}
    162 
    163 /* DO NOT PASS u->nick FOR oldnick !!! */
    164 void user_rename( irc_t *irc, char *oldnick, char *newnick )
    165 {
    166         user_t *u = user_find( irc, oldnick );
    167         gpointer okey, ovalue;
    168         char *key;
    169        
    170         if( !u ) return;        /* Should've been checked by the caller... */
    171        
    172         g_free( u->nick );
    173         if( u->nick == u->user ) u->user = NULL;
    174         if( u->nick == u->host ) u->host = NULL;
    175         if( u->nick == u->realname ) u->realname = NULL;
    176         u->nick = g_strdup( newnick );
    177         if( !u->user ) u->user = u->nick;
    178         if( !u->host ) u->host = u->nick;
    179         if( !u->realname ) u->realname = u->nick;
    180        
    181         /* Remove the old reference to this user from the hash and create a
    182            new one with the new nick. This is indeed a bit messy. */
    183         key = g_strdup( oldnick );
    184         nick_lc( key );
    185         if( !g_hash_table_lookup_extended( irc->userhash, key, &okey, &ovalue ) || ovalue != u )
    186         {
    187                 g_free( key );
    188                 return;         /* This really shouldn't happen! */     
    189         }
    190         g_hash_table_remove( irc->userhash, key );
    191         g_free( key );
    192         g_free( okey );
    193        
    194         key = g_strdup( newnick );
    195         nick_lc( key );
    196         g_hash_table_insert( irc->userhash, key, u );
    197        
    198         /* Also, let's try to keep the linked list nicely sorted. Fear this
    199            code. If my teacher would see this, she would cry. ;-) */
    200         {
    201                 user_t *u1, *lu1;
    202                
    203                 /* Remove the user from the old position in the chain. */
    204                 if( u == irc->users )
    205                 {
    206                         irc->users = u->next;
    207                 }
    208                 else
    209                 {
    210                         u1 = u;
    211                         for( lu1 = irc->users; lu1->next != u1; lu1 = lu1->next );
    212                         lu1->next = u1->next;
    213                 }
    214                
    215                 /* Search for the new position. */
    216                 for( lu1 = NULL, u1 = irc->users; u1; u1 = u1->next )
    217                 {
    218                         if( nick_cmp( newnick, u1->nick ) < 0 )
    219                                 break;
    220                        
    221                         lu1 = u1;
    222                 }
    223                
    224                 /* Insert it at this new position. */
    225                 u->next = u1;
    226                 if( lu1 )
    227                         lu1->next = u;
    228                 else
    229                         irc->users = u;
    230         }
    231 }
Note: See TracChangeset for help on using the changeset viewer.