private static int findLabeledLineStartIndex()

in log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/StackTraceStringResolver.java [218:274]


    private static int findLabeledLineStartIndex(
            final CharSequence buffer,
            final int startIndex,
            final int endIndex) {
        // Note that the index arithmetic in this method is not guarded.
        // That is, there are no `Math.addExact()` or `Math.subtractExact()` usages.
        // Since we know a priori that we are already operating within buffer limits.
        for (int bufferIndex = startIndex; bufferIndex < endIndex;) {

            // Find the next line start, if exists.
            final int lineStartIndex = findLineStartIndex(buffer, bufferIndex, endIndex);
            if (lineStartIndex < 0) {
                break;
            }
            bufferIndex = lineStartIndex;

            // Skip tabs.
            while (bufferIndex < endIndex && '\t' == buffer.charAt(bufferIndex)) {
                bufferIndex++;
            }

            // Search for the `Caused by: ` occurrence.
            if (bufferIndex < (endIndex - 11) &&
                    buffer.charAt(bufferIndex) == 'C' &&
                    buffer.charAt(bufferIndex + 1) == 'a' &&
                    buffer.charAt(bufferIndex + 2) == 'u' &&
                    buffer.charAt(bufferIndex + 3) == 's' &&
                    buffer.charAt(bufferIndex + 4) == 'e' &&
                    buffer.charAt(bufferIndex + 5) == 'd' &&
                    buffer.charAt(bufferIndex + 6) == ' ' &&
                    buffer.charAt(bufferIndex + 7) == 'b' &&
                    buffer.charAt(bufferIndex + 8) == 'y' &&
                    buffer.charAt(bufferIndex + 9) == ':' &&
                    buffer.charAt(bufferIndex + 10) == ' ') {
                return lineStartIndex;
            }

            // Search for the `Suppressed: ` occurrence.
            else if (bufferIndex < (endIndex - 12) &&
                    buffer.charAt(bufferIndex) == 'S' &&
                    buffer.charAt(bufferIndex + 1) == 'u' &&
                    buffer.charAt(bufferIndex + 2) == 'p' &&
                    buffer.charAt(bufferIndex + 3) == 'p' &&
                    buffer.charAt(bufferIndex + 4) == 'r' &&
                    buffer.charAt(bufferIndex + 5) == 'e' &&
                    buffer.charAt(bufferIndex + 6) == 's' &&
                    buffer.charAt(bufferIndex + 7) == 's' &&
                    buffer.charAt(bufferIndex + 8) == 'e' &&
                    buffer.charAt(bufferIndex + 9) == 'd' &&
                    buffer.charAt(bufferIndex + 10) == ':' &&
                    buffer.charAt(bufferIndex + 11) == ' ') {
                return lineStartIndex;
            }

        }
        return -1;
    }