moved serialization of attribute text data (xmlSerializeContent) into a

* tree.c, include/libxml/tree.h: moved serialization of
  attribute text data (xmlSerializeContent) into a separate
  routine (xmlSerializeTxtContent) so it can be used by xmlwriter.c
* xmlwriter.c: changed handling of attribute string to use the
  routine above (fixed bug 131548)
diff --git a/tree.c b/tree.c
index b804a98..620768b 100644
--- a/tree.c
+++ b/tree.c
@@ -7002,6 +7002,142 @@
  *   		Dumping XML tree content to a simple buffer		*
  *									*
  ************************************************************************/
+/**
+ * xmlAttrSerializeTxtContent:
+ * @buf:  the XML buffer output
+ * @doc:  the document
+ * @attr: the attribute node
+ * @value: the text content
+ *
+ * Serialize text attribute values to an xml simple buffer
+ */
+void
+xmlAttrSerializeTxtContent(xmlBufferPtr buf, xmlDocPtr doc,
+        xmlAttrPtr attr, const xmlChar *string) {
+    xmlChar *base, *cur;
+
+    base = cur = (xmlChar *)string;
+    while (*cur != 0) {
+        if (*cur == '\n') {
+            if (base != cur)
+                xmlBufferAdd(buf, base, cur - base);
+            xmlBufferAdd(buf, BAD_CAST "
", 5);
+            cur++;
+            base = cur;
+            } else if (*cur == '\r') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "
", 5);
+                cur++;
+                base = cur;
+            } else if (*cur == '\t') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "	", 4);
+                cur++;
+                base = cur;
+#if 0
+                base = cur = children->content;
+            } else if (*cur == '\'') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "'", 6);
+                cur++;
+                base = cur;
+#endif
+            } else if (*cur == '"') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST """, 6);
+                cur++;
+                base = cur;
+            } else if (*cur == '<') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "&lt;", 4);
+                cur++;
+                base = cur;
+            } else if (*cur == '>') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "&gt;", 4);
+                cur++;
+                base = cur;
+            } else if (*cur == '&') {
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                xmlBufferAdd(buf, BAD_CAST "&amp;", 5);
+                cur++;
+                base = cur;
+            } else if ((*cur >= 0x80) && ((doc == NULL) ||
+                          (doc->encoding == NULL))) {
+                /*
+                 * We assume we have UTF-8 content.
+                 */
+                char tmp[10];
+                int val = 0, l = 1;
+
+                if (base != cur)
+                    xmlBufferAdd(buf, base, cur - base);
+                if (*cur < 0xC0) {
+		    xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL);
+                    if (doc != NULL)
+                        doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
+                    snprintf(tmp, sizeof(tmp), "&#%d;", *cur);
+                    tmp[sizeof(tmp) - 1] = 0;
+                    xmlBufferAdd(buf, (xmlChar *) tmp, -1);
+                    cur++;
+                    base = cur;
+                    continue;
+                } else if (*cur < 0xE0) {
+                    val = (cur[0]) & 0x1F;
+                    val <<= 6;
+                    val |= (cur[1]) & 0x3F;
+                    l = 2;
+                } else if (*cur < 0xF0) {
+                    val = (cur[0]) & 0x0F;
+                    val <<= 6;
+                    val |= (cur[1]) & 0x3F;
+                    val <<= 6;
+                    val |= (cur[2]) & 0x3F;
+                    l = 3;
+                } else if (*cur < 0xF8) {
+                    val = (cur[0]) & 0x07;
+                    val <<= 6;
+                    val |= (cur[1]) & 0x3F;
+                    val <<= 6;
+                    val |= (cur[2]) & 0x3F;
+                    val <<= 6;
+                    val |= (cur[3]) & 0x3F;
+                    l = 4;
+                }
+                if ((l == 1) || (!IS_CHAR(val))) {
+		    xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL);
+                    if (doc != NULL)
+                        doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
+                    snprintf(tmp, sizeof(tmp), "&#%d;", *cur);
+                    tmp[sizeof(tmp) - 1] = 0;
+                    xmlBufferAdd(buf, (xmlChar *) tmp, -1);
+                    cur++;
+                    base = cur;
+                    continue;
+                }
+                /*
+                 * We could do multiple things here. Just save
+                 * as a char ref
+                 */
+                snprintf(tmp, sizeof(tmp), "&#x%X;", val);
+                tmp[sizeof(tmp) - 1] = 0;
+                xmlBufferAdd(buf, (xmlChar *) tmp, -1);
+                cur += l;
+                base = cur;
+            } else {
+                cur++;
+            }
+        }
+        if (base != cur)
+            xmlBufferAdd(buf, base, cur - base);
+}
 
 /**
  * xmlAttrSerializeContent:
@@ -7014,139 +7150,14 @@
 static void
 xmlAttrSerializeContent(xmlBufferPtr buf, xmlDocPtr doc, xmlAttrPtr attr)
 {
-    const xmlChar *cur, *base;
     xmlNodePtr children;
 
     children = attr->children;
     while (children != NULL) {
         switch (children->type) {
             case XML_TEXT_NODE:
-                base = cur = children->content;
-                while (*cur != 0) {
-                    if (*cur == '\n') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&#10;", 5);
-                        cur++;
-                        base = cur;
-                    } else if (*cur == '\r') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&#13;", 5);
-                        cur++;
-                        base = cur;
-                    } else if (*cur == '\t') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&#9;", 4);
-                        cur++;
-                        base = cur;
-#if 0
-                    } else if (*cur == '\'') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&apos;", 6);
-                        cur++;
-                        base = cur;
-#endif
-                    } else if (*cur == '"') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&quot;", 6);
-                        cur++;
-                        base = cur;
-                    } else if (*cur == '<') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&lt;", 4);
-                        cur++;
-                        base = cur;
-                    } else if (*cur == '>') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&gt;", 4);
-                        cur++;
-                        base = cur;
-                    } else if (*cur == '&') {
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        xmlBufferAdd(buf, BAD_CAST "&amp;", 5);
-                        cur++;
-                        base = cur;
-                    } else if ((*cur >= 0x80) && ((doc == NULL) ||
-                                                  (doc->encoding ==
-                                                   NULL))) {
-                        /*
-                         * We assume we have UTF-8 content.
-                         */
-                        char tmp[10];
-                        int val = 0, l = 1;
-
-                        if (base != cur)
-                            xmlBufferAdd(buf, base, cur - base);
-                        if (*cur < 0xC0) {
-			    xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr,
-			               NULL);
-                            if (doc != NULL)
-                                doc->encoding =
-                                    xmlStrdup(BAD_CAST "ISO-8859-1");
-                            snprintf(tmp, sizeof(tmp), "&#%d;", *cur);
-                            tmp[sizeof(tmp) - 1] = 0;
-                            xmlBufferAdd(buf, (xmlChar *) tmp, -1);
-                            cur++;
-                            base = cur;
-                            continue;
-                        } else if (*cur < 0xE0) {
-                            val = (cur[0]) & 0x1F;
-                            val <<= 6;
-                            val |= (cur[1]) & 0x3F;
-                            l = 2;
-                        } else if (*cur < 0xF0) {
-                            val = (cur[0]) & 0x0F;
-                            val <<= 6;
-                            val |= (cur[1]) & 0x3F;
-                            val <<= 6;
-                            val |= (cur[2]) & 0x3F;
-                            l = 3;
-                        } else if (*cur < 0xF8) {
-                            val = (cur[0]) & 0x07;
-                            val <<= 6;
-                            val |= (cur[1]) & 0x3F;
-                            val <<= 6;
-                            val |= (cur[2]) & 0x3F;
-                            val <<= 6;
-                            val |= (cur[3]) & 0x3F;
-                            l = 4;
-                        }
-                        if ((l == 1) || (!IS_CHAR(val))) {
-			    xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr,
-			               NULL);
-                            if (doc != NULL)
-                                doc->encoding =
-                                    xmlStrdup(BAD_CAST "ISO-8859-1");
-                            snprintf(tmp, sizeof(tmp), "&#%d;", *cur);
-                            tmp[sizeof(tmp) - 1] = 0;
-                            xmlBufferAdd(buf, (xmlChar *) tmp, -1);
-                            cur++;
-                            base = cur;
-                            continue;
-                        }
-                        /*
-                         * We could do multiple things here. Just save
-                         * as a char ref
-                         */
-                        snprintf(tmp, sizeof(tmp), "&#x%X;", val);
-                        tmp[sizeof(tmp) - 1] = 0;
-                        xmlBufferAdd(buf, (xmlChar *) tmp, -1);
-                        cur += l;
-                        base = cur;
-                    } else {
-                        cur++;
-                    }
-                }
-                if (base != cur)
-                    xmlBufferAdd(buf, base, cur - base);
-                break;
+		xmlAttrSerializeTxtContent(buf, doc, attr, children->content);
+		break;
             case XML_ENTITY_REF_NODE:
                 xmlBufferAdd(buf, BAD_CAST "&", 1);
                 xmlBufferAdd(buf, children->name,