Function process [src]

Prototype

pub fn process( self: *Decode, reader: *Reader, allocating: *Writer.Allocating, buffer: anytype, decoder: *RangeDecoder, n_read: *u64, ) !ProcessingStatus

Parameters

self: *Decodereader: *Readerallocating: *Writer.Allocatingdecoder: *RangeDecodern_read: *u64

Source

pub fn process( self: *Decode, reader: *Reader, allocating: *Writer.Allocating, /// `CircularBuffer` or `std.compress.lzma2.AccumBuffer`. buffer: anytype, decoder: *RangeDecoder, n_read: *u64, ) !ProcessingStatus { const gpa = allocating.allocator; const writer = &allocating.writer; const pos_state = buffer.len & ((@as(usize, 1) << self.properties.pb) - 1); if (!try decoder.decodeBit(reader, &self.is_match[(self.state << 4) + pos_state], n_read)) { const byte: u8 = try self.decodeLiteral(reader, buffer, decoder, n_read); try buffer.appendLiteral(gpa, byte, writer); self.state = if (self.state < 4) 0 else if (self.state < 10) self.state - 3 else self.state - 6; return .more; } var len: usize = undefined; if (try decoder.decodeBit(reader, &self.is_rep[self.state], n_read)) { if (!try decoder.decodeBit(reader, &self.is_rep_g0[self.state], n_read)) { if (!try decoder.decodeBit(reader, &self.is_rep_0long[(self.state << 4) + pos_state], n_read)) { self.state = if (self.state < 7) 9 else 11; const dist = self.rep[0] + 1; try buffer.appendLz(gpa, 1, dist, writer); return .more; } } else { const idx: usize = if (!try decoder.decodeBit(reader, &self.is_rep_g1[self.state], n_read)) 1 else if (!try decoder.decodeBit(reader, &self.is_rep_g2[self.state], n_read)) 2 else 3; const dist = self.rep[idx]; var i = idx; while (i > 0) : (i -= 1) { self.rep[i] = self.rep[i - 1]; } self.rep[0] = dist; } len = try self.rep_len_decoder.decode(reader, decoder, pos_state, n_read); self.state = if (self.state < 7) 8 else 11; } else { self.rep[3] = self.rep[2]; self.rep[2] = self.rep[1]; self.rep[1] = self.rep[0]; len = try self.len_decoder.decode(reader, decoder, pos_state, n_read); self.state = if (self.state < 7) 7 else 10; const rep_0 = try self.decodeDistance(reader, decoder, len, n_read); self.rep[0] = rep_0; if (self.rep[0] == 0xFFFF_FFFF) { if (decoder.isFinished()) { return .finished; } return error.CorruptInput; } } len += 2; const dist = self.rep[0] + 1; try buffer.appendLz(gpa, len, dist, writer); return .more; }