xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/encodings/utf_32.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker"""
2*cda5da8dSAndroid Build Coastguard WorkerPython 'utf-32' Codec
3*cda5da8dSAndroid Build Coastguard Worker"""
4*cda5da8dSAndroid Build Coastguard Workerimport codecs, sys
5*cda5da8dSAndroid Build Coastguard Worker
6*cda5da8dSAndroid Build Coastguard Worker### Codec APIs
7*cda5da8dSAndroid Build Coastguard Worker
8*cda5da8dSAndroid Build Coastguard Workerencode = codecs.utf_32_encode
9*cda5da8dSAndroid Build Coastguard Worker
10*cda5da8dSAndroid Build Coastguard Workerdef decode(input, errors='strict'):
11*cda5da8dSAndroid Build Coastguard Worker    return codecs.utf_32_decode(input, errors, True)
12*cda5da8dSAndroid Build Coastguard Worker
13*cda5da8dSAndroid Build Coastguard Workerclass IncrementalEncoder(codecs.IncrementalEncoder):
14*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, errors='strict'):
15*cda5da8dSAndroid Build Coastguard Worker        codecs.IncrementalEncoder.__init__(self, errors)
16*cda5da8dSAndroid Build Coastguard Worker        self.encoder = None
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Worker    def encode(self, input, final=False):
19*cda5da8dSAndroid Build Coastguard Worker        if self.encoder is None:
20*cda5da8dSAndroid Build Coastguard Worker            result = codecs.utf_32_encode(input, self.errors)[0]
21*cda5da8dSAndroid Build Coastguard Worker            if sys.byteorder == 'little':
22*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_le_encode
23*cda5da8dSAndroid Build Coastguard Worker            else:
24*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_be_encode
25*cda5da8dSAndroid Build Coastguard Worker            return result
26*cda5da8dSAndroid Build Coastguard Worker        return self.encoder(input, self.errors)[0]
27*cda5da8dSAndroid Build Coastguard Worker
28*cda5da8dSAndroid Build Coastguard Worker    def reset(self):
29*cda5da8dSAndroid Build Coastguard Worker        codecs.IncrementalEncoder.reset(self)
30*cda5da8dSAndroid Build Coastguard Worker        self.encoder = None
31*cda5da8dSAndroid Build Coastguard Worker
32*cda5da8dSAndroid Build Coastguard Worker    def getstate(self):
33*cda5da8dSAndroid Build Coastguard Worker        # state info we return to the caller:
34*cda5da8dSAndroid Build Coastguard Worker        # 0: stream is in natural order for this platform
35*cda5da8dSAndroid Build Coastguard Worker        # 2: endianness hasn't been determined yet
36*cda5da8dSAndroid Build Coastguard Worker        # (we're never writing in unnatural order)
37*cda5da8dSAndroid Build Coastguard Worker        return (2 if self.encoder is None else 0)
38*cda5da8dSAndroid Build Coastguard Worker
39*cda5da8dSAndroid Build Coastguard Worker    def setstate(self, state):
40*cda5da8dSAndroid Build Coastguard Worker        if state:
41*cda5da8dSAndroid Build Coastguard Worker            self.encoder = None
42*cda5da8dSAndroid Build Coastguard Worker        else:
43*cda5da8dSAndroid Build Coastguard Worker            if sys.byteorder == 'little':
44*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_le_encode
45*cda5da8dSAndroid Build Coastguard Worker            else:
46*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_be_encode
47*cda5da8dSAndroid Build Coastguard Worker
48*cda5da8dSAndroid Build Coastguard Workerclass IncrementalDecoder(codecs.BufferedIncrementalDecoder):
49*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, errors='strict'):
50*cda5da8dSAndroid Build Coastguard Worker        codecs.BufferedIncrementalDecoder.__init__(self, errors)
51*cda5da8dSAndroid Build Coastguard Worker        self.decoder = None
52*cda5da8dSAndroid Build Coastguard Worker
53*cda5da8dSAndroid Build Coastguard Worker    def _buffer_decode(self, input, errors, final):
54*cda5da8dSAndroid Build Coastguard Worker        if self.decoder is None:
55*cda5da8dSAndroid Build Coastguard Worker            (output, consumed, byteorder) = \
56*cda5da8dSAndroid Build Coastguard Worker                codecs.utf_32_ex_decode(input, errors, 0, final)
57*cda5da8dSAndroid Build Coastguard Worker            if byteorder == -1:
58*cda5da8dSAndroid Build Coastguard Worker                self.decoder = codecs.utf_32_le_decode
59*cda5da8dSAndroid Build Coastguard Worker            elif byteorder == 1:
60*cda5da8dSAndroid Build Coastguard Worker                self.decoder = codecs.utf_32_be_decode
61*cda5da8dSAndroid Build Coastguard Worker            elif consumed >= 4:
62*cda5da8dSAndroid Build Coastguard Worker                raise UnicodeError("UTF-32 stream does not start with BOM")
63*cda5da8dSAndroid Build Coastguard Worker            return (output, consumed)
64*cda5da8dSAndroid Build Coastguard Worker        return self.decoder(input, self.errors, final)
65*cda5da8dSAndroid Build Coastguard Worker
66*cda5da8dSAndroid Build Coastguard Worker    def reset(self):
67*cda5da8dSAndroid Build Coastguard Worker        codecs.BufferedIncrementalDecoder.reset(self)
68*cda5da8dSAndroid Build Coastguard Worker        self.decoder = None
69*cda5da8dSAndroid Build Coastguard Worker
70*cda5da8dSAndroid Build Coastguard Worker    def getstate(self):
71*cda5da8dSAndroid Build Coastguard Worker        # additional state info from the base class must be None here,
72*cda5da8dSAndroid Build Coastguard Worker        # as it isn't passed along to the caller
73*cda5da8dSAndroid Build Coastguard Worker        state = codecs.BufferedIncrementalDecoder.getstate(self)[0]
74*cda5da8dSAndroid Build Coastguard Worker        # additional state info we pass to the caller:
75*cda5da8dSAndroid Build Coastguard Worker        # 0: stream is in natural order for this platform
76*cda5da8dSAndroid Build Coastguard Worker        # 1: stream is in unnatural order
77*cda5da8dSAndroid Build Coastguard Worker        # 2: endianness hasn't been determined yet
78*cda5da8dSAndroid Build Coastguard Worker        if self.decoder is None:
79*cda5da8dSAndroid Build Coastguard Worker            return (state, 2)
80*cda5da8dSAndroid Build Coastguard Worker        addstate = int((sys.byteorder == "big") !=
81*cda5da8dSAndroid Build Coastguard Worker                       (self.decoder is codecs.utf_32_be_decode))
82*cda5da8dSAndroid Build Coastguard Worker        return (state, addstate)
83*cda5da8dSAndroid Build Coastguard Worker
84*cda5da8dSAndroid Build Coastguard Worker    def setstate(self, state):
85*cda5da8dSAndroid Build Coastguard Worker        # state[1] will be ignored by BufferedIncrementalDecoder.setstate()
86*cda5da8dSAndroid Build Coastguard Worker        codecs.BufferedIncrementalDecoder.setstate(self, state)
87*cda5da8dSAndroid Build Coastguard Worker        state = state[1]
88*cda5da8dSAndroid Build Coastguard Worker        if state == 0:
89*cda5da8dSAndroid Build Coastguard Worker            self.decoder = (codecs.utf_32_be_decode
90*cda5da8dSAndroid Build Coastguard Worker                            if sys.byteorder == "big"
91*cda5da8dSAndroid Build Coastguard Worker                            else codecs.utf_32_le_decode)
92*cda5da8dSAndroid Build Coastguard Worker        elif state == 1:
93*cda5da8dSAndroid Build Coastguard Worker            self.decoder = (codecs.utf_32_le_decode
94*cda5da8dSAndroid Build Coastguard Worker                            if sys.byteorder == "big"
95*cda5da8dSAndroid Build Coastguard Worker                            else codecs.utf_32_be_decode)
96*cda5da8dSAndroid Build Coastguard Worker        else:
97*cda5da8dSAndroid Build Coastguard Worker            self.decoder = None
98*cda5da8dSAndroid Build Coastguard Worker
99*cda5da8dSAndroid Build Coastguard Workerclass StreamWriter(codecs.StreamWriter):
100*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, stream, errors='strict'):
101*cda5da8dSAndroid Build Coastguard Worker        self.encoder = None
102*cda5da8dSAndroid Build Coastguard Worker        codecs.StreamWriter.__init__(self, stream, errors)
103*cda5da8dSAndroid Build Coastguard Worker
104*cda5da8dSAndroid Build Coastguard Worker    def reset(self):
105*cda5da8dSAndroid Build Coastguard Worker        codecs.StreamWriter.reset(self)
106*cda5da8dSAndroid Build Coastguard Worker        self.encoder = None
107*cda5da8dSAndroid Build Coastguard Worker
108*cda5da8dSAndroid Build Coastguard Worker    def encode(self, input, errors='strict'):
109*cda5da8dSAndroid Build Coastguard Worker        if self.encoder is None:
110*cda5da8dSAndroid Build Coastguard Worker            result = codecs.utf_32_encode(input, errors)
111*cda5da8dSAndroid Build Coastguard Worker            if sys.byteorder == 'little':
112*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_le_encode
113*cda5da8dSAndroid Build Coastguard Worker            else:
114*cda5da8dSAndroid Build Coastguard Worker                self.encoder = codecs.utf_32_be_encode
115*cda5da8dSAndroid Build Coastguard Worker            return result
116*cda5da8dSAndroid Build Coastguard Worker        else:
117*cda5da8dSAndroid Build Coastguard Worker            return self.encoder(input, errors)
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Workerclass StreamReader(codecs.StreamReader):
120*cda5da8dSAndroid Build Coastguard Worker
121*cda5da8dSAndroid Build Coastguard Worker    def reset(self):
122*cda5da8dSAndroid Build Coastguard Worker        codecs.StreamReader.reset(self)
123*cda5da8dSAndroid Build Coastguard Worker        try:
124*cda5da8dSAndroid Build Coastguard Worker            del self.decode
125*cda5da8dSAndroid Build Coastguard Worker        except AttributeError:
126*cda5da8dSAndroid Build Coastguard Worker            pass
127*cda5da8dSAndroid Build Coastguard Worker
128*cda5da8dSAndroid Build Coastguard Worker    def decode(self, input, errors='strict'):
129*cda5da8dSAndroid Build Coastguard Worker        (object, consumed, byteorder) = \
130*cda5da8dSAndroid Build Coastguard Worker            codecs.utf_32_ex_decode(input, errors, 0, False)
131*cda5da8dSAndroid Build Coastguard Worker        if byteorder == -1:
132*cda5da8dSAndroid Build Coastguard Worker            self.decode = codecs.utf_32_le_decode
133*cda5da8dSAndroid Build Coastguard Worker        elif byteorder == 1:
134*cda5da8dSAndroid Build Coastguard Worker            self.decode = codecs.utf_32_be_decode
135*cda5da8dSAndroid Build Coastguard Worker        elif consumed>=4:
136*cda5da8dSAndroid Build Coastguard Worker            raise UnicodeError("UTF-32 stream does not start with BOM")
137*cda5da8dSAndroid Build Coastguard Worker        return (object, consumed)
138*cda5da8dSAndroid Build Coastguard Worker
139*cda5da8dSAndroid Build Coastguard Worker### encodings module API
140*cda5da8dSAndroid Build Coastguard Worker
141*cda5da8dSAndroid Build Coastguard Workerdef getregentry():
142*cda5da8dSAndroid Build Coastguard Worker    return codecs.CodecInfo(
143*cda5da8dSAndroid Build Coastguard Worker        name='utf-32',
144*cda5da8dSAndroid Build Coastguard Worker        encode=encode,
145*cda5da8dSAndroid Build Coastguard Worker        decode=decode,
146*cda5da8dSAndroid Build Coastguard Worker        incrementalencoder=IncrementalEncoder,
147*cda5da8dSAndroid Build Coastguard Worker        incrementaldecoder=IncrementalDecoder,
148*cda5da8dSAndroid Build Coastguard Worker        streamreader=StreamReader,
149*cda5da8dSAndroid Build Coastguard Worker        streamwriter=StreamWriter,
150*cda5da8dSAndroid Build Coastguard Worker    )
151