📄 compr_lzari.c
字号:
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 + -