📄 minilzo.c
字号:
goto try_match; DINDEX2(dindex,ip);#endif GINDEX(m_pos,m_off,dict,dindex,in); if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) goto literal; if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) goto try_match; goto literal;try_match:#if 1 && defined(LZO_UNALIGNED_OK_2) if (* (const lzo_ushortp) m_pos != * (const lzo_ushortp) ip)#else if (m_pos[0] != ip[0] || m_pos[1] != ip[1])#endif { } else { if (m_pos[2] == ip[2]) {#if 0 if (m_off <= M2_MAX_OFFSET) goto match; if (lit <= 3) goto match; if (lit == 3) { assert(op - 2 > out); op[-2] |= LZO_BYTE(3); *op++ = *ii++; *op++ = *ii++; *op++ = *ii++; goto code_match; } if (m_pos[3] == ip[3])#endif goto match; } else {#if 0#if 0 if (m_off <= M1_MAX_OFFSET && lit > 0 && lit <= 3)#else if (m_off <= M1_MAX_OFFSET && lit == 3)#endif { register lzo_uint t; t = lit; assert(op - 2 > out); op[-2] |= LZO_BYTE(t); do *op++ = *ii++; while (--t > 0); assert(ii == ip); m_off -= 1; *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); *op++ = LZO_BYTE(m_off >> 2); ip += 2; goto match_done; }#endif } }literal: UPDATE_I(dict,0,dindex,ip,in); ++ip; if (ip >= ip_end) break; continue;match: UPDATE_I(dict,0,dindex,ip,in); if (pd(ip,ii) > 0) { register lzo_uint t = pd(ip,ii); if (t <= 3) { assert(op - 2 > out); op[-2] |= LZO_BYTE(t); } else if (t <= 18) *op++ = LZO_BYTE(t - 3); else { register lzo_uint tt = t - 18; *op++ = 0; while (tt > 255) { tt -= 255; *op++ = 0; } assert(tt > 0); *op++ = LZO_BYTE(tt); } do *op++ = *ii++; while (--t > 0); } assert(ii == ip); ip += 3; if (m_pos[3] != *ip++ || m_pos[4] != *ip++ || m_pos[5] != *ip++ || m_pos[6] != *ip++ || m_pos[7] != *ip++ || m_pos[8] != *ip++#ifdef LZO1Y || m_pos[ 9] != *ip++ || m_pos[10] != *ip++ || m_pos[11] != *ip++ || m_pos[12] != *ip++ || m_pos[13] != *ip++ || m_pos[14] != *ip++#endif ) { --ip; m_len = ip - ii; assert(m_len >= 3); assert(m_len <= M2_MAX_LEN); if (m_off <= M2_MAX_OFFSET) { m_off -= 1;#if defined(LZO1X) *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); *op++ = LZO_BYTE(m_off >> 3);#elif defined(LZO1Y) *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); *op++ = LZO_BYTE(m_off >> 2);#endif } else if (m_off <= M3_MAX_OFFSET) { m_off -= 1; *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); goto m3_m4_offset; } else#if defined(LZO1X) { m_off -= 0x4000; assert(m_off > 0); assert(m_off <= 0x7fff); *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11) | (m_len - 2)); goto m3_m4_offset; }#elif defined(LZO1Y) goto m4_match;#endif } else { { const lzo_byte *end = in_end; const lzo_byte *m = m_pos + M2_MAX_LEN + 1; while (ip < end && *m == *ip) m++, ip++; m_len = (ip - ii); } assert(m_len > M2_MAX_LEN); if (m_off <= M3_MAX_OFFSET) { m_off -= 1; if (m_len <= 33) *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); else { m_len -= 33; *op++ = M3_MARKER | 0; goto m3_m4_len; } } else {#if defined(LZO1Y)m4_match:#endif m_off -= 0x4000; assert(m_off > 0); assert(m_off <= 0x7fff); if (m_len <= M4_MAX_LEN) *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11) | (m_len - 2)); else { m_len -= M4_MAX_LEN; *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11));m3_m4_len: while (m_len > 255) { m_len -= 255; *op++ = 0; } assert(m_len > 0); *op++ = LZO_BYTE(m_len); } }m3_m4_offset: *op++ = LZO_BYTE((m_off & 63) << 2); *op++ = LZO_BYTE(m_off >> 6); }#if 0match_done:#endif ii = ip; if (ip >= ip_end) break; } *out_len = op - out; return pd(in_end,ii);}LZO_PUBLIC(int)DO_COMPRESS ( const lzo_byte *in , lzo_uint in_len, lzo_byte *out, lzo_uintp out_len, lzo_voidp wrkmem ){ lzo_byte *op = out; lzo_uint t;#if defined(__LZO_QUERY_COMPRESS) if (__LZO_IS_COMPRESS_QUERY(in,in_len,out,out_len,wrkmem)) return __LZO_QUERY_COMPRESS(in,in_len,out,out_len,wrkmem,D_SIZE,lzo_sizeof(lzo_dict_t));#endif if (in_len <= M2_MAX_LEN + 5) t = in_len; else { t = do_compress(in,in_len,op,out_len,wrkmem); op += *out_len; } if (t > 0) { const lzo_byte *ii = in + in_len - t; if (op == out && t <= 238) *op++ = LZO_BYTE(17 + t); else if (t <= 3) op[-2] |= LZO_BYTE(t); else if (t <= 18) *op++ = LZO_BYTE(t - 3); else { lzo_uint tt = t - 18; *op++ = 0; while (tt > 255) { tt -= 255; *op++ = 0; } assert(tt > 0); *op++ = LZO_BYTE(tt); } do *op++ = *ii++; while (--t > 0); } *op++ = M4_MARKER | 1; *op++ = 0; *op++ = 0; *out_len = op - out; return LZO_E_OK;}#undef do_compress#undef DO_COMPRESS#undef LZO_HASH#undef LZO_TEST_DECOMPRESS_OVERRUN#undef LZO_TEST_DECOMPRESS_OVERRUN_INPUT#undef LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT#undef LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND#undef DO_DECOMPRESS#define DO_DECOMPRESS lzo1x_decompress#if defined(LZO_TEST_DECOMPRESS_OVERRUN)# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT)# define LZO_TEST_DECOMPRESS_OVERRUN_INPUT 2# endif# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT)# define LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT 2# endif# if !defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND)# define LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND# endif#endif#undef TEST_IP#undef TEST_OP#undef TEST_LOOKBEHIND#undef NEED_IP#undef NEED_OP#undef HAVE_TEST_IP#undef HAVE_TEST_OP#undef HAVE_NEED_IP#undef HAVE_NEED_OP#undef HAVE_ANY_IP#undef HAVE_ANY_OP#if defined(LZO_TEST_DECOMPRESS_OVERRUN_INPUT)# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 1)# define TEST_IP (ip < ip_end)# endif# if (LZO_TEST_DECOMPRESS_OVERRUN_INPUT >= 2)# define NEED_IP(x) \ if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun# endif#endif#if defined(LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT)# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 1)# define TEST_OP (op <= op_end)# endif# if (LZO_TEST_DECOMPRESS_OVERRUN_OUTPUT >= 2)# undef TEST_OP# define NEED_OP(x) \ if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun# endif#endif#if defined(LZO_TEST_DECOMPRESS_OVERRUN_LOOKBEHIND)# define TEST_LOOKBEHIND(m_pos,out) if (m_pos < out) goto lookbehind_overrun#else# define TEST_LOOKBEHIND(m_pos,op) ((void) 0)#endif#if !defined(LZO_EOF_CODE) && !defined(TEST_IP)# define TEST_IP (ip < ip_end)#endif#if defined(TEST_IP)# define HAVE_TEST_IP#else# define TEST_IP 1#endif#if defined(TEST_OP)# define HAVE_TEST_OP#else# define TEST_OP 1#endif#if defined(NEED_IP)# define HAVE_NEED_IP#else# define NEED_IP(x) ((void) 0)#endif#if defined(NEED_OP)# define HAVE_NEED_OP#else# define NEED_OP(x) ((void) 0)#endif#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP)# define HAVE_ANY_IP#endif#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP)# define HAVE_ANY_OP#endif#undef __COPY4#define __COPY4(dst,src) * (lzo_uint32p)(dst) = * (const lzo_uint32p)(src)#undef COPY4#if defined(LZO_UNALIGNED_OK_4)# define COPY4(dst,src) __COPY4(dst,src)#elif defined(LZO_ALIGNED_OK_4)# define COPY4(dst,src) __COPY4((lzo_ptr_t)(dst),(lzo_ptr_t)(src))#endif#if defined(DO_DECOMPRESS)LZO_PUBLIC(int)DO_DECOMPRESS ( const lzo_byte *in , lzo_uint in_len, lzo_byte *out, lzo_uintp out_len, lzo_voidp wrkmem )#endif{ register lzo_byte *op; register const lzo_byte *ip; register lzo_uint t;#if defined(COPY_DICT) lzo_uint m_off; const lzo_byte *dict_end;#else register const lzo_byte *m_pos;#endif const lzo_byte * const ip_end = in + in_len;#if defined(HAVE_ANY_OP) lzo_byte * const op_end = out + *out_len;#endif#if defined(LZO1Z) lzo_uint last_m_off = 0;#endif LZO_UNUSED(wrkmem);#if defined(__LZO_QUERY_DECOMPRESS) if (__LZO_IS_DECOMPRESS_QUERY(in,in_len,out,out_len,wrkmem)) return __LZO_QUERY_DECOMPRESS(in,in_len,out,out_len,wrkmem,0,0);#endif#if defined(COPY_DICT) if (dict) { if (dict_len > M4_MAX_OFFSET) { dict += dict_len - M4_MAX_OFFSET; dict_len = M4_MAX_OFFSET; } dict_end = dict + dict_len; } else { dict_len = 0; dict_end = NULL; }#endif *out_len = 0; op = out; ip = in; if (*ip > 17) { t = *ip++ - 17; if (t < 4) goto match_next; assert(t > 0); NEED_OP(t); NEED_IP(t+1); do *op++ = *ip++; while (--t > 0); goto first_literal_run; } while (TEST_IP && TEST_OP) { t = *ip++; if (t >= 16) goto match; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 15 + *ip++; } assert(t > 0); NEED_OP(t+3); NEED_IP(t+4);#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4)#if !defined(LZO_UNALIGNED_OK_4) if (PTR_ALIGNED2_4(op,ip)) {#endif COPY4(op,ip); op += 4; ip += 4; if (--t > 0) { if (t >= 4) { do { COPY4(op,ip); op += 4; ip += 4; t -= 4; } while (t >= 4); if (t > 0) do *op++ = *ip++; while (--t > 0); } else do *op++ = *ip++; while (--t > 0); }#if !defined(LZO_UNALIGNED_OK_4) } else#endif#endif#if !defined(LZO_UNALIGNED_OK_4) { *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; do *op++ = *ip++; while (--t > 0); }#endiffirst_literal_run: t = *ip++; if (t >= 16) goto match;#if defined(COPY_DICT)#if defined(LZO1Z) m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); last_m_off = m_off;#else m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2);#endif NEED_OP(3); t = 3; COPY_DICT(t,m_off)#else#if defined(LZO1Z) t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); m_pos = op - t; last_m_off = t;#else m_pos = op - (1 + M2_MAX_OFFSET); m_pos -= t >> 2; m_pos -= *ip++ << 2;#endif TEST_LOOKBEHIND(m_pos,out); NEED_OP(3); *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos;#endif goto match_done; while (TEST_IP && TEST_OP) {match: if (t >= 64) {#if defined(COPY_DICT)#if defined(LZO1X) m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); t = (t >> 5) - 1;#elif defined(LZO1Y) m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); t = (t >> 4) - 3;#elif defined(LZO1Z) m_off = t & 0x1f; if (m_off >= 0x1c) m_off = last_m_off; else { m_off = 1 + (m_off << 6) + (*ip++ >> 2); last_m_off = m_off; } t = (t >> 5) - 1;#endif#else#if defined(LZO1X) m_pos = op - 1; m_pos -= (t >> 2) & 7; m_pos -= *ip++ << 3; t = (t >> 5) - 1;#elif defined(LZO1Y) m_pos = op - 1; m_pos -= (t >> 2) & 3; m_pos -= *ip++ << 2; t = (t >> 4) - 3;#elif defined(LZO1Z) { lzo_uint off = t & 0x1f; m_pos = op; if (off >= 0x1c) { assert(last_m_off > 0); m_pos -= last_m_off; } else { off = 1 + (off << 6) + (*ip++ >> 2); m_pos -= off; last_m_off = off; } } t = (t >> 5) - 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -