📄 parse.c
字号:
bg[0] = *cur++; if (isdigit(*cur)) bg[1] = *cur++; } if (font) { decoded = g_string_append(decoded, "</FONT>"); font = FALSE; } if (fg[0]) { fgnum = atoi(fg); if (fgnum < 0 || fgnum > 15) continue; font = TRUE; g_string_append_printf(decoded, "<FONT COLOR=\"%s\"", irc_mirc_colors[fgnum]); if (bg[0]) { bgnum = atoi(bg); if (bgnum >= 0 && bgnum < 16) g_string_append_printf(decoded, " BACK=\"%s\"", irc_mirc_colors[bgnum]); } decoded = g_string_append_c(decoded, '>'); } break; case '\011': cur++; if (!italic) { decoded = g_string_append(decoded, "<I>"); italic = TRUE; } else { decoded = g_string_append(decoded, "</I>"); italic = FALSE; } break; case '\037': cur++; if (!underline) { decoded = g_string_append(decoded, "<U>"); underline = TRUE; } else { decoded = g_string_append(decoded, "</U>"); underline = FALSE; } break; case '\007': case '\026': cur++; break; case '\017': cur++; /* fallthrough */ case '\000': if (bold) decoded = g_string_append(decoded, "</B>"); if (italic) decoded = g_string_append(decoded, "</I>"); if (underline) decoded = g_string_append(decoded, "</U>"); if (font) decoded = g_string_append(decoded, "</FONT>"); break; default: purple_debug(PURPLE_DEBUG_ERROR, "irc", "Unexpected mIRC formatting character %d\n", *cur); } } while (*cur); return g_string_free(decoded, FALSE);}char *irc_mirc2txt (const char *string){ char *result = g_strdup (string); int i, j; for (i = 0, j = 0; result[i]; i++) { switch (result[i]) { case '\002': case '\003': /* Foreground color */ if (isdigit(result[i + 1])) i++; if (isdigit(result[i + 1])) i++; /* Optional comma and background color */ if (result[i + 1] == ',') { i++; if (isdigit(result[i + 1])) i++; if (isdigit(result[i + 1])) i++; } /* Note that i still points to the last character * of the color selection string. */ continue; case '\007': case '\017': case '\026': case '\037': continue; default: result[j++] = result[i]; } } result[j] = '\0'; return result;}gboolean irc_ischannel(const char *string){ return (string[0] == '#' || string[0] == '&');}char *irc_parse_ctcp(struct irc_conn *irc, const char *from, const char *to, const char *msg, int notice){ PurpleConnection *gc; const char *cur = msg + 1; char *buf, *ctcp; time_t timestamp; /* Note that this is NOT correct w.r.t. multiple CTCPs in one * message and low-level quoting ... but if you want that crap, * use a real IRC client. */ if (msg[0] != '\001' || msg[strlen(msg) - 1] != '\001') return g_strdup(msg); if (!strncmp(cur, "ACTION ", 7)) { cur += 7; buf = g_strdup_printf("/me %s", cur); buf[strlen(buf) - 1] = '\0'; return buf; } else if (!strncmp(cur, "PING ", 5)) { if (notice) { /* reply */ /* TODO: Should this read in the timestamp as a double? */ sscanf(cur, "PING %lu", ×tamp); gc = purple_account_get_connection(irc->account); if (!gc) return NULL; buf = g_strdup_printf(_("Reply time from %s: %lu seconds"), from, time(NULL) - timestamp); purple_notify_info(gc, _("PONG"), _("CTCP PING reply"), buf); g_free(buf); return NULL; } else { buf = irc_format(irc, "vt:", "NOTICE", from, msg); irc_send(irc, buf); g_free(buf); } } else if (!strncmp(cur, "VERSION", 7) && !notice) { buf = irc_format(irc, "vt:", "NOTICE", from, "\001VERSION Purple IRC\001"); irc_send(irc, buf); g_free(buf); } else if (!strncmp(cur, "DCC SEND ", 9)) { irc_dccsend_recv(irc, from, msg + 10); return NULL; } ctcp = g_strdup(msg + 1); ctcp[strlen(ctcp) - 1] = '\0'; buf = g_strdup_printf("Received CTCP '%s' (to %s) from %s", ctcp, to, from); g_free(ctcp); return buf;}void irc_msg_table_build(struct irc_conn *irc){ int i; if (!irc || !irc->msgs) { purple_debug(PURPLE_DEBUG_ERROR, "irc", "Attempt to build a message table on a bogus structure\n"); return; } for (i = 0; _irc_msgs[i].name; i++) { g_hash_table_insert(irc->msgs, (gpointer)_irc_msgs[i].name, (gpointer)&_irc_msgs[i]); }}void irc_cmd_table_build(struct irc_conn *irc){ int i; if (!irc || !irc->cmds) { purple_debug(PURPLE_DEBUG_ERROR, "irc", "Attempt to build a command table on a bogus structure\n"); return; } for (i = 0; _irc_cmds[i].name ; i++) { g_hash_table_insert(irc->cmds, (gpointer)_irc_cmds[i].name, (gpointer)&_irc_cmds[i]); }}char *irc_format(struct irc_conn *irc, const char *format, ...){ GString *string = g_string_new(""); char *tok, *tmp; const char *cur; va_list ap; va_start(ap, format); for (cur = format; *cur; cur++) { if (cur != format) g_string_append_c(string, ' '); tok = va_arg(ap, char *); switch (*cur) { case 'v': g_string_append(string, tok); break; case ':': g_string_append_c(string, ':'); /* no break! */ case 't': case 'n': case 'c': tmp = irc_send_convert(irc, tok); g_string_append(string, tmp); g_free(tmp); break; default: purple_debug(PURPLE_DEBUG_ERROR, "irc", "Invalid format character '%c'\n", *cur); break; } } va_end(ap); g_string_append(string, "\r\n"); return (g_string_free(string, FALSE));}void irc_parse_msg(struct irc_conn *irc, char *input){ struct _irc_msg *msgent; char *cur, *end, *tmp, *from, *msgname, *fmt, **args, *msg; guint i; irc->recv_time = time(NULL); /* * The data passed to irc-receiving-text is the raw protocol data. * TODO: It should be passed as an array of bytes and a length * instead of a null terminated string. */ purple_signal_emit(_irc_plugin, "irc-receiving-text", purple_account_get_connection(irc->account), &input); if (!strncmp(input, "PING ", 5)) { msg = irc_format(irc, "vv", "PONG", input + 5); irc_send(irc, msg); g_free(msg); return; } else if (!strncmp(input, "ERROR ", 6)) { if (g_utf8_validate(input, -1, NULL)) { char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input); purple_connection_error(purple_account_get_connection(irc->account), tmp); g_free(tmp); } else purple_connection_error(purple_account_get_connection(irc->account), _("Disconnected.")); return; } if (input[0] != ':' || (cur = strchr(input, ' ')) == NULL) { irc_parse_error_cb(irc, input); return; } from = g_strndup(&input[1], cur - &input[1]); cur++; end = strchr(cur, ' '); if (!end) end = cur + strlen(cur); tmp = g_strndup(cur, end - cur); msgname = g_ascii_strdown(tmp, -1); g_free(tmp); if ((msgent = g_hash_table_lookup(irc->msgs, msgname)) == NULL) { irc_msg_default(irc, "", from, &input); g_free(msgname); g_free(from); return; } g_free(msgname); args = g_new0(char *, strlen(msgent->format)); for (cur = end, fmt = msgent->format, i = 0; fmt[i] && *cur++; i++) { switch (fmt[i]) { case 'v': if (!(end = strchr(cur, ' '))) end = cur + strlen(cur); args[i] = g_strndup(cur, end - cur); cur += end - cur; break; case 't': case 'n': case 'c': if (!(end = strchr(cur, ' '))) end = cur + strlen(cur); tmp = g_strndup(cur, end - cur); args[i] = irc_recv_convert(irc, tmp); g_free(tmp); cur += end - cur; break; case ':': if (*cur == ':') cur++; args[i] = irc_recv_convert(irc, cur); cur = cur + strlen(cur); break; case '*': args[i] = g_strdup(cur); cur = cur + strlen(cur); break; default: purple_debug(PURPLE_DEBUG_ERROR, "irc", "invalid message format character '%c'\n", fmt[i]); break; } } tmp = irc_recv_convert(irc, from); (msgent->cb)(irc, msgent->name, tmp, args); g_free(tmp); for (i = 0; i < strlen(msgent->format); i++) { g_free(args[i]); } g_free(args); g_free(from);}static void irc_parse_error_cb(struct irc_conn *irc, char *input){ purple_debug(PURPLE_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", input);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -