Add readDelimiterTerminatedString to ParsableByteArray.

PiperOrigin-RevId: 338718776
This commit is contained in:
samrobinson 2020-10-23 20:03:53 +01:00 committed by Oliver Woodman
parent 7ccbf572c7
commit 1fcfef5cde
2 changed files with 44 additions and 1 deletions

View File

@ -496,11 +496,22 @@ public final class ParsableByteArray {
*/
@Nullable
public String readNullTerminatedString() {
return readDelimiterTerminatedString('\0');
}
/**
* Reads up to the next delimiter byte (or the limit) as UTF-8 characters.
*
* @return The string not including any terminating delimiter byte, or null if the end of the data
* has already been reached.
*/
@Nullable
public String readDelimiterTerminatedString(char delimiter) {
if (bytesLeft() == 0) {
return null;
}
int stringLimit = position;
while (stringLimit < limit && data[stringLimit] != 0) {
while (stringLimit < limit && data[stringLimit] != delimiter) {
stringLimit++;
}
String string = Util.fromUtf8Bytes(data, position, stringLimit - position);

View File

@ -483,6 +483,38 @@ public final class ParsableByteArrayTest {
assertThat(parser.readNullTerminatedString()).isNull();
}
@Test
public void readDelimiterTerminatedString() {
byte[] bytes = new byte[] {'f', 'o', 'o', '*', 'b', 'a', 'r', '*'};
// Test normal case.
ParsableByteArray parser = new ParsableByteArray(bytes);
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("foo");
assertThat(parser.getPosition()).isEqualTo(4);
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("bar");
assertThat(parser.getPosition()).isEqualTo(8);
assertThat(parser.readDelimiterTerminatedString('*')).isNull();
// Test with limit at delimiter.
parser = new ParsableByteArray(bytes, 4);
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("foo");
assertThat(parser.getPosition()).isEqualTo(4);
assertThat(parser.readDelimiterTerminatedString('*')).isNull();
// Test with limit before delimiter.
parser = new ParsableByteArray(bytes, 3);
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("foo");
assertThat(parser.getPosition()).isEqualTo(3);
assertThat(parser.readDelimiterTerminatedString('*')).isNull();
}
@Test
public void readDelimiterTerminatedStringWithoutEndingDelimiter() {
byte[] bytes = new byte[] {'f', 'o', 'o', '*', 'b', 'a', 'r'};
ParsableByteArray parser = new ParsableByteArray(bytes);
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("foo");
assertThat(parser.readDelimiterTerminatedString('*')).isEqualTo("bar");
assertThat(parser.readDelimiterTerminatedString('*')).isNull();
}
@Test
public void readSingleLineWithoutEndingTrail() {
byte[] bytes = new byte[] {