コード例 #1
0
ファイル: XRef.class.php プロジェクト: gariev/xref
 /**
  * Parses command line-arguments and returns found options/arguments.
  *
  *  input (for tests only, by default it takes real command-line option list):
  *      array("scriptname.php", "--help", "-d", "foo=bar", "--config=xref.ini", "filename.php")
  *
  *  output:
  *      array(
  *          array( "help" => true, "define" => array("foo=bar"), "config" => "xref.ini"),
  *          array( "filename.php" )
  *      );
  *
  * @return array(array $commandLineOptions, array $commandLineArguments)
  */
 public static function getCmdOptions($test_args = null)
 {
     if (is_null($test_args)) {
         if (self::$options) {
             return array(self::$options, self::$arguments);
         }
         if (php_sapi_name() != 'cli') {
             return array(array(), array());
         }
     }
     $short_options_list = array();
     // array( 'h', 'v', 'c:' )
     $long_options_list = array();
     // array( 'help', 'verbose', 'config=' )
     $rename_map = array();
     // array( 'h' => 'help', 'c' => 'config' )
     $is_array_map = array();
     // array( 'help' => false, 'define' => true, )
     foreach (self::$optionsList as $o) {
         $short = $o[0];
         $long = $o[1];
         if ($short) {
             $short_options_list[] = $short;
         }
         if ($long) {
             $long_options_list[] = $long;
         }
         $short = preg_replace('/\\W+$/', '', $short);
         // remove ':' and '=' at the end of specificatios
         $long = preg_replace('/\\W+$/', '', $long);
         if ($short && $long) {
             $rename_map[$short] = $long;
         }
         $is_array_map[$long ? $long : $short] = $o[4];
     }
     // * DONE: write a better command-line parser
     // * too bad: the code below (from official Console/Getopt documentation) doesn't work in E_STRICT mode
     // * and Console_GetoptPlus is not installed by default on most systems :(
     // $error_reporting = error_reporting();
     // error_reporting($error_reporting & ~E_STRICT);
     // require_once 'Console/Getopt.php';
     // $getopt = new Console_Getopt();
     // $args = ($test_args) ? $test_args : $getopt->readPHPArgv();
     // $getoptResult = $getopt->getopt( $args, implode('', $short_options_list), $long_options_list);
     // if (PEAR::isError($getoptResult)) {
     //     throw new Exception( $getoptResult->getMessage() );
     // }
     // error_reporting($error_reporting);
     // * end of Console_Getopt dependent code
     global $argv;
     $args = $test_args ? $test_args : $argv;
     $getopt_result = self::myGetopt($args, implode('', $short_options_list), $long_options_list);
     if (!is_array($getopt_result)) {
         throw new Exception($getopt_result);
     }
     $options = array();
     list($opt_list, $arguments) = $getopt_result;
     foreach ($opt_list as $o) {
         list($k, $v) = $o;
         // change default value for command-line options that doesn't require a value
         if (is_null($v)) {
             $v = true;
         }
         // '-a' --> 'a', '--foo' -> 'foo'
         $k = preg_replace('#^-+#', '', $k);
         // force long option names
         if (isset($rename_map[$k])) {
             $k = $rename_map[$k];
         }
         if ($is_array_map[$k]) {
             if (!isset($options[$k])) {
                 $options[$k] = array();
             }
             $options[$k][] = $v;
         } else {
             $options[$k] = $v;
         }
     }
     self::$options = $options;
     self::$arguments = $arguments;
     return array($options, $arguments);
 }