2 // System.Xml.XmlParserInput
\r
5 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
\r
7 // (C)2003 Atsushi Enomoto
\r
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
\r
41 // specified character.
\r
42 public void Close ()
\r
44 this.reader.Close ();
\r
47 public void Expect (int expected)
\r
49 int ch = ReadChar ();
\r
51 if (ch != expected) {
\r
54 "expected '{0}' ({1:X}) but found '{2}' ({3:X})",
\r
62 public void Expect (string expected)
\r
64 int len = expected.Length;
\r
65 for(int i=0; i< len; i++)
\r
66 Expect (expected[i]);
\r
69 public void InsertParameterEntityBuffer (string value)
\r
71 this.peBuffer.Insert (0, ' ' + value + ' ');
\r
75 public int PeekChar ()
\r
78 return peBuffer [0];
\r
81 return reader.Peek ();
\r
86 peek_char = reader.Read ();
\r
91 public int ReadChar ()
\r
97 peBuffer.Remove (0, 1);
\r
98 peStored = peBuffer.Length > 0;
\r
99 // I decided not to add character to currentTag with respect to PERef value
\r
107 ch = reader.Read ();
\r
116 currentMarkup.Append ((char) ch);
\r
121 #region Public Properties
\r
122 public string BaseURI {
\r
123 get { return baseURI; }
\r
126 public StringBuilder CurrentMarkup {
\r
127 get { return this.currentMarkup; }
\r
130 public bool HasPEBuffer {
\r
134 else if (peBuffer.ToString ().Trim (XmlChar.WhitespaceChars).Length == 0)
\r
141 public int LineNumber {
\r
142 get { return line; }
\r
145 public int LinePosition {
\r
146 get { return column; }
\r
149 public bool InitialState {
\r
150 get { return initialState; }
\r
151 set { initialState = value; }
\r
163 StringBuilder currentMarkup = new StringBuilder ();
\r
164 StringBuilder peBuffer = new StringBuilder ();
\r
166 bool peStored = false;
\r
167 bool initialState = true;
\r
169 private int ParseCharReference (string name)
\r
172 if (name.Length > 0 && name [0] == '#') {
\r
173 if (name [1] == 'x')
\r
174 ret = int.Parse (name.Substring (2, name.Length - 2), NumberStyles.None & NumberStyles.AllowHexSpecifier);
\r
176 ret = int.Parse (name.Substring (1, name.Length - 1));
\r
181 private int ParseKnownEntityReference (string name)
\r
184 case "quot": return '"';
\r
185 case "lt": return '<';
\r
186 case "gt": return '>';
\r
187 case "amp": return '&';
\r
188 case "apos": return '\'';
\r
193 private XmlException ReaderError (string message)
\r
195 return new XmlException (message, null, line, column);
\r