in src/Parsing/Impl/LiteralParser.cs [151:224]
internal static List<char> ParseBytes(char[] text, int start, int length, bool isRaw, bool normalizeLineEndings) {
Debug.Assert(text != null);
var buf = new List<char>(length);
var i = start;
var l = start + length;
int val;
while (i < l) {
var ch = text[i++];
if (!isRaw && ch == '\\') {
if (i >= l) {
throw new ArgumentException("Trailing \\ in string");
}
ch = text[i++];
switch (ch) {
case 'a': buf.Add('\a'); continue;
case 'b': buf.Add('\b'); continue;
case 'f': buf.Add('\f'); continue;
case 'n': buf.Add('\n'); continue;
case 'r': buf.Add('\r'); continue;
case 't': buf.Add('\t'); continue;
case 'v': buf.Add('\v'); continue;
case '\\': buf.Add('\\'); continue;
case '\'': buf.Add('\''); continue;
case '\"': buf.Add('\"'); continue;
case '\r': if (i < l && text[i] == '\n') { i++; } continue;
case '\n': continue;
case 'x': //hex
if (!TryParseInt(text, i, 2, 16, out val)) {
goto default;
}
buf.Add((char)val);
i += 2;
continue;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7': {
val = ch - '0';
if (i < l && HexValue(text[i], out var onechar) && onechar < 8) {
val = val * 8 + onechar;
i++;
if (i < l && HexValue(text[i], out onechar) && onechar < 8) {
val = val * 8 + onechar;
i++;
}
}
}
buf.Add((char)val);
continue;
default:
buf.Add('\\');
buf.Add(ch);
continue;
}
} else if (ch == '\r' && normalizeLineEndings) {
// normalize line endings
if (i < text.Length && text[i] == '\n') {
i++;
}
buf.Add('\n');
} else {
buf.Add(ch);
}
}
return buf;
}