Backport
authorMiguel de Icaza <miguel@gnome.org>
Tue, 27 Sep 2005 18:46:53 +0000 (18:46 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Tue, 27 Sep 2005 18:46:53 +0000 (18:46 -0000)
svn path=/branches/mono-1-1-9/mcs/; revision=50883

mcs/class/System.XML/System.Xml/XmlTextReader.cs
mcs/class/System.XML/Test/System.Xml/XmlTextReaderTests.cs

index 1c33b6f1f162974524aee62ee443c400260fac57..b8b97007fad4644d55b6df2c34e4110e98ae69d7 100644 (file)
@@ -1420,10 +1420,10 @@ namespace System.Xml
 
                private void AppendSurrogatePairNameChar (int ch)
                {
-                       nameBuffer [nameLength++] = (char) (ch / 0x10000 + 0xD800 - 1);
+                       nameBuffer [nameLength++] = (char) ((ch - 0x10000) / 0x400 + 0xD800);
                        if (nameLength == nameCapacity)
                                ExpandNameCapacity ();
-                       nameBuffer [nameLength++] = (char) (ch % 0x10000 + 0xDC00);
+                       nameBuffer [nameLength++] = (char) ((ch - 0x10000) % 0x400 + 0xDC00);
                }
 
                private void ExpandNameCapacity ()
@@ -1444,8 +1444,8 @@ namespace System.Xml
 
                private void AppendSurrogatePairValueChar (int ch)
                {
-                       valueBuffer.Append ((char) (ch / 0x10000 + 0xD800 - 1));
-                       valueBuffer.Append ((char) (ch % 0x10000 + 0xDC00));
+                       valueBuffer.Append ((char) ((ch - 0x10000) / 0x400 + 0xD800));
+                       valueBuffer.Append ((char) ((ch - 0x10000) % 0x400 + 0xDC00));
                }
 
                private string CreateValueString ()
@@ -1467,10 +1467,10 @@ namespace System.Xml
                        if (ch < Char.MaxValue)
                                currentTagBuffer [currentTagLength++] = (char) ch;
                        else {
-                               currentTagBuffer [currentTagLength++] = (char) (ch / 0x10000 + 0xD800 - 1);
+                               currentTagBuffer [currentTagLength++] = (char) ((ch - 0x10000) / 0x400 + 0xD800);
                                if (currentTagLength == currentTagCapacity)
                                        ExpandCurrentTagCapacity ();
-                               currentTagBuffer [currentTagLength++] = (char) (ch % 0x10000 + 0xDC00);
+                               currentTagBuffer [currentTagLength++] = (char) ((ch - 0x10000) % 0x400 + 0xDC00);
                        }
                }
 
@@ -2669,8 +2669,8 @@ namespace System.Xml
                                        if (c < Char.MaxValue)
                                                buffer [bufIndex++] = (char) c;
                                        else {
-                                               buffer [bufIndex++] = (char) (c / 0x10000 + 0xD800 - 1);
-                                               buffer [bufIndex++] = (char) (c % 0x10000 + 0xDC00);
+                                               buffer [bufIndex++] = (char) ((c - 0x10000) / 0x400 + 0xD800);
+                                               buffer [bufIndex++] = (char) ((c - 0x10000) % 0x400 + 0xDC00);
                                        }
                                        break;
                                }
index cddb729133118f31951837b10a7e89572e19cdc3..4312bdbcd84d7fb0ba5a707b429ab95901654e03 100644 (file)
@@ -1115,5 +1115,20 @@ namespace MonoTests.System.Xml
                                XmlNodeType.Document, null);
                        xtr.Read ();
                }
+
+               [Test] // bug #76247
+               public void SurrogateRoundtrip ()
+               {
+                       byte [] data = new byte [] {0x3c, 0x61, 0x3e, 0xf0,
+                               0xa8, 0xa7, 0x80, 0x3c, 0x2f, 0x61, 0x3e};
+                       XmlTextReader xtr = new XmlTextReader (
+                               new MemoryStream (data));
+                       xtr.Read ();
+                       string line = xtr.ReadString ();
+                       int [] arr = new int [line.Length];
+                       for (int i = 0; i < line.Length; i++)
+                               arr [i] = (int) line [i];
+                       AssertEquals (new int [] {0xd862, 0xddc0}, arr);
+               }
        }
 }