static void add_item_to_list (gpointer key, gpointer value, gpointer list) { char **user_data = list; int length = 0; if (!key) return; char *data = *user_data; if (data) { char *escaped_data; char *tmp = data, *bkup; while (*data) { if (*data == '<' || *data == '>') length += 3; else if (*data == '&') length += 4; else if(*data == '\"' || *data == '\'') length += 5; length++; data++; } escaped_data = malloc ((length+1)*sizeof(char)); bkup = escaped_data; while (*tmp) { switch (*tmp) { case '<': strcpy (escaped_data, "<"); escaped_data += 4; break; case '>': strcpy (escaped_data, ">"); escaped_data += 4; break; case '&': strcpy (escaped_data, "&"); escaped_data += 5; break; case '\'': strcpy (escaped_data, "'"); escaped_data += 6; break; case '\"': strcpy (escaped_data, """); escaped_data += 6; break; default: *escaped_data = *tmp; escaped_data++; } tmp++; } escaped_data = '\0'; escaped_data = bkup; /* FIXME: Avoid memory fragmentation */ tmp = g_strdup_printf ("%s%s", escaped_data, (char *)key); g_free (data); data = tmp; } else data = g_strdup_printf ("%s", (char *) key); *user_data = data; }