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

📄 unreduce.c

📁 汇编大全 中国矿业大学计算机学院 汇编实验5
💻 C
字号:
/*---------------------------------------------------------------------------  unreduce.c  The Reducing algorithm is actually a combination of two distinct algorithms.  The first algorithm compresses repeated byte sequences, and the second al-  gorithm takes the compressed stream from the first algorithm and applies a  probabilistic compression method.  ---------------------------------------------------------------------------*/#include "unzip.h"/**************************************//*  UnReduce Defines, Typedefs, etc.  *//**************************************/#define DLE    144typedef byte f_array[64];       /* for followers[256][64] */static void LoadFollowers __((void));/*******************************//*  UnReduce Global Variables  *//*******************************/f_array *followers = (f_array *) prefix_of;     /* shared work space */byte Slen[256];int factor;int L_table[] ={0, 0x7f, 0x3f, 0x1f, 0x0f};int D_shift[] ={0, 0x07, 0x06, 0x05, 0x04};int D_mask[] ={0, 0x01, 0x03, 0x07, 0x0f};int B_table[] ={8, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};/*************************//*  Function unReduce()  *//*************************/void unReduce() /* expand probabilistically reduced data */{    register int lchar;    int nchar;    int ExState;    int V;    int Len;    factor = lrec.compression_method - 1;    ExState = 0;    lchar = 0;    LoadFollowers();    while (((outpos + outcnt) < ucsize) && (!zipeof)) {        if (Slen[lchar] == 0)            READBIT(8, nchar)   /* ; */        else {            READBIT(1, nchar);            if (nchar != 0)                READBIT(8, nchar)       /* ; */            else {                int follower;                int bitsneeded = B_table[Slen[lchar]];                READBIT(bitsneeded, follower);                nchar = followers[lchar][follower];            }        }        /* expand the resulting byte */        switch (ExState) {        case 0:            if (nchar != DLE)                OUTB(nchar)     /*;*/            else                ExState = 1;            break;        case 1:            if (nchar != 0) {                V = nchar;                Len = V & L_table[factor];                if (Len == L_table[factor])                    ExState = 2;                else                    ExState = 3;            } else {                OUTB(DLE);                ExState = 0;            }            break;        case 2:{                Len += nchar;                ExState = 3;            }            break;        case 3:{                register int i = Len + 3;                int offset = (((V >> D_shift[factor]) &                               D_mask[factor]) << 8) + nchar + 1;                longint op = (outpos + outcnt) - offset;                /* special case- before start of file */                while ((op < 0L) && (i > 0)) {                    OUTB(0);                    op++;                    i--;                }                /* normal copy of data from output buffer */                {                    register int ix = (int) (op % OUTBUFSIZ);                    /* do a block memory copy if possible */                    if (((ix + i) < OUTBUFSIZ) &&                        ((outcnt + i) < OUTBUFSIZ)) {                        memcpy(outptr, &outbuf[ix], i);                        outptr += i;                        outcnt += i;                    }                    /* otherwise copy byte by byte */                    else                        while (i--) {                            OUTB(outbuf[ix]);                            if (++ix >= OUTBUFSIZ)                                ix = 0;                        }                }                ExState = 0;            }            break;        }        /* store character for next iteration */        lchar = nchar;    }}/******************************//*  Function LoadFollowers()  *//******************************/static void LoadFollowers(){    register int x;    register int i;    for (x = 255; x >= 0; x--) {        READBIT(6, Slen[x]);        for (i = 0; (byte) i < Slen[x]; i++) {            READBIT(8, followers[x][i]);        }    }}

⌨️ 快捷键说明

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