public PatternConverter parse()

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


    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;
    }