亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? inflate.c

?? windows gzip source code
?? C
字號:
//
// inflate.c
//
// Decompressor
//
#include <crtdbg.h>
#include <stdio.h>
#include "inflate.h"
#include "infmacro.h"
#include "infgzip.h"
#include "maketbl.h"


//
// Local function prototypes
//
static BOOL	decodeBlock(t_decoder_context *context);
static BOOL makeTables(t_decoder_context *context);


HRESULT WINAPI Decompress(
	PVOID				void_context,
	CONST BYTE *		input, 
	LONG				input_size,
	BYTE *				output, 
	LONG				output_size,
	PLONG				input_used,
	PLONG				output_used
)
{
	t_decoder_context *context = (t_decoder_context *) void_context;

	context->input_curpos		= input;
	context->end_input_buffer	= input + input_size;
	context->output_curpos		= output;
	context->end_output_buffer	= output + output_size;
	context->output_buffer		= output;

	//
	// Keep decoding blocks until the output fills up, we read all the input, or we enter
    // the "done" state
	//
    // Note that INPUT_EOF() is not a sufficient check for determining that all the input
    // has been used; there could be an additional block stored entirely in the bit buffer.
    // For this reason, if we're in the READING_BFINAL state (start of new block) after
    // calling decodeBlock(), don't quit the loop unless there is truly no input left in
    // the bit buffer.
    //
	while ( (context->output_curpos < context->end_output_buffer) && 
            (!INPUT_EOF()) && 
            (context->state != STATE_DONE && context->state != STATE_VERIFYING_GZIP_FOOTER)
          )
	{
retry:
		if (decodeBlock(context) == FALSE)
		{
			*input_used = 0;
			*output_used = 0;
			return E_FAIL;
		}

        // No more input bytes, but am starting a new block and there's at least one bit
        // in the bit buffer
        if (context->state == STATE_READING_BFINAL && INPUT_EOF() && context->bitcount > -16)
            goto retry;
	}

	*input_used  = (long) (context->input_curpos - input);
	*output_used = (long) (context->output_curpos - output);

    if (context->using_gzip)
    {
        // Calculate the crc32 of everything we just decompressed, and then, if our state
        // is STATE_DONE, verify the crc
        if (*output_used > 0)
        {
            context->gzip_crc32 = GzipCRC32(context->gzip_crc32, output, *output_used);
            context->gzip_output_stream_size += (*output_used);
        }

        if (context->state == STATE_VERIFYING_GZIP_FOOTER)
        {
            context->state = STATE_DONE;

            // Now do our crc/input size check
            if (context->gzip_crc32 != context->gzip_footer_crc32 ||
                context->gzip_output_stream_size != context->gzip_footer_output_stream_size)
            {
               	*input_used = 0;
	            *output_used = 0;
        		return E_FAIL;
            }
        }
    }

	if (*input_used == 0 && *output_used == 0)
    {
        if (context->state == STATE_DONE)
		    return S_FALSE; // End of compressed data
        else
            return E_FAIL; // Avoid infinite loops
    }
	else
    {
		return S_OK;
    }
}


//
// Returns TRUE for success, FALSE for an error of some kind (invalid data)
//
static BOOL decodeBlock(t_decoder_context *context)
{
	BOOL eob, result;

    if (context->state == STATE_DONE || context->state == STATE_VERIFYING_GZIP_FOOTER)
        return TRUE;

    if (context->using_gzip)
    {
        if (context->state == STATE_READING_GZIP_HEADER)
        {
            if (ReadGzipHeader(context) == FALSE)
                return FALSE;

            // If we're still reading the GZIP header it means we ran out of input
            if (context->state == STATE_READING_GZIP_HEADER)
                return TRUE;
        }

        if (context->state == STATE_START_READING_GZIP_FOOTER || context->state == STATE_READING_GZIP_FOOTER)
        {
            if (ReadGzipFooter(context) == FALSE)
                return FALSE;

            // Whether we ran out of input or not, return
            return TRUE;
        }
    }

	//
	// Do we need to fill our bit buffer?
	//
	// This will happen the very first time we call Decompress(), as well as after decoding
	// an uncompressed block
	//
	if (context->state == STATE_READING_BFINAL_NEED_TO_INIT_BITBUF)
	{
		//
		// If we didn't have enough bits to init, return
		//
		if (initBitBuffer(context) == FALSE)
			return TRUE;
	}

	//
	// Need to read bfinal bit
	//
	if (context->state == STATE_READING_BFINAL)
	{
		// Need 1 bit
		if (ensureBitsContext(context, 1) == FALSE)
			return TRUE;

		context->bfinal	= getBits(context, 1);
		context->state = STATE_READING_BTYPE;
	}

	if (context->state == STATE_READING_BTYPE)
	{
		// Need 2 bits
		if (ensureBitsContext(context, 2) == FALSE)
			return TRUE;

		context->btype = getBits(context, 2);

		if (context->btype == BLOCKTYPE_DYNAMIC)
		{
			context->state = STATE_READING_NUM_LIT_CODES;
		}
		else if (context->btype == BLOCKTYPE_FIXED)
		{
			context->state = STATE_DECODE_TOP;
		}
		else if (context->btype == BLOCKTYPE_UNCOMPRESSED)
		{
			context->state = STATE_UNCOMPRESSED_ALIGNING;
		}
		else
		{
            // unsupported compression mode
			return FALSE;
		}
	}

	if (context->btype == BLOCKTYPE_DYNAMIC)
	{
		if (context->state < STATE_DECODE_TOP)
		{
			if (readDynamicBlockHeader(context) == FALSE)
				return FALSE;

			if (context->state == STATE_DECODE_TOP)
			{
				if (makeTables(context) == FALSE)
					return FALSE; // bad tables
			}
            else
            {
                return TRUE; // not enough input
            }
		}

		result = DecodeDynamicBlock(context, &eob);

		if (eob)
			context->state = STATE_READING_BFINAL;
	}
	else if (context->btype == BLOCKTYPE_FIXED)
	{
		result = DecodeStaticBlock(context, &eob);

		if (eob)
			context->state = STATE_READING_BFINAL;
	}
	else if (context->btype == BLOCKTYPE_UNCOMPRESSED)
	{
		result = decodeUncompressedBlock(context, &eob);
	}
	else
	{
		//
		// Invalid block type
		//
		return FALSE;
	}

    //
    // If we reached the end of the block and the block we were decoding had
    // bfinal=1 (final block)
    //
	if (eob && context->bfinal)
    {
        if (context->using_gzip)
    		context->state = STATE_START_READING_GZIP_FOOTER;
        else
            context->state = STATE_DONE;
    }

	return result;
}


//
// Will throw an exception if a corrupt table is detected
//
static BOOL makeTables(t_decoder_context *context) 
{
	if (makeTable(
		MAX_LITERAL_TREE_ELEMENTS,
		LITERAL_TABLE_BITS,
		context->literal_tree_code_length,
		context->literal_table,
		context->literal_left,
		context->literal_right) == FALSE)
		return FALSE;

	return makeTable(
		MAX_DIST_TREE_ELEMENTS,
		DISTANCE_TABLE_BITS,
		context->distance_tree_code_length,
		context->distance_table,
		context->distance_left,
		context->distance_right
	);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清电影一区| 激情久久久久久久久久久久久久久久| 欧美欧美欧美欧美首页| 国产一区不卡精品| 亚洲成人av福利| 国产精品国产三级国产aⅴ无密码| 欧美久久婷婷综合色| av一区二区三区四区| 韩国av一区二区三区在线观看| 一区二区高清视频在线观看| 国产亚洲综合性久久久影院| 欧美日韩一本到| 成人午夜私人影院| 国产精品一区二区三区99| 日韩1区2区3区| 亚洲超碰精品一区二区| 亚洲欧美日韩综合aⅴ视频| 欧美极品美女视频| 久久久久久久久久久黄色| 555夜色666亚洲国产免| 欧美性淫爽ww久久久久无| yourporn久久国产精品| 懂色av一区二区三区免费观看| 日韩黄色在线观看| 狠狠色丁香九九婷婷综合五月| 一区二区在线观看免费视频播放| 日本一区二区三区视频视频| 久久亚洲综合色| 精品久久久久久久久久久院品网 | 亚洲国产中文字幕| 一区二区三区自拍| 最新国产の精品合集bt伙计| 日本一区二区三级电影在线观看| 久久一区二区三区四区| 精品奇米国产一区二区三区| 欧美大度的电影原声| 欧美大片免费久久精品三p| 日韩一区二区三区电影在线观看| 欧美三级日本三级少妇99| 欧美在线短视频| 91啪亚洲精品| 色8久久精品久久久久久蜜| 成人福利视频网站| 99免费精品视频| 91在线观看高清| 一本大道久久a久久精二百| 91视频免费播放| 欧美在线影院一区二区| 欧美亚洲一区二区在线| 欧美另类变人与禽xxxxx| 欧美精品日韩综合在线| 日韩一区二区麻豆国产| 日韩一区二区麻豆国产| www激情久久| 国产精品久久久久aaaa樱花| 日韩伦理免费电影| 亚洲午夜久久久久中文字幕久| 亚洲一本大道在线| 久久精品国产免费| 国产黄色精品网站| 色综合一区二区| 欧美日韩一区二区电影| 欧美sm极限捆绑bd| 国产人成亚洲第一网站在线播放 | 一本色道久久加勒比精品| 欧美亚洲精品一区| 日韩欧美在线1卡| 国产亚洲福利社区一区| 亚洲视频一区在线| 日韩国产欧美在线播放| 国产精品91xxx| 91原创在线视频| 69久久夜色精品国产69蝌蚪网| 精品久久久久99| 成人欧美一区二区三区黑人麻豆 | 久久国产生活片100| 国产白丝精品91爽爽久久| 91天堂素人约啪| 欧美一区二区三区影视| 欧美韩国日本不卡| 香蕉成人伊视频在线观看| 国产一区在线视频| 在线观看日产精品| 久久免费电影网| 亚洲超碰精品一区二区| 国产成人免费视| 欧美日韩国产一级二级| 国产亚洲欧美色| 亚洲成人中文在线| gogogo免费视频观看亚洲一| 制服丝袜在线91| 亚洲视频小说图片| 韩国女主播成人在线| 在线精品视频小说1| 久久亚洲精品国产精品紫薇| 亚洲一区二区三区四区在线观看 | 亚洲人成影院在线观看| 日本在线不卡视频| 91在线观看污| 国产午夜精品久久久久久免费视| 图片区小说区区亚洲影院| 成人激情动漫在线观看| 日韩免费观看高清完整版| 一区二区三区欧美在线观看| 国产激情精品久久久第一区二区 | 国产在线精品一区二区不卡了 | 日韩欧美专区在线| 亚洲午夜一二三区视频| www.欧美精品一二区| 欧美一区二区三区免费观看视频| 日韩一区在线播放| 国产suv精品一区二区883| 日韩一区二区三区电影在线观看| 亚洲国产一区二区三区| 97se亚洲国产综合自在线| www国产成人免费观看视频 深夜成人网| 亚洲国产欧美另类丝袜| 91久久精品日日躁夜夜躁欧美| 国产女人18水真多18精品一级做| 毛片av一区二区三区| 国模冰冰炮一区二区| 日韩一区二区三区精品视频 | 午夜欧美电影在线观看| 91丨porny丨在线| 国产精品黄色在线观看| 成人免费毛片嘿嘿连载视频| 国产亚洲精品超碰| 国产乱淫av一区二区三区| 日韩女同互慰一区二区| 免费xxxx性欧美18vr| 欧美一区二区三区四区五区| 五月激情综合色| 91精品国产入口| 日韩电影在线一区| 欧美丰满美乳xxx高潮www| 天天av天天翘天天综合网色鬼国产| 欧美在线一二三四区| 亚洲午夜免费视频| 欧美午夜精品免费| 亚洲第四色夜色| 日韩欧美亚洲国产另类| 久久97超碰色| 国产亚洲精品久| 99久久精品免费| 一区二区三区影院| 欧美三级午夜理伦三级中视频| 亚洲精品国产a| 欧美日韩国产另类不卡| 免费观看一级特黄欧美大片| 精品福利一区二区三区| 国产一区二区在线视频| 欧美国产一区二区| 色综合天天做天天爱| 亚洲一区二区视频在线| 欧美精品日韩精品| 久久精品999| 国产视频亚洲色图| 色噜噜狠狠色综合欧洲selulu| 一区二区三区日韩欧美| 制服丝袜国产精品| 国产乱对白刺激视频不卡| 国产精品入口麻豆原神| 欧美三级乱人伦电影| 久久精品国产77777蜜臀| 欧美国产禁国产网站cc| 欧美性感一区二区三区| 日韩电影在线免费看| 国产欧美日韩三区| 91国产精品成人| 久久99精品国产麻豆婷婷洗澡| 久久色中文字幕| 欧美亚洲综合一区| 国产一区二三区| 一区二区三区在线观看动漫| 日韩免费看的电影| 色综合久久久久| 麻豆精品一区二区| 专区另类欧美日韩| 日韩小视频在线观看专区| 成人免费视频一区二区| 日韩精品电影在线| 中文字幕欧美日韩一区| 在线91免费看| 97超碰欧美中文字幕| 久久99在线观看| 一区二区三区四区中文字幕| ww亚洲ww在线观看国产| 欧美在线看片a免费观看| 国产主播一区二区三区| 亚洲一区av在线| 国产精品欧美久久久久无广告| 欧美精品色综合| 色综合一区二区三区| 国产乱国产乱300精品| 视频在线在亚洲| 国产精品国产三级国产三级人妇 | 欧美一卡二卡三卡| 99久久99久久精品国产片果冻| 狠狠狠色丁香婷婷综合激情| 亚洲成人av免费|