public static LineSeparator detectSeparators(@NotNull CharSequence text) {
int index = indexOfAny(text, "\n\r");
if (index == -1) return null;
- if (startsWith(text, index, "\r\n")) return LineSeparator.CRLF;
- if (text.charAt(index) == '\r') return LineSeparator.CR;
- if (text.charAt(index) == '\n') return LineSeparator.LF;
- throw new IllegalStateException();
+ LineSeparator lineSeparator = findStartingLineSeparator(text, index);
+ if (lineSeparator == null) {
+ throw new AssertionError();
+ }
+ return lineSeparator;
+ }
+
+ @Nullable
+ public static LineSeparator findStartingLineSeparator(@NotNull CharSequence text, int startIndex) {
+ if (startIndex < 0 || startIndex >= text.length()) {
+ return null;
+ }
+ char ch = text.charAt(startIndex);
+ if (ch == '\r') {
+ return startIndex + 1 < text.length() && text.charAt(startIndex + 1) == '\n' ? LineSeparator.CRLF : LineSeparator.CR;
+ }
+ return ch == '\n' ? LineSeparator.LF : null;
}
@NotNull
assertEquals(LineSeparator.CRLF, StringUtil.detectSeparators("asd\r\nads\n"));
}
+ @Test
+ public void testFindStartingLineSeparator() {
+ assertEquals(null, StringUtil.findStartingLineSeparator("", -1));
+ assertEquals(null, StringUtil.findStartingLineSeparator("", 0));
+ assertEquals(null, StringUtil.findStartingLineSeparator("", 1));
+ assertEquals(null, StringUtil.findStartingLineSeparator("\nHello", -1));
+ assertEquals(null, StringUtil.findStartingLineSeparator("\nHello", 1));
+ assertEquals(null, StringUtil.findStartingLineSeparator("\nH\rel\nlo", 6));
+
+ assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("\nHello", 0));
+ assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("\nH\rel\nlo", 5));
+ assertEquals(LineSeparator.LF, StringUtil.findStartingLineSeparator("Hello\n", 5));
+
+ assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("\rH\r\nello", 0));
+ assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("Hello\r", 5));
+ assertEquals(LineSeparator.CR, StringUtil.findStartingLineSeparator("Hello\b\r", 6));
+
+ assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\rH\r\nello", 2));
+ assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\r\nH\r\nello", 0));
+ assertEquals(LineSeparator.CRLF, StringUtil.findStartingLineSeparator("\r\nH\r\nello\r\n", 9));
+ }
+
@Test
public void testFormatFileSize() {
assertEquals("0B", StringUtil.formatFileSize(0));