Module refinery.units.compression.lzjb

Expand source code Browse git
from __future__ import annotations

from refinery.lib.fast.lzjb import lzjb_compress, lzjb_decompress
from refinery.units import Unit


class lzjb(Unit):
    """
    LZJB compression and decompression.

    This LZ-type compression is used in the ZFS file system.
    """
    @classmethod
    def handles(cls, data) -> bool | None:
        if len(data) < 3:
            return False
        copy = data[0]
        pos = 1
        for mask in (0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80):
            if pos >= len(data):
                break
            if copy & mask:
                if pos + 1 >= len(data):
                    return False
                hi = data[pos]
                lo = data[pos + 1]
                match_pos = ((hi & 0x03) << 8) | lo
                if match_pos == 0:
                    return False
                pos += 2
            else:
                pos += 1
        return None

    def reverse(self, src):
        return lzjb_compress(src)

    def process(self, data):
        return lzjb_decompress(data)

Classes

class lzjb

LZJB compression and decompression.

This LZ-type compression is used in the ZFS file system.

Expand source code Browse git
class lzjb(Unit):
    """
    LZJB compression and decompression.

    This LZ-type compression is used in the ZFS file system.
    """
    @classmethod
    def handles(cls, data) -> bool | None:
        if len(data) < 3:
            return False
        copy = data[0]
        pos = 1
        for mask in (0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80):
            if pos >= len(data):
                break
            if copy & mask:
                if pos + 1 >= len(data):
                    return False
                hi = data[pos]
                lo = data[pos + 1]
                match_pos = ((hi & 0x03) << 8) | lo
                if match_pos == 0:
                    return False
                pos += 2
            else:
                pos += 1
        return None

    def reverse(self, src):
        return lzjb_compress(src)

    def process(self, data):
        return lzjb_decompress(data)

Ancestors

Subclasses

Inherited members