mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """Python 'zlib_codec' Codec - zlib compression encoding.
 | ||
|  | 
 | ||
|  | This codec de/encodes from bytes to bytes and is therefore usable with | ||
|  | bytes.transform() and bytes.untransform(). | ||
|  | 
 | ||
|  | Written by Marc-Andre Lemburg (mal@lemburg.com). | ||
|  | """
 | ||
|  | 
 | ||
|  | import codecs | ||
|  | import zlib # this codec needs the optional zlib module ! | ||
|  | 
 | ||
|  | ### Codec APIs | ||
|  | 
 | ||
|  | def zlib_encode(input, errors='strict'): | ||
|  |     assert errors == 'strict' | ||
|  |     return (zlib.compress(input), len(input)) | ||
|  | 
 | ||
|  | def zlib_decode(input, errors='strict'): | ||
|  |     assert errors == 'strict' | ||
|  |     return (zlib.decompress(input), len(input)) | ||
|  | 
 | ||
|  | class Codec(codecs.Codec): | ||
|  |     def encode(self, input, errors='strict'): | ||
|  |         return zlib_encode(input, errors) | ||
|  |     def decode(self, input, errors='strict'): | ||
|  |         return zlib_decode(input, errors) | ||
|  | 
 | ||
|  | class IncrementalEncoder(codecs.IncrementalEncoder): | ||
|  |     def __init__(self, errors='strict'): | ||
|  |         assert errors == 'strict' | ||
|  |         self.errors = errors | ||
|  |         self.compressobj = zlib.compressobj() | ||
|  | 
 | ||
|  |     def encode(self, input, final=False): | ||
|  |         if final: | ||
|  |             c = self.compressobj.compress(input) | ||
|  |             return c + self.compressobj.flush() | ||
|  |         else: | ||
|  |             return self.compressobj.compress(input) | ||
|  | 
 | ||
|  |     def reset(self): | ||
|  |         self.compressobj = zlib.compressobj() | ||
|  | 
 | ||
|  | class IncrementalDecoder(codecs.IncrementalDecoder): | ||
|  |     def __init__(self, errors='strict'): | ||
|  |         assert errors == 'strict' | ||
|  |         self.errors = errors | ||
|  |         self.decompressobj = zlib.decompressobj() | ||
|  | 
 | ||
|  |     def decode(self, input, final=False): | ||
|  |         if final: | ||
|  |             c = self.decompressobj.decompress(input) | ||
|  |             return c + self.decompressobj.flush() | ||
|  |         else: | ||
|  |             return self.decompressobj.decompress(input) | ||
|  | 
 | ||
|  |     def reset(self): | ||
|  |         self.decompressobj = zlib.decompressobj() | ||
|  | 
 | ||
|  | class StreamWriter(Codec, codecs.StreamWriter): | ||
|  |     charbuffertype = bytes | ||
|  | 
 | ||
|  | class StreamReader(Codec, codecs.StreamReader): | ||
|  |     charbuffertype = bytes | ||
|  | 
 | ||
|  | ### encodings module API | ||
|  | 
 | ||
|  | def getregentry(): | ||
|  |     return codecs.CodecInfo( | ||
|  |         name='zlib', | ||
|  |         encode=zlib_encode, | ||
|  |         decode=zlib_decode, | ||
|  |         incrementalencoder=IncrementalEncoder, | ||
|  |         incrementaldecoder=IncrementalDecoder, | ||
|  |         streamreader=StreamReader, | ||
|  |         streamwriter=StreamWriter, | ||
|  |     ) |