in openAPI/src/main/java/jetbrains/exodus/bindings/BindingUtils.java [59:106]
public static String readString(@NotNull final ByteArrayInputStream stream) {
int next = stream.read();
if (next == UTFUtil.NULL_STRING_UTF_VALUE) {
next = stream.read();
if (next == 0) {
return null;
}
throw new IllegalArgumentException();
}
if (next == 0) {
return "";
}
if (!(stream instanceof ByteArraySizedInputStream)) {
throw new IllegalArgumentException("ByteArraySizedInputStream is expected");
}
final ByteArraySizedInputStream sizedStream = (ByteArraySizedInputStream) stream;
final byte[] bytes = sizedStream.toByteArray();
final char[] chars = new char[sizedStream.size() - 1]; // minus trailing zero
int i = sizedStream.pos();
int j = 0;
do {
if (next < 128) {
chars[j++] = (char) next;
} else {
final int high = next >> 4;
if (high == 12 || high == 13) {
final int char2 = bytes[i++] & 0xff;
if ((char2 & 0xC0) != 0x80) {
throw new IllegalArgumentException();
}
chars[j++] = (char) (((next & 0x1F) << 6) | (char2 & 0x3F));
} else if (high == 14) {
final int char2 = bytes[i] & 0xff;
final int char3 = bytes[i + 1] & 0xff;
i += 2;
if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) {
throw new IllegalArgumentException();
}
chars[j++] = (char) (((next & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F)));
} else {
throw new IllegalArgumentException();
}
}
next = bytes[i++] & 0xff;
} while (next != 0);
sizedStream.setPos(i);
return new String(chars, 0, j);
}