2010-06-03 Jb Evain <jbevain@novell.com>
[mcs.git] / tools / corcompare / WellFormedXmlWriter.cs
blob631f1364e041d5141b85d690736bba82b547a64c
1 //
2 // WellFormedXmlWriter.cs
3 //
4 // Author:
5 // Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc. http://www.novell.com
8 //
9 using System;
10 using System.Globalization;
11 using System.Collections;
12 using System.Xml;
14 namespace CorCompare {
16 public class WellFormedXmlWriter : DefaultXmlWriter
18 public static bool IsValid (int ch)
20 return !IsInvalid (ch);
23 public static bool IsInvalid (int ch)
25 switch (ch) {
26 case 9:
27 case 10:
28 case 13:
29 return false;
31 if (ch < 32)
32 return true;
33 if (ch < 0xD800)
34 return false;
35 if (ch < 0xE000)
36 return true;
37 if (ch < 0xFFFE)
38 return false;
39 if (ch < 0x10000)
40 return true;
41 if (ch < 0x110000)
42 return false;
43 else
44 return true;
47 public static int IndexOfInvalid (string s, bool allowSurrogate)
49 for (int i = 0; i < s.Length; i++)
50 if (IsInvalid (s [i])) {
51 if (!allowSurrogate ||
52 i + 1 == s.Length ||
53 s [i] < '\uD800' ||
54 s [i] >= '\uDC00' ||
55 s [i + 1] < '\uDC00' ||
56 s [i + 1] >= '\uE000')
57 return i;
58 i++;
60 return -1;
63 public static int IndexOfInvalid (char [] s, int start, int length, bool allowSurrogate)
65 int end = start + length;
66 if (s.Length < end)
67 throw new ArgumentOutOfRangeException ("length");
68 for (int i = start; i < end; i++)
69 if (IsInvalid (s [i])) {
70 if (!allowSurrogate ||
71 i + 1 == end ||
72 s [i] < '\uD800' ||
73 s [i] >= '\uDC00' ||
74 s [i + 1] < '\uDC00' ||
75 s [i + 1] >= '\uE000')
76 return i;
77 i++;
79 return -1;
82 public WellFormedXmlWriter (XmlWriter writer) : base (writer)
86 public override void WriteString (string text)
88 int i = IndexOfInvalid (text, true);
89 if (i >= 0) {
90 char [] arr = text.ToCharArray ();
91 Writer.WriteChars (arr, 0, i);
92 WriteChars (arr, i, arr.Length - i);
93 } else {
94 // no invalid character.
95 Writer.WriteString (text);
99 public override void WriteChars (char [] text, int idx, int length)
101 int start = idx;
102 int end = idx + length;
103 while ((idx = IndexOfInvalid (text, start, length, true)) >= 0) {
104 if (start < idx)
105 Writer.WriteChars (text, start, idx - start);
106 Writer.WriteString (String.Format (CultureInfo.InvariantCulture,
107 text [idx] < 0x80 ? "\\x{0:X02}" : "\\u{0:X04}",
108 (int) text [idx]));
109 length -= idx - start + 1;
110 start = idx + 1;
112 if (start < end)
113 Writer.WriteChars (text, start, end - start);
118 public class DefaultXmlWriter : XmlWriter
120 XmlWriter writer;
122 public DefaultXmlWriter (XmlWriter writer)
124 this.writer = writer;
127 protected XmlWriter Writer {
128 get { return writer; }
131 public override void Close ()
133 writer.Close ();
136 public override void Flush ()
138 writer.Flush ();
141 public override string LookupPrefix (string ns)
143 return writer.LookupPrefix (ns);
146 public override void WriteBase64 (byte [] buffer, int index, int count)
148 writer.WriteBase64 (buffer, index, count);
151 public override void WriteBinHex (byte [] buffer, int index, int count)
153 writer.WriteBinHex (buffer, index, count);
156 public override void WriteCData (string text)
158 writer.WriteCData (text);
161 public override void WriteCharEntity (char ch)
163 writer.WriteCharEntity (ch);
166 public override void WriteChars (char [] buffer, int index, int count)
168 writer.WriteChars (buffer, index, count);
171 public override void WriteComment (string text)
173 writer.WriteComment (text);
176 public override void WriteDocType (string name, string pubid, string sysid, string subset)
178 writer.WriteDocType (name, pubid, sysid, subset);
181 public override void WriteEndAttribute ()
183 writer.WriteEndAttribute ();
186 public override void WriteEndDocument ()
188 writer.WriteEndDocument ();
191 public override void WriteEndElement ()
193 writer.WriteEndElement ();
196 public override void WriteEntityRef (string name)
198 writer.WriteEntityRef (name);
201 public override void WriteFullEndElement ()
203 writer.WriteFullEndElement ();
206 public override void WriteName (string name)
208 writer.WriteName (name);
211 public override void WriteNmToken (string name)
213 writer.WriteNmToken (name);
216 public override void WriteNode (XmlReader reader, bool defattr)
218 writer.WriteNode (reader, defattr);
221 public override void WriteProcessingInstruction (string name, string text)
223 writer.WriteProcessingInstruction (name, text);
226 public override void WriteQualifiedName (string localName, string ns)
228 writer.WriteQualifiedName (localName, ns);
231 public override void WriteRaw (string data)
233 writer.WriteRaw (data);
236 public override void WriteRaw (char [] buffer, int index, int count)
238 writer.WriteRaw (buffer, index, count);
241 public override void WriteStartAttribute (string prefix, string localName, string ns)
243 writer.WriteStartAttribute (prefix, localName, ns);
246 public override void WriteStartDocument (bool standalone)
248 writer.WriteStartDocument (standalone);
251 public override void WriteStartDocument ()
253 writer.WriteStartDocument ();
256 public override void WriteStartElement (string prefix, string localName, string ns)
258 writer.WriteStartElement (prefix, localName, ns);
261 public override void WriteString (string text)
263 writer.WriteString (text);
266 public override void WriteSurrogateCharEntity (char lowChar, char highChar)
268 writer.WriteSurrogateCharEntity (lowChar, highChar);
271 public override void WriteWhitespace (string ws)
273 writer.WriteWhitespace (ws);
276 public override WriteState WriteState {
277 get {
278 return writer.WriteState;
282 public override string XmlLang {
283 get {
284 return writer.XmlLang;
288 public override XmlSpace XmlSpace {
289 get {
290 return writer.XmlSpace;