comparison libpurple/xmlnode.c @ 29006:e1c01f236674

Correctly parse "<br>" in an XML attribute. Closes #11318. If nobody has objections, I intend to add purple_unescape_text() to util.[ch] for 2.7.0.
author Paul Aurich <paul@darkrain42.org>
date Wed, 10 Feb 2010 03:32:29 +0000
parents 981374c7308b
children 05d727f76ca9
comparison
equal deleted inserted replaced
29005:9b0d3a48a467 29006:e1c01f236674
543 *len += sizeof("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S) - 1; 543 *len += sizeof("<?xml version='1.0' encoding='UTF-8' ?>" NEWLINE_S NEWLINE_S) - 1;
544 544
545 return xml_with_declaration; 545 return xml_with_declaration;
546 } 546 }
547 547
548 static char *purple_unescape_text(const char *in)
549 {
550 GString *ret;
551 const char *c = in;
552
553 if (in == NULL)
554 return NULL;
555
556 ret = g_string_new("");
557 while (*c) {
558 int len;
559 const char *ent;
560
561 if ((ent = purple_markup_unescape_entity(c, &len)) != NULL) {
562 g_string_append(ret, ent);
563 c += len;
564 } else {
565 g_string_append_c(ret, *c);
566 c++;
567 }
568 }
569
570 return g_string_free(ret, FALSE);
571 }
572
548 struct _xmlnode_parser_data { 573 struct _xmlnode_parser_data {
549 xmlnode *current; 574 xmlnode *current;
550 gboolean error; 575 gboolean error;
551 }; 576 };
552 577
588 const char *prefix = (const char *)attributes[i+1]; 613 const char *prefix = (const char *)attributes[i+1];
589 char *txt; 614 char *txt;
590 int attrib_len = attributes[i+4] - attributes[i+3]; 615 int attrib_len = attributes[i+4] - attributes[i+3];
591 char *attrib = g_strndup((const char *)attributes[i+3], attrib_len); 616 char *attrib = g_strndup((const char *)attributes[i+3], attrib_len);
592 txt = attrib; 617 txt = attrib;
593 attrib = purple_unescape_html(txt); 618 attrib = purple_unescape_text(txt);
594 g_free(txt); 619 g_free(txt);
595 xmlnode_set_attrib_full(node, name, NULL, prefix, attrib); 620 xmlnode_set_attrib_full(node, name, NULL, prefix, attrib);
596 g_free(attrib); 621 g_free(attrib);
597 } 622 }
598 623