⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htzip.c

📁 www工具包
💻 C
字号:
/***	ZIP ENCODING / DECODING MODULE****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTZip.c,v 2.8 1999/02/22 22:10:12 frystyk Exp $****	This module requires zlib in order to compile/link*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "WWWCore.h"#include "HTZip.h"					 /* Implemented here */#ifdef WWW_MSWINDOWS#define ZLIB_DLL#endif#include <zlib.h>#define OUTBUF_SIZE		32768struct _HTStream {    const HTStreamClass *	isa;    int				state;    HTRequest *			request;    HTStream *			target;			/* Our output target */    z_stream *			zstream;		      /* Zlib stream */    char 			outbuf [OUTBUF_SIZE]; 	    /* Inflated data */};PRIVATE int CompressionLevel = Z_DEFAULT_COMPRESSION;/* ------------------------------------------------------------------------- */PRIVATE BOOL Zlib_init (HTStream * me, int level){    if (me && me->zstream &&	(level == Z_DEFAULT_COMPRESSION ||	 (level >= Z_BEST_SPEED && level <= Z_BEST_COMPRESSION))) {	int status;	HTTRACE(STREAM_TRACE, "Zlib Inflate Init stream %p with compression level %d\n" _ me _ level);	if ((status = inflateInit(me->zstream)) != Z_OK) {	    HTTRACE(STREAM_TRACE, "Zlib........ Failed with status %d\n" _ status);	    return NO;	}	return YES;    }    return NO;}PRIVATE BOOL ZLib_terminate (HTStream * me){    HTTRACE(STREAM_TRACE, "Zlib Inflate Terminating stream %p\n" _ me);    if (me) {	int status;	HTTRACE(STREAM_TRACE, "Results..... Inflated incoming data: deflated %lu, inflated %lu, factor %.2f\n" _ 		    me->zstream->total_in _ me->zstream->total_out _ 		    me->zstream->total_in == 0 ? 0.0 :		    (double) me->zstream->total_out / me->zstream->total_in);	if ((status = inflateEnd(me->zstream)) != Z_OK) {	    HTTRACE(STREAM_TRACE, "Zlib........ Failed with status %d\n" _ status);	    return NO;	}	return YES;    }    return NO;}PRIVATE int HTZLibInflate_flush (HTStream * me){    return (*me->target->isa->flush)(me->target);}PRIVATE int HTZLibInflate_free (HTStream * me){    int status = HT_OK;    ZLib_terminate(me);    if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)	return HT_WOULD_BLOCK;    HTTRACE(STREAM_TRACE, "Zlib Inflate FREEING...\n");    HT_FREE(me->zstream);    HT_FREE(me);    return status;}PRIVATE int HTZLibInflate_abort (HTStream * me, HTList * e){    HTTRACE(STREAM_TRACE, "Zlib Inflate ABORTING...\n");    ZLib_terminate(me);    (*me->target->isa->abort)(me->target, NULL);    HT_FREE(me->zstream);    HT_FREE(me);    return HT_ERROR;}PRIVATE int HTZLibInflate_write (HTStream * me, const char * buf, int len){    if (me->state != HT_OK) {	me->state = (*me->target->isa->put_block)(me->target,						   me->outbuf,						   OUTBUF_SIZE - me->zstream->avail_out);	if (me->state != HT_OK) return me->state;    }    /*    **  Setup the zstream buffers to handle the new data    */    me->zstream->next_in = (unsigned char *) buf;    me->zstream->avail_in = len;    me->zstream->next_out = (unsigned char *) me->outbuf;    me->zstream->avail_out = OUTBUF_SIZE;        /*    ** Now run through the data and inflate it. We use Z_PARTIAL_FLUSH    ** in order to put as much data in the output buffer as quick as    ** possible.    */    for (;;) {	int status = inflate(me->zstream, Z_PARTIAL_FLUSH);	switch (status) {	case Z_OK:	    me->state = (*me->target->isa->put_block)(me->target,						       me->outbuf,						       OUTBUF_SIZE - me->zstream->avail_out);	    if (me->state != HT_OK) return me->state;	    /*	    **  All data was consumed and we are ready to handle the	    **  next data.	    */	    me->zstream->next_out = (unsigned char *) me->outbuf;	    me->zstream->avail_out = OUTBUF_SIZE;	    break;	case Z_MEM_ERROR:	    HT_OUTOFMEM("HTZLibInflate_write");	    return HT_ERROR;	case Z_BUF_ERROR:	    /*	    ** No action was taken anf we can take this as a sign ot it	    ** having finished all data in the input buffer.	    */	    return HT_OK;	case Z_STREAM_END:	    me->state = (*me->target->isa->put_block)(me->target,						       me->outbuf,						       OUTBUF_SIZE - me->zstream->avail_out);	    if (me->state != HT_OK) return me->state;	    HTTRACE(STREAM_TRACE, "Zlib Inflate End of Stream\n");	    return HT_OK;	default:	    HTTRACE(STREAM_TRACE, "Zlib Inflate Inflate returned %d\n" _ status);	    return HT_ERROR;	}    }    return HT_OK;}PRIVATE int HTZLibInflate_put_character (HTStream * me, char c){    return HTZLibInflate_write(me, &c, 1);}PRIVATE int HTZLibInflate_put_string (HTStream * me, const char * s){    return HTZLibInflate_write(me, s, (int) strlen(s));}PRIVATE const HTStreamClass HTInflate ={		    "ZlibInflate",    HTZLibInflate_flush,    HTZLibInflate_free,    HTZLibInflate_abort,    HTZLibInflate_put_character,    HTZLibInflate_put_string,    HTZLibInflate_write}; PUBLIC BOOL HTZLib_setCompressionLevel (int level){    if (level >= Z_BEST_SPEED && level <= Z_BEST_COMPRESSION) {	CompressionLevel = level;	HTTRACE(STREAM_TRACE, "Zlib........ Compression level set to %d\n" _ level);    }    return NO;}PUBLIC int HTZLib_compressionLevel (void){    return CompressionLevel;}PUBLIC HTStream * HTZLib_inflate (HTRequest *	request,				  void *	param,				  HTEncoding	coding,				  HTStream *	target){    HTStream * me = NULL;    if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL ||	(me->zstream = (z_stream *) HT_CALLOC(1, sizeof(z_stream))) == NULL)	HT_OUTOFMEM("HTZLib_inflate");    me->isa = &HTInflate;    me->state = HT_OK;    me->request = request;    me->target = target ? target : HTErrorStream();    if (Zlib_init(me, CompressionLevel) != YES) {	HT_FREE(me);	return HTErrorStream();    }    HTTRACE(STREAM_TRACE, "Zlib Inflate Stream created\n");    return me;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -