src/irc_proto.c
author Tero Marttila <terom@fixme.fi>
Sun, 19 Apr 2009 04:52:12 +0300
changeset 142 dc2bb09d412c
parent 82 bc767e01648d
child 149 549913bbe0d2
permissions -rw-r--r--
implement table-as-argument for lua_arg_*
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
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     5
err_t irc_nm_parse_buf (struct irc_nm *nm, char *prefix)
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     6
{
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     7
    // XXX: handle server name prefixes
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     8
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     9
    // mangle tokens
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    10
    nm->nickname = strsep(&prefix, "!");
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    11
    nm->username = strsep(&prefix, "@");
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    12
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    13
    // did we find the ! and @ tokens?
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    14
    if (!prefix)
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    15
        // probably a server name instead
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    16
        return ERR_INVALID_NM;
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    17
    
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    18
    // the hostname is then the rest of the prefix
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    19
    nm->hostname = prefix;
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    20
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    21
    // ok
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    22
    return SUCCESS;
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    23
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    24
}
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    25
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
    26
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
    27
{
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
    // 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
    29
    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
    30
        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
    31
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
    32
    // 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
    33
    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
    34
    
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    35
    // parse from buf
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    36
    return irc_nm_parse_buf(nm, buf);
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
    37
}
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
    38
36
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
/**
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
 * 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
    41
 */
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
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
    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
    // 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
    45
    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
    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
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
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
    49
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    // 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
    51
    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
    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
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
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
    55
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    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
    57
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    // 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
    59
    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
    60
        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
    61
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    // 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
    63
    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
    64
        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
    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
    // 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
    67
    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
    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
    // 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
    70
    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
    71
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // ok
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 SUCCESS;
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
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
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
    77
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    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
    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
    // 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
    81
    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
    82
        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
    83
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    // 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
    85
    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
    86
        // match
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        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
    88
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    else
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        // 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
    91
        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
    92
}
72
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    93
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    94
const char* irc_nick_chanflags (const char *nick, char chanflags[IRC_CHANFLAGS_MAX])
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    95
{
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    96
    char *cf = chanflags;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    97
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    98
    // consume the chanflags, using strchr to look for the char in the set of chanflags...
82
bc767e01648d fix a valgrind'd bug with irc_nick_chanflags being given an empty string
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
    99
    // XXX: error if nickname is empty...
bc767e01648d fix a valgrind'd bug with irc_nick_chanflags being given an empty string
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
   100
    while (*nick && strchr(IRC_CHANFLAGS, *nick) && (cf < chanflags + IRC_CHANFLAGS_MAX - 1))
72
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   101
        *cf++ = *nick++;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   102
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   103
    // NUL-terminate chanflags
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   104
    *cf = '\0';
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   105
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   106
    // then return the pointer to the first nickname char
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   107
    return nick;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   108
}
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   109