in src/com/amazon/ion/impl/IonTokenReader.java [1117:1199]
public static int readEscapedCharacter(PushbackReader r, boolean inClob)
throws IOException, UnexpectedEofException
{
// \\ The backslash character
// \0 The character 0 (nul terminator char, for some)
// \xhh The character with hexadecimal value 0xhh
// \ u hhhh The character with hexadecimal value 0xhhhh
// \t The tab character ('\u0009')
// \n The newline (line feed) character ('\ u 000A')
// \v The vertical tab character ('\u000B')
// \r The carriage-return character ('\ u 000D')
// \f The form-feed character ('\ u 000C')
// \a The alert (bell) character ('\ u 0007')
// \" The double quote character
// \' The single quote character
// \? The question mark character
int c2 = 0, c = r.read();
switch (c) {
case -1:
throw new UnexpectedEofException();
case 't': return '\t';
case 'n': return '\n';
case 'v': return '\u000B';
case 'r': return '\r';
case 'f': return '\f';
case 'b': return '\u0008';
case 'a': return '\u0007';
case '\\': return '\\';
case '\"': return '\"';
case '\'': return '\'';
case '/': return '/';
case '?': return '?';
case 'U':
// Expecting 8 hex digits
if (inClob) {
throw new IonException("Unicode escapes \\U not allowed in clob");
}
c = readDigit(r, 16, true);
if (c < 0) break; // TODO throw UnexpectedEofException
c2 = c << 28;
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 24;
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 20;
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 16;
// ... fall through...
case 'u':
// Expecting 4 hex digits
if (inClob) {
throw new IonException("Unicode escapes \\u not allowed in clob");
}
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 12;
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 8;
// ... fall through...
case 'x':
// Expecting 2 hex digits
c = readDigit(r, 16, true);
if (c < 0) break;
c2 += c << 4;
c = readDigit(r, 16, true);
if (c < 0) break;
return c2 + c;
case '0':
return 0;
case '\n':
return EMPTY_ESCAPE_SEQUENCE;
default:
break;
}
throw new IonException("invalid escape sequence \"\\"
+ (char) c + "\" [" + c + "]");
}