<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Symfony\Component\Process; 
 
use Symfony\Component\Process\Exception\InvalidArgumentException; 
 
/** 
 * ProcessUtils is a bunch of utility methods. 
 * 
 * This class contains static methods only and is not meant to be instantiated. 
 * 
 * @author Martin Haso? <[email protected]> 
 */ 
class ProcessUtils 
{ 
    /** 
     * This class should not be instantiated. 
     */ 
    private function __construct() 
    { 
    } 
 
    /** 
     * Escapes a string to be used as a shell argument. 
     * 
     * @param string $argument The argument that will be escaped 
     * 
     * @return string The escaped argument 
     * 
     * @deprecated since version 3.3, to be removed in 4.0. Use a command line array or give env vars to the `Process::start/run()` method instead. 
     */ 
    public static function escapeArgument($argument) 
    { 
        @trigger_error('The '.__METHOD__.'() method is deprecated since version 3.3 and will be removed in 4.0. Use a command line array or give env vars to the Process::start/run() method instead.', E_USER_DEPRECATED); 
 
        //Fix for PHP bug #43784 escapeshellarg removes % from given string 
        //Fix for PHP bug #49446 escapeshellarg doesn't work on Windows 
        //@see https://bugs.php.net/bug.php?id=43784 
        //@see https://bugs.php.net/bug.php?id=49446 
        if ('\\' === DIRECTORY_SEPARATOR) { 
            if ('' === $argument) { 
                return escapeshellarg($argument); 
            } 
 
            $escapedArgument = ''; 
            $quote = false; 
            foreach (preg_split('/(")/', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) { 
                if ('"' === $part) { 
                    $escapedArgument .= '\\"'; 
                } elseif (self::isSurroundedBy($part, '%')) { 
                    // Avoid environment variable expansion 
                    $escapedArgument .= '^%"'.substr($part, 1, -1).'"^%'; 
                } else { 
                    // escape trailing backslash 
                    if ('\\' === substr($part, -1)) { 
                        $part .= '\\'; 
                    } 
                    $quote = true; 
                    $escapedArgument .= $part; 
                } 
            } 
            if ($quote) { 
                $escapedArgument = '"'.$escapedArgument.'"'; 
            } 
 
            return $escapedArgument; 
        } 
 
        return "'".str_replace("'", "'\\''", $argument)."'"; 
    } 
 
    /** 
     * Validates and normalizes a Process input. 
     * 
     * @param string $caller The name of method call that validates the input 
     * @param mixed  $input  The input to validate 
     * 
     * @return mixed The validated input 
     * 
     * @throws InvalidArgumentException In case the input is not valid 
     */ 
    public static function validateInput($caller, $input) 
    { 
        if (null !== $input) { 
            if (is_resource($input)) { 
                return $input; 
            } 
            if (is_string($input)) { 
                return $input; 
            } 
            if (is_scalar($input)) { 
                return (string) $input; 
            } 
            if ($input instanceof Process) { 
                return $input->getIterator($input::ITER_SKIP_ERR); 
            } 
            if ($input instanceof \Iterator) { 
                return $input; 
            } 
            if ($input instanceof \Traversable) { 
                return new \IteratorIterator($input); 
            } 
 
            throw new InvalidArgumentException(sprintf('%s only accepts strings, Traversable objects or stream resources.', $caller)); 
        } 
 
        return $input; 
    } 
 
    private static function isSurroundedBy($arg, $char) 
    { 
        return 2 < strlen($arg) && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; 
    } 
} 
 
 |