internal static List ParseBytes()

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;
        }