2 // Author: Sergey Chaban (serge@wildwestsoftware.com)
\r
7 namespace Mono.ILASM {
\r
11 internal class StringHelper : StringHelperBase {
\r
13 private static readonly string idChars = "_$@?`";
\r
17 /// <param name="host"></param>
\r
18 public StringHelper (ILTokenizer host) : base (host)
\r
25 /// <returns></returns>
\r
26 public override bool Start (char ch)
\r
28 mode = Token.UNKNOWN;
\r
30 if (Char.IsLetter (ch) || idChars.IndexOf (ch) != -1) {
\r
32 } else if (ch == '\'') {
\r
33 mode = Token.SQSTRING;
\r
34 } else if (ch == '"') {
\r
35 mode = Token.QSTRING;
\r
38 return (mode != Token.UNKNOWN);
\r
42 private static bool IsIdChar (int c)
\r
45 return (Char.IsLetterOrDigit(ch) || idChars.IndexOf (ch) != -1);
\r
50 /// <returns></returns>
\r
51 public override string Build ()
\r
53 if (mode == Token.UNKNOWN) return String.Empty;
\r
56 ILReader reader = host.Reader;
\r
58 StringBuilder idsb = new StringBuilder ();
\r
59 if (mode == Token.SQSTRING || mode == Token.QSTRING) {
\r
60 int term = (mode == Token.SQSTRING) ? '\'' : '"';
\r
61 reader.Read (); // skip quote
\r
62 for (ch = reader.Read (); ch != -1; ch = reader.Read ()) {
\r
68 ch = reader.Read ();
\r
71 * Long string can be broken across multiple lines
\r
72 * by using '\' as the last char in line.
\r
73 * Any white space chars between '\' and the first
\r
74 * char on the next line are ignored.
\r
77 reader.SkipWhitespace ();
\r
81 int escaped = Escape (ch);
\r
82 if (escaped == -1) {
\r
90 idsb.Append((char)ch);
\r
93 while ((ch = reader.Read ()) != -1) {
\r
94 if (IsIdChar (ch)) {
\r
95 idsb.Append ((char) ch);
\r
102 return idsb.ToString ();
\r
110 /// <param name="ch"></param>
\r
111 /// <returns></returns>
\r
112 public static int Escape (int ch)
\r
116 if (ch >= '0' && ch <='7') {
\r
117 //TODO : octal code
\r
119 int id = "abfnrtv\"'\\".IndexOf ((char)ch);
\r
121 res = "\a\b\f\n\r\t\v\"'\\" [id];
\r