Commit 1fcfef5c by samrobinson Committed by Oliver Woodman

Add readDelimiterTerminatedString to ParsableByteArray.

PiperOrigin-RevId: 338718776
parent 7ccbf572
...@@ -496,11 +496,22 @@ public final class ParsableByteArray { ...@@ -496,11 +496,22 @@ public final class ParsableByteArray {
*/ */
@Nullable @Nullable
public String readNullTerminatedString() { 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) { if (bytesLeft() == 0) {
return null; return null;
} }
int stringLimit = position; int stringLimit = position;
while (stringLimit < limit && data[stringLimit] != 0) { while (stringLimit < limit && data[stringLimit] != delimiter) {
stringLimit++; stringLimit++;
} }
String string = Util.fromUtf8Bytes(data, position, stringLimit - position); String string = Util.fromUtf8Bytes(data, position, stringLimit - position);
......
...@@ -484,6 +484,38 @@ public final class ParsableByteArrayTest { ...@@ -484,6 +484,38 @@ public final class ParsableByteArrayTest {
} }
@Test @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() { public void readSingleLineWithoutEndingTrail() {
byte[] bytes = new byte[] { byte[] bytes = new byte[] {
'f', 'o', 'o' 'f', 'o', 'o'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment