⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 irc message protocol stack
💻 C
📖 第 1 页 / 共 2 页
字号:
			if (isdigit(*cur))				fg[1] = *cur++;			if (*cur == ',') {				cur++;				if (isdigit(*cur))					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 '\037':			cur++;			if (!underline) {				decoded = g_string_append(decoded, "<U>");				underline = TRUE;			} else {				decoded = g_string_append(decoded, "</U>");				underline = TRUE;			}			break;		case '\007':		case '\026':			cur++;			break;		case '\017':			cur++;			/* fallthrough */		case '\000':			if (bold)				decoded = g_string_append(decoded, "</B>");			if (underline)				decoded = g_string_append(decoded, "</U>");			if (font)				decoded = g_string_append(decoded, "</FONT>");			break;		default:			gaim_debug(GAIM_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':		case '\007':		case '\017':		case '\026':		case '\037':			continue;		default:			result[j++] = result[i];		}	}	result[i] = '\0';        return result;}char *irc_parse_ctcp(struct irc_conn *irc, const char *from, const char *to, const char *msg, int notice){	GaimConnection *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 */			sscanf(cur, "PING %lu", &timestamp);			gc = gaim_account_get_connection(irc->account);			if (!gc)				return NULL;			buf = g_strdup_printf(_("Reply time from %s: %lu seconds"), from, time(NULL) - timestamp);			gaim_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);			gc = gaim_account_get_connection(irc->account);		}	} else if (!strncmp(cur, "VERSION", 7) && !notice) {		buf = irc_format(irc, "vt:", "NOTICE", from, "\001VERSION Gaim 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) {		gaim_debug(GAIM_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) {		gaim_debug(GAIM_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:			gaim_debug(GAIM_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;	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)) {		gaim_connection_error(gaim_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:			gaim_debug(GAIM_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){	gaim_debug(GAIM_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", input);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -