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