This function is more or less transferred from gcc source
| 81 | |
| 82 | // This function is more or less transferred from gcc source |
| 83 | bool match_special_char(wchar_t *dest, const wchar_t *&source) { |
| 84 | wchar_t c; |
| 85 | |
| 86 | bool m = true; |
| 87 | auto assign = [dest](wchar_t c) { |
| 88 | if (dest != nullptr) |
| 89 | *dest = c; |
| 90 | }; |
| 91 | |
| 92 | switch (c = *(source++)) { |
| 93 | case L'a': |
| 94 | assign(L'\a'); |
| 95 | break; |
| 96 | case L'b': |
| 97 | assign(L'\b'); |
| 98 | break; |
| 99 | case L't': |
| 100 | assign(L'\t'); |
| 101 | break; |
| 102 | case L'f': |
| 103 | assign(L'\f'); |
| 104 | break; |
| 105 | case L'n': |
| 106 | assign(L'\n'); |
| 107 | break; |
| 108 | case L'r': |
| 109 | assign(L'\r'); |
| 110 | break; |
| 111 | case L'v': |
| 112 | assign(L'\v'); |
| 113 | break; |
| 114 | case L'\\': |
| 115 | assign(L'\\'); |
| 116 | break; |
| 117 | case L'0': |
| 118 | assign(L'\0'); |
| 119 | break; |
| 120 | |
| 121 | case L'x': |
| 122 | case L'u': |
| 123 | case L'U': { |
| 124 | /* Hexadecimal form of wide characters. */ |
| 125 | int len = (c == L'x' ? 2 : (c == L'u' ? 4 : 8)); |
| 126 | wchar_t n = 0; |
| 127 | #ifndef UNICODE |
| 128 | len = 2; |
| 129 | #endif |
| 130 | for (int i = 0; i < len; i++) { |
| 131 | wchar_t buf[2] = {L'\0', L'\0'}; |
| 132 | |
| 133 | c = *(source++); |
| 134 | if (c > UCHAR_MAX || !((L'0' <= c && c <= L'9') || (L'a' <= c && c <= L'f') || (L'A' <= c && c <= L'F'))) |
| 135 | return false; |
| 136 | |
| 137 | buf[0] = c; |
| 138 | n = n << 4; |
| 139 | n += static_cast<wchar_t>(wcstol(buf, nullptr, 16)); |
| 140 | } |