Source for file Ethna_Getopt.php
Documentation is available at Ethna_Getopt.php
// vim: foldmethod=marker  
 *  @author     Yoshinari Takaoka <takaoka@beatcraft.com>  
if (!defined('ETHNA_OPTVALUE_IS_DISABLED')) {  
    define('ETHNA_OPTVALUE_IS_DISABLED', 1);  
if (!defined('ETHNA_OPTVALUE_IS_REQUIRED')) {  
    define('ETHNA_OPTVALUE_IS_REQUIRED', 2);  
if (!defined('ETHNA_OPTVALUE_IS_OPTIONAL')) {  
    define('ETHNA_OPTVALUE_IS_OPTIONAL', 3);  
 *  PEAR への依存を排除するため、 Console_Getopt クラスを最実装したもの  
 *  @author     Yoshinari Takaoka <takaoka@beatcraft.com>  
 *  @see        http://pear.php.net/manual/en/package.console.console-getopt.php  
     *  PHP 設定を考慮して、$argv 配列を読みます。  
     *  ini ディレクティブ中の register_argc_argv を考慮します。  
     *  注意: PHP 4.2.0 以前では、$argv を読むためには  
     *         register_globals が ON になっている必要が  
     *         ありました。Ethna は この設定がoffであるこ  
     *  @return array - オプションとパラメータを含む配列、  
        if (ini_get('register_argc_argv') == 
false) {  
                       'Could not read cmd args (register_argc_argv=Off?'  
     *  コマンドラインオプションをパースし、結果を返します。  
     *  @param array  $args - コマンドライン引数の配列  
     *  @param string $shortoptions - 使用できる短いオプション目録を指定します。  
     *  @param array  $longoptions - 使用できる長いオプション目録を指定します。  
     *  @return array - パースされたオプションと非オプションのコマンドライン引数  
     *                   の 2つの要素からなる配列、もしくは Ethna_Error 。  
    function getopt($args, $shortoptions, $longoptions = 
NULL)  
        $shortopts = 
$this->_parseShortOption($shortoptions);  
        $longopts = 
$this->_parseLongOption($longoptions);  
        $parsed_arguments = 
array();  
        $nonparsed_arguments = 
array();  
        for ($pos = 
0; $pos < 
count($args); $pos++
) {  
             $next_arg = isset
($args[$pos + 
1]) ? 
$args[$pos + 
1] : 
NULL;  
             $is_nextarg_is_value = 
false;  
             if (strpos($arg, '--') === 
0) { //  long option  
                 // GNU getopt(3) の場合は、長いオプションは他と重なら  
                 // ない限りにおいて短縮できる。たとえば --foo, --fuji  
                 // というオプションが定義された場合、 --fo や --fu と  
                 // PEAR の Console_Getopt はこの短縮指定に対応していな  
                 // い。よって、それを使用してきた Ethna でもそこまでは  
                 $opt_and_value = 
explode('=', $lopt);  
                 $opt = 
$opt_and_value[0];  
                 $required = 
$longopts[$opt];  
                 if (count($opt_and_value) == 
2) {  
                     $value = 
$opt_and_value[1];   // --foo=bar  
                 } elseif (strpos('-', $next_arg) !== 
0  
                     if (!empty($next_arg)) {      // --foo bar  
                         // == が設定されていた場合は値として解釈「しない」  
                                        "option --$opt requires an argument"  
                                        "option --$opt doesn't allow an argument"  
                 //  長いオプションの場合は、-- 付きでオプション名を記録する  
                 //  Console_Getopt 互換にするため。  
                 $parsed_arguments[] = 
array("--$opt", $value);  
             } elseif (strpos($arg, '-') === 
0) {  // short option  
                 // -abcd のように、オプションと値が続けて  
                 // 入力される場合がある。この場合どうオプションを解釈  
                 // するかの仕様は、GNU getopt(3) の仕様に従う  
                 // 1. abcd を1文字ずつに分解し、a, b, c, d にする  
                 // 2. ':' (値必須) として設定されていた場合は、次の文字以降は  
                 //    全て値として解釈する。この場合は次のargvは値として解釈し  
                 //    ない。また、次の文字がなく、次の argv が値だった場合は、  
                 // 3. '::'(値が任意) として設定されていた場合も次の文字以降を  
                 //    全て値として解釈するが、次の文字がない場合でも次のargvは  
                 // 4. 無設定(値設定禁止)の場合は、次の文字もオプションとして解  
                 //    釈する。また、次のargvは値として解釈しない  
                 // @see LANG=C; man 3 getopt (日本語マニュアルは見ない方がいいかも)  
                 // @see http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html  
                 //  TODO: ambiguous なオプションを検出できるようにする  
                 for ($sopt_pos = 
0; $sopt_pos < 
$sopt_len; $sopt_pos++
) {  
                     $required = isset
($shortopts[$opt]) ? 
$shortopts[$opt] : 
NULL;  
                                if ($next_arg[0] != 
'-') { // -a hoge  
                                $value = 
substr($sopt, $sopt_pos + 
1);  
                                $value = 
(empty($value)) ? 
NULL : 
$value;  
                                            "option -$opt requires an argument"  
                             // ':' または '::' が設定された場合は、次の文字  
                             // 以降を全て値として解釈するため、次のargv要素に  
                     //  短いオプションの場合は、- を付けないでオプション名を記録する  
                     //  Console_Getopt 互換にするため。  
                     $parsed_arguments[] = 
array($opt, $value);  
                     if ($do_next_arg === 
true) {  
             } else {  // オプションとして解釈されない  
                 //   non-parsed なオプションに辿り着いた  
                 //   これは POSIX_CORRECT な実装であって  
                 //   GNU Getopt な実装ではないが、実際に  
                 //   Console_Getopt で行われている以上、  
        return array($parsed_arguments, $nonparsed_arguments);  
     *  @param  string $sopts 短いオプション目録  
     *  @return array  オプションと引数指定種別の配列  
    function _parseShortOption($sopts)  
        $analyze_result = 
array();  
        for ($pos = 
0; $pos < 
strlen($sopts); $pos++
) {  
            $next_char = 
(isset
($sopts[$pos + 
1]))  
            $next2_char = 
(isset
($sopts[$pos + 
2]))  
            //   $sopts[$pos] is character.  
            if ($next_char == 
':' && 
$next2_char == 
':') {  
            } elseif ($next_char == 
':' && 
$next2_char != 
':') {   
     *  @param  array $lopts 長いオプション目録  
     *  @return array オプションと引数指定種別の配列  
    function _parseLongOption($lopts)  
        $analyze_result = 
array();  
        foreach ($lopts as $opt) {  
 
 
	
		Documentation generated on Fri, 11 Nov 2011 03:59:43 +0900 by phpDocumentor 1.4.3