| 115 | } |
| 116 | |
| 117 | auto ShellParser::parseBackslash() -> Char { |
| 118 | auto letter = next(); |
| 119 | |
| 120 | if (!letter) { |
| 121 | return '\\'; |
| 122 | } |
| 123 | |
| 124 | switch (*letter) { |
| 125 | case ' ': |
| 126 | return ' '; |
| 127 | case 'n': |
| 128 | return '\n'; |
| 129 | case 't': |
| 130 | return '\t'; |
| 131 | case 'r': |
| 132 | return '\r'; |
| 133 | case 'b': |
| 134 | return '\b'; |
| 135 | case 'v': |
| 136 | return '\v'; |
| 137 | case 'f': |
| 138 | return '\f'; |
| 139 | case 'a': |
| 140 | return '\a'; |
| 141 | case '\'': |
| 142 | return '\''; |
| 143 | case '"': |
| 144 | return '"'; |
| 145 | case '\\': |
| 146 | return '\\'; |
| 147 | case '0': |
| 148 | return '\0'; |
| 149 | case 'u': { |
| 150 | auto letter = parseUnicodeEscapeSequence(); |
| 151 | if (isUtf16LeadSurrogate(letter)) { |
| 152 | auto shouldBeSlash = next(); |
| 153 | if (shouldBeSlash && shouldBeSlash == '\\') { |
| 154 | auto shouldBeU = next(); |
| 155 | if (shouldBeU && shouldBeU == 'u') { |
| 156 | return parseUnicodeEscapeSequence(letter); |
| 157 | } else { |
| 158 | previous(); |
| 159 | } |
| 160 | } |
| 161 | previous(); |
| 162 | return STAR_UTF32_REPLACEMENT_CHAR; |
| 163 | } else { |
| 164 | return letter; |
| 165 | } |
| 166 | } |
| 167 | default: |
| 168 | return *letter; |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | auto ShellParser::parseUnicodeEscapeSequence(Maybe<Char> previousCodepoint) -> Char { |
| 173 | String codepoint; |
nothing calls this directly
no test coverage detected