libs/PclZip/pclzip.lib.php
public function privDeleteByRule(&$p_result_list, &$p_options)
  {
    $v_result      = 1;
    $v_list_detail = array();

    // ----- Open the zip file
    if (($v_result = $this->privOpenFd('rb')) != 1) {
      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory informations
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {
      $this->privCloseFd();

      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($this->zip_fd);

    // ----- Scan all the files
    // ----- Start at beginning of Central Dir
    $v_pos_entry = $v_central_dir['offset'];
    @rewind($this->zip_fd);
    if (@fseek($this->zip_fd, $v_pos_entry)) {
      // ----- Close the zip file
      $this->privCloseFd();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read each entry
    $v_header_list = array();
    $j_start       = 0;
    for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {

      // ----- Read the file header
      $v_header_list[$v_nb_extracted] = array();
      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) {
        // ----- Close the zip file
        $this->privCloseFd();

        return $v_result;
      }

      // ----- Store the index
      $v_header_list[$v_nb_extracted]['index'] = $i;

      // ----- Look for the specific extract rules
      $v_found = false;

      // ----- Look for extract by name rule
      if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {

        // ----- Look if the filename is in the list
        for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {

          // ----- Look for a directory
          if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {

            // ----- Look if the directory is in the filename path
            if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
              $v_found = true;
            } elseif ((($v_header_list[$v_nb_extracted]['external'] & 0x00000010) == 0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
              $v_found = true;
            }

            // ----- Look for a filename
          } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
            $v_found = true;
          }
        }

        // ----- Look for extract by ereg rule
        // ereg() is deprecated with PHP 5.3
        /*
            elseif (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
            && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {

            if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
            $v_found = true;
            }
            }
            */

        // ----- Look for extract by preg rule
      } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {

        if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
          $v_found = true;
        }

        // ----- Look for extract by index rule
      } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {

        // ----- Look if the index is in the list
        for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {

          if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
            $v_found = true;
          }
          if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
            $j_start = $j + 1;
          }

          if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) {
            break;
          }
        }
      } else {
        $v_found = true;
      }

      // ----- Look for deletion
      if ($v_found) {
        unset($v_header_list[$v_nb_extracted]);
      } else {
        $v_nb_extracted++;
      }
    }

    // ----- Look if something need to be deleted
    if ($v_nb_extracted > 0) {

      // ----- Creates a temporay file
      $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';

      // ----- Creates a temporary zip archive
      $v_temp_zip = new PclZip($v_zip_temp_name);

      // ----- Open the temporary zip file in write mode
      if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
        $this->privCloseFd();

        // ----- Return
        return $v_result;
      }

      // ----- Look which file need to be kept
      for ($i = 0; $i < sizeof($v_header_list); $i++) {

        // ----- Calculate the position of the header
        @rewind($this->zip_fd);
        if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

          // ----- Return
          return PclZip::errorCode();
        }

        // ----- Read the file header
        $v_local_header = array();
        if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Check that local file header is same as central file header
        if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) {
          // TBC
        }
        unset($v_local_header);

        // ----- Write the file header
        if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Read/write the data block
        if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }
      }

      // ----- Store the offset of the central dir
      $v_offset = @ftell($v_temp_zip->zip_fd);

      // ----- Re-Create the Central Dir files header
      for ($i = 0; $i < sizeof($v_header_list); $i++) {
        // ----- Create the file header
        if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
          $v_temp_zip->privCloseFd();
          $this->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Transform the header to a 'usable' info
        $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
      }

      // ----- Zip file comment
      $v_comment = '';
      if (isset($p_options[PCLZIP_OPT_COMMENT])) {
        $v_comment = $p_options[PCLZIP_OPT_COMMENT];
      }

      // ----- Calculate the size of the central header
      $v_size = @ftell($v_temp_zip->zip_fd) - $v_offset;

      // ----- Create the central dir footer
      if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
        // ----- Reset the file list
        unset($v_header_list);
        $v_temp_zip->privCloseFd();
        $this->privCloseFd();
        @unlink($v_zip_temp_name);

        // ----- Return
        return $v_result;
      }

      // ----- Close
      $v_temp_zip->privCloseFd();
      $this->privCloseFd();

      // ----- Delete the zip file
      // TBC : I should test the result ...
      @unlink($this->zipname);

      // ----- Rename the temporary file
      // TBC : I should test the result ...
      //@rename($v_zip_temp_name, $this->zipname);
      PclZipUtilRename($v_zip_temp_name, $this->zipname);

      // ----- Destroy the temporary archive
      unset($v_temp_zip);

      // ----- Remove every files : reset the file
    } elseif ($v_central_dir['entries'] != 0) {
      $this->privCloseFd();

      if (($v_result = $this->privOpenFd('wb')) != 1) {
        return $v_result;
      }

      if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
        return $v_result;
      }

      $this->privCloseFd();
    }

    // ----- Return
    return $v_result;
  }
public function privDeleteByRule(&$p_result_list, &$p_options)
  {
    $v_result      = 1;
    $v_list_detail = array();

    // ----- Open the zip file
    if (($v_result = $this->privOpenFd('rb')) != 1) {
      // ----- Return
      return $v_result;
    }

    // ----- Read the central directory informations
    $v_central_dir = array();
    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) {
      $this->privCloseFd();

      return $v_result;
    }

    // ----- Go to beginning of File
    @rewind($this->zip_fd);

    // ----- Scan all the files
    // ----- Start at beginning of Central Dir
    $v_pos_entry = $v_central_dir['offset'];
    @rewind($this->zip_fd);
    if (@fseek($this->zip_fd, $v_pos_entry)) {
      // ----- Close the zip file
      $this->privCloseFd();

      // ----- Error log
      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

      // ----- Return
      return PclZip::errorCode();
    }

    // ----- Read each entry
    $v_header_list = array();
    $j_start       = 0;
    for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) {

      // ----- Read the file header
      $v_header_list[$v_nb_extracted] = array();
      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) {
        // ----- Close the zip file
        $this->privCloseFd();

        return $v_result;
      }

      // ----- Store the index
      $v_header_list[$v_nb_extracted]['index'] = $i;

      // ----- Look for the specific extract rules
      $v_found = false;

      // ----- Look for extract by name rule
      if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {

        // ----- Look if the filename is in the list
        for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {

          // ----- Look for a directory
          if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {

            // ----- Look if the directory is in the filename path
            if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
              $v_found = true;
            } elseif ((($v_header_list[$v_nb_extracted]['external'] & 0x00000010) == 0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
              $v_found = true;
            }

            // ----- Look for a filename
          } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
            $v_found = true;
          }
        }

        // ----- Look for extract by ereg rule
        // ereg() is deprecated with PHP 5.3
        /*
            elseif (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
            && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {

            if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
            $v_found = true;
            }
            }
            */

        // ----- Look for extract by preg rule
      } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {

        if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
          $v_found = true;
        }

        // ----- Look for extract by index rule
      } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {

        // ----- Look if the index is in the list
        for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {

          if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
            $v_found = true;
          }
          if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
            $j_start = $j + 1;
          }

          if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) {
            break;
          }
        }
      } else {
        $v_found = true;
      }

      // ----- Look for deletion
      if ($v_found) {
        unset($v_header_list[$v_nb_extracted]);
      } else {
        $v_nb_extracted++;
      }
    }

    // ----- Look if something need to be deleted
    if ($v_nb_extracted > 0) {

      // ----- Creates a temporay file
      $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp';

      // ----- Creates a temporary zip archive
      $v_temp_zip = new PclZip($v_zip_temp_name);

      // ----- Open the temporary zip file in write mode
      if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
        $this->privCloseFd();

        // ----- Return
        return $v_result;
      }

      // ----- Look which file need to be kept
      for ($i = 0; $i < sizeof($v_header_list); $i++) {

        // ----- Calculate the position of the header
        @rewind($this->zip_fd);
        if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Error log
          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');

          // ----- Return
          return PclZip::errorCode();
        }

        // ----- Read the file header
        $v_local_header = array();
        if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Check that local file header is same as central file header
        if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) {
          // TBC
        }
        unset($v_local_header);

        // ----- Write the file header
        if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Read/write the data block
        if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
          // ----- Close the zip file
          $this->privCloseFd();
          $v_temp_zip->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }
      }

      // ----- Store the offset of the central dir
      $v_offset = @ftell($v_temp_zip->zip_fd);

      // ----- Re-Create the Central Dir files header
      for ($i = 0; $i < sizeof($v_header_list); $i++) {
        // ----- Create the file header
        if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
          $v_temp_zip->privCloseFd();
          $this->privCloseFd();
          @unlink($v_zip_temp_name);

          // ----- Return
          return $v_result;
        }

        // ----- Transform the header to a 'usable' info
        $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
      }

      // ----- Zip file comment
      $v_comment = '';
      if (isset($p_options[PCLZIP_OPT_COMMENT])) {
        $v_comment = $p_options[PCLZIP_OPT_COMMENT];
      }

      // ----- Calculate the size of the central header
      $v_size = @ftell($v_temp_zip->zip_fd) - $v_offset;

      // ----- Create the central dir footer
      if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
        // ----- Reset the file list
        unset($v_header_list);
        $v_temp_zip->privCloseFd();
        $this->privCloseFd();
        @unlink($v_zip_temp_name);

        // ----- Return
        return $v_result;
      }

      // ----- Close
      $v_temp_zip->privCloseFd();
      $this->privCloseFd();

      // ----- Delete the zip file
      // TBC : I should test the result ...
      @unlink($this->zipname);

      // ----- Rename the temporary file
      // TBC : I should test the result ...
      //@rename($v_zip_temp_name, $this->zipname);
      PclZipUtilRename($v_zip_temp_name, $this->zipname);

      // ----- Destroy the temporary archive
      unset($v_temp_zip);

      // ----- Remove every files : reset the file
    } elseif ($v_central_dir['entries'] != 0) {
      $this->privCloseFd();

      if (($v_result = $this->privOpenFd('wb')) != 1) {
        return $v_result;
      }

      if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
        return $v_result;
      }

      $this->privCloseFd();
    }

    // ----- Return
    return $v_result;
  }
--------------------------------------------------------------------------------