archivelib 0.2.0

An implementaton of the Greenleaf ArchiveLib compression/decompression algorithm
Documentation
use std::convert::TryInto;
use std::io::Read;

use super::array_alias::ArrayAlias;
use crate::compress::{CompressU16ArrayAlias, CompressU8ArrayAlias, RCompressData, Result};
use crate::support::BitwiseWrite;

impl<R: Read, W: BitwiseWrite> RCompressData<R, W> {
  pub fn fn211(
    &mut self,
    var212: i32,
    dat_arr_cursor187: &mut CompressU16ArrayAlias<'_>,
    dat_arr_cursor178: &mut CompressU8ArrayAlias<'_>,
    dat_arr_cursor188: &mut CompressU16ArrayAlias<'_>,
  ) -> Result<u32> {
    let dat_arr_cursor178_offset = dat_arr_cursor178.offset(self);
    let dat_arr_cursor188_offset = dat_arr_cursor188.offset(self);

    self.dat174 = cast!(var212 as i16);
    let mut var292 = cast!(var212 as u32);
    let mut var227 = 0;
    self.dat_arr177[1] = 0;
    for i in 0..cast!((self.dat174) as usize) {
      dat_arr_cursor178.set(self, i, 0);
      if 0 != dat_arr_cursor187.get(self, i) {
        var227 += 1;
        self.dat_arr177[var227] = i.try_into().unwrap();
      }
    }
    if var227 < 2 {
      dat_arr_cursor188.set(self, self.dat_arr177[1].try_into().unwrap(), 0);
      Ok(self.dat_arr177[1].try_into().unwrap())
    } else {
      let mut run_start226 = (var227 / 2).try_into().unwrap();
      while run_start226 >= 1 {
        self.fn225(
          i32::from(run_start226),
          dat_arr_cursor187,
          cast!(var227 as i16),
        );
        run_start226 -= 1
      }
      let mut var289;
      loop {
        run_start226 = self.dat_arr177[1];
        if run_start226 < self.dat174 {
          dat_arr_cursor188.set(self, 0, cast!(run_start226 as u16));
          dat_arr_cursor188.shift(self, 1);
        }
        self.dat_arr177[1] = self.dat_arr177[var227];
        var227 -= 1;
        self.fn225(1, dat_arr_cursor187, cast!(var227 as i16));
        let run_length276 = self.dat_arr177[1];
        if run_length276 < self.dat174 {
          dat_arr_cursor188.set(self, 0, cast!(run_length276 as u16));
          dat_arr_cursor188.shift(self, 1);
        }
        var289 = var292;
        var292 += 1;
        dat_arr_cursor187.set(
          self,
          cast!(var289 as usize),
          dat_arr_cursor187.get(self, cast!(run_start226 as usize))
            + dat_arr_cursor187.get(self, cast!(run_length276 as usize)),
        );
        self.dat_arr177[1] = cast!(var289 as i16);
        self.fn225(1, dat_arr_cursor187, cast!(var227 as i16));
        self.dat_arr189[cast!(var289 as usize)] = cast!(run_start226 as u16);
        self.dat_arr190[cast!(var289 as usize)] = cast!(run_length276 as u16);
        if var227 <= 1 {
          break;
        }
      }
      dat_arr_cursor188.set_offset(self, dat_arr_cursor188_offset);
      self.fn228(cast!(var289 as i32), dat_arr_cursor178, dat_arr_cursor188);
      dat_arr_cursor188.set_offset(self, dat_arr_cursor188_offset);
      dat_arr_cursor178.set_offset(self, dat_arr_cursor178_offset);
      self.fn230(var212, dat_arr_cursor178, dat_arr_cursor188);
      Ok(var289)
    }
  }
}