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

📄 lzo_mchw.ch

📁 lzo-1.08-src.zip 高效的压缩解压代码
💻 CH
字号:
/* lzo_mchw.ch -- matching functions using a window   This file is part of the LZO real-time data compression library.   Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer   All Rights Reserved.   The LZO library 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.   The LZO 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 General Public License for more details.   You should have received a copy of the GNU General Public License   along with the LZO library; see the file COPYING.   If not, write to the Free Software Foundation, Inc.,   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.   Markus F.X.J. Oberhumer   <markus@oberhumer.com> *//***********************************************************************//************************************************************************/typedef struct{	int init;	lzo_uint look;			/* bytes in lookahead buffer */	lzo_uint m_len;	lzo_uint m_off;	lzo_uint last_m_len;	lzo_uint last_m_off;	const lzo_byte *bp;	const lzo_byte *ip;	const lzo_byte *in;	const lzo_byte *in_end;	lzo_byte *out;	lzo_progress_callback_t cb;	lzo_uint textsize;		/* text size counter */	lzo_uint codesize;		/* code size counter */	lzo_uint printcount;	/* counter for reporting progress every 1K bytes */	/* some stats */	unsigned long lit_bytes;	unsigned long match_bytes;	unsigned long rep_bytes;	unsigned long lazy;#if defined(LZO1B)	lzo_uint r1_m_len;	/* some stats */	unsigned long r1_r, m3_r, m2_m, m3_m;#endif#if defined(LZO1C)	lzo_uint r1_m_len;	lzo_byte *m3;	/* some stats */	unsigned long r1_r, m3_r, m2_m, m3_m;#endif#if defined(LZO1F)	lzo_uint r1_lit;	lzo_uint r1_m_len;	/* some stats */	unsigned long r1_r, m2_m, m3_m;#endif#if defined(LZO1X) || defined(LZO1Y) || defined(LZO1Z)	lzo_uint r1_lit;	lzo_uint r1_m_len;	/* some stats */	unsigned long m1a_m, m1b_m, m2_m, m3_m, m4_m;	unsigned long lit1_r, lit2_r, lit3_r;#endif#if defined(LZO2A)	/* some stats */	unsigned long m1, m2, m3, m4;#endif}LZO_COMPRESS_T;#if defined(__PUREC__)/* the cast is needed to work around a bug in Pure C (Atari ST) */#define getbyte(c) 	((c).ip < (c).in_end ? (unsigned) *((c).ip)++ : (-1))#else#define getbyte(c) 	((c).ip < (c).in_end ? *((c).ip)++ : (-1))#endif#include "lzo_swd.ch"/***********************************************************************//************************************************************************/static intinit_match ( LZO_COMPRESS_T *c, lzo_swd_t *s,			 const lzo_byte *dict, lzo_uint dict_len,			 lzo_uint32 flags ){	int r;	assert(!c->init);	c->init = 1;	s->c = c;	c->last_m_len = c->last_m_off = 0;	c->textsize = c->codesize = c->printcount = 0;	c->lit_bytes = c->match_bytes = c->rep_bytes = 0;	c->lazy = 0;	r = swd_init(s,dict,dict_len);	if (r != 0)		return r;	s->use_best_off = (flags & 1) ? 1 : 0;	return r;}/***********************************************************************//************************************************************************/static intfind_match ( LZO_COMPRESS_T *c, lzo_swd_t *s,			 lzo_uint this_len, lzo_uint skip ){	assert(c->init);	if (skip > 0)	{		assert(this_len >= skip);		swd_accept(s, this_len - skip);		c->textsize += this_len - skip + 1;	}	else	{		assert(this_len <= 1);		c->textsize += this_len - skip;	}	s->m_len = 1;	s->m_len = THRESHOLD;#ifdef SWD_BEST_OFF	if (s->use_best_off)		memset(s->best_pos,0,sizeof(s->best_pos));#endif	swd_findbest(s);	c->m_len = s->m_len;	c->m_off = s->m_off;	swd_getbyte(s);	if (s->b_char < 0)	{		c->look = 0;		c->m_len = 0;		swd_exit(s);	}	else	{		c->look = s->look + 1;	}	c->bp = c->ip - c->look;#if 0	/* brute force match search */	if (c->m_len > THRESHOLD && c->m_len + 1 <= c->look)	{		const lzo_byte *ip = c->bp;		const lzo_byte *m  = c->bp - c->m_off;		const lzo_byte *in = c->in;		if (ip - in > N)			in = ip - N;		for (;;)		{			while (*in != *ip)				in++;			if (in == ip)				break;			if (in != m)				if (memcmp(in,ip,c->m_len+1) == 0)					printf("%p %p %p %5d\n",in,ip,m,c->m_len);			in++;		}	}#endif	if (c->cb && c->textsize > c->printcount)	{		(*c->cb)(c->textsize,c->codesize);		c->printcount += 1024;	}	return LZO_E_OK;}/*vi:ts=4:et*/

⌨️ 快捷键说明

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