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

📄 arcusq.c

📁 汇编大全 中国矿业大学计算机学院 汇编实验5
💻 C
字号:
/* * $Header: arcusq.c,v 1.2 88/06/02 16:27:44 hyc Locked $ *//* * ARC - Archive utility - ARCUSQ *  * Version 3.14, created on 07/25/86 at 13:04:19 *  * (C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED *  * By:  Thom Henderson *  * Description: This file contains the routines used to expand a file which was * packed using Huffman squeezing. *  * Most of this code is taken from an USQ program by Richard Greenlaw, which was * adapted to CI-C86 by Robert J. Beilstein. *  * Language: Computer Innovations Optimizing C86 */#include <stdio.h>#include "arc.h"void	abort();int	getc_unp();/* stuff for Huffman unsqueezing */#define ERROR (-1)#define SPEOF 256		/* special endfile token */#define NUMVALS 257		/* 256 data values plus SPEOF */extern	struct nd {		/* decoding tree */	int	child[2];	/* left, right */}               node[NUMVALS];	/* use large buffer */static int      bpos;		/* last bit position read */static int      curin;		/* last byte value read */static int      numnodes;	/* number of nodes in decode tree */static          shortget_int(f)			/* get a 16bit integer */	FILE           *f;	/* file to get it from */{	int	i,j;	i = getc_unp(f);	j = getc_unp(f) << 8;	return (i | j) & 0xFFFF;}voidinit_usq(f)			/* initialize Huffman unsqueezing */	FILE           *f;	/* file containing squeezed data */{	int             i;	/* node index */	bpos = 99;		/* force initial read */	numnodes = get_int(f);	if (numnodes < 0 || numnodes >= NUMVALS)		abort("File has an invalid decode tree");	/* initialize for possible empty tree (SPEOF only) */	node[0].child[0] = -(SPEOF + 1);	node[0].child[1] = -(SPEOF + 1);	for (i = 0; i < numnodes; ++i) {	/* get decoding tree from						 * file */		node[i].child[0] = get_int(f);		node[i].child[1] = get_int(f);	}}intgetc_usq(f)			/* get byte from squeezed file */	FILE           *f;	/* file containing squeezed data */{	int             i;	/* tree index */	/* follow bit stream in tree to a leaf */	for (i = 0; i >= 0;) {	/* work down(up?) from root */		if (++bpos > 7) {			if ((curin = getc_unp(f)) == ERROR)				return (ERROR);			bpos = 0;			/* move a level deeper in tree */			i = node[i].child[1 & curin];		} else			i = node[i].child[1 & (curin >>= 1)];	}	/* decode fake node index to original data value */	i = -(i + 1);	/* decode special endfile token to normal EOF */	i = (i == SPEOF) ? EOF : i;	return i;}

⌨️ 快捷键说明

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