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

📄 util.c

📁 yahoo message protocol stack
💻 C
📖 第 1 页 / 共 2 页
字号:
static void yahoo_htc_queue_cleanup(GQueue *q){	char *tmp;	while ((tmp = g_queue_pop_tail(q)))		g_free(tmp);	g_queue_free(q);}static void _parse_font_tag(const char *src, GString *dest, int *i, int *j,				int len, GQueue *colors, GQueue *tags, GQueue *ftattr){	int m, n, vstart;	gboolean quote = 0, done = 0;	m = *j;	while (1) {		m++;		if (m >= len) {			g_string_append(dest, &src[*i]);			*i = len;			break;		}		if (src[m] == '=') {			n = vstart = m;			while (1) {				n++;				if (n >= len) {					m = n;					break;				}				if (src[n] == '"') {					if (!quote) {						quote = 1;						vstart = n;						continue;					} else {						done = 1;					}				}				if (!quote && ((src[n] == ' ') || (src[n] == '>')))					done = 1;				if (done) {					if (!g_ascii_strncasecmp(&src[*j+1], "FACE", m - *j - 1)) {						fontattr *f;						f = g_new(fontattr, 1);						f->type = face;						f->u.face = g_strndup(&src[vstart+1], n-vstart-1);						if (!ftattr)							ftattr = g_queue_new();						g_queue_push_tail(ftattr, f);						m = n;						break;					} else if (!g_ascii_strncasecmp(&src[*j+1], "SIZE", m - *j - 1)) {						fontattr *f;						f = g_new(fontattr, 1);						f->type = size;						f->u.size = POINT_SIZE(strtol(&src[vstart+1], NULL, 10));						if (!ftattr)							ftattr = g_queue_new();						g_queue_push_tail(ftattr, f);						m = n;						break;					} else if (!g_ascii_strncasecmp(&src[*j+1], "COLOR", m - *j - 1)) {						fontattr *f;						f = g_new(fontattr, 1);						f->type = color;						f->u.color = g_strndup(&src[vstart+1], n-vstart-1);						if (!ftattr)							ftattr = g_queue_new();						g_queue_push_head(ftattr, f);						m = n;						break;					} else {						fontattr *f;						f = g_new(fontattr, 1);						f->type = junk;						f->u.junk = g_strndup(&src[*j+1], n-*j);						if (!ftattr)							ftattr = g_queue_new();						g_queue_push_tail(ftattr, f);						m = n;						break;					}				}			}		}		if (src[m] == ' ')			*j = m;		if (src[m] == '>') {			gboolean needendtag = 0;			fontattr *f;			GString *tmp = g_string_new(NULL);			char *colorstr;			if (!g_queue_is_empty(ftattr)) {				while ((f = g_queue_pop_tail(ftattr))) {					switch (f->type) {					case size:						if (!needendtag) {							needendtag = 1;							g_string_append(dest, "<font ");						}						g_string_append_printf(dest, "size=\"%d\" ", f->u.size);						fontattr_free(f);						break;					case face:						if (!needendtag) {							needendtag = 1;							g_string_append(dest, "<font ");						}						g_string_append_printf(dest, "face=\"%s\" ", f->u.face);						fontattr_free(f);						break;					case junk:						if (!needendtag) {							needendtag = 1;							g_string_append(dest, "<font ");						}						g_string_append(dest, f->u.junk);						fontattr_free(f);						break;					case color:						if (needendtag) {							g_string_append(tmp, "</font>");							dest->str[dest->len-1] = '>';							needendtag = 0;						}						colorstr = g_queue_peek_tail(colors);						g_string_append(tmp, colorstr ? colorstr : "\033[#000000m");						g_string_append_printf(dest, "\033[%sm", f->u.color);						g_queue_push_tail(colors, g_strdup_printf("\033[%sm", f->u.color));						fontattr_free(f);						break;					}				}				g_queue_free(ftattr);				ftattr = NULL;				if (needendtag) {					dest->str[dest->len-1] = '>';					g_queue_push_tail(tags, g_strdup("</font>"));					g_string_free(tmp, TRUE);				} else {					g_queue_push_tail(tags, tmp->str);					g_string_free(tmp, FALSE);				}			}			*i = *j = m;			break;		}	}}char *yahoo_html_to_codes(const char *src){	int i, j, len;	GString *dest;	char *ret, *esc;	GQueue *colors, *tags;	GQueue *ftattr = NULL;	gboolean no_more_specials = FALSE;	colors = g_queue_new();	tags = g_queue_new();	dest = g_string_sized_new(strlen(src));	for (i = 0, len = strlen(src); i < len; i++) {		if (!no_more_specials && src[i] == '<') {			j = i;			while (1) {				j++;				if (j >= len) { /* no '>' */					g_string_append_c(dest, src[i]);					no_more_specials = TRUE;					break;				}				if (src[j] == '<') {					/* FIXME: This doesn't convert outgoing entities.					 *        However, I suspect this case may never					 *        happen anymore because of the entities.					 */					g_string_append_len(dest, &src[i], j - i);					i = j - 1;					if (ftattr) {						fontattr *f;						while ((f = g_queue_pop_head(ftattr)))							fontattr_free(f);						g_queue_free(ftattr);						ftattr = NULL;					}					break;				}				if (src[j] == ' ') {					if (!g_ascii_strncasecmp(&src[i+1], "BODY", j - i - 1)) {						char *t = strchr(&src[j], '>');						if (!t) {							g_string_append(dest, &src[i]);							i = len;							break;						} else {							i = t - src;							break;						}					} else if (!g_ascii_strncasecmp(&src[i+1], "A HREF=\"", j - i - 1)) {						j += 7;						g_string_append(dest, "\033[lm");						while (1) {							g_string_append_c(dest, src[j]);							if (++j >= len) {								i = len;								break;							}							if (src[j] == '"') {								g_string_append(dest, "\033[xlm");								while (1) {									if (++j >= len) {										i = len;										break;									}									if (!g_ascii_strncasecmp(&src[j], "</A>", 4)) {										j += 3;										break;									}								}								i = j;								break;							}						}					} else if (g_ascii_strncasecmp(&src[i+1], "FONT", j - i - 1)) { /* not interested! */						while (1) {							if (++j >= len) {								g_string_append(dest, &src[i]);								i = len;								break;							}							if (src[j] == '>') {								g_string_append_len(dest, &src[i], j - i + 1);								i = j;								break;							}						}					} else { /* yay we have a font tag */						_parse_font_tag(src, dest, &i, &j, len, colors, tags, ftattr);					}					break;				}				if (src[j] == '>') {					/* This has some problems like the FIXME for the					 * '<' case. and like that case, I suspect the case					 * that this has problems is won't happen anymore anyway.					 */					int sublen = j - i - 1;					if (sublen) {						if (!g_ascii_strncasecmp(&src[i+1], "B", sublen)) {							g_string_append(dest, "\033[1m");						} else if (!g_ascii_strncasecmp(&src[i+1], "/B", sublen)) {							g_string_append(dest, "\033[x1m");						} else if (!g_ascii_strncasecmp(&src[i+1], "I", sublen)) {							g_string_append(dest, "\033[2m");						} else if (!g_ascii_strncasecmp(&src[i+1], "/I", sublen)) {							g_string_append(dest, "\033[x2m");						} else if (!g_ascii_strncasecmp(&src[i+1], "U", sublen)) {							g_string_append(dest, "\033[4m");						} else if (!g_ascii_strncasecmp(&src[i+1], "/U", sublen)) {							g_string_append(dest, "\033[x4m");						} else if (!g_ascii_strncasecmp(&src[i+1], "/A", sublen)) {							g_string_append(dest, "\033[xlm");						} else if (!g_ascii_strncasecmp(&src[i+1], "BR", sublen)) {							g_string_append_c(dest, '\n');						} else if (!g_ascii_strncasecmp(&src[i+1], "/BODY", sublen)) {							/* mmm, </body> tags. *BURP* */						} else if (!g_ascii_strncasecmp(&src[i+1], "/FONT", sublen) && g_queue_peek_tail(tags)) {							char *etag, *cl;							etag = g_queue_pop_tail(tags);							if (etag) {								g_string_append(dest, etag);								if (!strcmp(etag, "</font>")) {									cl = g_queue_pop_tail(colors);									if (cl)										g_free(cl);								}								g_free(etag);							}						} else {							g_string_append_len(dest, &src[i], j - i + 1);						}					} else {						g_string_append_len(dest, &src[i], j - i + 1);					}					i = j;					break;				}			}		} else {			if (((len - i) >= 4) && !strncmp(&src[i], "&lt;", 4)) {				g_string_append_c(dest, '<');				i += 3;			} else if (((len - i) >= 4) && !strncmp(&src[i], "&gt;", 4)) {				g_string_append_c(dest, '>');				i += 3;			} else if (((len - i) >= 5) && !strncmp(&src[i], "&amp;", 4)) {				g_string_append_c(dest, '&');				i += 4;			} else if (((len - i) >= 6) && !strncmp(&src[i], "&quot;", 4)) {				g_string_append_c(dest, '"');				i += 5;			} else {				g_string_append_c(dest, src[i]);			}		}	}	ret = dest->str;	g_string_free(dest, FALSE);	esc = g_strescape(ret, NULL);	gaim_debug(GAIM_DEBUG_MISC, "yahoo", "yahoo_html_to_codes:  Returning string: '%s'.\n", esc);	g_free(esc);	yahoo_htc_queue_cleanup(colors);	yahoo_htc_queue_cleanup(tags);	return ret;}

⌨️ 快捷键说明

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