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

📄 compr_lzari.c

📁 jffs2源代码基于2。6内核
💻 C
📖 第 1 页 / 共 2 页
字号:
						if (op >= dstend) {							*dstlen = written;							return -1;						}						*(op++) = buffer;						buffer = 0;						mask = 128;						written++;						*srclen = read;					}					for ( ; shifts > 0; shifts--) {						buffer |= mask;						if ((mask >>= 1) == 0) {							if (op >= dstend) {								*dstlen = written;								return -1;							}							*(op++) = buffer;							buffer = 0;							mask = 128;							written++;							*srclen = read;						}					}				} else if (low >= Q2) {					buffer |= mask;					if ((mask >>= 1) == 0) {						if (op >= dstend) {							*dstlen = written;							return -1;						}						*(op++) = buffer;						buffer = 0;						mask = 128;						written++;						*srclen = read;					}					for ( ; shifts > 0; shifts--) {						if ((mask >>= 1) == 0) {							if (op >= dstend) {								*dstlen = written;								return -1;							}							*(op++) = buffer;							buffer = 0;							mask = 128;							written++;							*srclen = read;						}					}					low -= Q2;					high -= Q2;				} else if (low >= Q1 && high <= Q3) {					shifts++;					low -= Q1;					high -= Q1;				} else break;				low += low;  high += high;			}			UpdateModel(sym);			range = high - low;			high = low + (range * position_cum[match_position - 1]) / position_cum[0];			low +=       (range * position_cum[match_position    ]) / position_cum[0];			for ( ; ; ) {				if (high <= Q2) {					if ((mask >>= 1) == 0) {						if (op >= dstend) {							*dstlen = written;							return -1;						}						*(op++) = buffer;						buffer = 0;						mask = 128;						written++;						*srclen = read;					}					for ( ; shifts > 0; shifts--) {						buffer |= mask;						if ((mask >>= 1) == 0) {							if (op >= dstend) {								*dstlen = written;								return -1;							}							*(op++) = buffer;							buffer = 0;							mask = 128;							written++;							*srclen = read;						}					}				} else {					if (low >= Q2) {						buffer |= mask;						if ((mask >>= 1) == 0) {							if (op >= dstend) {								*dstlen = written;								return -1;							}							*(op++) = buffer;							buffer = 0;							mask = 128;							written++;							*srclen = read;						}						for ( ; shifts > 0; shifts--) {							if ((mask >>= 1) == 0) {								if (op >= dstend) {									*dstlen = written;									return -1;								}								*(op++) = buffer;								buffer = 0;								mask = 128;								written++;								*srclen = read;							}						}						low -= Q2;						high -= Q2;					} else {						if ((low >= Q1) && (high <= Q3)) {							shifts++;							low -= Q1;							high -= Q1;						} else {							break;						}					}				}				low += low;				high += high;			}		}		last_match_length = match_length;		for (i = 0; (i < last_match_length) && (ip < srcend); i++) {			c = *(ip++);			DeleteNode(s);			text_buf[s] = c;			if (s < F - 1)				text_buf[s + N] = c;			s = (s + 1) & (N - 1);			r = (r + 1) & (N - 1);			InsertNode(r);		}		read += i;		while (i++ < last_match_length) {			DeleteNode(s);			s = (s + 1) & (N - 1);			r = (r + 1) & (N - 1);			if (--len) InsertNode(r);		}	} while (len > 0);	shifts++;	if (low < Q1) {		if ((mask >>= 1) == 0) {			if (op >= dstend) {				*dstlen = written;				return -1;			}			*(op++) = buffer;			buffer = 0;			mask = 128;			written++;			*srclen = read;		}		for ( ; shifts > 0; shifts--) {			buffer |= mask;			if ((mask >>= 1) == 0) {				if (op >= dstend) {					*dstlen = written;					return -1;				}				*(op++) = buffer;				buffer = 0;				mask = 128;				written++;				*srclen = read;			}		}	} else {		buffer |= mask;		if ((mask >>= 1) == 0) {			if (op >= dstend) {				*dstlen = written;				return -1;			}			*(op++) = buffer;			buffer = 0;			mask = 128;			written++;			*srclen = read;		}		for ( ; shifts > 0; shifts--) {			if ((mask >>= 1) == 0) {				if (op >= dstend) {					*dstlen = written;					return -1;				}				*(op++) = buffer;				buffer = 0;				mask = 128;				written++;				*srclen = read;			}		}	}	for (i = 0; i < 7; i++) {		if ((mask >>= 1) == 0) {			if (op >= dstend) {				*dstlen = written;				return -1;			}			*(op++) = buffer;			buffer = 0;			mask = 128;			written++;			*srclen = read;		}	}	*dstlen = written;	return 0;}static int Decode(unsigned char *srcbuf, unsigned char *dstbuf, unsigned long srclen,					unsigned long dstlen)	/* Just the reverse of Encode(). */{	unsigned long i, r, j, k, c, range, sym;	unsigned char *ip, *op;	unsigned char *srcend = srcbuf + srclen;	unsigned char *dstend = dstbuf + dstlen;	unsigned char buffer = 0;	unsigned char mask = 0;	unsigned long low = 0;	unsigned long high = Q4;	unsigned long value = 0;	ip = srcbuf;	op = dstbuf;	for (i = 0; i < M + 2; i++) {		value *= 2;		if ((mask >>= 1) == 0) {			buffer = (ip >= srcend) ? 0 : *(ip++);			mask = 128;		}		value += ((buffer & mask) != 0);	}	StartModel();	for (i = 0; i < N - F; i++) text_buf[i] = ' ';	r = N - F;	while (op < dstend) {		range = high - low;		sym = BinarySearchSym((unsigned long)				(((value - low + 1) * sym_cum[0] - 1) / range));		high = low + (range * sym_cum[sym - 1]) / sym_cum[0];		low +=       (range * sym_cum[sym    ]) / sym_cum[0];		for ( ; ; ) {			if (low >= Q2) {				value -= Q2;  low -= Q2;  high -= Q2;			} else if (low >= Q1 && high <= Q3) {				value -= Q1;  low -= Q1;  high -= Q1;			} else if (high > Q2) break;			low += low;  high += high;			value *= 2;			if ((mask >>= 1) == 0) {				buffer = (ip >= srcend) ? 0 : *(ip++);				mask = 128;			}			value += ((buffer & mask) != 0);		}		c = sym_to_char[sym];		UpdateModel(sym);		if (c < 256) {			if (op >= dstend) return -1;			*(op++) = c;			text_buf[r++] = c;			r &= (N - 1);		} else {			j = c - 255 + THRESHOLD;			range = high - low;			i = BinarySearchPos((unsigned long)				(((value - low + 1) * position_cum[0] - 1) / range));			high = low + (range * position_cum[i    ]) / position_cum[0];			low +=       (range * position_cum[i + 1]) / position_cum[0];			for ( ; ; ) {				if (low >= Q2) {					value -= Q2;  low -= Q2;  high -= Q2;				} else if (low >= Q1 && high <= Q3) {					value -= Q1;  low -= Q1;  high -= Q1;				} else if (high > Q2) break;				low += low;  high += high;				value *= 2;				if ((mask >>= 1) == 0) {					buffer = (ip >= srcend) ? 0 : *(ip++);					mask = 128;				}				value += ((buffer & mask) != 0);			}			i = (r - i - 1) & (N - 1);			for (k = 0; k < j; k++) {				c = text_buf[(i + k) & (N - 1)];				if (op >= dstend) return -1;				*(op++) = c;				text_buf[r++] = c;				r &= (N - 1);			}				}	}	return 0;}/* interface to jffs2 follows */#include "compr.h"#include <linux/jffs2.h>int jffs2_lzari_compress (unsigned char *input,			unsigned char *output, uint32_t *sourcelen,			uint32_t *dstlen, void *model);int jffs2_lzari_decompress (unsigned char *input,			  unsigned char *output, uint32_t sourcelen,			  uint32_t dstlen, void *model);struct jffs2_compressor jffs2_lzari_comp = {	.priority = JFFS2_LZARI_PRIORITY,	.name = "lzari",	.compr = JFFS2_COMPR_LZARI,	.compress = &jffs2_lzari_compress,	.decompress = &jffs2_lzari_decompress,#ifdef JFFS2_LZARI_DISABLED	.disabled = 1,#else	.disabled = 0,#endif};int jffs2_lzari_compress (unsigned char *input,			unsigned char *output, uint32_t *sourcelen,			uint32_t *dstlen, void *model){	return Encode(input, output, (unsigned long *)sourcelen, (unsigned long *)dstlen);}int jffs2_lzari_decompress (unsigned char *input,			  unsigned char *output, uint32_t sourcelen,			  uint32_t dstlen, void *model){    return Decode(input, output, sourcelen, dstlen);}int jffs2_lzari_init (void){    return jffs2_register_compressor(&jffs2_lzari_comp);}void jffs2_lzari_exit (void){    jffs2_unregister_compressor (&jffs2_lzari_comp);}

⌨️ 快捷键说明

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