1######################## BEGIN LICENSE BLOCK ######################## 2# The Original Code is mozilla.org code. 3# 4# The Initial Developer of the Original Code is 5# Netscape Communications Corporation. 6# Portions created by the Initial Developer are Copyright (C) 1998 7# the Initial Developer. All Rights Reserved. 8# 9# Contributor(s): 10# Mark Pilgrim - port to Python 11# 12# This library is free software; you can redistribute it and/or 13# modify it under the terms of the GNU Lesser General Public 14# License as published by the Free Software Foundation; either 15# version 2.1 of the License, or (at your option) any later version. 16# 17# This library is distributed in the hope that it will be useful, 18# but WITHOUT ANY WARRANTY; without even the implied warranty of 19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20# Lesser General Public License for more details. 21# 22# You should have received a copy of the GNU Lesser General Public 23# License along with this library; if not, write to the Free Software 24# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 25# 02110-1301 USA 26######################### END LICENSE BLOCK ######################### 27 28from .constants import eStart 29from .compat import wrap_ord 30 31 32class CodingStateMachine: 33 def __init__(self, sm): 34 self._mModel = sm 35 self._mCurrentBytePos = 0 36 self._mCurrentCharLen = 0 37 self.reset() 38 39 def reset(self): 40 self._mCurrentState = eStart 41 42 def next_state(self, c): 43 # for each byte we get its class 44 # if it is first byte, we also get byte length 45 # PY3K: aBuf is a byte stream, so c is an int, not a byte 46 byteCls = self._mModel['classTable'][wrap_ord(c)] 47 if self._mCurrentState == eStart: 48 self._mCurrentBytePos = 0 49 self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] 50 # from byte's class and stateTable, we get its next state 51 curr_state = (self._mCurrentState * self._mModel['classFactor'] 52 + byteCls) 53 self._mCurrentState = self._mModel['stateTable'][curr_state] 54 self._mCurrentBytePos += 1 55 return self._mCurrentState 56 57 def get_current_charlen(self): 58 return self._mCurrentCharLen 59 60 def get_coding_state_machine(self): 61 return self._mModel['name'] 62