Merge pull request #4327 from vkargov/vk-abcremedy
[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                         int read = DoRead ();\r
72                         if (read == '\n')\r
73                                 location.NewLine ();\r
74                         else\r
75                                 location.NextColumn ();\r
76                         return read;\r
77                 }\r
78 \r
79                 /// <summary>\r
80                 /// </summary>\r
81                 /// <returns></returns>\r
82                 public int Peek ()\r
83                 {\r
84                         return DoPeek ();\r
85                 }\r
86 \r
87 \r
88                 /// <summary>\r
89                 /// </summary>\r
90                 public void Unread (char c)\r
91                 {\r
92                         putback_stack.Push (c);\r
93 \r
94                         if ('\n' == c)\r
95                                 location.PreviousLine ();\r
96 \r
97                         location.PreviousColumn ();\r
98                 }\r
99 \r
100 \r
101                 /// <summary>\r
102                 /// </summary>\r
103                 /// <param name="chars"></param>\r
104                 public void Unread (char [] chars)\r
105                 {\r
106                         for (int i=chars.Length-1; i>=0; i--)\r
107                                 Unread (chars[i]);                                      \r
108                 }\r
109 \r
110                 /// <summary>\r
111                 /// </summary>\r
112                 /// <param name="c"></param>\r
113                 public void Unread (int c)\r
114                 {\r
115                         Unread ((char)c);\r
116                 }\r
117 \r
118 \r
119                 /// <summary>\r
120                 /// </summary>\r
121                 public void SkipWhitespace ()\r
122                 {\r
123                         int ch = Read ();\r
124                         for (; ch != -1 && Char.IsWhiteSpace((char) ch); ch = Read ());\r
125                         if (ch != -1) Unread (ch);\r
126                 }\r
127 \r
128 \r
129                 /// <summary>\r
130                 /// </summary>\r
131                 /// <returns></returns>\r
132                 public string ReadToWhitespace ()\r
133                 {\r
134                         StringBuilder sb = new StringBuilder ();\r
135                         int ch = Read ();\r
136                         for (; ch != -1 && !Char.IsWhiteSpace((char) ch); sb.Append ((char) ch), ch = Read ());\r
137                         if (ch != -1) Unread (ch);\r
138                         return sb.ToString ();\r
139                 }\r
140 \r
141 \r
142                 /// <summary>\r
143                 /// </summary>\r
144                 public void MarkLocation ()\r
145                 {\r
146                         if (markedLocation == Location.Unknown) {\r
147                                 markedLocation = new Location (location);\r
148                         } else {\r
149                                 markedLocation.CopyFrom (location);\r
150                         }\r
151                 }\r
152 \r
153 \r
154                 /// <summary>\r
155                 /// </summary>\r
156                 public void RestoreLocation ()\r
157                 {\r
158                         if (markedLocation != Location.Unknown) {\r
159                                 location.CopyFrom (markedLocation);\r
160                         }\r
161                 }\r
162 \r
163         }\r
164 \r
165 }\r
166 \r