private void parseString()

in modules/print/src/main/java/common/org/apache/harmony/x/print/MimeType.java [119:465]


    private void parseString(String aString) {
        String errMsg = "Illegal mime-type string format!";

        int state = 1; // state for parser 
        int nextState = 0; // next state after the comments end

        // convert String to char array
        char s[] = new char[aString.length()];
        aString.getChars(0, aString.length(), s, 0);

        int len = s.length - 1;

        int cnt1 = 1; // nesting comments level

        // Position of type and subtype in the string:
        int startTypeIndex = 0;
        int startSubtypeIndex = 0;

        // Analized parameter name and value variables:
        int startParamNameIndex = 0;
        int startParamValueIndex = 0;
        String paramName = null;
        String paramValue = null;

        Vector nameVector = new Vector(); // parameter names vector
        Vector valueVector = new Vector(); // parameter values vector

        // string should not be empty, should have at least three characters
        if (len <= 1) {
            throw new IllegalArgumentException(errMsg);
        }

        for (int i = 0; i <= len; i++) {
            switch (state) {
            case 1:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isOKTokenChar(s[i])) {
                    startTypeIndex = i;
                    state = 2;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if (s[i] == '(') {
                    nextState = 1;
                    state = 50;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 2:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isOKTokenChar(s[i])) {
                    break;
                }
                if (s[i] == '/') {
                    state = 3;
                    aType = newLowercaseString(s, startTypeIndex, i);
                    break;
                }
                if (s[i] == '(') {
                    nextState = 4;
                    state = 50;
                    aType = newLowercaseString(s, startTypeIndex, i);
                    break;
                }
                if (isSpaceChar(s[i])) {
                    state = 4;
                    aType = newLowercaseString(s, startTypeIndex, i);
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 3:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isOKTokenChar(s[i])) {
                    startSubtypeIndex = i;
                    state = 5;
                    break;
                }
                if (s[i] == '(') {
                    nextState = 3;
                    state = 50;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 4:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (s[i] == '(') {
                    nextState = 4;
                    state = 50;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if (s[i] == '/') {
                    startSubtypeIndex = i + 1;
                    state = 3;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 5:
                if (isOKTokenChar(s[i])) {
                    if (i == len) {
                        aSubtype = newLowercaseString(s, startSubtypeIndex,
                                i + 1);
                    }
                    break;
                }
                if ((s[i] == ';') && (i != len)) {
                    aSubtype = newLowercaseString(s, startSubtypeIndex, i);
                    state = 7;
                    break;
                }
                if ((s[i] == '(') && (i != len)) {
                    aSubtype = newLowercaseString(s, startSubtypeIndex, i);
                    nextState = 6;
                    state = 50;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    aSubtype = newLowercaseString(s, startSubtypeIndex, i);
                    state = 6;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 6:
                if (isSpaceChar(s[i])) {
                    break;
                }
                if ((s[i] == '(') && (i != len)) {
                    nextState = 6;
                    state = 50;
                    break;
                }
                if ((s[i] == ';') && (i != len)) {
                    state = 7;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 7:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if (s[i] == '(') {
                    state = 50;
                    nextState = 7;
                    break;
                }
                startParamNameIndex = i;
                if (isOKTokenChar(s[i])) {
                    state = 8;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 8:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isOKTokenChar(s[i])) {
                    break;
                }
                if (isSpaceChar(s[i])) {
                    paramName = newLowercaseString(s, startParamNameIndex, i);
                    state = 10;
                    break;
                }
                if (s[i] == '(') {
                    paramName = newLowercaseString(s, startParamNameIndex, i);
                    state = 50;
                    nextState = 10;
                    break;
                }
                if (s[i] == '=') {
                    paramName = newLowercaseString(s, startParamNameIndex, i);
                    state = 9;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 9:
                if (isOKTokenChar(s[i])) {
                    if (i == len) {
                        paramValue = new String(s, i, 1);
                        addParameter(paramName, paramValue, nameVector,
                                valueVector);
                    } else {
                        startParamValueIndex = i;
                        state = 11;
                    }
                    break;
                }
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if (s[i] == '(') {
                    state = 50;
                    nextState = 9;
                    break;
                }
                if (s[i] == '"') {
                    startParamValueIndex = i + 1;
                    state = 13;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 10:
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if (s[i] == '=') {
                    state = 9;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 11:
                if (isOKTokenChar(s[i])) {
                    if (i == len) {
                        paramValue = new String(s, startParamValueIndex, i + 1
                                - startParamValueIndex);
                        addParameter(paramName, paramValue, nameVector,
                                valueVector);
                    }
                    break;
                }
                if ((s[i] == ';') && (i != len)) {
                    paramValue = new String(s, startParamValueIndex, i
                            - startParamValueIndex);
                    addParameter(paramName, paramValue, nameVector, valueVector);
                    state = 7;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    paramValue = new String(s, startParamValueIndex, i
                            - startParamValueIndex);
                    addParameter(paramName, paramValue, nameVector, valueVector);
                    state = 12;
                    break;
                }
                if ((s[i] == '(') && (i != len)) {
                    paramValue = new String(s, startParamValueIndex, i
                            - startParamValueIndex);
                    addParameter(paramName, paramValue, nameVector, valueVector);
                    state = 50;
                    nextState = 12;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 12:
                if (isSpaceChar(s[i])) {
                    break;
                }
                if ((s[i] == '(') && (i != len)) {
                    state = 50;
                    nextState = 12;
                    break;
                }
                if ((s[i] == ';') && (i != len)) {
                    state = 7;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 13:
                if ((s[i] == '"') && (s[i - 1] != '\\')) {
                    paramValue = new String(s, startParamValueIndex, i
                            - startParamValueIndex);
                    addParameter(paramName, paramValue, nameVector, valueVector);
                    state = 14;
                    break;
                }
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isPrintableASCIIChar(s[i])) {
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 14:
                if ((s[i] == ';') && (i != len)) {
                    state = 7;
                    break;
                }
                if (isSpaceChar(s[i])) {
                    break;
                }
                if ((s[i] == '(') && (i != len)) {
                    state = 50;
                    nextState = 14;
                    break;
                }
                throw new IllegalArgumentException(errMsg);

            case 50:
                if (s[i] == '(') {
                    cnt1++;
                }
                if (s[i] == ')') {
                    cnt1--;
                }
                if (cnt1 == 0) {
                    cnt1 = 1;
                    state = nextState;
                    break;
                }
                if (i == len) {
                    throw new IllegalArgumentException(errMsg);
                }
                if (isPrintableASCIIChar(s[i])) {
                    break;
                }
                throw new IllegalArgumentException(errMsg);
            }
        }
        makeParamsArray(nameVector, valueVector);
    }