boolean (String s, StringBuilder outChars, int @Nullable [] sourceOffsets) { assert sourceOffsets == null || sourceOffsets.length == s.length() + 1; int off = 0; int len = s.length(); boolean result = true; final int outOffset = outChars.length(); while (off < len) { char aChar = s.charAt(off++); if (sourceOffsets != null) { sourceOffsets[outChars.length() - outOffset] = off - 1; sourceOffsets[outChars.length() + 1 - outOffset] = off; } if (aChar == '\\') { aChar = s.charAt(off++); if (aChar == 'u') { // Read the xxxx int value = 0; boolean error = false; for (int i = 0; i < 4 && off < s.length(); i++) { aChar = s.charAt(off++); switch (aChar) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> value = (value << 4) + aChar - '0'; case 'a', 'b', 'c', 'd', 'e', 'f' -> value = (value << 4) + 10 + aChar - 'a'; case 'A', 'B', 'C', 'D', 'E', 'F' -> value = (value << 4) + 10 + aChar - 'A'; default -> { outChars.append("\\u"); int start = off - i - 1; int end = Math.min(start + 4, s.length()); outChars.append(s, start, end); i = 4; error = true; off = end; } } } if (!error) { outChars.append((char)value); } else { result = false; } } else if (aChar == '\n') { // escaped linebreak: skip whitespace in the beginning of next line while (off < len && (s.charAt(off) == ' ' || s.charAt(off) == '\t')) { off++; } } else if (aChar == 't') { outChars.append('\t'); } else if (aChar == 'r') { outChars.append('\r'); } else if (aChar == 'n') { outChars.append('\n'); } else if (aChar == 'f') { outChars.append('\f'); } else { outChars.append(aChar); } } else { outChars.append(aChar); } if (sourceOffsets != null) { sourceOffsets[outChars.length() - outOffset] = off; } } return result; }