private char GetStringOctal(int c) { StringBuilder builder = new StringBuilder(); builder.Append((char)c); if (EcmaChar.IsOctalDigit(this.Reader.Peek())) { builder.Append((char)this.Reader.Read()); if (c >= '0' && c <= '3' && EcmaChar.IsOctalDigit(this.Reader.Peek())) { builder.Append((char)this.Reader.Read()); } } return((char)Convert.ToInt32(builder.ToString(), 8)); }
private TokenBuffer GetString(int stop) { int c; StringBuilder str = new StringBuilder(); while (true) { c = this.Reader.Read(); if (EcmaChar.IsLineTerminator(c)) { throw new EcmaRuntimeException("A string cant containe a line terminator. Use \\n instance"); } if (c == stop) { return(new TokenBuffer(TokenType.String, str.ToString(), this.LastLineStart)); } if (c == '\\') { c = this.Reader.Read(); switch (c) { case '\'': str.Append("'"); break; case '"': str.Append("\""); break; case '\\': str.Append('\\'); break; case 'b': str.Append('\u0008'); break; case 't': str.Append('\u0009'); break; case 'n': str.Append('\u000A'); break; case 'f': str.Append("\u000C"); break; case 'r': str.Append('\u000D'); break; case 'x': str.Append(GetStringHex()); break; case 'u': str.Append(GetStringUnicode()); break; default: if (EcmaChar.IsOctalDigit(c)) { str.Append(GetStringOctal(c)); } str.Append((char)c); break; } continue; } str.Append((char)c); } }