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

📄 list.c

📁 LZSS 压缩/解压算法 算法简单
💻 C
字号:
/****************************************************************************          Lempel, Ziv, Storer, and Szymanski Encoding and Decoding**   File    : list.c*   Purpose : Implement linked list optimized matching of uncoded strings*             for LZSS algorithm.*   Author  : Michael Dipperstein*   Date    : February 18, 2004******************************************************************************   UPDATES**   $Id: list.c,v 1.2 2005/12/28 06:03:30 michael Exp $*   $Log: list.c,v $*   Revision 1.2  2005/12/28 06:03:30  michael*   Use slower but clearer Get/PutBitsInt for reading/writing bits.*   Replace mod with conditional Wrap macro.**   Revision 1.1  2004/02/22 17:24:02  michael*   Initial revision of linked list search.  Mostly code from lzlist.c.******************************************************************************** List: Linked list optimized matching routines used by LZSS*       Encoding/Decoding Routine* Copyright (C) 2004 by Michael Dipperstein (mdipper@cs.ucsb.edu)** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA****************************************************************************//****************************************************************************                             INCLUDED FILES***************************************************************************/#include <limits.h>#include "lzlocal.h"/****************************************************************************                                CONSTANTS***************************************************************************/#define NULL_INDEX      (WINDOW_SIZE + 1)/****************************************************************************                            GLOBAL VARIABLES***************************************************************************//* cyclic buffer sliding window of already read characters */extern unsigned char slidingWindow[];extern unsigned char uncodedLookahead[];unsigned int lists[UCHAR_MAX];                    /* heads of linked lists */unsigned int next[WINDOW_SIZE];             /* indices of next in list *//*****************************************************************************   Function   : InitializeSearchStructures*   Description: This function initializes structures used to speed up the*                process of mathcing uncoded strings to strings in the*                sliding window.  For link list optimized searches, this*                means that linked lists of strings all starting with*                the same character are initialized.*   Parameters : None*   Effects    : None*   Returned   : None**   NOTE: This function assumes that the sliding window is initially filled*         with all identical characters.****************************************************************************/void InitializeSearchStructures(){    unsigned int i;    for (i = 0; i < WINDOW_SIZE; i++)    {        next[i] = i + 1;    }    /* there's no next for the last character */    next[WINDOW_SIZE - 1] = NULL_INDEX;    /* the only list right now is the ' ' list */    for (i = 0; i < 256; i++)    {        lists[i] = NULL_INDEX;    }    lists[' '] = 0;}/*****************************************************************************   Function   : FindMatch*   Description: This function will search through the slidingWindow*                dictionary for the longest sequence matching the MAX_CODED*                long string stored in uncodedLookahed.*   Parameters : windowHead - head of sliding window*                uncodedHead - head of uncoded lookahead buffer*   Effects    : None*   Returned   : The sliding window index where the match starts and the*                length of the match.  If there is no match a length of*                zero will be returned.****************************************************************************/encoded_string_t FindMatch(unsigned int windowHead, unsigned int uncodedHead){    encoded_string_t matchData;    unsigned int i, j;    matchData.length = 0;    matchData.offset = 0;    i = lists[uncodedLookahead[uncodedHead]];   /* start of proper list */    while (i != NULL_INDEX)    {        /* the list insures we matched one, how many more match? */        j = 1;        while(slidingWindow[Wrap((i + j), WINDOW_SIZE)] ==            uncodedLookahead[Wrap((uncodedHead + j), MAX_CODED)])        {            if (j >= MAX_CODED)            {                break;            }            j++;        };        if (j > matchData.length)        {            matchData.length = j;            matchData.offset = i;        }        if (j >= MAX_CODED)        {            matchData.length = MAX_CODED;            break;        }        i = next[i];    /* try next in list */    }    return matchData;}/*****************************************************************************   Function   : AddChar*   Description: This function adds the character stored in*                slidingWindow[charIndex] to the linked lists.*   Parameters : charIndex - sliding window index of the character to be*                            added to the linked list.*   Effects    : slidingWindow[charIndex] appended to the end of the*                appropriate linked list.*   Returned   : NONE****************************************************************************/void AddChar(unsigned int charIndex){    unsigned int i;    /* inserted character will be at the end of the list */    next[charIndex] = NULL_INDEX;    if (lists[slidingWindow[charIndex]] == NULL_INDEX)    {        /* this is the only character in it's list */        lists[slidingWindow[charIndex]] = charIndex;        return;    }    /* find the end of the list */    i = lists[slidingWindow[charIndex]];    while(next[i] != NULL_INDEX)    {        i = next[i];    }    /* add new character to the list end */    next[i] = charIndex;}/*****************************************************************************   Function   : RemoveChar*   Description: This function removes the character stored in*                slidingWindow[charIndex] from the linked lists.*   Parameters : charIndex - sliding window index of the character to be*                            removed from the linked list.*   Effects    : slidingWindow[charIndex] is removed from it's linked list*                and the list is appropriately reconnected.*   Returned   : NONE****************************************************************************/void RemoveChar(unsigned int charIndex){    unsigned int i;    unsigned int nextIndex;    nextIndex = next[charIndex];        /* remember where this points to */    next[charIndex] = NULL_INDEX;    if (lists[slidingWindow[charIndex]] == charIndex)    {        /* we're deleting a list head */        lists[slidingWindow[charIndex]] = nextIndex;        return;    }    /* find character pointing to ours */    i = lists[slidingWindow[charIndex]];    while(next[i] != charIndex)    {        i = next[i];    }    /* point the previous next */    next[i] = nextIndex;}/*****************************************************************************   Function   : ReplaceChar*   Description: This function replaces the character stored in*                slidingWindow[charIndex] with the one specified by*                replacement.  The hash table entries effected by the*                replacement are also corrected.*   Parameters : charIndex - sliding window index of the character to be*                            removed from the linked list.*   Effects    : slidingWindow[charIndex] is replaced by replacement.  Old*                hash entries for strings containing slidingWindow[charIndex]*                are removed and new ones are added.*   Returned   : None****************************************************************************/void ReplaceChar(unsigned int charIndex, unsigned char replacement){    RemoveChar(charIndex);    slidingWindow[charIndex] = replacement;    AddChar(charIndex);}

⌨️ 快捷键说明

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