src/irc_proto.c
author Tero Marttila <terom@fixme.fi>
Fri, 13 Mar 2009 15:22:46 +0200
changeset 52 97604efda1ce
parent 45 71e65564afd2
child 72 43084f103c2a
permissions -rw-r--r--
add test_sock_push, and filter argument to test main()
39
a4891d71aca9 rename irc_nm to irc_proto, and move numerics from irc_cmd.h
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
     1
#include "irc_proto.h"
36
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <string.h>
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     5
err_t irc_nm_parse (struct irc_nm *nm, char *buf, const char *prefix)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     6
{
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     7
    // too long?
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     8
    if (strlen(prefix) >= IRC_PREFIX_MAX)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
     9
        return ERR_INVALID_NM;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    10
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    11
    // copy to mutable buffer
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    12
    strcpy(buf, prefix);
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    13
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    14
    // mangle tokens
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    15
    nm->nickname = strsep(&buf, "!");
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    16
    nm->username = strsep(&buf, "@");
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    17
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    18
    // did we find the ! and @ tokens?
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    19
    if (!buf)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    20
        // probably a server name instead
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    21
        return ERR_INVALID_NM;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    22
    
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    23
    // the hostname is then the rest of the prefix
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    24
    nm->hostname = buf;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    25
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    26
    // ok
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    27
    return SUCCESS;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    28
}
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    29
36
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
/**
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
 * Compare two nicknames
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
 */
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
int irc_cmp_nick (const char *nick1, const char *nick2)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    // XXX: just use strcasecmp for now
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    return strcasecmp(nick1, nick2);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
int irc_ncmp_nick (const char *nick1, const char *nick2, size_t n)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    // XXX: just use strncasecmp for now
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    return strncasecmp(nick1, nick2, n);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
err_t irc_prefix_parse_nick (const char *prefix, char nick[IRC_NICK_MAX])
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    const char *bang;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    // find the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    if ((bang = strchr(prefix, '!')) == NULL)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        return ERR_INVALID_NM;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    // too long?
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    if (bang - prefix > IRC_NICK_MAX - 1)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        return ERR_INVALID_NICK_LENGTH;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    // copy up to the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    memcpy(nick, prefix, bang - prefix);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    // terminating NUL
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    nick[bang - prefix] = '\0';
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    // ok
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    return SUCCESS;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
int irc_prefix_cmp_nick (const char *prefix, const char *nick)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    const char *bang;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    // find the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    if ((bang = strchr(prefix, '!')) == NULL)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        return -ERR_INVALID_NM;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    // compare up to that
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    if (irc_ncmp_nick(prefix, nick, (bang - prefix)) == 0)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        // match
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        return 0;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    else
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        // doesn't match
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        return 1;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
}