""" Python 'utf-16' Codec





Written by Marc-Andre Lemburg (mal@lemburg.com).



(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.



"""

import codecs, sys



### Codec APIs



encode = codecs.utf_16_encode



def decode(input, errors='strict'):

    return codecs.utf_16_decode(input, errors, True)



class IncrementalEncoder(codecs.IncrementalEncoder):

    def __init__(self, errors='strict'):

        codecs.IncrementalEncoder.__init__(self, errors)

        self.encoder = None



    def encode(self, input, final=False):

        if self.encoder is None:

            result = codecs.utf_16_encode(input, self.errors)[0]

            if sys.byteorder == 'little':

                self.encoder = codecs.utf_16_le_encode

            else:

                self.encoder = codecs.utf_16_be_encode

            return result

        return self.encoder(input, self.errors)[0]



    def reset(self):

        codecs.IncrementalEncoder.reset(self)

        self.encoder = None



class IncrementalDecoder(codecs.BufferedIncrementalDecoder):

    def __init__(self, errors='strict'):

        codecs.BufferedIncrementalDecoder.__init__(self, errors)

        self.decoder = None



    def _buffer_decode(self, input, errors, final):

        if self.decoder is None:

            (output, consumed, byteorder) = \

                codecs.utf_16_ex_decode(input, errors, 0, final)

            if byteorder == -1:

                self.decoder = codecs.utf_16_le_decode

            elif byteorder == 1:

                self.decoder = codecs.utf_16_be_decode

            elif consumed >= 2:

                raise UnicodeError("UTF-16 stream does not start with BOM")

            return (output, consumed)

        return self.decoder(input, self.errors, final)



    def reset(self):

        codecs.BufferedIncrementalDecoder.reset(self)

        self.decoder = None



class StreamWriter(codecs.StreamWriter):

    def __init__(self, stream, errors='strict'):

        self.bom_written = False

        codecs.StreamWriter.__init__(self, stream, errors)



    def encode(self, input, errors='strict'):

        self.bom_written = True

        result = codecs.utf_16_encode(input, errors)

        if sys.byteorder == 'little':

            self.encode = codecs.utf_16_le_encode

        else:

            self.encode = codecs.utf_16_be_encode

        return result



class StreamReader(codecs.StreamReader):



    def reset(self):

        codecs.StreamReader.reset(self)

        try:

            del self.decode

        except AttributeError:

            pass



    def decode(self, input, errors='strict'):

        (object, consumed, byteorder) = \

            codecs.utf_16_ex_decode(input, errors, 0, False)

        if byteorder == -1:

            self.decode = codecs.utf_16_le_decode

        elif byteorder == 1:

            self.decode = codecs.utf_16_be_decode

        elif consumed>=2:

            raise UnicodeError,"UTF-16 stream does not start with BOM"

        return (object, consumed)



### encodings module API



def getregentry():

    return codecs.CodecInfo(

        name='utf-16',

        encode=encode,

        decode=decode,

        incrementalencoder=IncrementalEncoder,

        incrementaldecoder=IncrementalDecoder,

        streamreader=StreamReader,

        streamwriter=StreamWriter,

    )

