All pastes #79173 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-07-05 01:02 UTC
rendered paste body
function decompress2($in_data, $out_len)
{
	$in_len = strlen($in_data);
	$in_pos = 0;
	$out_data = '';

	do
	{
		$ctrl = ord($in_data[$in_pos++]);

		if ($ctrl < 32)
		{
			$out_data .= substr($in_data, $in_pos, $ctrl + 1);
			$in_pos += $ctrl + 1;
		}
		else
		{
			$len = $ctrl >> 5;

			$reference = (strlen($out_data) - (($ctrl & 0x1f) << 8) - 1);

			if ($len == 7)
			{
				$len += ord($in_data[$in_pos++]);
			}
			  
			$reference -= ord($in_data[$in_pos++]);

			/**
			* For some reason, $reference can be equal to the last byte of the data.
			* We can't replace these lines with substr($out_data, $reference, 2) because
			* at the time it would be called, $out_data[$reference + 1] may not exist
			*/
			if (isset($out_data[$reference + $len + 2]))
			{
				$out_data .= substr($out_data, $reference, $len + 2);
				$reference += $len + 2;
			}
			else
			{
				$out_data .= $out_data[$reference];
				$out_data .= $out_data[$reference + 1];
				$reference += 2;

				do
				{
					$out_data .= $out_data[$reference++];
				}
				while (--$len);
			}
		}

		if (isset($out_data[$out_len]))
		{
			die("WTF");
		}
	}
	while ($in_pos < $in_len);

	return $out_data;
}