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

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

?? huffman-decompress.c

?? 自適應哈弗曼(adaptive huffman)壓縮和解壓程序
?? C
字號:
/*
 * File:      huffman-decompress.c
 * Author:    JD, with a bit of code pirated from a 2103 student
 * Date:      2008-02-03
 * Version:   1.1
 *
 * Description: decompress the output of the huffman-compress program
 *	to obtain a copy of the original file.  This program reads in
 *	either stdin or the given file argument and decompresses this
 *	data.  The output is written to stdout (if the input was stdin) and
 *	is otherwise written to the same file name as the original with
 *	".dehuf" appended.
 *
 *	If the first argument is "-a", the input codes (but not the
 *	overhead data) are assumed to be written in ASCII, one code per
 *	line.
 */


#include    <stdio.h>
#include    <stdlib.h>
#include    <stdint.h>	    /* C99 */
#include    <ctype.h>
#include    <string.h>


#define	    NUM_SYMBOLS	    256
#define	    NUM_ITEMS       (2 * NUM_SYMBOLS - 1)
#define	    MAX_NUM_MERGES  (NUM_SYMBOLS - 1)
#define	    NO_MORE         (-1)
#define     NO_PARENT	    (-1)
#define     NO_CHILD	    (-1)


typedef struct
{
    unsigned int count;
    short parent_index;
    short left_child_index, right_child_index;
    short code_length;
    char code[MAX_NUM_MERGES];
    char merged;
    char left_or_right;		    /* left or right child of parent? */
} Item_t;


int read_bit(int * bit);
int get_smallest(Item_t items[], int length);
int parse_args(int argc, char * argv[], int * ascii_input);
int read_header(Item_t items[], unsigned long * total_chars, int ascii_input);



void
usage(const char * progname)
{
    fprintf(stderr, "Usage: %s [-a] [infile]\n", progname);
}



int
main(int argc, char * argv[])
{
    int i, next_item, root_index, this_node, next_bit;
    int small1, small2;
    unsigned long total_chars;
    Item_t items[NUM_ITEMS];
    int ascii_input = 0;

    if (parse_args(argc, argv, &ascii_input) != 0)
	return EXIT_FAILURE;

    for (i = 0; i < NUM_ITEMS; i++)
    {
	items[i].count = 0;
	items[i].merged = 0;
	items[i].parent_index = NO_PARENT;      
	items[i].left_child_index = NO_CHILD;      
	items[i].right_child_index = NO_CHILD;      
    }

    if (read_header(items, &total_chars, ascii_input) != 0)
    {
	fprintf(stderr, "%s: invalid header in compressed input\n", argv[0]);
	return EXIT_FAILURE;
    }

#ifdef DEBUG
    /* Output the counts */
    for (i = 0; i < NUM_SYMBOLS; i++)
	printf("count %d: %d\n", i, items[i].count);
#endif

    /* Merge the items */
    next_item = NUM_SYMBOLS;
    while (1)
    {
	small1 = get_smallest(items, NUM_ITEMS);
	if (small1 == NO_MORE)
	    break;
	items[small1].merged = 1;

	small2 = get_smallest(items, NUM_ITEMS);
	if (small2 == NO_MORE)
	    break;
	items[small2].merged = 1;

	items[small1].left_or_right = 0;
	items[small1].parent_index = next_item;

	items[small2].left_or_right = 1;
	items[small2].parent_index = next_item;

	items[next_item].count = items[small1].count + items[small2].count;
	items[next_item].left_child_index = small1;
	items[next_item].right_child_index = small2;
	next_item++;
    }

    if (next_item == NUM_SYMBOLS)
    {
	/* There was only one symbol in the input! Special case! */
	/* fprintf(stderr, "small1 is %d\n", small1); */
	for (i = 0; i < items[small1].count; i++)
	    putchar(small1);
	
	return EXIT_SUCCESS;
    }

    root_index = next_item - 1;
    this_node = root_index;
    if (ascii_input)
    {
	getchar();  /* Toss away '\n' which follows the counts */
	while ((next_bit = getchar()) != EOF && total_chars > 0)
	{
#ifdef DEBUG
	    printf("%d ", next_bit);
#endif
	    if (next_bit == '0')
		this_node = items[this_node].left_child_index;
	    else
		this_node = items[this_node].right_child_index;

	    if (items[this_node].left_child_index == NO_CHILD)
	    {
		putchar(this_node);
		this_node = root_index;
		total_chars--;
		getchar();  /* Toss away '\n' which follows the code */
	    }
	}
    }
    else
    {
	while (read_bit(&next_bit) == 0 && total_chars > 0)
	{
#ifdef DEBUG
	    printf("%d ", next_bit);
#endif
	    if (next_bit == 0)
		this_node = items[this_node].left_child_index;
	    else
		this_node = items[this_node].right_child_index;

	    if (items[this_node].left_child_index == NO_CHILD)
	    {
		putchar(this_node);
		this_node = root_index;
		total_chars--;
	    }
	}
    }

    return EXIT_SUCCESS;
}



/*
 * Function:  parse_args
 * Purpose:   Examine the arguments and freopen() streams as necessary.
 * Inputs:    argc, argv and a pointer to an int
 * Returns:   0 on success, non-zero on failure
 *
 * Error checking: enough...
 * Sample usage: parse_args(argc, argv, &use_ascii_input);
 */

int
parse_args(int argc, char * argv[], int * ascii_input)
{
    char * progname = argv[0];

    if (argc > 1 && 0 == strcmp(argv[1], "-a"))
    {
	*ascii_input = 1;
	argc--;
	argv++;
    }
    if (argc > 2)
    {
	usage(argv[0]);
	return 1;
    }
    if (argc > 1)
    {
	char * outfile;

	if (freopen(argv[1], "r", stdin) == NULL)
	{
	    fprintf(stderr, "%s: unable to open input file '%s' for reading\n",
		    progname, argv[1]);
	    return 2;
	}
	outfile = malloc(strlen(argv[1] + 7));
	if (outfile == NULL)
	{
	    fprintf(stderr, "%s: unable to allocate memory; quitting\n",
		    progname);
	    return 3;
	}
	strcpy(outfile, argv[1]);
	strcat(outfile, ".dehuf");
	if (freopen(outfile, "w", stdout) == NULL)
	{
	    fprintf(stderr, "%s: unable to open output file '%s' for writing\n",
		    progname, outfile);
	    return 4;
	}
    }

    return 0;
}



/*
 * Function:  get_smallest
 * Purpose:   Gets the un-merged item with the smallest count.
 * Inputs:    items[] and length
 * Returns:   0 on success, non-0 otherwise
 * Assumption: item counts are initialized to 0
 *
 * Error checking: none
 * Sample usage: get_smallest(items, MAX);
 */

int
read_header(Item_t items[], unsigned long * total_chars, int ascii_input)
{
    int i, min_symb, max_symb;
    unsigned char data_type;

    *total_chars = 0;
    fread(&min_symb, sizeof(min_symb), 1, stdin);
    fread(&max_symb, sizeof(max_symb), 1, stdin);
    data_type = fgetc(stdin);
    if (data_type == 'b')
    {
	unsigned char byte;

	for (i = min_symb; i <= max_symb; i++)
	{
	    fread(&byte, sizeof(byte), 1, stdin);
	    items[i].count = byte;
	    *total_chars += items[i].count;
	}
    }
    else if (data_type == 'h')
    {
	uint16_t halfword;

	for (i = min_symb; i <= max_symb; i++)
	{
	    fread(&halfword, sizeof(halfword), 1, stdin);
	    items[i].count = halfword;
	    *total_chars += items[i].count;
	}
    }
    else if (data_type == 'w')
    {
	uint32_t word;

	for (i = min_symb; i <= max_symb; i++)
	{
	    fread(&word, sizeof(word), 1, stdin);
	    items[i].count = word;
	    *total_chars += items[i].count;
	}
    }
    else
	return 1;

    return 0;
}



/*
 * Function:  get_smallest
 * Purpose:   Gets the un-merged item with the smallest count.
 * Inputs:    items[] and length
 * Returns:   an int >= 0 or NO_MORE (NO_MORE if all items are merged)
 *
 * Error checking: none
 * Sample usage: get_smallest(items, MAX);
 */

int
get_smallest(Item_t items[], int length)
{
    int smallest = NO_MORE;      /* Smallest item index */
    int i;

    for (i = 0; i < length; i++)
    {
	if (items[i].merged || items[i].count == 0)
	    continue;

	if (smallest == NO_MORE)
	    smallest = i;
	else if (items[i].count < items[smallest].count)
	    smallest = i;
    }

    return smallest;
}


static unsigned char byte = 0;
static int bits_available = 0;

int read_bit(int * bit)
{
    if (bits_available == 0)
    {
	if (fread(&byte, sizeof(byte), 1, stdin) != 1)
	    return 1;
	bits_available = 8;
    }

    *bit = byte >> 7;
    byte <<= 1;
    bits_available--;

    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本成人在线观看| 不卡的电视剧免费网站有什么| 欧美体内she精高潮| 亚洲女与黑人做爰| 91高清视频在线| 亚洲精品中文在线观看| 95精品视频在线| 亚洲精品水蜜桃| 欧美日免费三级在线| 亚洲成a人v欧美综合天堂下载| 欧美在线播放高清精品| 亚洲国产日韩av| 日韩精品一区二区在线观看| 精品一区二区在线视频| 国产亚洲午夜高清国产拍精品| 国产suv精品一区二区三区| 成人免费在线观看入口| 欧美影院一区二区三区| 免费在线欧美视频| 国产三级久久久| 91黄色免费版| 美女一区二区视频| 欧美国产一区二区在线观看| 不卡的av中国片| 午夜天堂影视香蕉久久| 精品国产不卡一区二区三区| 高清国产一区二区| 亚洲va韩国va欧美va精品| 久久精品一区八戒影视| 99精品视频在线观看| 日本少妇一区二区| 国产精品沙发午睡系列990531| 91女厕偷拍女厕偷拍高清| 日韩高清一区二区| 欧美国产97人人爽人人喊| 精品婷婷伊人一区三区三| 精品一区二区久久久| 亚洲激情六月丁香| 精品国产一二三区| 在线亚洲+欧美+日本专区| 久久激五月天综合精品| 亚洲免费观看高清完整版在线 | 国产一区二区在线影院| 亚洲欧美影音先锋| 久久亚洲二区三区| 欧美日韩不卡一区二区| 国产91富婆露脸刺激对白| 日韩在线一区二区| 国产精品成人在线观看| 日韩精品一区二区三区老鸭窝 | 精品一区在线看| 亚洲成av人综合在线观看| 1区2区3区国产精品| 欧美大尺度电影在线| 在线精品亚洲一区二区不卡| 丁香婷婷综合五月| 另类人妖一区二区av| 一区二区三区 在线观看视频| 久久综合九色综合97_久久久| 在线精品视频一区二区| jizz一区二区| 国产精品88888| 麻豆国产精品视频| 石原莉奈在线亚洲三区| 亚洲激情一二三区| 亚洲视频免费在线| 欧美国产一区在线| 国产欧美一区二区精品性色| 欧美大片免费久久精品三p| 欧美日韩一区中文字幕| 日本韩国欧美一区二区三区| 岛国一区二区在线观看| 国产一区二区在线看| 奇米影视一区二区三区| 日精品一区二区| 亚洲成人精品在线观看| 亚洲六月丁香色婷婷综合久久 | 免费看欧美女人艹b| 午夜伦理一区二区| 亚洲va韩国va欧美va精品| 亚洲国产日日夜夜| 亚洲成va人在线观看| 午夜欧美一区二区三区在线播放| 亚洲综合在线五月| 伊人婷婷欧美激情| 亚洲高清免费视频| 日韩精品亚洲一区二区三区免费| 午夜精品视频一区| 日韩av网站在线观看| 日韩av在线免费观看不卡| 午夜成人在线视频| 免费人成黄页网站在线一区二区| 免费高清在线一区| 国产在线日韩欧美| 国产成人精品免费视频网站| 国产不卡免费视频| 一本色道久久加勒比精品| 色悠久久久久综合欧美99| 欧美在线综合视频| 在线播放亚洲一区| 精品国产一区二区在线观看| 欧美激情一区二区三区四区| 亚洲天堂免费看| 亚洲成人综合网站| 国内精品视频一区二区三区八戒| 国产一区二区免费看| 99re成人精品视频| 欧美日韩你懂得| 欧美成人a视频| 中文字幕av一区二区三区| 亚洲一区二区成人在线观看| 五月激情综合婷婷| 成人激情免费视频| 精品视频123区在线观看| 欧美videos中文字幕| 18成人在线观看| 日韩专区中文字幕一区二区| 国产一区二区三区蝌蚪| 一本色道久久综合亚洲aⅴ蜜桃 | 成人蜜臀av电影| 欧美日韩午夜在线| 久久久精品欧美丰满| 亚洲主播在线播放| 国产麻豆精品theporn| 91丨porny丨中文| 日韩女优av电影| 最新欧美精品一区二区三区| 水野朝阳av一区二区三区| 99久久精品国产毛片| 欧美一区二区成人| 亚洲欧洲综合另类| 国产在线精品一区二区不卡了| 91色在线porny| 26uuu精品一区二区| 亚洲午夜久久久久久久久电影网 | 亚洲欧洲日产国码二区| 国产欧美日韩三级| 日韩国产欧美在线播放| av不卡免费在线观看| 7777精品伊人久久久大香线蕉的| 国产精品伦一区| 日韩电影免费在线| 99综合影院在线| 日韩免费高清av| 国产精品国产三级国产aⅴ无密码| 亚洲福中文字幕伊人影院| 国产精品77777| 欧美人伦禁忌dvd放荡欲情| 精品国产乱码久久久久久久久| 亚洲在线免费播放| 国产大陆亚洲精品国产| 欧美精品 日韩| 1024国产精品| 极品销魂美女一区二区三区| 欧美疯狂性受xxxxx喷水图片| 国产日产欧美一区| 久久精品国产99| 欧美三级日本三级少妇99| 亚洲三级在线免费| 国产一区二区三区四| 欧美日韩精品系列| 国产精品久久毛片a| 美洲天堂一区二卡三卡四卡视频| 99久精品国产| 亚洲国产成人午夜在线一区| 蜜臀av在线播放一区二区三区| 激情综合亚洲精品| 日韩久久免费av| 午夜精品福利视频网站| 成人激情开心网| 中文久久乱码一区二区| 国模少妇一区二区三区| 日韩欧美成人激情| 日韩高清欧美激情| 91在线精品一区二区三区| 国产精品毛片大码女人 | 午夜精品福利久久久| 在线亚洲+欧美+日本专区| 成人欧美一区二区三区小说| 国产91精品入口| 久久久久九九视频| 国产真实乱偷精品视频免| 日韩欧美区一区二| 久久99精品一区二区三区三区| 在线成人高清不卡| 精品一区二区在线看| 国产网站一区二区| eeuss鲁一区二区三区| 亚洲色图一区二区三区| 欧美亚洲国产bt| 水野朝阳av一区二区三区| 精品久久久三级丝袜| 成人夜色视频网站在线观看| 亚洲国产高清aⅴ视频| 成人高清视频在线| 亚洲一线二线三线久久久| 欧美日韩国产不卡| 青青草成人在线观看| 欧美videossexotv100| 成人avav在线|