1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package Torello.Java;

class LeftTrimAll
{
    static String run(String s)
    {
        char[] cArr = s.toCharArray();

        // LEFT TRIM is easier on the mind.  There are only two variables needed for this one.
        int targetPos = 0;
        int sourcePos = 0;

        // Make sure to skip completely any and all leading new-line characters.
        while ((targetPos < cArr.length) && (cArr[targetPos] == '\n')) targetPos++;

        // If there were **ONLY** leading new-line characters, return the original string
        if (targetPos == cArr.length) return s;

        // Re-initialize 'sourcePos'
        sourcePos = targetPos;

        while (sourcePos < cArr.length)
        {
            // When this loop begins, sourcePos is pointing at the first character of text
            // in the very-next line-of-text to process.
            //
            // NORMAL EXECUTION:    This loop advances 'sourcePos' to the first non-white-space
            //                      character in the line.
            // 
            // WS-ONLY LINES CASE:  This loop advances 'sourcePos' to the next line ('\n')
            // 
            // LAST-LINE CASE:      Advances 'sourcePos' to cArr.length

            while (     (sourcePos < cArr.length)
                    &&  Character.isWhitespace(cArr[sourcePos])
                    &&  (cArr[sourcePos] != '\n')
                )
                sourcePos++;


            // Left Shift the String to 'erase' all leading white-space characters in the
            // current line of text.

            while ((sourcePos < cArr.length) && (cArr[sourcePos] != '\n'))
                cArr[targetPos++] = cArr[sourcePos++];


            // The loop that is directly above this statement BREAKS when '\n' is reached,
            // so unless the end of the String has been reached, shift one more of the characters
            // NOTE: If a character is shifted, below, it will always be the '\n' character

            if (sourcePos < cArr.length) cArr[targetPos++] = cArr[sourcePos++];
        }

        return new String(cArr, 0, targetPos);
    }
}