2 // System.Xml.XmlParserInput
5 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
7 // (C)2003 Atsushi Enomoto
13 using System.Globalization;
\r
15 namespace Mono.Xml.Native
\r
17 public class XmlParserInput
\r
20 public XmlParserInput (TextReader reader, string baseURI)
\r
21 : this (reader, baseURI, 1, 1)
\r
25 public XmlParserInput (TextReader reader, string baseURI, int line, int column)
\r
27 this.reader = reader;
\r
29 StreamReader sr = reader as StreamReader;
\r
31 can_seek = sr.BaseStream.CanSeek;
\r
34 this.column = column;
\r
35 this.baseURI = baseURI;
\r
39 #region Public Methods
\r
40 // Read the next character and compare it against the
41 // specified character.
47 public void Expect (int expected)
54 "expected '{0}' ({1:X}) but found '{2}' ({3:X})",
62 public void Expect (string expected)
64 int len = expected.Length;
65 for(int i=0; i< len; i++)
69 public void InsertParameterEntityBuffer (string value)
71 this.peBuffer.Insert (0, ' ' + value + ' ');
75 public int PeekChar ()
81 return reader.Peek ();
86 peek_char = reader.Read ();
91 public int ReadChar ()
97 peBuffer.Remove (0, 1);
98 peStored = peBuffer.Length > 0;
99 // I decided not to add character to currentTag with respect to PERef value
116 currentMarkup.Append ((char) ch);
121 #region Public Properties
122 public string BaseURI {
123 get { return baseURI; }
126 public StringBuilder CurrentMarkup {
127 get { return this.currentMarkup; }
130 private char [] wsChars = new char [] {' ', '\r', '\n', '\t'};
131 public bool HasPEBuffer {
135 else if (peBuffer.ToString ().Trim (wsChars).Length == 0)
142 public int LineNumber {
146 public int LinePosition {
147 get { return column; }
149 public string Name
\r
152 return currentMarkup.ToString (parsedNameStart, parsedNameEnd - parsedNameStart);
156 public string Value {
158 return currentMarkup.ToString (parsedValueStart, parsedValueEnd - parsedValueStart);
164 private void ReadNameOrNmToken(bool isNameToken)
\r
166 parsedNameStart = currentMarkup.Length;
\r
168 if (!XmlChar.IsNameChar (PeekChar ()))
\r
169 throw ReaderError ("a name did not start with a legal character " + PeekChar ());
\r
172 if (!XmlChar.IsFirstNameChar (PeekChar ()))
\r
173 throw ReaderError ("a name did not start with a valid character " + PeekChar () + "(" + (char) PeekChar () + ")");
\r
178 while (XmlChar.IsNameChar (PeekChar ())) {
182 parsedNameEnd = currentMarkup.Length;
192 StringBuilder currentMarkup = new StringBuilder ();
195 int parsedValueStart;
197 StringBuilder peBuffer = new StringBuilder ();
199 bool peStored = false;
201 private int ParseCharReference (string name)
204 if (name.Length > 0 && name [0] == '#') {
206 ret = int.Parse (name.Substring (2, name.Length - 2), NumberStyles.None & NumberStyles.AllowHexSpecifier);
208 ret = int.Parse (name.Substring (1, name.Length - 1));
213 private int ParseKnownEntityReference (string name)
216 case "quot": return '"';
217 case "lt": return '<';
218 case "gt": return '>';
219 case "amp": return '&';
220 case "apos": return '\'';
225 private XmlException ReaderError (string message)
227 return new XmlException (message, line, column);