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; }