chmode: Make mode table manageable

This commit is contained in:
Ed Kellett 2020-11-02 23:07:31 +00:00
parent 5d7273614b
commit b5c8d52d82

View file

@ -86,13 +86,13 @@ construct_cflags_strings(void)
for(i = 0; i < 256; i++) for(i = 0; i < 256; i++)
{ {
if( !(chmode_table[i].set_func == chm_ban) && if (chmode_table[i].set_func != chm_ban &&
!(chmode_table[i].set_func == chm_forward) && chmode_table[i].set_func != chm_forward &&
!(chmode_table[i].set_func == chm_throttle) && chmode_table[i].set_func != chm_throttle &&
!(chmode_table[i].set_func == chm_key) && chmode_table[i].set_func != chm_key &&
!(chmode_table[i].set_func == chm_limit) && chmode_table[i].set_func != chm_limit &&
!(chmode_table[i].set_func == chm_op) && chmode_table[i].set_func != chm_op &&
!(chmode_table[i].set_func == chm_voice)) chmode_table[i].set_func != chm_voice)
{ {
chmode_flags[i] = chmode_table[i].mode_type; chmode_flags[i] = chmode_table[i].mode_type;
} }
@ -116,7 +116,9 @@ construct_cflags_strings(void)
} }
/* Should we leave orphaned check here? -- dwr */ /* Should we leave orphaned check here? -- dwr */
if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned)) if (chmode_table[i].set_func != NULL &&
chmode_table[i].set_func != chm_nosuch &&
chmode_table[i].set_func != chm_orphaned)
{ {
*ptr2++ = (char) i; *ptr2++ = (char) i;
} }
@ -153,11 +155,12 @@ cflag_add(char c_, ChannelModeFunc function)
{ {
int c = (unsigned char)c_; int c = (unsigned char)c_;
if (chmode_table[c].set_func != chm_nosuch && if (chmode_table[c].set_func != NULL &&
chmode_table[c].set_func != chm_nosuch &&
chmode_table[c].set_func != chm_orphaned) chmode_table[c].set_func != chm_orphaned)
return 0; return 0;
if (chmode_table[c].set_func == chm_nosuch) if (chmode_table[c].set_func == NULL || chmode_table[c].set_func == chm_nosuch)
chmode_table[c].mode_type = find_cflag_slot(); chmode_table[c].mode_type = find_cflag_slot();
if (chmode_table[c].mode_type == 0) if (chmode_table[c].mode_type == 0)
return 0; return 0;
@ -1385,272 +1388,29 @@ chm_key(struct Client *source_p, struct Channel *chptr,
/* *INDENT-OFF* */ /* *INDENT-OFF* */
struct ChannelMode chmode_table[256] = struct ChannelMode chmode_table[256] =
{ {
{chm_nosuch, 0 }, /* 0x00 */ ['F'] = {chm_simple, MODE_FREETARGET },
{chm_nosuch, 0 }, /* 0x01 */ ['I'] = {chm_ban, CHFL_INVEX },
{chm_nosuch, 0 }, /* 0x02 */ ['L'] = {chm_staff, MODE_EXLIMIT },
{chm_nosuch, 0 }, /* 0x03 */ ['P'] = {chm_staff, MODE_PERMANENT },
{chm_nosuch, 0 }, /* 0x04 */ ['Q'] = {chm_simple, MODE_DISFORWARD },
{chm_nosuch, 0 }, /* 0x05 */ ['b'] = {chm_ban, CHFL_BAN },
{chm_nosuch, 0 }, /* 0x06 */ ['e'] = {chm_ban, CHFL_EXCEPTION },
{chm_nosuch, 0 }, /* 0x07 */ ['f'] = {chm_forward, 0 },
{chm_nosuch, 0 }, /* 0x08 */ ['g'] = {chm_simple, MODE_FREEINVITE },
{chm_nosuch, 0 }, /* 0x09 */ ['i'] = {chm_simple, MODE_INVITEONLY },
{chm_nosuch, 0 }, /* 0x0a */ ['j'] = {chm_throttle, 0 },
{chm_nosuch, 0 }, /* 0x0b */ ['k'] = {chm_key, 0 },
{chm_nosuch, 0 }, /* 0x0c */ ['l'] = {chm_limit, 0 },
{chm_nosuch, 0 }, /* 0x0d */ ['m'] = {chm_simple, MODE_MODERATED },
{chm_nosuch, 0 }, /* 0x0e */ ['n'] = {chm_simple, MODE_NOPRIVMSGS },
{chm_nosuch, 0 }, /* 0x0f */ ['o'] = {chm_op, 0 },
{chm_nosuch, 0 }, /* 0x10 */ ['p'] = {chm_simple, MODE_PRIVATE },
{chm_nosuch, 0 }, /* 0x11 */ ['q'] = {chm_ban, CHFL_QUIET },
{chm_nosuch, 0 }, /* 0x12 */ ['r'] = {chm_simple, MODE_REGONLY },
{chm_nosuch, 0 }, /* 0x13 */ ['s'] = {chm_simple, MODE_SECRET },
{chm_nosuch, 0 }, /* 0x14 */ ['t'] = {chm_simple, MODE_TOPICLIMIT },
{chm_nosuch, 0 }, /* 0x15 */ ['v'] = {chm_voice, 0 },
{chm_nosuch, 0 }, /* 0x16 */ ['z'] = {chm_simple, MODE_OPMODERATE },
{chm_nosuch, 0 }, /* 0x17 */
{chm_nosuch, 0 }, /* 0x18 */
{chm_nosuch, 0 }, /* 0x19 */
{chm_nosuch, 0 }, /* 0x1a */
{chm_nosuch, 0 }, /* 0x1b */
{chm_nosuch, 0 }, /* 0x1c */
{chm_nosuch, 0 }, /* 0x1d */
{chm_nosuch, 0 }, /* 0x1e */
{chm_nosuch, 0 }, /* 0x1f */
{chm_nosuch, 0 }, /* 0x20 */
{chm_nosuch, 0 }, /* 0x21 */
{chm_nosuch, 0 }, /* 0x22 */
{chm_nosuch, 0 }, /* 0x23 */
{chm_nosuch, 0 }, /* 0x24 */
{chm_nosuch, 0 }, /* 0x25 */
{chm_nosuch, 0 }, /* 0x26 */
{chm_nosuch, 0 }, /* 0x27 */
{chm_nosuch, 0 }, /* 0x28 */
{chm_nosuch, 0 }, /* 0x29 */
{chm_nosuch, 0 }, /* 0x2a */
{chm_nosuch, 0 }, /* 0x2b */
{chm_nosuch, 0 }, /* 0x2c */
{chm_nosuch, 0 }, /* 0x2d */
{chm_nosuch, 0 }, /* 0x2e */
{chm_nosuch, 0 }, /* 0x2f */
{chm_nosuch, 0 }, /* 0x30 */
{chm_nosuch, 0 }, /* 0x31 */
{chm_nosuch, 0 }, /* 0x32 */
{chm_nosuch, 0 }, /* 0x33 */
{chm_nosuch, 0 }, /* 0x34 */
{chm_nosuch, 0 }, /* 0x35 */
{chm_nosuch, 0 }, /* 0x36 */
{chm_nosuch, 0 }, /* 0x37 */
{chm_nosuch, 0 }, /* 0x38 */
{chm_nosuch, 0 }, /* 0x39 */
{chm_nosuch, 0 }, /* 0x3a */
{chm_nosuch, 0 }, /* 0x3b */
{chm_nosuch, 0 }, /* 0x3c */
{chm_nosuch, 0 }, /* 0x3d */
{chm_nosuch, 0 }, /* 0x3e */
{chm_nosuch, 0 }, /* 0x3f */
{chm_nosuch, 0 }, /* @ */
{chm_nosuch, 0 }, /* A */
{chm_nosuch, 0 }, /* B */
{chm_nosuch, 0 }, /* C */
{chm_nosuch, 0 }, /* D */
{chm_nosuch, 0 }, /* E */
{chm_simple, MODE_FREETARGET }, /* F */
{chm_nosuch, 0 }, /* G */
{chm_nosuch, 0 }, /* H */
{chm_ban, CHFL_INVEX }, /* I */
{chm_nosuch, 0 }, /* J */
{chm_nosuch, 0 }, /* K */
{chm_staff, MODE_EXLIMIT }, /* L */
{chm_nosuch, 0 }, /* M */
{chm_nosuch, 0 }, /* N */
{chm_nosuch, 0 }, /* O */
{chm_staff, MODE_PERMANENT }, /* P */
{chm_simple, MODE_DISFORWARD }, /* Q */
{chm_nosuch, 0 }, /* R */
{chm_nosuch, 0 }, /* S */
{chm_nosuch, 0 }, /* T */
{chm_nosuch, 0 }, /* U */
{chm_nosuch, 0 }, /* V */
{chm_nosuch, 0 }, /* W */
{chm_nosuch, 0 }, /* X */
{chm_nosuch, 0 }, /* Y */
{chm_nosuch, 0 }, /* Z */
{chm_nosuch, 0 },
{chm_nosuch, 0 },
{chm_nosuch, 0 },
{chm_nosuch, 0 },
{chm_nosuch, 0 },
{chm_nosuch, 0 },
{chm_nosuch, 0 }, /* a */
{chm_ban, CHFL_BAN }, /* b */
{chm_nosuch, 0 }, /* c */
{chm_nosuch, 0 }, /* d */
{chm_ban, CHFL_EXCEPTION }, /* e */
{chm_forward, 0 }, /* f */
{chm_simple, MODE_FREEINVITE }, /* g */
{chm_nosuch, 0 }, /* h */
{chm_simple, MODE_INVITEONLY }, /* i */
{chm_throttle, 0 }, /* j */
{chm_key, 0 }, /* k */
{chm_limit, 0 }, /* l */
{chm_simple, MODE_MODERATED }, /* m */
{chm_simple, MODE_NOPRIVMSGS }, /* n */
{chm_op, 0 }, /* o */
{chm_simple, MODE_PRIVATE }, /* p */
{chm_ban, CHFL_QUIET }, /* q */
{chm_simple, MODE_REGONLY }, /* r */
{chm_simple, MODE_SECRET }, /* s */
{chm_simple, MODE_TOPICLIMIT }, /* t */
{chm_nosuch, 0 }, /* u */
{chm_voice, 0 }, /* v */
{chm_nosuch, 0 }, /* w */
{chm_nosuch, 0 }, /* x */
{chm_nosuch, 0 }, /* y */
{chm_simple, MODE_OPMODERATE }, /* z */
{chm_nosuch, 0 }, /* 0x7b */
{chm_nosuch, 0 }, /* 0x7c */
{chm_nosuch, 0 }, /* 0x7d */
{chm_nosuch, 0 }, /* 0x7e */
{chm_nosuch, 0 }, /* 0x7f */
{chm_nosuch, 0 }, /* 0x80 */
{chm_nosuch, 0 }, /* 0x81 */
{chm_nosuch, 0 }, /* 0x82 */
{chm_nosuch, 0 }, /* 0x83 */
{chm_nosuch, 0 }, /* 0x84 */
{chm_nosuch, 0 }, /* 0x85 */
{chm_nosuch, 0 }, /* 0x86 */
{chm_nosuch, 0 }, /* 0x87 */
{chm_nosuch, 0 }, /* 0x88 */
{chm_nosuch, 0 }, /* 0x89 */
{chm_nosuch, 0 }, /* 0x8a */
{chm_nosuch, 0 }, /* 0x8b */
{chm_nosuch, 0 }, /* 0x8c */
{chm_nosuch, 0 }, /* 0x8d */
{chm_nosuch, 0 }, /* 0x8e */
{chm_nosuch, 0 }, /* 0x8f */
{chm_nosuch, 0 }, /* 0x90 */
{chm_nosuch, 0 }, /* 0x91 */
{chm_nosuch, 0 }, /* 0x92 */
{chm_nosuch, 0 }, /* 0x93 */
{chm_nosuch, 0 }, /* 0x94 */
{chm_nosuch, 0 }, /* 0x95 */
{chm_nosuch, 0 }, /* 0x96 */
{chm_nosuch, 0 }, /* 0x97 */
{chm_nosuch, 0 }, /* 0x98 */
{chm_nosuch, 0 }, /* 0x99 */
{chm_nosuch, 0 }, /* 0x9a */
{chm_nosuch, 0 }, /* 0x9b */
{chm_nosuch, 0 }, /* 0x9c */
{chm_nosuch, 0 }, /* 0x9d */
{chm_nosuch, 0 }, /* 0x9e */
{chm_nosuch, 0 }, /* 0x9f */
{chm_nosuch, 0 }, /* 0xa0 */
{chm_nosuch, 0 }, /* 0xa1 */
{chm_nosuch, 0 }, /* 0xa2 */
{chm_nosuch, 0 }, /* 0xa3 */
{chm_nosuch, 0 }, /* 0xa4 */
{chm_nosuch, 0 }, /* 0xa5 */
{chm_nosuch, 0 }, /* 0xa6 */
{chm_nosuch, 0 }, /* 0xa7 */
{chm_nosuch, 0 }, /* 0xa8 */
{chm_nosuch, 0 }, /* 0xa9 */
{chm_nosuch, 0 }, /* 0xaa */
{chm_nosuch, 0 }, /* 0xab */
{chm_nosuch, 0 }, /* 0xac */
{chm_nosuch, 0 }, /* 0xad */
{chm_nosuch, 0 }, /* 0xae */
{chm_nosuch, 0 }, /* 0xaf */
{chm_nosuch, 0 }, /* 0xb0 */
{chm_nosuch, 0 }, /* 0xb1 */
{chm_nosuch, 0 }, /* 0xb2 */
{chm_nosuch, 0 }, /* 0xb3 */
{chm_nosuch, 0 }, /* 0xb4 */
{chm_nosuch, 0 }, /* 0xb5 */
{chm_nosuch, 0 }, /* 0xb6 */
{chm_nosuch, 0 }, /* 0xb7 */
{chm_nosuch, 0 }, /* 0xb8 */
{chm_nosuch, 0 }, /* 0xb9 */
{chm_nosuch, 0 }, /* 0xba */
{chm_nosuch, 0 }, /* 0xbb */
{chm_nosuch, 0 }, /* 0xbc */
{chm_nosuch, 0 }, /* 0xbd */
{chm_nosuch, 0 }, /* 0xbe */
{chm_nosuch, 0 }, /* 0xbf */
{chm_nosuch, 0 }, /* 0xc0 */
{chm_nosuch, 0 }, /* 0xc1 */
{chm_nosuch, 0 }, /* 0xc2 */
{chm_nosuch, 0 }, /* 0xc3 */
{chm_nosuch, 0 }, /* 0xc4 */
{chm_nosuch, 0 }, /* 0xc5 */
{chm_nosuch, 0 }, /* 0xc6 */
{chm_nosuch, 0 }, /* 0xc7 */
{chm_nosuch, 0 }, /* 0xc8 */
{chm_nosuch, 0 }, /* 0xc9 */
{chm_nosuch, 0 }, /* 0xca */
{chm_nosuch, 0 }, /* 0xcb */
{chm_nosuch, 0 }, /* 0xcc */
{chm_nosuch, 0 }, /* 0xcd */
{chm_nosuch, 0 }, /* 0xce */
{chm_nosuch, 0 }, /* 0xcf */
{chm_nosuch, 0 }, /* 0xd0 */
{chm_nosuch, 0 }, /* 0xd1 */
{chm_nosuch, 0 }, /* 0xd2 */
{chm_nosuch, 0 }, /* 0xd3 */
{chm_nosuch, 0 }, /* 0xd4 */
{chm_nosuch, 0 }, /* 0xd5 */
{chm_nosuch, 0 }, /* 0xd6 */
{chm_nosuch, 0 }, /* 0xd7 */
{chm_nosuch, 0 }, /* 0xd8 */
{chm_nosuch, 0 }, /* 0xd9 */
{chm_nosuch, 0 }, /* 0xda */
{chm_nosuch, 0 }, /* 0xdb */
{chm_nosuch, 0 }, /* 0xdc */
{chm_nosuch, 0 }, /* 0xdd */
{chm_nosuch, 0 }, /* 0xde */
{chm_nosuch, 0 }, /* 0xdf */
{chm_nosuch, 0 }, /* 0xe0 */
{chm_nosuch, 0 }, /* 0xe1 */
{chm_nosuch, 0 }, /* 0xe2 */
{chm_nosuch, 0 }, /* 0xe3 */
{chm_nosuch, 0 }, /* 0xe4 */
{chm_nosuch, 0 }, /* 0xe5 */
{chm_nosuch, 0 }, /* 0xe6 */
{chm_nosuch, 0 }, /* 0xe7 */
{chm_nosuch, 0 }, /* 0xe8 */
{chm_nosuch, 0 }, /* 0xe9 */
{chm_nosuch, 0 }, /* 0xea */
{chm_nosuch, 0 }, /* 0xeb */
{chm_nosuch, 0 }, /* 0xec */
{chm_nosuch, 0 }, /* 0xed */
{chm_nosuch, 0 }, /* 0xee */
{chm_nosuch, 0 }, /* 0xef */
{chm_nosuch, 0 }, /* 0xf0 */
{chm_nosuch, 0 }, /* 0xf1 */
{chm_nosuch, 0 }, /* 0xf2 */
{chm_nosuch, 0 }, /* 0xf3 */
{chm_nosuch, 0 }, /* 0xf4 */
{chm_nosuch, 0 }, /* 0xf5 */
{chm_nosuch, 0 }, /* 0xf6 */
{chm_nosuch, 0 }, /* 0xf7 */
{chm_nosuch, 0 }, /* 0xf8 */
{chm_nosuch, 0 }, /* 0xf9 */
{chm_nosuch, 0 }, /* 0xfa */
{chm_nosuch, 0 }, /* 0xfb */
{chm_nosuch, 0 }, /* 0xfc */
{chm_nosuch, 0 }, /* 0xfd */
{chm_nosuch, 0 }, /* 0xfe */
{chm_nosuch, 0 }, /* 0xff */
}; };
/* *INDENT-ON* */ /* *INDENT-ON* */
@ -1701,6 +1461,7 @@ set_channel_mode(struct Client *client_p, struct Client *source_p,
{ {
switch (c) switch (c)
{ {
ChannelModeFunc set_func;
case '+': case '+':
dir = MODE_ADD; dir = MODE_ADD;
if (!reauthorized) if (!reauthorized)
@ -1721,7 +1482,10 @@ set_channel_mode(struct Client *client_p, struct Client *source_p,
dir = MODE_QUERY; dir = MODE_QUERY;
break; break;
default: default:
chmode_table[(unsigned char) c].set_func(fakesource_p, chptr, alevel, set_func = chmode_table[(unsigned char) c].set_func;
if (set_func == NULL)
set_func = chm_nosuch;
set_func(fakesource_p, chptr, alevel,
parc, &parn, parv, parc, &parn, parv,
&errors, dir, c, &errors, dir, c,
chmode_table[(unsigned char) c].mode_type); chmode_table[(unsigned char) c].mode_type);