public PatternConverter parse()

in log4j-1.2-api/src/main/java/org/apache/log4j/helpers/PatternParser.java [124:215]


    public PatternConverter parse() {
        char c;
        i = 0;
        while (i < patternLength) {
            c = pattern.charAt(i++);
            switch (state) {
            case LITERAL_STATE:
                // In literal state, the last char is always a literal.
                if (i == patternLength) {
                    currentLiteral.append(c);
                    continue;
                }
                if (c == ESCAPE_CHAR) {
                    // peek at the next char.
                    switch (pattern.charAt(i)) {
                    case ESCAPE_CHAR:
                        currentLiteral.append(c);
                        i++; // move pointer
                        break;
                    case 'n':
                        currentLiteral.append(Layout.LINE_SEP);
                        i++; // move pointer
                        break;
                    default:
                        if (currentLiteral.length() != 0) {
                            addToList(new LiteralPatternConverter(currentLiteral.toString()));
                            // LogLog.debug("Parsed LITERAL converter: \""
                            // +currentLiteral+"\".");
                        }
                        currentLiteral.setLength(0);
                        currentLiteral.append(c); // append %
                        state = CONVERTER_STATE;
                        formattingInfo.reset();
                    }
                } else {
                    currentLiteral.append(c);
                }
                break;
            case CONVERTER_STATE:
                currentLiteral.append(c);
                switch (c) {
                case '-':
                    formattingInfo.leftAlign = true;
                    break;
                case '.':
                    state = DOT_STATE;
                    break;
                default:
                    if (c >= '0' && c <= '9') {
                        formattingInfo.min = c - '0';
                        state = MIN_STATE;
                    } else
                        finalizeConverter(c);
                } // switch
                break;
            case MIN_STATE:
                currentLiteral.append(c);
                if (c >= '0' && c <= '9')
                    formattingInfo.min = formattingInfo.min * 10 + (c - '0');
                else if (c == '.')
                    state = DOT_STATE;
                else {
                    finalizeConverter(c);
                }
                break;
            case DOT_STATE:
                currentLiteral.append(c);
                if (c >= '0' && c <= '9') {
                    formattingInfo.max = c - '0';
                    state = MAX_STATE;
                } else {
                    LogLog.error("Error occured in position " + i + ".\n Was expecting digit, instead got char \"" + c + "\".");
                    state = LITERAL_STATE;
                }
                break;
            case MAX_STATE:
                currentLiteral.append(c);
                if (c >= '0' && c <= '9')
                    formattingInfo.max = formattingInfo.max * 10 + (c - '0');
                else {
                    finalizeConverter(c);
                    state = LITERAL_STATE;
                }
                break;
            } // switch
        } // while
        if (currentLiteral.length() != 0) {
            addToList(new LiteralPatternConverter(currentLiteral.toString()));
            // LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\".");
        }
        return head;
    }