private static int findLabeledLineStartIndex()

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


    private static int findLabeledLineStartIndex(final CharSequence buffer, final int startIndex) {
        // 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.
        final int bufferLength = buffer.length();
        for (int bufferIndex = startIndex; bufferIndex < bufferLength; ) {

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

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

            // Search for the `Caused by: ` occurrence.
            if (bufferIndex < (bufferLength - 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 < (bufferLength - 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;
    }