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

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

?? lzx.cpp

?? Pocket PC CHM 文件閱讀器 (源代碼)
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/* $Id: lzx.c,v 1.5 2002/10/09 01:16:33 jedwin Exp $ */
/***************************************************************************
 *                        lzx.c - LZX decompression routines               *
 *                           -------------------                           *
 *                                                                         *
 *  maintainer: Jed Wing <jedwin@ugcs.caltech.edu>                         *
 *  source:     modified lzx.c from cabextract v0.5                        *
 *  notes:      This file was taken from cabextract v0.5, which was,       *
 *              itself, a modified version of the lzx decompression code   *
 *              from unlzx.                                                *
 *                                                                         *
 *  platforms:  In its current incarnation, this file has been tested on   *
 *              two different Linux platforms (one, redhat-based, with a   *
 *              2.1.2 glibc and gcc 2.95.x, and the other, Debian, with    *
 *              2.2.4 glibc and both gcc 2.95.4 and gcc 3.0.2).  Both were *
 *              Intel x86 compatible machines.                             *
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.  Note that an exemption to this   *
 *   license has been granted by Stuart Caie for the purposes of           *
 *   distribution with chmlib.  This does not, to the best of my           *
 *   knowledge, constitute a change in the license of this (the LZX) code  *
 *   in general.                                                           *
 *                                                                         *
 ***************************************************************************/

#include "lzx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __GNUC__
#define memcpy __builtin_memcpy
#endif

/* sized types */
typedef unsigned char  UBYTE; /* 8 bits exactly    */
typedef unsigned short UWORD; /* 16 bits (or more) */
typedef unsigned int   ULONG; /* 32 bits (or more) */
typedef   signed int    LONG; /* 32 bits (or more) */

/* some constants defined by the LZX specification */
#define LZX_MIN_MATCH                (2)
#define LZX_MAX_MATCH                (257)
#define LZX_NUM_CHARS                (256)
#define LZX_BLOCKTYPE_INVALID        (0)   /* also blocktypes 4-7 invalid */
#define LZX_BLOCKTYPE_VERBATIM       (1)
#define LZX_BLOCKTYPE_ALIGNED        (2)
#define LZX_BLOCKTYPE_UNCOMPRESSED   (3)
#define LZX_PRETREE_NUM_ELEMENTS     (20)
#define LZX_ALIGNED_NUM_ELEMENTS     (8)   /* aligned offset tree #elements */
#define LZX_NUM_PRIMARY_LENGTHS      (7)   /* this one missing from spec! */
#define LZX_NUM_SECONDARY_LENGTHS    (249) /* length tree #elements */

/* LZX huffman defines: tweak tablebits as desired */
#define LZX_PRETREE_MAXSYMBOLS  (LZX_PRETREE_NUM_ELEMENTS)
#define LZX_PRETREE_TABLEBITS   (6)
#define LZX_MAINTREE_MAXSYMBOLS (LZX_NUM_CHARS + 50*8)
#define LZX_MAINTREE_TABLEBITS  (12)
#define LZX_LENGTH_MAXSYMBOLS   (LZX_NUM_SECONDARY_LENGTHS+1)
#define LZX_LENGTH_TABLEBITS    (12)
#define LZX_ALIGNED_MAXSYMBOLS  (LZX_ALIGNED_NUM_ELEMENTS)
#define LZX_ALIGNED_TABLEBITS   (7)

#define LZX_LENTABLE_SAFETY (64) /* we allow length table decoding overruns */

#define LZX_DECLARE_TABLE(tbl) \
  UWORD tbl##_table[(1<<LZX_##tbl##_TABLEBITS) + (LZX_##tbl##_MAXSYMBOLS<<1)];\
  UBYTE tbl##_len  [LZX_##tbl##_MAXSYMBOLS + LZX_LENTABLE_SAFETY]

struct LZXstate
{
    UBYTE *window;         /* the actual decoding window              */
    ULONG window_size;     /* window size (32Kb through 2Mb)          */
    ULONG actual_size;     /* window size when it was first allocated */
    ULONG window_posn;     /* current offset within the window        */
    ULONG R0, R1, R2;      /* for the LRU offset system               */
    UWORD main_elements;   /* number of main tree elements            */
    int   header_read;     /* have we started decoding at all yet?    */
    UWORD block_type;      /* type of this block                      */
    ULONG block_length;    /* uncompressed length of this block       */
    ULONG block_remaining; /* uncompressed bytes still left to decode */
    ULONG frames_read;     /* the number of CFDATA blocks processed   */
    LONG  intel_filesize;  /* magic header value used for transform   */
    LONG  intel_curpos;    /* current offset in transform space       */
    int   intel_started;   /* have we seen any translatable data yet? */

    LZX_DECLARE_TABLE(PRETREE);
    LZX_DECLARE_TABLE(MAINTREE);
    LZX_DECLARE_TABLE(LENGTH);
    LZX_DECLARE_TABLE(ALIGNED);
};

/* LZX decruncher */

/* Microsoft's LZX document and their implementation of the
 * com.ms.util.cab Java package do not concur.
 *
 * In the LZX document, there is a table showing the correlation between
 * window size and the number of position slots. It states that the 1MB
 * window = 40 slots and the 2MB window = 42 slots. In the implementation,
 * 1MB = 42 slots, 2MB = 50 slots. The actual calculation is 'find the
 * first slot whose position base is equal to or more than the required
 * window size'. This would explain why other tables in the document refer
 * to 50 slots rather than 42.
 *
 * The constant NUM_PRIMARY_LENGTHS used in the decompression pseudocode
 * is not defined in the specification.
 *
 * The LZX document does not state the uncompressed block has an
 * uncompressed length field. Where does this length field come from, so
 * we can know how large the block is? The implementation has it as the 24
 * bits following after the 3 blocktype bits, before the alignment
 * padding.
 *
 * The LZX document states that aligned offset blocks have their aligned
 * offset huffman tree AFTER the main and length trees. The implementation
 * suggests that the aligned offset tree is BEFORE the main and length
 * trees.
 *
 * The LZX document decoding algorithm states that, in an aligned offset
 * block, if an extra_bits value is 1, 2 or 3, then that number of bits
 * should be read and the result added to the match offset. This is
 * correct for 1 and 2, but not 3, where just a huffman symbol (using the
 * aligned tree) should be read.
 *
 * Regarding the E8 preprocessing, the LZX document states 'No translation
 * may be performed on the last 6 bytes of the input block'. This is
 * correct.  However, the pseudocode provided checks for the *E8 leader*
 * up to the last 6 bytes. If the leader appears between -10 and -7 bytes
 * from the end, this would cause the next four bytes to be modified, at
 * least one of which would be in the last 6 bytes, which is not allowed
 * according to the spec.
 *
 * The specification states that the huffman trees must always contain at
 * least one element. However, many CAB files contain blocks where the
 * length tree is completely empty (because there are no matches), and
 * this is expected to succeed.
 */


/* LZX uses what it calls 'position slots' to represent match offsets.
 * What this means is that a small 'position slot' number and a small
 * offset from that slot are encoded instead of one large offset for
 * every match.
 * - position_base is an index to the position slot bases
 * - extra_bits states how many bits of offset-from-base data is needed.
 */
static const UBYTE extra_bits[51] = {
     0,  0,  0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,
     7,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14,
    15, 15, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    17, 17, 17
};

static const ULONG position_base[51] = {
          0,       1,       2,      3,      4,      6,      8,     12,     16,     24,     32,       48,      64,      96,     128,     192,
        256,     384,     512,    768,   1024,   1536,   2048,   3072,   4096,   6144,   8192,    12288,   16384,   24576,   32768,   49152,
      65536,   98304,  131072, 196608, 262144, 393216, 524288, 655360, 786432, 917504, 1048576, 1179648, 1310720, 1441792, 1572864, 1703936,
    1835008, 1966080, 2097152
};

struct LZXstate *LZXinit(int window)
{
    struct LZXstate *pState=NULL;
    ULONG wndsize = 1 << window;
    int i, posn_slots;

    /* LZX supports window sizes of 2^15 (32Kb) through 2^21 (2Mb) */
    /* if a previously allocated window is big enough, keep it     */
    if (window < 15 || window > 21) return NULL;

    /* allocate state and associated window */
    pState = (struct LZXstate *)malloc(sizeof(struct LZXstate));
    if (!(pState->window = (UBYTE *)malloc(wndsize)))
    {
        free(pState);
        return NULL;
    }
    pState->actual_size = wndsize;
    pState->window_size = wndsize;

    /* calculate required position slots */
    if (window == 20) posn_slots = 42;
    else if (window == 21) posn_slots = 50;
    else posn_slots = window << 1;

    /** alternatively **/
    /* posn_slots=i=0; while (i < wndsize) i += 1 << extra_bits[posn_slots++]; */

    /* initialize other state */
    pState->R0  =  pState->R1  = pState->R2 = 1;
    pState->main_elements   = LZX_NUM_CHARS + (posn_slots << 3);
    pState->header_read     = 0;
    pState->frames_read     = 0;
    pState->block_remaining = 0;
    pState->block_type      = LZX_BLOCKTYPE_INVALID;
    pState->intel_curpos    = 0;
    pState->intel_started   = 0;
    pState->window_posn     = 0;

    /* initialise tables to 0 (because deltas will be applied to them) */
    for (i = 0; i < LZX_MAINTREE_MAXSYMBOLS; i++) pState->MAINTREE_len[i] = 0;
    for (i = 0; i < LZX_LENGTH_MAXSYMBOLS; i++)   pState->LENGTH_len[i]   = 0;

    return pState;
}

void LZXteardown(struct LZXstate *pState)
{
    if (pState)
    {
        if (pState->window)
            free(pState->window);
        free(pState);
    }
}

int LZXreset(struct LZXstate *pState)
{
    int i;

    pState->R0  =  pState->R1  = pState->R2 = 1;
    pState->header_read     = 0;
    pState->frames_read     = 0;
    pState->block_remaining = 0;
    pState->block_type      = LZX_BLOCKTYPE_INVALID;
    pState->intel_curpos    = 0;
    pState->intel_started   = 0;
    pState->window_posn     = 0;

    for (i = 0; i < LZX_MAINTREE_MAXSYMBOLS + LZX_LENTABLE_SAFETY; i++) pState->MAINTREE_len[i] = 0;
    for (i = 0; i < LZX_LENGTH_MAXSYMBOLS + LZX_LENTABLE_SAFETY; i++)   pState->LENGTH_len[i]   = 0;

    return DECR_OK;
};


/* Bitstream reading macros:
 *
 * INIT_BITSTREAM    should be used first to set up the system
 * READ_BITS(var,n)  takes N bits from the buffer and puts them in var
 *
 * ENSURE_BITS(n)    ensures there are at least N bits in the bit buffer
 * PEEK_BITS(n)      extracts (without removing) N bits from the bit buffer
 * REMOVE_BITS(n)    removes N bits from the bit buffer
 *
 * These bit access routines work by using the area beyond the MSB and the
 * LSB as a free source of zeroes. This avoids having to mask any bits.
 * So we have to know the bit width of the bitbuffer variable. This is
 * sizeof(ULONG) * 8, also defined as ULONG_BITS
 */

/* number of bits in ULONG. Note: This must be at multiple of 16, and at
 * least 32 for the bitbuffer code to work (ie, it must be able to ensure
 * up to 17 bits - that's adding 16 bits when there's one bit left, or
 * adding 32 bits when there are no bits left. The code should work fine
 * for machines where ULONG >= 32 bits.
 */
#define ULONG_BITS (sizeof(ULONG)<<3)

#define INIT_BITSTREAM do { bitsleft = 0; bitbuf = 0; } while (0)

#define ENSURE_BITS(n)							\
  while (bitsleft < (n)) {						\
    bitbuf |= ((inpos[1]<<8)|inpos[0]) << (ULONG_BITS-16 - bitsleft);	\

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲天天做日日做天天谢日日欢 | 91视频观看免费| 久久亚洲二区三区| 国产一区福利在线| 久久亚洲一区二区三区明星换脸| 精久久久久久久久久久| 日韩精品中文字幕在线不卡尤物| 美美哒免费高清在线观看视频一区二区 | av不卡一区二区三区| ...av二区三区久久精品| 色综合久久久久久久久久久| 玉米视频成人免费看| 911精品产国品一二三产区| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美精品一区二区在线播放| 成人在线综合网站| 一区二区三区国产精品| 欧美性一二三区| 青青草国产精品亚洲专区无| 国产丝袜欧美中文另类| 色诱视频网站一区| 日本不卡视频一二三区| 国产校园另类小说区| 色综合中文字幕| 日韩精品乱码免费| 国产欧美日韩综合精品一区二区| 91视频91自| 久久se精品一区二区| 国产精品乱码久久久久久| 色狠狠一区二区| 精品一区二区三区在线观看| 亚洲人成网站精品片在线观看| 欧美精品亚洲一区二区在线播放| 国产精品综合久久| 亚洲黄网站在线观看| 欧美精品一区二区高清在线观看 | 日韩欧美精品在线视频| 高清beeg欧美| 亚洲美女淫视频| 日韩欧美国产不卡| 91偷拍与自偷拍精品| 日本亚洲天堂网| 中文字幕日韩精品一区| 日韩欧美国产1| 色婷婷综合久久久| 国产一区二区三区四| 亚洲国产另类精品专区| 国产网红主播福利一区二区| 欧洲av一区二区嗯嗯嗯啊| 国产成人福利片| 丝袜脚交一区二区| 亚洲精品国产无套在线观| 久久色成人在线| 91精品国产麻豆| 91麻豆成人久久精品二区三区| 激情偷乱视频一区二区三区| 亚洲国产视频一区二区| 国产精品毛片大码女人| 精品少妇一区二区三区在线视频 | 偷拍日韩校园综合在线| 国产精品一区二区久久精品爱涩| 欧美视频你懂的| 成人国产亚洲欧美成人综合网| 日本欧美久久久久免费播放网| 亚洲品质自拍视频| 中文乱码免费一区二区| 精品国产123| 在线播放亚洲一区| 欧美日本国产视频| 91福利国产成人精品照片| 成人在线视频一区二区| 黄色资源网久久资源365| 日韩高清不卡一区二区三区| 亚洲曰韩产成在线| 亚洲人成在线播放网站岛国| 国产精品国产a| 国产精品乱人伦一区二区| 日本一区二区电影| 国产欧美久久久精品影院| 亚洲精品在线网站| 久久综合色婷婷| 欧美成人vr18sexvr| 日韩欧美一区二区不卡| 欧美一卡二卡在线观看| 精品欧美一区二区久久| 日韩精品一区二区三区中文不卡 | 午夜精品一区在线观看| 亚洲成在线观看| 亚洲二区在线视频| 日韩国产精品久久久久久亚洲| 亚洲成人资源网| 免费在线视频一区| 国内精品视频一区二区三区八戒| 国产一区二区在线免费观看| 国产精品18久久久久久久久| 成人影视亚洲图片在线| 粉嫩蜜臀av国产精品网站| 97se亚洲国产综合自在线| 色菇凉天天综合网| 在线播放国产精品二区一二区四区| 678五月天丁香亚洲综合网| 精品久久一区二区三区| 国产嫩草影院久久久久| 亚洲欧洲中文日韩久久av乱码| 亚洲午夜电影网| 亚洲国产日韩在线一区模特| 亚洲嫩草精品久久| 亚洲国产精品成人综合| ...中文天堂在线一区| 亚洲国产精品嫩草影院| 日本女优在线视频一区二区| 韩国在线一区二区| 99久久国产免费看| 91精品国产一区二区三区| 国产亚洲一区二区三区在线观看 | 成人免费视频国产在线观看| 色天天综合色天天久久| 日韩一区和二区| 国产精品久久久久久亚洲伦| 亚洲一区二区三区四区的 | 亚洲国产精品欧美一二99| 久久er精品视频| 91亚洲精品乱码久久久久久蜜桃 | 免费在线成人网| 99视频在线精品| 欧美日韩精品一区二区三区四区 | 精品系列免费在线观看| 丰满少妇在线播放bd日韩电影| 日本大香伊一区二区三区| 精品欧美一区二区三区精品久久 | 国产精品一区在线观看乱码| 日本道免费精品一区二区三区| 欧美xxxxxxxx| 亚洲小少妇裸体bbw| 国产精品一卡二卡| 欧美一区二区三区小说| 亚洲美女视频在线观看| 国产揄拍国内精品对白| 欧美日韩国产123区| 日韩美女精品在线| 国产精品系列在线观看| 91麻豆精品国产91久久久更新时间| 国产精品嫩草影院av蜜臀| 蜜桃视频一区二区| 欧美三级中文字幕在线观看| 国产精品天天看| 精品一区二区影视| 欧美一级二级三级乱码| 亚洲一区在线电影| 一本高清dvd不卡在线观看| 国产欧美日韩在线视频| 久久电影国产免费久久电影| 欧美人妖巨大在线| 亚洲综合丁香婷婷六月香| 成人短视频下载| 国产亚洲精品超碰| 韩日欧美一区二区三区| 日韩一级免费观看| 日韩国产一区二| 欧美疯狂做受xxxx富婆| 亚洲一区二区三区视频在线| 色综合视频一区二区三区高清| 中文字幕 久热精品 视频在线| 国产精品乡下勾搭老头1| 欧美成人伊人久久综合网| 美女视频黄久久| 欧美r级电影在线观看| 久久精品国产精品青草| 精品精品国产高清a毛片牛牛 | 国产欧美一区二区三区在线老狼| 久久国产成人午夜av影院| 精品久久久久久最新网址| 久久99国产精品免费| 精品成人免费观看| 国产一区二区三区不卡在线观看| 欧美精品一区二区三区在线播放 | 成a人片国产精品| 国产精品另类一区| 菠萝蜜视频在线观看一区| 亚洲天堂福利av| 91麻豆国产福利精品| 亚洲午夜久久久久久久久久久| 欧美日韩一二三| 五月综合激情婷婷六月色窝| 欧美高清www午色夜在线视频| 日韩中文字幕91| 欧美xxxxxxxxx| 不卡欧美aaaaa| 亚洲综合激情网| 51精品视频一区二区三区| 美女国产一区二区三区| 国产女主播在线一区二区| 91在线高清观看| 五月天欧美精品| 欧美成人女星排行榜| 成人自拍视频在线| 亚洲一二三区不卡| 久久影音资源网| 北条麻妃一区二区三区| 亚洲不卡一区二区三区|