mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* compress.c -- compress a memory buffer
 | 
						|
 * Copyright (C) 1995-2005 Jean-loup Gailly.
 | 
						|
 * For conditions of distribution and use, see copyright notice in zlib.h
 | 
						|
 */
 | 
						|
 | 
						|
/* @(#) $Id$ */
 | 
						|
 | 
						|
#define ZLIB_INTERNAL
 | 
						|
#include "zlib.h"
 | 
						|
 | 
						|
/* ===========================================================================
 | 
						|
     Compresses the source buffer into the destination buffer. The level
 | 
						|
   parameter has the same meaning as in deflateInit.  sourceLen is the byte
 | 
						|
   length of the source buffer. Upon entry, destLen is the total size of the
 | 
						|
   destination buffer, which must be at least 0.1% larger than sourceLen plus
 | 
						|
   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
 | 
						|
 | 
						|
     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
 | 
						|
   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
 | 
						|
   Z_STREAM_ERROR if the level parameter is invalid.
 | 
						|
*/
 | 
						|
int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
 | 
						|
    Bytef *dest;
 | 
						|
    uLongf *destLen;
 | 
						|
    const Bytef *source;
 | 
						|
    uLong sourceLen;
 | 
						|
    int level;
 | 
						|
{
 | 
						|
    z_stream stream;
 | 
						|
    int err;
 | 
						|
 | 
						|
    stream.next_in = (Bytef*)source;
 | 
						|
    stream.avail_in = (uInt)sourceLen;
 | 
						|
#ifdef MAXSEG_64K
 | 
						|
    /* Check for source > 64K on 16-bit machine: */
 | 
						|
    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
 | 
						|
#endif
 | 
						|
    stream.next_out = dest;
 | 
						|
    stream.avail_out = (uInt)*destLen;
 | 
						|
    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
 | 
						|
 | 
						|
    stream.zalloc = (alloc_func)0;
 | 
						|
    stream.zfree = (free_func)0;
 | 
						|
    stream.opaque = (voidpf)0;
 | 
						|
 | 
						|
    err = deflateInit(&stream, level);
 | 
						|
    if (err != Z_OK) return err;
 | 
						|
 | 
						|
    err = deflate(&stream, Z_FINISH);
 | 
						|
    if (err != Z_STREAM_END) {
 | 
						|
        deflateEnd(&stream);
 | 
						|
        return err == Z_OK ? Z_BUF_ERROR : err;
 | 
						|
    }
 | 
						|
    *destLen = stream.total_out;
 | 
						|
 | 
						|
    err = deflateEnd(&stream);
 | 
						|
    return err;
 | 
						|
}
 | 
						|
 | 
						|
/* ===========================================================================
 | 
						|
 */
 | 
						|
int ZEXPORT compress (dest, destLen, source, sourceLen)
 | 
						|
    Bytef *dest;
 | 
						|
    uLongf *destLen;
 | 
						|
    const Bytef *source;
 | 
						|
    uLong sourceLen;
 | 
						|
{
 | 
						|
    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
 | 
						|
}
 | 
						|
 | 
						|
/* ===========================================================================
 | 
						|
     If the default memLevel or windowBits for deflateInit() is changed, then
 | 
						|
   this function needs to be updated.
 | 
						|
 */
 | 
						|
uLong ZEXPORT compressBound (sourceLen)
 | 
						|
    uLong sourceLen;
 | 
						|
{
 | 
						|
    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
 | 
						|
           (sourceLen >> 25) + 13;
 | 
						|
}
 |