All pastes #823412 Raw Edit

Someone

public text v1 · immutable
·published 2007-12-19 10:28 UTC
rendered paste body
<?php
//Side note: Can cause extreme high loads :P
class LZW{ 
	var $code_value = array();
	var $prefix_code = array();
	var $append_character = array();
	var $out = "";
	var $TABLE_SIZE = 5021;
	var $output_bit_count = 0;
	var $output_bit_buffer = "0";
	var $next_code = 258;
	var $sTable = array();
	var $data = NULL;
	var $tIdx;
	var $bitsToGet = 9;
	var $bytePointer;
	var $bitPointer;
	var $nextData = 0;
	var $nextBits = 0;
	var $andTable = array(511, 1023, 2047, 4095);
function compress($string){
  $this->output_code(256);
  $this->input = $string;
  $this->next_code=258;
  $string_code=ord($this->input{0});
  for($i=1;$i<=strlen($this->input);$i++)
  {$character=ord($this->input{$i});
    $index=$this->find_match($string_code,$character);
    if (isset($this->code_value[$index]))
      $string_code=$this->code_value[$index];
    else
    {if ($this->next_code <= 4094){
		$this->code_value[$index]=$this->next_code;
$this->prefix_code[$index]=$string_code;
$this->append_character[$index]=$character;
		$this->next_code++;}else{$this->output_code(256);
		 $this->next_code = 258;
		 $this->code_value = array();
         $this->prefix_code = array();
         $this->append_character = array();
		 $this->code_value[$index]=$this->next_code;
         $this->prefix_code[$index]=$string_code;
         $this->append_character[$index]=$character;
		 $this->next_code++;}
      $this->output_code($string_code);
      $string_code=$character;}}
  
  $this->output_code(257);
  $this->output_code(0);  //Clean up
  return $this->out;
}
function find_match($hash_prefix,$hash_character){

  $index = ($hash_character << 4 ) ^ $hash_prefix;
  if ($index == 0)
    $offset = 1;
  else
    $offset = $this->TABLE_SIZE - $index;
    
	while (1){
      if (!isset($this->code_value[$index]))
        return $index;
      if ($this->prefix_code[$index] == $hash_prefix && $this->append_character[$index] == $hash_character)
        return $index;
        $index -= $offset;
      if ($index < 0)
        $index += $this->TABLE_SIZE;
    }
}
function output_code($code){
	 $len = ($code < 512 ? 9 : ($code < 1024 ? 10 : ($code < 2048 ? 11 : 12)));
	 $this->output_bit_buffer = $this->bitOR($this->lshift(decbin($code),(32 - $len - $this->output_bit_count)),$this->output_bit_buffer);
     $this->output_bit_count += $len;
     while ($this->output_bit_count >= 8){
        $this->out .= chr($this->rshift($this->output_bit_buffer,24));
        $this->output_bit_buffer = $this->lshift($this->output_bit_buffer,8);
        $this->output_bit_count -= 8;
     }
}
      function decode($data) {
        if(ord($data{0}) == 0x00 && ord($data{1}) == 0x01) {
            die("LZW flavour not supported.");
        }
        $this->initsTable();
        $this->data =& $data;
        $this->bytePointer = 0;
        $this->bitPointer = 0;
        $this->nextData = 0;
        $this->nextBits = 0;
        $oldCode = 0;
        $string = "";
        $uncompData = "";
        while (($code = $this->getNextCode()) != 257) {
			if ($code == 256) {
                $this->initsTable();
                $code = $this->getNextCode();
                if ($code == 257) {break;}
                $uncompData .= $this->sTable[$code];
                $oldCode = $code;
            } else {
                if ($code < $this->tIdx) {
                    $string = $this->sTable[$code];
                    $uncompData .= $string;
                    $this->addStringToTable($this->sTable[$oldCode], $string[0]);
                    $oldCode = $code;
                } else {$string = $this->sTable[$oldCode];
                    $string = $string.$string[0];
                    $uncompData .= $string;
                    $this->addStringToTable($string);
                    $oldCode = $code;}}}
    return $uncompData;}
    function initsTable() {
        $this->sTable = array();
        for ($i = 0; $i < 256; $i++){
            $this->sTable[$i] = chr($i);}
        $this->tIdx = 258;
        $this->bitsToGet = 9;}
    function addStringToTable ($oldString, $newString="") {
        $string = $oldString.$newString;
        $this->sTable[$this->tIdx++] = $string;
        if ($this->tIdx == 511) {
            $this->bitsToGet = 10;
        } else if ($this->tIdx == 1023) {
            $this->bitsToGet = 11;
        } else if ($this->tIdx == 2047) {
            $this->bitsToGet = 12;
        }
    }
    function getNextCode() {
        if ($this->bytePointer == strlen($this->data)+1)
            return 257;
        $this->nextData = ($this->nextData << 8) | (ord($this->data{$this->bytePointer++}) & 0xff);
        $this->nextBits += 8;
        if ($this->nextBits < $this->bitsToGet) {
            $this->nextData = ($this->nextData << 8) | (ord($this->data{$this->bytePointer++}) & 0xff);
            $this->nextBits += 8;}
        $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9];
        $this->nextBits -= $this->bitsToGet;
		return $code;
    }
  function lshift($n,$b){ return str_pad($n,($b+strlen($n)),"0");}
  function rshift($n,$b){
   $ret = substr($n,0,(strlen($n) - $b));
   return ((int)bindec($ret));}
  function bitOR($a,$b){
    $long = strlen($a) > strlen($b) ? $a : $b;
	$short = $long == $a ? $b : $a;
	$l = strrev($long);
	$s = strrev($short);
	for($r=0;$r<strlen($l);$r++){
	  $re[$r] = ($s{$r} == "1" || $l{$r} == "1") ? "1" : "0"; }	$ret = implode("",$re);
	$ret = strrev(substr($ret,0,32));
	return $ret;
  }

}
	ini_set('memory_limit', -1);
	$text = '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';
	$l = new LZW;
	echo $l->decode($text);
?>