| 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 } |