* ILReader.cs: Instead of mainting a buffer let the reader handle
[mono.git] / mcs / ilasm / scanner / ILReader.cs
1 // ILReader.cs\r
2 // Author: Sergey Chaban (serge@wildwestsoftware.com)\r
3 \r
4 using System;\r
5 using System.IO;\r
6 using System.Text;\r
7 using System.Collections;\r
8 \r
9 namespace Mono.ILASM {\r
10 \r
11 \r
12         /// <summary>\r
13         /// </summary>\r
14         public class ILReader {\r
15                 \r
16                 private StreamReader reader;\r
17                 private Stack putback_stack;\r
18                 private Location location;\r
19                 private Location markedLocation;\r
20                 \r
21                 public ILReader (StreamReader reader)\r
22                 {\r
23                         this.reader = reader;\r
24                         putback_stack = new Stack ();\r
25                         \r
26                         location = new Location ();\r
27                         markedLocation = Location.Unknown;\r
28                 }\r
29 \r
30 \r
31 \r
32                 /// <summary>\r
33                 /// </summary>\r
34                 public Location Location {\r
35                         get {\r
36                                 return location;\r
37                         }\r
38                 }\r
39 \r
40 \r
41                 /// <summary>\r
42                 /// Provides access to underlying StreamReader.\r
43                 /// </summary>\r
44                 public StreamReader BaseReader {\r
45                         get {\r
46                                 return reader;\r
47                         }\r
48                 }\r
49 \r
50                 private int DoRead ()\r
51                 {\r
52                         if (putback_stack.Count > 0) \r
53                                 return (char) putback_stack.Pop ();\r
54                         \r
55                         return reader.Read ();\r
56                 }\r
57 \r
58                 private int DoPeek ()\r
59                 {\r
60                         if (putback_stack.Count > 0)\r
61                                 return (char) putback_stack.Peek ();\r
62                         \r
63                         return reader.Peek ();\r
64                 }\r
65 \r
66                 /// <summary>\r
67                 /// </summary>\r
68                 /// <returns></returns>\r
69                 public int Read ()\r
70                 {\r
71                         return DoRead ();\r
72                 }\r
73 \r
74                 /// <summary>\r
75                 /// </summary>\r
76                 /// <returns></returns>\r
77                 public int Peek ()\r
78                 {\r
79                         return DoPeek ();\r
80                 }\r
81 \r
82 \r
83                 /// <summary>\r
84                 /// </summary>\r
85                 public void Unread (char c)\r
86                 {\r
87                         putback_stack.Push (c);\r
88 \r
89                         if ('\n' == c)\r
90                                 location.PreviousLine ();\r
91 \r
92                         location.PreviousColumn ();\r
93                 }\r
94 \r
95 \r
96                 /// <summary>\r
97                 /// </summary>\r
98                 /// <param name="chars"></param>\r
99                 public void Unread (char [] chars)\r
100                 {\r
101                         for (int i=chars.Length-1; i>=0; i--)\r
102                                 Unread (chars[i]);                                      \r
103                 }\r
104 \r
105                 /// <summary>\r
106                 /// </summary>\r
107                 /// <param name="c"></param>\r
108                 public void Unread (int c)\r
109                 {\r
110                         Unread ((char)c);\r
111                 }\r
112 \r
113 \r
114                 /// <summary>\r
115                 /// </summary>\r
116                 public void SkipWhitespace ()\r
117                 {\r
118                         int ch = Read ();\r
119                         for (; ch != -1 && Char.IsWhiteSpace((char) ch); ch = Read ());\r
120                         if (ch != -1) Unread (ch);\r
121                 }\r
122 \r
123 \r
124                 /// <summary>\r
125                 /// </summary>\r
126                 /// <returns></returns>\r
127                 public string ReadToWhitespace ()\r
128                 {\r
129                         StringBuilder sb = new StringBuilder ();\r
130                         int ch = Read ();\r
131                         for (; ch != -1 && !Char.IsWhiteSpace((char) ch); sb.Append ((char) ch), ch = Read ());\r
132                         if (ch != -1) Unread (ch);\r
133                         return sb.ToString ();\r
134                 }\r
135 \r
136 \r
137                 /// <summary>\r
138                 /// </summary>\r
139                 public void MarkLocation ()\r
140                 {\r
141                         if (markedLocation == Location.Unknown) {\r
142                                 markedLocation = new Location (location);\r
143                         } else {\r
144                                 markedLocation.CopyFrom (location);\r
145                         }\r
146                 }\r
147 \r
148 \r
149                 /// <summary>\r
150                 /// </summary>\r
151                 public void RestoreLocation ()\r
152                 {\r
153                         if (markedLocation != Location.Unknown) {\r
154                                 location.CopyFrom (markedLocation);\r
155                         }\r
156                 }\r
157 \r
158         }\r
159 \r
160 }\r
161 \r