script-astra/Android/Sdk/sources/android-35/android/icu/message2/InputSource.java

86 lines
2.0 KiB
Java
Raw Normal View History

2025-01-20 15:15:20 +00:00
/* GENERATED SOURCE. DO NOT MODIFY. */
// © 2024 and later: Unicode, Inc. and others.
// License & terms of use: https://www.unicode.org/copyright.html
package android.icu.message2;
class InputSource {
final String buffer;
private int cursor;
private int lastReadCursor = -1;
private int lastReadCount = 0;
InputSource(String input) {
if (input == null) {
throw new IllegalArgumentException("Input string should not be null");
}
this.buffer = input;
this.cursor = 0;
}
boolean atEnd() {
return cursor >= buffer.length();
}
int peekChar() {
if (atEnd()) {
return -1;
}
return buffer.charAt(cursor);
}
int readCodePoint() {
// TODO: remove this?
// START Detect possible infinite loop
if (lastReadCursor != cursor) {
lastReadCursor = cursor;
lastReadCount = 1;
} else {
lastReadCount++;
if (lastReadCount >= 10) {
throw new RuntimeException("Stuck in a loop!");
}
}
// END Detect possible infinite loop
if (atEnd()) {
return -1;
}
char c = buffer.charAt(cursor++);
if (Character.isHighSurrogate(c)) {
if (!atEnd()) {
char c2 = buffer.charAt(cursor++);
if (Character.isLowSurrogate(c2)) {
return Character.toCodePoint(c, c2);
} else { // invalid, high surrogate followed by non-surrogate
cursor--;
return c;
}
}
}
return c;
}
// Backup a number of characters.
void backup(int amount) {
// TODO: validate
cursor -= amount;
}
int getPosition() {
return cursor;
}
void skip(int amount) {
// TODO: validate
cursor += amount;
}
void gotoPosition(int position) {
// TODO: validate
cursor = position;
}
}