lib/lzo/lzo1x_compress.c

Source file repositories/reference/linux-study-clean/lib/lzo/lzo1x_compress.c

File Facts

System
Linux kernel
Corpus path
lib/lzo/lzo1x_compress.c
Extension
.c
Size
10469 bytes
Lines
451
Domain
Kernel Services
Bucket
lib
Inferred role
Kernel Services: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.

Dependency Surface

Detected Declarations

Annotated Snippet

if (dv == 0 && bitstream_version) {
			const unsigned char *ir = ip + 4;
			const unsigned char *limit = min(ip_end, ip + MAX_ZERO_RUN_LENGTH + 1);
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && \
	defined(LZO_FAST_64BIT_MEMORY_ACCESS)
			u64 dv64;

			for (; (ir + 32) <= limit; ir += 32) {
				dv64 = get_unaligned((u64 *)ir);
				dv64 |= get_unaligned((u64 *)ir + 1);
				dv64 |= get_unaligned((u64 *)ir + 2);
				dv64 |= get_unaligned((u64 *)ir + 3);
				if (dv64)
					break;
			}
			for (; (ir + 8) <= limit; ir += 8) {
				dv64 = get_unaligned((u64 *)ir);
				if (dv64) {
#  if defined(__LITTLE_ENDIAN)
					ir += __builtin_ctzll(dv64) >> 3;
#  elif defined(__BIG_ENDIAN)
					ir += __builtin_clzll(dv64) >> 3;
#  else
#    error "missing endian definition"
#  endif
					break;
				}
			}
#else
			while ((ir < (const unsigned char *)
					ALIGN((uintptr_t)ir, 4)) &&
					(ir < limit) && (*ir == 0))
				ir++;
			if (IS_ALIGNED((uintptr_t)ir, 4)) {
				for (; (ir + 4) <= limit; ir += 4) {
					dv = *((u32 *)ir);
					if (dv) {
#  if defined(__LITTLE_ENDIAN)
						ir += __builtin_ctz(dv) >> 3;
#  elif defined(__BIG_ENDIAN)
						ir += __builtin_clz(dv) >> 3;
#  else
#    error "missing endian definition"
#  endif
						break;
					}
				}
			}
#endif
			while (likely(ir < limit) && unlikely(*ir == 0))
				ir++;
			run_length = ir - ip;
			if (run_length > MAX_ZERO_RUN_LENGTH)
				run_length = MAX_ZERO_RUN_LENGTH;
		} else {
			t = ((dv * 0x1824429d) >> (32 - D_BITS)) & D_MASK;
			m_pos = in + dict[t];
			dict[t] = (lzo_dict_t) (ip - in);
			if (unlikely(dv != get_unaligned_le32(m_pos)))
				goto literal;
		}

		ii -= ti;
		ti = 0;
		t = ip - ii;
		if (t != 0) {
			if (t <= 3) {
				op[*state_offset] |= t;
				NEED_OP(4);
				COPY4(op, ii);
				op += t;
			} else if (t <= 16) {
				NEED_OP(17);
				*op++ = (t - 3);
				COPY8(op, ii);
				COPY8(op + 8, ii + 8);
				op += t;
			} else {
				if (t <= 18) {
					NEED_OP(1);
					*op++ = (t - 3);
				} else {
					size_t tt = t - 18;
					NEED_OP(1);
					*op++ = 0;
					while (unlikely(tt > 255)) {
						tt -= 255;
						NEED_OP(1);
						*op++ = 0;
					}

Annotation

Implementation Notes