Merge branch 'master' of http://github.com/mono/mono
[mono.git] / mcs / class / Commons.Xml.Relaxng / Commons.Xml.Relaxng.Rnc / RncTokenizer.cs
index 747364a5935f424f750ff00e3ec8a68439fe590d..53048bcd32f0d280e8c4bcb77ad40182962ffddd 100644 (file)
@@ -7,27 +7,27 @@
 // (C)2003 Atsushi Enomoto\r
 // (C)2004 Novell Inc.\r
 //\r
-
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
+\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+//\r
 \r
 using System;\r
 using System.Collections;\r
@@ -53,10 +53,12 @@ namespace Commons.Xml.Relaxng.Rnc
                int savedLineNumber = 1;\r
                int savedLinePosition;\r
                bool nextIncrementLine;\r
+               string baseUri;\r
 \r
-               public RncTokenizer (TextReader source)\r
+               public RncTokenizer (TextReader source, string baseUri)\r
                {\r
                        this.source = source;\r
+                       this.baseUri = baseUri;\r
                }\r
 \r
                public bool IsElement {\r
@@ -71,6 +73,10 @@ namespace Commons.Xml.Relaxng.Rnc
                        get { return savedLinePosition; }\r
                }\r
 \r
+               public string BaseUri {\r
+                       get { return baseUri; }\r
+               }\r
+\r
                // jay interface implementation\r
 \r
                public int token ()\r
@@ -262,7 +268,12 @@ namespace Commons.Xml.Relaxng.Rnc
                                Array.Copy (nameBuffer, arr, index);\r
                                nameBuffer = arr;\r
                        }\r
-                       nameBuffer [index++] = (char) c;\r
+                       if (c > 0x10000) {\r
+                               AppendNameChar ((c - 0x10000) / 0x400 + 0xD800, ref index);\r
+                               AppendNameChar ((c - 0x10000) % 0x400 + 0xDC00, ref index);\r
+                       }\r
+                       else\r
+                               nameBuffer [index++] = (char) c;\r
                }\r
 \r
                private string ReadTripleQuoted (char quoteChar)\r
@@ -395,7 +406,7 @@ namespace Commons.Xml.Relaxng.Rnc
                                return Token.Asterisk;\r
                        case '\\':\r
                                if (backslashed)\r
-                                       return Token.BackSlash;\r
+                                       return Token.ERROR;\r
                                return ParseToken (true);\r
                        case '+':\r
                                return Token.Plus;\r
@@ -409,11 +420,9 @@ namespace Commons.Xml.Relaxng.Rnc
                                peekChar = '>';\r
                                goto default;\r
                        case '#':\r
-                               // NOTE: This interpretation is expanded against the spec\r
-//                             if (ReadChar () != '#')\r
-//                                     throw new RelaxngException ("Invalid character after '#'.");\r
-                               tokenValue = ReadLine ();\r
+//                             tokenValue = ReadLine ();\r
 //                             return Token.Documentation;\r
+                               ReadLine ();\r
                                return ParseToken (false);\r
                        case '\'':\r
                        case '\"':\r
@@ -427,6 +436,9 @@ namespace Commons.Xml.Relaxng.Rnc
                                        } // else '' or ""\r
                                        name = String.Empty;\r
                                }\r
+                               int invidx = XmlChar.IndexOfInvalid (name, true) ;\r
+                               if (invidx >= 0)\r
+                                       throw new RelaxngException (String.Format ("Invalid XML character in compact syntax literal segment at {0:X}", (int) name [invidx]));\r
                                tokenValue = name;\r
                                return Token.LiteralSegment;\r
                        default:\r
@@ -447,7 +459,7 @@ namespace Commons.Xml.Relaxng.Rnc
                                }\r
                                tokenValue = name;\r
                                if (backslashed)\r
-                                       return Token.NCName;\r
+                                       return Token.QuotedIdentifier;\r
                                switch (name) {\r
                                case "attribute":\r
                                        isElement = false;\r
@@ -496,4 +508,4 @@ namespace Commons.Xml.Relaxng.Rnc
                }\r
 \r
        }\r
-}
+}\r