Changeset 2e0eaac for nick.c


Ignore:
Timestamp:
2010-07-11T23:14:49Z (9 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
09dfb68
Parents:
b1f818b
Message:

First version of the nick_format setting.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nick.c

    rb1f818b r2e0eaac  
    2727#include "bitlbee.h"
    2828
     29/* Character maps, _lc_[x] == _uc_[x] (but uppercase), according to the RFC's.
     30   With one difference, we allow dashes. These are used to do uc/lc conversions
     31   and strip invalid chars. */
     32static char *nick_lc_chars = "0123456789abcdefghijklmnopqrstuvwxyz{}^`-_|";
     33static char *nick_uc_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[]~`-_\\";
     34
    2935/* Store handles in lower case and strip spaces, because AIM is braindead. */
    3036static char *clean_handle( const char *orig )
     
    7379                strncpy( nick, found_nick, MAX_NICK_LENGTH );
    7480        }
     81        else if( ( found_nick = nick_gen( bu ) ) )
     82        {
     83                strncpy( nick, found_nick, MAX_NICK_LENGTH );
     84                g_free( found_nick );
     85        }
    7586        else
    7687        {
     88                /* Keep this fallback since nick_gen() can return NULL in some cases. */
    7789                char *s;
    7890               
     
    97109char *nick_gen( bee_user_t *bu )
    98110{
    99         return NULL;
     111        gboolean ok = FALSE; /* Set to true once the nick contains something unique. */
     112        GString *ret = g_string_new( "" );
     113        char *fmt = set_getstr( &bu->ic->acc->set, "nick_format" ) ? :
     114                    set_getstr( &bu->bee->set, "nick_format" );
     115       
     116        while( fmt && *fmt && ret->len < MAX_NICK_LENGTH )
     117        {
     118                char *part, chop = '\0';
     119               
     120                if( *fmt != '%' )
     121                {
     122                        g_string_append_c( ret, *fmt );
     123                        fmt ++;
     124                        continue;
     125                }
     126               
     127                fmt ++;
     128                while( *fmt )
     129                {
     130                        /* -char means chop off everything from char */
     131                        if( *fmt == '-' )
     132                        {
     133                                chop = fmt[1];
     134                                if( chop == '\0' )
     135                                        return NULL;
     136                                fmt += 2;
     137                        }
     138                        else if( g_strncasecmp( fmt, "handle", 6 ) == 0 )
     139                        {
     140                                part = bu->handle;
     141                                fmt += 6;
     142                                ok |= TRUE;
     143                                break;
     144                        }
     145                        else if( g_strncasecmp( fmt, "full_name", 9 ) == 0 )
     146                        {
     147                                part = bu->fullname;
     148                                fmt += 9;
     149                                ok |= part && *part;
     150                                break;
     151                        }
     152                        else if( g_strncasecmp( fmt, "first_name", 10 ) == 0 )
     153                        {
     154                                part = bu->fullname;
     155                                fmt += 10;
     156                                ok |= part && *part;
     157                                chop = ' ';
     158                                break;
     159                        }
     160                        else
     161                        {
     162                                return NULL;
     163                        }
     164                }
     165               
     166                while( part && *part && *part != chop )
     167                {
     168                        if( strchr( nick_lc_chars, *part ) ||
     169                            strchr( nick_uc_chars, *part ) )
     170                                g_string_append_c( ret, *part );
     171                       
     172                        part ++;
     173                }
     174        }
     175       
     176        /* This returns NULL if the nick is empty or otherwise not ok. */
     177        return g_string_free( ret, ret->len == 0 || !ok );
    100178}
    101179
     
    163241
    164242
    165 /* Character maps, _lc_[x] == _uc_[x] (but uppercase), according to the RFC's.
    166    With one difference, we allow dashes. */
    167 
    168 static char *nick_lc_chars = "0123456789abcdefghijklmnopqrstuvwxyz{}^`-_|";
    169 static char *nick_uc_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ[]~`-_\\";
    170 
    171243void nick_strip( char *nick )
    172244{
Note: See TracChangeset for help on using the changeset viewer.