+++ /dev/null
-""" Python 'utf-16' Codec\r
-\r
-\r
-Written by Marc-Andre Lemburg (mal@lemburg.com).\r
-\r
-(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.\r
-\r
-"""\r
-import codecs, sys\r
-\r
-### Codec APIs\r
-\r
-encode = codecs.utf_16_encode\r
-\r
-def decode(input, errors='strict'):\r
- return codecs.utf_16_decode(input, errors, True)\r
-\r
-class IncrementalEncoder(codecs.IncrementalEncoder):\r
- def __init__(self, errors='strict'):\r
- codecs.IncrementalEncoder.__init__(self, errors)\r
- self.encoder = None\r
-\r
- def encode(self, input, final=False):\r
- if self.encoder is None:\r
- result = codecs.utf_16_encode(input, self.errors)[0]\r
- if sys.byteorder == 'little':\r
- self.encoder = codecs.utf_16_le_encode\r
- else:\r
- self.encoder = codecs.utf_16_be_encode\r
- return result\r
- return self.encoder(input, self.errors)[0]\r
-\r
- def reset(self):\r
- codecs.IncrementalEncoder.reset(self)\r
- self.encoder = None\r
-\r
- def getstate(self):\r
- # state info we return to the caller:\r
- # 0: stream is in natural order for this platform\r
- # 2: endianness hasn't been determined yet\r
- # (we're never writing in unnatural order)\r
- return (2 if self.encoder is None else 0)\r
-\r
- def setstate(self, state):\r
- if state:\r
- self.encoder = None\r
- else:\r
- if sys.byteorder == 'little':\r
- self.encoder = codecs.utf_16_le_encode\r
- else:\r
- self.encoder = codecs.utf_16_be_encode\r
-\r
-class IncrementalDecoder(codecs.BufferedIncrementalDecoder):\r
- def __init__(self, errors='strict'):\r
- codecs.BufferedIncrementalDecoder.__init__(self, errors)\r
- self.decoder = None\r
-\r
- def _buffer_decode(self, input, errors, final):\r
- if self.decoder is None:\r
- (output, consumed, byteorder) = \\r
- codecs.utf_16_ex_decode(input, errors, 0, final)\r
- if byteorder == -1:\r
- self.decoder = codecs.utf_16_le_decode\r
- elif byteorder == 1:\r
- self.decoder = codecs.utf_16_be_decode\r
- elif consumed >= 2:\r
- raise UnicodeError("UTF-16 stream does not start with BOM")\r
- return (output, consumed)\r
- return self.decoder(input, self.errors, final)\r
-\r
- def reset(self):\r
- codecs.BufferedIncrementalDecoder.reset(self)\r
- self.decoder = None\r
-\r
-class StreamWriter(codecs.StreamWriter):\r
- def __init__(self, stream, errors='strict'):\r
- codecs.StreamWriter.__init__(self, stream, errors)\r
- self.encoder = None\r
-\r
- def reset(self):\r
- codecs.StreamWriter.reset(self)\r
- self.encoder = None\r
-\r
- def encode(self, input, errors='strict'):\r
- if self.encoder is None:\r
- result = codecs.utf_16_encode(input, errors)\r
- if sys.byteorder == 'little':\r
- self.encoder = codecs.utf_16_le_encode\r
- else:\r
- self.encoder = codecs.utf_16_be_encode\r
- return result\r
- else:\r
- return self.encoder(input, errors)\r
-\r
-class StreamReader(codecs.StreamReader):\r
-\r
- def reset(self):\r
- codecs.StreamReader.reset(self)\r
- try:\r
- del self.decode\r
- except AttributeError:\r
- pass\r
-\r
- def decode(self, input, errors='strict'):\r
- (object, consumed, byteorder) = \\r
- codecs.utf_16_ex_decode(input, errors, 0, False)\r
- if byteorder == -1:\r
- self.decode = codecs.utf_16_le_decode\r
- elif byteorder == 1:\r
- self.decode = codecs.utf_16_be_decode\r
- elif consumed>=2:\r
- raise UnicodeError,"UTF-16 stream does not start with BOM"\r
- return (object, consumed)\r
-\r
-### encodings module API\r
-\r
-def getregentry():\r
- return codecs.CodecInfo(\r
- name='utf-16',\r
- encode=encode,\r
- decode=decode,\r
- incrementalencoder=IncrementalEncoder,\r
- incrementaldecoder=IncrementalDecoder,\r
- streamreader=StreamReader,\r
- streamwriter=StreamWriter,\r
- )\r