|
|
红色代码的部分在我看来永远不会执行,而且,while(cursor && ((bbp - cursor) <= max_dist))执行一次就会退出循环,如果是这样的话,根本用不着循环结构呀.
由于写代码的人是水平很高的,我想不太可能有这样的错误,所以我断定自己错了,可就不知道错在什么地方.由于源代码很长,如果有什么不理解的可以参看源代码:
http://www.speakeasy.org/~russotto/chm/lzx_compress.tar.gz
只是我的理解:下面的函数选自lz_nonslide.c 功能是分析缓冲区的数据(按byte)让chartable[256]指向缓冲区首次出现的字符的位置,在后面如果再出现这个字符,就让prevtab指向chartable中指向首次出现的位置的指针chartab[char],而且让lentab的相应位置的值为1. 最后统计前后匹配的长度,存入lentab.
- static void lz_analyze_block(lz_info *lzi)
- {
- int *lentab, *lenp;
- u_char **prevtab, **prevp;
- u_char *bbp, *bbe;
- u_char *chartab[256];
- u_char *cursor;
- int prevlen;
- int ch;
- int maxlen;
- long wasinc;
- int max_dist = lzi->max_dist;
- memset(chartab, 0, sizeof(chartab));
- prevtab = prevp = lzi->prevtab;
- lentab = lenp = lzi->lentab;
- memset(prevtab, 0, sizeof(*prevtab) * lzi->chars_in_buf);
- memset(lentab, 0, sizeof(*prevtab) * lzi->chars_in_buf);
- bbp = lzi->block_buf;
- bbe = bbp + lzi->chars_in_buf;
- while (bbp < bbe) {
- if (chartab[ch = *bbp]) {
- *prevp = chartab[ch];
- *lenp = 1;
- }
- chartab[ch] = bbp;
- bbp++;
- prevp++;
- lenp++;
- }
- wasinc = 1;
- for (maxlen = 1; wasinc && (maxlen < lzi->max_match); maxlen++) {
- bbp = bbe - maxlen - 1;
- lenp = lentab + lzi->chars_in_buf - maxlen - 1;
- prevp = prevtab + lzi->chars_in_buf - maxlen - 1;
- wasinc = 0;
- while (bbp > lzi->block_buf) {
- if (*lenp == maxlen) {
- ch = bbp[maxlen];
- cursor = *prevp;
- while(cursor && ((bbp - cursor) <= max_dist)) {
- prevlen = *(cursor - lzi->block_buf + lentab);
- if (cursor[maxlen] == ch) {
- *prevp = cursor;
- (*lenp)++;
- wasinc++;
- break;
- }
- if (prevlen != maxlen) break;
- [color=red] cursor = *(cursor - lzi->block_buf + prevtab);[/color]
- }
- }
- bbp--;
- prevp--;
- lenp--;
- }
- }
- lzi->analysis_valid = 1;
- }
复制代码 |
|