--- /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