| | 338 | | void parse_channel_modes(IRC_CHANNEL_REC *channel, const char *setby, | | | 339 | | const char *mode, int update_key) | | | 340 | | { | | | 341 | | IRC_SERVER_REC *server = channel->server; | | | 342 | | GString *newmode; | | | 343 | | char *dup, *modestr, *arg, *curmode, type, *old_key; | | | 344 | | int umode; | | | 345 | | | | | 346 | | g_return_if_fail(IS_IRC_CHANNEL(channel));
| | | 347 | | g_return_if_fail(mode != NULL);
| | | 348 | | | | | 349 | | type = '+'; | | true | 350 | | newmode = g_string_new(channel->mode); | | | 351 | | old_key = update_key ? NULL : g_strdup(channel->key);
| | | 352 | | | | | 353 | | dup = modestr = g_strdup(mode); | | | 354 | | curmode = cmd_get_param(&modestr); | | | 355 | | while (*curmode != '\0') { | | | 356 | | if (HAS_MODE_ARG(server, type, *curmode)) {
| | | 357 | | | | | 358 | | | | | 359 | | arg = cmd_get_param(&modestr); | | | 360 | | } else { | | | 361 | | arg = NULL;
| | | 362 | | } | | | 363 | | | | | 364 | | switch (*curmode) { | | | 365 | | case '+': | | | 366 | | case '-': | | | 367 | | type = *curmode; | | | 368 | | break; | | | 369 | | default: | | | 370 | | umode = (unsigned char) *curmode; | | | 371 | | if (server->modes[umode].func != NULL) {
| | | 372 | | server->modes[umode].func(channel, setby, | | | 373 | | type, *curmode, arg, | | | 374 | | newmode); | | newmode = 0 | 375 | | } else { | | | 376 | | | | newmode <= 4095 | 377 | | modes_type_d(channel, setby, type, *curmode, |
|