11e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan/*
21e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * State
31e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan *
41e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * Authors: Lasse Collin <lasse.collin@tukaani.org>
51e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan *          Igor Pavlov <http://7-zip.org/>
61e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan *
71e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * This file has been put into the public domain.
81e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan * You can do whatever you want with this file.
91e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan */
101e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
111e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnanpackage org.tukaani.xz.lzma;
121e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
131e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnanfinal class State {
141e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    static final int STATES = 12;
151e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
161e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int LIT_STATES = 7;
171e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
181e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int LIT_LIT = 0;
191e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int MATCH_LIT_LIT = 1;
201e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int REP_LIT_LIT = 2;
211e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int SHORTREP_LIT_LIT = 3;
221e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int MATCH_LIT = 4;
231e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int REP_LIT = 5;
241e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int SHORTREP_LIT = 6;
251e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int LIT_MATCH = 7;
261e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int LIT_LONGREP = 8;
271e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int LIT_SHORTREP = 9;
281e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int NONLIT_MATCH = 10;
291e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private static final int NONLIT_REP = 11;
301e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
311e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    private int state;
321e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
331e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    State() {}
341e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
351e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    State(State other) {
361e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = other.state;
371e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
381e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
391e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void reset() {
401e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = LIT_LIT;
411e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
421e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
431e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    int get() {
441e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        return state;
451e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
461e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
471e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void set(State other) {
481e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = other.state;
491e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
501e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
511e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void updateLiteral() {
521e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        if (state <= SHORTREP_LIT_LIT)
531e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan            state = LIT_LIT;
541e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        else if (state <= LIT_SHORTREP)
551e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan            state -= 3;
561e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        else
571e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan            state -= 6;
581e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
591e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
601e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void updateMatch() {
611e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = state < LIT_STATES ? LIT_MATCH : NONLIT_MATCH;
621e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
631e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
641e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void updateLongRep() {
651e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = state < LIT_STATES ? LIT_LONGREP : NONLIT_REP;
661e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
671e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
681e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    void updateShortRep() {
691e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        state = state < LIT_STATES ? LIT_SHORTREP : NONLIT_REP;
701e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
711e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan
721e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    boolean isLiteral() {
731e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan        return state < LIT_STATES;
741e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan    }
751e977d75f657dacb4cb5c36ab6054bcf66b08076Vinod Krishnan}
76