17db96d56Sopenharmony_ci""" Python 'utf-16' Codec
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciWritten by Marc-Andre Lemburg (mal@lemburg.com).
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci"""
97db96d56Sopenharmony_ciimport codecs, sys
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci### Codec APIs
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ciencode = codecs.utf_16_encode
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cidef decode(input, errors='strict'):
167db96d56Sopenharmony_ci    return codecs.utf_16_decode(input, errors, True)
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciclass IncrementalEncoder(codecs.IncrementalEncoder):
197db96d56Sopenharmony_ci    def __init__(self, errors='strict'):
207db96d56Sopenharmony_ci        codecs.IncrementalEncoder.__init__(self, errors)
217db96d56Sopenharmony_ci        self.encoder = None
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    def encode(self, input, final=False):
247db96d56Sopenharmony_ci        if self.encoder is None:
257db96d56Sopenharmony_ci            result = codecs.utf_16_encode(input, self.errors)[0]
267db96d56Sopenharmony_ci            if sys.byteorder == 'little':
277db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_le_encode
287db96d56Sopenharmony_ci            else:
297db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_be_encode
307db96d56Sopenharmony_ci            return result
317db96d56Sopenharmony_ci        return self.encoder(input, self.errors)[0]
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def reset(self):
347db96d56Sopenharmony_ci        codecs.IncrementalEncoder.reset(self)
357db96d56Sopenharmony_ci        self.encoder = None
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci    def getstate(self):
387db96d56Sopenharmony_ci        # state info we return to the caller:
397db96d56Sopenharmony_ci        # 0: stream is in natural order for this platform
407db96d56Sopenharmony_ci        # 2: endianness hasn't been determined yet
417db96d56Sopenharmony_ci        # (we're never writing in unnatural order)
427db96d56Sopenharmony_ci        return (2 if self.encoder is None else 0)
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci    def setstate(self, state):
457db96d56Sopenharmony_ci        if state:
467db96d56Sopenharmony_ci            self.encoder = None
477db96d56Sopenharmony_ci        else:
487db96d56Sopenharmony_ci            if sys.byteorder == 'little':
497db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_le_encode
507db96d56Sopenharmony_ci            else:
517db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_be_encode
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciclass IncrementalDecoder(codecs.BufferedIncrementalDecoder):
547db96d56Sopenharmony_ci    def __init__(self, errors='strict'):
557db96d56Sopenharmony_ci        codecs.BufferedIncrementalDecoder.__init__(self, errors)
567db96d56Sopenharmony_ci        self.decoder = None
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def _buffer_decode(self, input, errors, final):
597db96d56Sopenharmony_ci        if self.decoder is None:
607db96d56Sopenharmony_ci            (output, consumed, byteorder) = \
617db96d56Sopenharmony_ci                codecs.utf_16_ex_decode(input, errors, 0, final)
627db96d56Sopenharmony_ci            if byteorder == -1:
637db96d56Sopenharmony_ci                self.decoder = codecs.utf_16_le_decode
647db96d56Sopenharmony_ci            elif byteorder == 1:
657db96d56Sopenharmony_ci                self.decoder = codecs.utf_16_be_decode
667db96d56Sopenharmony_ci            elif consumed >= 2:
677db96d56Sopenharmony_ci                raise UnicodeError("UTF-16 stream does not start with BOM")
687db96d56Sopenharmony_ci            return (output, consumed)
697db96d56Sopenharmony_ci        return self.decoder(input, self.errors, final)
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def reset(self):
727db96d56Sopenharmony_ci        codecs.BufferedIncrementalDecoder.reset(self)
737db96d56Sopenharmony_ci        self.decoder = None
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    def getstate(self):
767db96d56Sopenharmony_ci        # additional state info from the base class must be None here,
777db96d56Sopenharmony_ci        # as it isn't passed along to the caller
787db96d56Sopenharmony_ci        state = codecs.BufferedIncrementalDecoder.getstate(self)[0]
797db96d56Sopenharmony_ci        # additional state info we pass to the caller:
807db96d56Sopenharmony_ci        # 0: stream is in natural order for this platform
817db96d56Sopenharmony_ci        # 1: stream is in unnatural order
827db96d56Sopenharmony_ci        # 2: endianness hasn't been determined yet
837db96d56Sopenharmony_ci        if self.decoder is None:
847db96d56Sopenharmony_ci            return (state, 2)
857db96d56Sopenharmony_ci        addstate = int((sys.byteorder == "big") !=
867db96d56Sopenharmony_ci                       (self.decoder is codecs.utf_16_be_decode))
877db96d56Sopenharmony_ci        return (state, addstate)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    def setstate(self, state):
907db96d56Sopenharmony_ci        # state[1] will be ignored by BufferedIncrementalDecoder.setstate()
917db96d56Sopenharmony_ci        codecs.BufferedIncrementalDecoder.setstate(self, state)
927db96d56Sopenharmony_ci        state = state[1]
937db96d56Sopenharmony_ci        if state == 0:
947db96d56Sopenharmony_ci            self.decoder = (codecs.utf_16_be_decode
957db96d56Sopenharmony_ci                            if sys.byteorder == "big"
967db96d56Sopenharmony_ci                            else codecs.utf_16_le_decode)
977db96d56Sopenharmony_ci        elif state == 1:
987db96d56Sopenharmony_ci            self.decoder = (codecs.utf_16_le_decode
997db96d56Sopenharmony_ci                            if sys.byteorder == "big"
1007db96d56Sopenharmony_ci                            else codecs.utf_16_be_decode)
1017db96d56Sopenharmony_ci        else:
1027db96d56Sopenharmony_ci            self.decoder = None
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciclass StreamWriter(codecs.StreamWriter):
1057db96d56Sopenharmony_ci    def __init__(self, stream, errors='strict'):
1067db96d56Sopenharmony_ci        codecs.StreamWriter.__init__(self, stream, errors)
1077db96d56Sopenharmony_ci        self.encoder = None
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci    def reset(self):
1107db96d56Sopenharmony_ci        codecs.StreamWriter.reset(self)
1117db96d56Sopenharmony_ci        self.encoder = None
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    def encode(self, input, errors='strict'):
1147db96d56Sopenharmony_ci        if self.encoder is None:
1157db96d56Sopenharmony_ci            result = codecs.utf_16_encode(input, errors)
1167db96d56Sopenharmony_ci            if sys.byteorder == 'little':
1177db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_le_encode
1187db96d56Sopenharmony_ci            else:
1197db96d56Sopenharmony_ci                self.encoder = codecs.utf_16_be_encode
1207db96d56Sopenharmony_ci            return result
1217db96d56Sopenharmony_ci        else:
1227db96d56Sopenharmony_ci            return self.encoder(input, errors)
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciclass StreamReader(codecs.StreamReader):
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci    def reset(self):
1277db96d56Sopenharmony_ci        codecs.StreamReader.reset(self)
1287db96d56Sopenharmony_ci        try:
1297db96d56Sopenharmony_ci            del self.decode
1307db96d56Sopenharmony_ci        except AttributeError:
1317db96d56Sopenharmony_ci            pass
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    def decode(self, input, errors='strict'):
1347db96d56Sopenharmony_ci        (object, consumed, byteorder) = \
1357db96d56Sopenharmony_ci            codecs.utf_16_ex_decode(input, errors, 0, False)
1367db96d56Sopenharmony_ci        if byteorder == -1:
1377db96d56Sopenharmony_ci            self.decode = codecs.utf_16_le_decode
1387db96d56Sopenharmony_ci        elif byteorder == 1:
1397db96d56Sopenharmony_ci            self.decode = codecs.utf_16_be_decode
1407db96d56Sopenharmony_ci        elif consumed>=2:
1417db96d56Sopenharmony_ci            raise UnicodeError("UTF-16 stream does not start with BOM")
1427db96d56Sopenharmony_ci        return (object, consumed)
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci### encodings module API
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_cidef getregentry():
1477db96d56Sopenharmony_ci    return codecs.CodecInfo(
1487db96d56Sopenharmony_ci        name='utf-16',
1497db96d56Sopenharmony_ci        encode=encode,
1507db96d56Sopenharmony_ci        decode=decode,
1517db96d56Sopenharmony_ci        incrementalencoder=IncrementalEncoder,
1527db96d56Sopenharmony_ci        incrementaldecoder=IncrementalDecoder,
1537db96d56Sopenharmony_ci        streamreader=StreamReader,
1547db96d56Sopenharmony_ci        streamwriter=StreamWriter,
1557db96d56Sopenharmony_ci    )
156