comparison libpurple/protocols/irc/parse.c @ 20809:c6232f341ea5

Fix the mIRC format handling bug that causes incorrect display of received text. The behavior of g_markup_escape_text changed in glib 2.12, which caused this bug. This fix copies the working version of said function and the private helper function append_escaped_text() into our IRC prpl. Fixes #3467
author John Bailey <rekkanoryo@rekkanoryo.org>
date Sat, 06 Oct 2007 21:58:54 +0000
parents 44b4e8bd759b
children 88aa557b997f 271d154bbb91
comparison
equal deleted inserted replaced
20798:97bda4a072d2 20809:c6232f341ea5
279 g_strfreev(encodings); 279 g_strfreev(encodings);
280 280
281 return purple_utf8_salvage(string); 281 return purple_utf8_salvage(string);
282 } 282 }
283 283
284 /* This function is shamelessly stolen from glib--it is an old version of the
285 * private function append_escaped_text, used by g_markup_escape_text, whose
286 * behavior changed in glib 2.12. */
287 static void irc_append_escaped_text(GString *str, const char *text, gssize length)
288 {
289 const char *p = text;
290 const char *end = text + length;
291 const char *next = NULL;
292
293 while(p != end) {
294 next = g_utf8_next_char(p);
295
296 switch(*p) {
297 case '&':
298 g_string_append(str, "&amp;");
299 break;
300 case '<':
301 g_string_append(str, "&lt;");
302 break;
303 case '>':
304 g_string_append(str, "&gt;");
305 break;
306 case '\'':
307 g_string_append(str, "&apos;");
308 break;
309 case '"':
310 g_string_append(str, "&quot;");
311 break;
312 default:
313 g_string_append_len(str, p, next - p);
314 break;
315 }
316
317 p = next;
318 }
319 }
320
321 /* This function is shamelessly stolen from glib--it is an old version of the
322 * function g_markup_escape_text, whose behavior changed in glib 2.12. */
323 char *irc_escape_privmsg(const char *text, gssize length)
324 {
325 GString *str;
326
327 g_return_val_if_fail(text != NULL, NULL);
328
329 if(length < 0)
330 length = strlen(text);
331
332 str = g_string_sized_new(length);
333
334 irc_append_escaped_text(str, text, length);
335
336 return g_string_free(str, FALSE);
337 }
338
284 /* XXX tag closings are not necessarily correctly nested here! If we 339 /* XXX tag closings are not necessarily correctly nested here! If we
285 * get a ^O or reach the end of the string and there are open 340 * get a ^O or reach the end of the string and there are open
286 * tags, they are closed in a fixed order ... this means, for 341 * tags, they are closed in a fixed order ... this means, for
287 * example, you might see <FONT COLOR="blue">some text <B>with 342 * example, you might see <FONT COLOR="blue">some text <B>with
288 * various attributes</FONT></B> (notice that B and FONT overlap 343 * various attributes</FONT></B> (notice that B and FONT overlap