/**
  * Retourne le debug_backtrace purgé des références à certains fichiers (et/ou chemins).
  *
  * @param array $pIgnorePaths Chemins à ignorer
  * @param integer $pLevel Nombre de niveau d'appels à ignorer.
  * @return array debug_backtrace
  */
 private static function _filtered_debug_backtrace($pIgnorePaths = null, $pLevel = 0)
 {
     static $recurse = false;
     if ($recurse) {
         return array();
     }
     $recurse = true;
     try {
         // Chemins à ignorer
         $ignorePaths = array(__FILE__, COPIX_CORE_PATH . 'shortcuts.lib.php', COPIX_TEMP_PATH);
         if (is_array($pIgnorePaths)) {
             $ignorePaths = array_merge($ignorePaths, $pIgnorePaths);
         }
         // Construit la regex pour vérifier les chemins
         $regex = array();
         foreach ($ignorePaths as $path) {
             $regex[] = preg_quote(CopixConfig::getRealPath($path), '/');
         }
         $pathRegex = '/^(' . implode('|', $regex) . ')/i';
         // Filtre la pile d'appel
         $backtrace = array_slice(debug_backtrace(), $pLevel + 2);
         foreach ($backtrace as $k => $step) {
             if (isset($step['file']) && preg_match($pathRegex, $step['file'])) {
                 unset($backtrace[$k]);
             }
         }
         $recurse = false;
         return array_values($backtrace);
     } catch (Exception $e) {
         $recurse = false;
         throw $e;
     }
 }
 private function assertPathEquals($expected, $actual, $message = null)
 {
     $this->assertEquals(empty($expected) ? $expected : CopixConfig::getRealPath($expected), empty($actual) ? $actual : CopixConfig::getRealPath($actual), $message);
 }
 /**
  * Filtre les fichiers de classe.
  *
  * Accepte le fichiers nommés Copix*.class.php et ICopix*.class.php.
  * Remplit $this->fileIncludes au fur et à mesure.
  *
  * @see CopixFile::findFiles()
  */
 public function _classFileFilter($fullPath, $relativePath, $basePath, $depth)
 {
     if (!is_dir($fullPath) && preg_match('/^(I?Copix\\w+)\\.class\\.php$/i', basename($fullPath), $matches)) {
         // Ajout le lien classe=>fichier dans potentialClassPaths
         $this->_addPotentialClassPath($matches[1], $fullPath);
         $realPath = CopixConfig::getRealPath($fullPath);
         if (isset($this->fileIncludes[$realPath])) {
             return false;
         }
         $this->fileIncludes[$realPath] = sprintf("%s.'%s'", $this->basePaths[$basePath], $relativePath);
         return true;
     }
     return false;
 }
 /**
  * Détermine si un chemin peut-être défini relativement à l'une des constantes COPIX_*_PATH.
  *
  * @param string $pPath Chemin à analyser.
  * @return array Un tableau array($prefixe, $cheminRelatif), si aucun préfixe ne correspond $prefixe == null
  */
 public static function getCopixPathPrefix($pPath)
 {
     $pPath = CopixConfig::getRealPath($pPath);
     foreach (self::$_copixPathPrefixes as $name => $path) {
         if ($path === true) {
             $path = self::$_copixPathPrefixes[$name] = CopixConfig::getRealPath(constant($name));
         }
         $length = strlen($path);
         if (substr($pPath, 0, $length) == $path) {
             return array($name, substr($pPath, $length));
         }
     }
     return array(null, $pPath);
 }