State next()

in src/main/java/com/alibaba/com/caucho/hessian/io/HessianDebugState.java [1115:1199]


        State next(int ch) {
            if (_lengthIndex < 2) {
                _length = 256 * _length + (ch & 0xff);

                if (++_lengthIndex == 2 && _length == 0 && _isLastChunk) {
                    if (_next.isShift(_value.toString()))
                        return _next.shift(_value.toString());
                    else {
                        printObject("\"" + _value + "\"");
                        return _next;
                    }
                } else
                    return this;
            } else if (_length == 0) {
                if (ch == 's' || ch == 'x') {
                    _isLastChunk = false;
                    _lengthIndex = 0;
                    return this;
                } else if (ch == 'S' || ch == 'X') {
                    _isLastChunk = true;
                    _lengthIndex = 0;
                    return this;
                } else if (ch == 0x00) {
                    if (_next.isShift(_value.toString()))
                        return _next.shift(_value.toString());
                    else {
                        printObject("\"" + _value + "\"");
                        return _next;
                    }
                } else if (0x00 <= ch && ch < 0x20) {
                    _isLastChunk = true;
                    _lengthIndex = 2;
                    _length = ch & 0xff;
                    return this;
                } else if (0x30 <= ch && ch < 0x34) {
                    _isLastChunk = true;
                    _lengthIndex = 1;
                    _length = (ch - 0x30);
                    return this;
                } else {
                    println(String.valueOf((char) ch) + ": unexpected character");
                    return _next;
                }
            }

            switch (_utfState) {
                case TOP:
                    if (ch < 0x80) {
                        _length--;

                        _value.append((char) ch);
                    } else if (ch < 0xe0) {
                        _ch = (char) ((ch & 0x1f) << 6);
                        _utfState = UTF_2_1;
                    } else {
                        _ch = (char) ((ch & 0xf) << 12);
                        _utfState = UTF_3_1;
                    }
                    break;

                case UTF_2_1:
                case UTF_3_2:
                    _ch += ch & 0x3f;
                    _value.append(_ch);
                    _length--;
                    _utfState = TOP;
                    break;

                case UTF_3_1:
                    _ch += (char) ((ch & 0x3f) << 6);
                    _utfState = UTF_3_2;
                    break;
            }

            if (_length == 0 && _isLastChunk) {
                if (_next.isShift(_value.toString()))
                    return _next.shift(_value.toString());
                else {
                    printObject("\"" + _value + "\"");

                    return _next;
                }
            } else
                return this;
        }