--- a/src/java.base/share/classes/java/lang/StringLatin1.java Wed Sep 12 14:19:36 2018 -0300
+++ b/src/java.base/share/classes/java/lang/StringLatin1.java Wed Sep 12 14:19:36 2018 -0300
@@ -545,7 +545,7 @@
int length = value.length;
int left = 0;
while (left < length) {
- char ch = (char)(value[left] & 0xff);
+ char ch = getChar(value, left);
if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
break;
}
@@ -558,7 +558,7 @@
int length = value.length;
int right = length;
while (0 < right) {
- char ch = (char)(value[right - 1] & 0xff);
+ char ch = getChar(value, right - 1);
if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
break;
}
@@ -573,7 +573,8 @@
return "";
}
int right = lastIndexOfNonWhitespace(value);
- return ((left > 0) || (right < value.length)) ? newString(value, left, right - left) : null;
+ boolean ifChanged = (left > 0) || (right < value.length);
+ return ifChanged ? newString(value, left, right - left) : null;
}
public static String stripLeading(byte[] value) {
@@ -597,11 +598,7 @@
private int index; // current index, modified on advance/split
private final int fence; // one past last index
- LinesSpliterator(byte[] value) {
- this(value, 0, value.length);
- }
-
- LinesSpliterator(byte[] value, int start, int length) {
+ private LinesSpliterator(byte[] value, int start, int length) {
this.value = value;
this.index = start;
this.fence = start + length;
@@ -609,7 +606,7 @@
private int indexOfLineSeparator(int start) {
for (int current = start; current < fence; current++) {
- byte ch = value[current];
+ char ch = getChar(value, current);
if (ch == '\n' || ch == '\r') {
return current;
}
@@ -619,9 +616,9 @@
private int skipLineSeparator(int start) {
if (start < fence) {
- if (value[start] == '\r') {
+ if (getChar(value, start) == '\r') {
int next = start + 1;
- if (next < fence && value[next] == '\n') {
+ if (next < fence && getChar(value, next) == '\n') {
return next + 1;
}
}
@@ -680,10 +677,80 @@
public int characteristics() {
return Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL;
}
+
+ static LinesSpliterator spliterator(byte[] value) {
+ return new LinesSpliterator(value, 0, value.length);
+ }
+
+ static LinesSpliterator spliterator(byte[] value, int leading, int trailing) {
+ int length = value.length;
+ int left = 0;
+ int index;
+ for (int l = 0; l < leading; l++) {
+ index = skipBlankForward(value, left, length);
+ if (index == left) {
+ break;
+ }
+ left = index;
+ }
+ int right = length;
+ for (int t = 0; t < trailing; t++) {
+ index = skipBlankBackward(value, left, right);
+ if (index == right) {
+ break;
+ }
+ right = index;
+ }
+ return new LinesSpliterator(value, left, right - left);
+ }
+
+ private static int skipBlankForward(byte[] value, int start, int length) {
+ int index = start;
+ while (index < length) {
+ char ch = getChar(value, index++);
+ if (ch == '\n') {
+ return index;
+ }
+ if (ch == '\r') {
+ if (index < length && getChar(value, index) == '\n') {
+ return index + 1;
+ }
+ return index;
+ }
+ if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
+ return start;
+ }
+ }
+ return length;
+ }
+
+ private static int skipBlankBackward(byte[] value, int start, int fence) {
+ int index = fence;
+ if (start < index && getChar(value, index - 1) == '\n') {
+ index--;
+ }
+ if (start < index && getChar(value, index - 1) == '\r') {
+ index--;
+ }
+ while (start < index) {
+ char ch = getChar(value, --index);
+ if (ch == '\r' || ch == '\n') {
+ return index + 1;
+ }
+ if (ch != ' ' && ch != '\t' && !Character.isWhitespace(ch)) {
+ return fence;
+ }
+ }
+ return start;
+ }
}
- static Stream<String> lines(byte[] value) {
- return StreamSupport.stream(new LinesSpliterator(value), false);
+ static Stream<String> lines(byte[] value, int leading, int trailing) {
+ if (leading == 0 && trailing == 0) {
+ return StreamSupport.stream(LinesSpliterator.spliterator(value), false);
+ } else {
+ return StreamSupport.stream(LinesSpliterator.spliterator(value, leading, trailing), false);
+ }
}
public static void putChar(byte[] val, int index, int c) {