Mercurial > pidgin
comparison libpurple/xmlnode.c @ 30957:3cf95447b26c
disapproval of revision '3ac008cdb1707c831737d497562a2751cdff861c'
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Mon, 22 Nov 2010 10:49:06 +0000 |
| parents | 61d160a4689f |
| children |
comparison
equal
deleted
inserted
replaced
| 30956:61d160a4689f | 30957:3cf95447b26c |
|---|---|
| 44 # define NEWLINE_S "\r\n" | 44 # define NEWLINE_S "\r\n" |
| 45 #else | 45 #else |
| 46 # define NEWLINE_S "\n" | 46 # define NEWLINE_S "\n" |
| 47 #endif | 47 #endif |
| 48 | 48 |
| 49 #ifdef CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS | |
| 50 /* | |
| 51 * The purpose of this function is to prevent us from creating XML documents | |
| 52 * that contain characters that are not allowed in XML 1.0. However, this | |
| 53 * change is unfortunately REALLY slow. | |
| 54 */ | |
| 55 static gboolean is_valid_xml10(const char *str) | |
| 56 { | |
| 57 gunichar ch; | |
| 58 | |
| 59 for (ch = g_utf8_get_char(str); str[0] != '\0'; str = g_utf8_next_char(str)) | |
| 60 { | |
| 61 /* | |
| 62 * Valid characters in XML 1.0 are: #x9 #xA #xD | |
| 63 * [#x20-#xD7FF] [#xE000-#xFFFD] [#x10000-#x10FFFF] | |
| 64 */ | |
| 65 if (ch < 0x09 || (ch > 0x0a && ch < 0x0d) || (ch > 0x0d && ch < 0x20)) | |
| 66 return FALSE; | |
| 67 } | |
| 68 | |
| 69 return TRUE; | |
| 70 } | |
| 71 #endif /* CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS */ | |
| 72 | |
| 73 static xmlnode* | 49 static xmlnode* |
| 74 new_node(const char *name, XMLNodeType type) | 50 new_node(const char *name, XMLNodeType type) |
| 75 { | 51 { |
| 76 xmlnode *node = g_new0(xmlnode, 1); | 52 xmlnode *node = g_new0(xmlnode, 1); |
| 77 | 53 |
| 130 gsize real_size; | 106 gsize real_size; |
| 131 | 107 |
| 132 g_return_if_fail(node != NULL); | 108 g_return_if_fail(node != NULL); |
| 133 g_return_if_fail(data != NULL); | 109 g_return_if_fail(data != NULL); |
| 134 g_return_if_fail(size != 0); | 110 g_return_if_fail(size != 0); |
| 135 | |
| 136 #ifdef CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS | |
| 137 g_return_if_fail(is_valid_xml10(data)); | |
| 138 #endif /* CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS */ | |
| 139 | 111 |
| 140 real_size = size == -1 ? strlen(data) : size; | 112 real_size = size == -1 ? strlen(data) : size; |
| 141 | 113 |
| 142 child = new_node(NULL, XMLNODE_TYPE_DATA); | 114 child = new_node(NULL, XMLNODE_TYPE_DATA); |
| 143 | 115 |
| 212 } | 184 } |
| 213 | 185 |
| 214 void | 186 void |
| 215 xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value) | 187 xmlnode_set_attrib(xmlnode *node, const char *attr, const char *value) |
| 216 { | 188 { |
| 217 #ifdef CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS | |
| 218 g_return_if_fail(is_valid_xml10(attr)); | |
| 219 g_return_if_fail(is_valid_xml10(value)); | |
| 220 #endif /* CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS */ | |
| 221 | |
| 222 xmlnode_remove_attrib(node, attr); | 189 xmlnode_remove_attrib(node, attr); |
| 223 xmlnode_set_attrib_full(node, attr, NULL, NULL, value); | 190 xmlnode_set_attrib_full(node, attr, NULL, NULL, value); |
| 224 } | 191 } |
| 225 | 192 |
| 226 void | 193 void |
| 241 xmlnode *attrib_node; | 208 xmlnode *attrib_node; |
| 242 | 209 |
| 243 g_return_if_fail(node != NULL); | 210 g_return_if_fail(node != NULL); |
| 244 g_return_if_fail(attr != NULL); | 211 g_return_if_fail(attr != NULL); |
| 245 g_return_if_fail(value != NULL); | 212 g_return_if_fail(value != NULL); |
| 246 #ifdef CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS | |
| 247 g_return_if_fail(is_valid_xml10(attr)); | |
| 248 if (xmlns != NULL) | |
| 249 g_return_if_fail(is_valid_xml10(xmlns)); | |
| 250 if (prefix != NULL) | |
| 251 g_return_if_fail(is_valid_xml10(prefix)); | |
| 252 g_return_if_fail(is_valid_xml10(value)); | |
| 253 #endif /* CHECKING_XML_STRINGS_FOR_VALID_CHARACTERS */ | |
| 254 | 213 |
| 255 xmlnode_remove_attrib_with_namespace(node, attr, xmlns); | 214 xmlnode_remove_attrib_with_namespace(node, attr, xmlns); |
| 256 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB); | 215 attrib_node = new_node(attr, XMLNODE_TYPE_ATTRIB); |
| 257 | 216 |
| 258 attrib_node->data = g_strdup(value); | 217 attrib_node->data = g_strdup(value); |
