src/protocols/irc/parse.c

changeset 9442
db4d2cea6f2a
parent 9274
25119ad142d9
child 9597
c6f672b593cb
equal deleted inserted replaced
9441:507df068c272 9442:db4d2cea6f2a
548 } 548 }
549 g_free(args); 549 g_free(args);
550 g_free(from); 550 g_free(from);
551 } 551 }
552 552
553 int irc_parse_cmd(struct irc_conn *irc, const char *target, const char *cmdstr)
554 {
555 const char *cur, *end, *fmt;
556 char *tmp, *cmd, **args;
557 struct _irc_user_cmd *cmdent;
558 guint i;
559 int ret;
560
561 cur = cmdstr;
562 end = strchr(cmdstr, ' ');
563 if (!end)
564 end = cur + strlen(cur);
565
566 tmp = g_strndup(cur, end - cur);
567 cmd = g_utf8_strdown(tmp, -1);
568 g_free(tmp);
569
570 if ((cmdent = g_hash_table_lookup(irc->cmds, cmd)) == NULL) {
571 ret = irc_cmd_default(irc, cmd, target, &cmdstr);
572 g_free(cmd);
573 return ret;
574 }
575
576 args = g_new0(char *, strlen(cmdent->format));
577 for (cur = end, fmt = cmdent->format, i = 0; fmt[i] && *cur++; i++) {
578 switch (fmt[i]) {
579 case 'v':
580 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
581 args[i] = g_strndup(cur, end - cur);
582 cur += end - cur;
583 break;
584 case 't':
585 case 'n':
586 case 'c':
587 if (!(end = strchr(cur, ' '))) end = cur + strlen(cur);
588 args[i] = g_strndup(cur, end - cur);
589 cur += end - cur;
590 break;
591 case ':':
592 case '*':
593 args[i] = g_strdup(cur);
594 cur = cur + strlen(cur);
595 break;
596 default:
597 gaim_debug(GAIM_DEBUG_ERROR, "irc", "invalid command format character '%c'\n", fmt[i]);
598 break;
599 }
600 }
601 ret = (cmdent->cb)(irc, cmd, target, (const char **)args);
602 for (i = 0; i < strlen(cmdent->format); i++)
603 g_free(args[i]);
604 g_free(args);
605
606 g_free(cmd);
607 return ret;
608 }
609
610 static void irc_parse_error_cb(struct irc_conn *irc, char *input) 553 static void irc_parse_error_cb(struct irc_conn *irc, char *input)
611 { 554 {
612 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", input); 555 gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", input);
613 } 556 }

mercurial