text: ######################## BEGIN LICENSE BLOCK ########################
  # The Original Code is Mozilla Universal charset detector code.
  #
  # The Initial Developer of the Original Code is
  # Netscape Communications Corporation.
  # Portions created by the Initial Developer are Copyright (C) 2001
  # the Initial Developer. All Rights Reserved.
  #
  # Contributor(s):
  #   Mark Pilgrim - port to Python
  #   Shy Shalom - original C code
  #   Proofpoint, Inc.
  #
  # This library is free software; you can redistribute it and/or
  # modify it under the terms of the GNU Lesser General Public
  # License as published by the Free Software Foundation; either
  # version 2.1 of the License, or (at your option) any later version.
  #
  # This library is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  # Lesser General Public License for more details.
  #
  # You should have received a copy of the GNU Lesser General Public
  # License along with this library; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  # 02110-1301  USA
  ######################### END LICENSE BLOCK #########################
  
  import sys
  from . import constants
  from .charsetprober import CharSetProber
  
  if sys.version_info >= (3, 0):
      xrange = range
  
  class MultiByteCharSetProber(CharSetProber):
      def __init__(self):
          CharSetProber.__init__(self)
          self._mDistributionAnalyzer = None
          self._mCodingSM = None
          self._mLastChar = [0, 0]
  
      def reset(self):
          CharSetProber.reset(self)
          if self._mCodingSM:
              self._mCodingSM.reset()
          if self._mDistributionAnalyzer:
              self._mDistributionAnalyzer.reset()
          self._mLastChar = [0, 0]
  
      def get_charset_name(self):
          pass
  
      def feed(self, aBuf):
          aLen = len(aBuf)
          for i in xrange(0, aLen):
              codingState = self._mCodingSM.next_state(aBuf[i])
              if codingState == constants.eError:
                  if constants._debug:
                      sys.stderr.write(self.get_charset_name()
                                       + ' prober hit error at byte ' + str(i)
                                       + '\n')
                  self._mState = constants.eNotMe
                  break
              elif codingState == constants.eItsMe:
                  self._mState = constants.eFoundIt
                  break
              elif codingState == constants.eStart:
                  charLen = self._mCodingSM.get_current_charlen()
                  if i == 0:
                      self._mLastChar[1] = aBuf[0]
                      self._mDistributionAnalyzer.feed(self._mLastChar, charLen)
                  else:
                      self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1],
                                                       charLen)
  
          self._mLastChar[0] = aBuf[aLen - 1]
  
          if self.get_state() == constants.eDetecting:
              if (self._mDistributionAnalyzer.got_enough_data() and
                      (self.get_confidence() > constants.SHORTCUT_THRESHOLD)):
                  self._mState = constants.eFoundIt
  
          return self.get_state()
  
      def get_confidence(self):
          return self._mDistributionAnalyzer.get_confidence()
  