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