static void Unread(PushbackTextReader r, int ch) { if (ch != -1) { r.Unread(ch); } }
static void readToken(PushbackTextReader r, char initch, bool leadConstituent, out String rawToken, out String token, out String mask, out bool eofSeen) { if (leadConstituent && NonConstituent(initch)) { throw new InvalidOperationException("Invalid leading characters: " + (char)initch); } bool allowSymEscape = RT.booleanCast(RT.AllowSymbolEscapeVar.deref()); bool rawMode = false; StringBuilder sbRaw = new StringBuilder(); StringBuilder sbToken = new StringBuilder(); StringBuilder sbMask = new StringBuilder(); if (allowSymEscape && initch == '|') { rawMode = true; sbRaw.Append(initch); } else { sbRaw.Append(initch); sbToken.Append(initch); sbMask.Append(initch); } for (;;) { int ch = r.Read(); if (rawMode) { if (ch == -1) { rawToken = sbRaw.ToString(); token = sbToken.ToString(); mask = sbMask.ToString(); eofSeen = true; return; } if (ch == '|') { int ch2 = r.Read(); if (ch2 == '|') { sbRaw.Append('|'); sbToken.Append('|'); sbMask.Append('a'); } else { r.Unread(ch2); rawMode = false; sbRaw.Append(ch); } } else { sbRaw.Append((char)ch); sbToken.Append((char)ch); sbMask.Append('a'); } } else { if (ch == -1 || isWhitespace(ch) || isTerminatingMacro(ch)) { Unread(r, ch); rawToken = sbRaw.ToString(); token = sbToken.ToString(); mask = sbMask.ToString(); eofSeen = false; return; } else if (NonConstituent(ch)) { throw new InvalidOperationException("Invalid constituent character: " + (char)ch); } else if (ch == '|' && allowSymEscape) { rawMode = true; sbRaw.Append((char)ch); } else { sbRaw.Append((char)ch); sbToken.Append((char)ch); sbMask.Append((char)ch); } } } }