/**
 * http://php.net/manual/en/function.getopt.php
 * temporary polyfill for proper working of getopt()
 * will revert to the native function if php >= 5.3.0
 *
 *
 * ===============================================================
 * THIS FUNCTION SHOULD NOT BE RELIED UPON AS IT WILL REMOVED
 * ONCE THE PROJECT REQUIRES PHP 5.3.0
 * if you must, call like:
 * $getopts = (function_exists('_getopt') ? '_' : '') . 'getopt';
 * $vars = $getopts($short = '', $long = array('id::'));
 * ===============================================================
 *
 *
 * http://www.ntu.beautifulworldco.com/weblog/?p=526
 */
function _getopt()
{
    if (func_num_args() == 1) {
        $flag = $flag_array = $GLOBALS['argv'];
        $short_option = func_get_arg(0);
        $long_option = array();
    } elseif (func_num_args() == 2) {
        if (is_array(func_get_arg(1))) {
            $flag = $GLOBALS['argv'];
            $short_option = func_get_arg(0);
            $long_option = func_get_arg(1);
        } else {
            $flag = func_get_arg(0);
            $short_option = func_get_arg(1);
            $long_option = array();
        }
    } else {
        if (func_num_args() == 3) {
            $flag = func_get_arg(0);
            $short_option = func_get_arg(1);
            $long_option = func_get_arg(2);
        } else {
            exit("wrong options\n");
        }
    }
    if (PHP_VERSION_ID >= 50300) {
        return getopt($short_option, $long_option);
    }
    $short_option = trim($short_option);
    $short_no_value = array();
    $short_required_value = array();
    $short_optional_value = array();
    $long_no_value = array();
    $long_required_value = array();
    $long_optional_value = array();
    $options = array();
    for ($i = 0; $i < strlen($short_option);) {
        if ($short_option[$i] != ":") {
            if ($i == strlen($short_option) - 1) {
                $short_no_value[] = $short_option[$i];
                break;
            } else {
                if ($short_option[$i + 1] != ":") {
                    $short_no_value[] = $short_option[$i];
                    $i++;
                    continue;
                } elseif ($short_option[$i + 1] == ":" && $short_option[$i + 2] != ":") {
                    $short_required_value[] = $short_option[$i];
                    $i += 2;
                    continue;
                } elseif ($short_option[$i + 1] == ":" && $short_option[$i + 2] == ":") {
                    $short_optional_value[] = $short_option[$i];
                    $i += 3;
                    continue;
                }
            }
        } else {
            continue;
        }
    }
    foreach ($long_option as $a) {
        if (substr($a, -2) == "::") {
            $long_optional_value[] = substr($a, 0, -2);
            continue;
        } elseif (substr($a, -1) == ":") {
            $long_required_value[] = substr($a, 0, -1);
            continue;
        } else {
            $long_no_value[] = $a;
            continue;
        }
    }
    if (is_array($flag)) {
        $flag_array = $flag;
    } else {
        $flag = "- {$flag}";
        $flag_array = split_para($flag);
    }
    for ($i = 0; $i < count($flag_array);) {
        if ($i >= count($flag_array)) {
            break;
        }
        if (!$flag_array[$i] || $flag_array[$i] == "-") {
            $i++;
            continue;
        }
        if ($flag_array[$i][0] != "-") {
            $i++;
            continue;
        }
        if (substr($flag_array[$i], 0, 2) == "--") {
            if (strpos($flag_array[$i], '=') != false) {
                list($key, $value) = explode('=', substr($flag_array[$i], 2), 2);
                if (in_array($key, $long_required_value) || in_array($key, $long_optional_value)) {
                    $options[$key][] = $value;
                }
                $i++;
                continue;
            }
            if (strpos($flag_array[$i], '=') == false) {
                $key = substr($flag_array[$i], 2);
                if (in_array(substr($flag_array[$i], 2), $long_required_value)) {
                    $options[$key][] = $flag_array[$i + 1];
                    $i += 2;
                    continue;
                } elseif (in_array(substr($flag_array[$i], 2), $long_optional_value)) {
                    if ($flag_array[$i + 1] != "" && $flag_array[$i + 1][0] != "-") {
                        $options[$key][] = $flag_array[$i + 1];
                        $i += 2;
                    } else {
                        $options[$key][] = FALSE;
                        $i++;
                    }
                    continue;
                } else {
                    if (in_array(substr($flag_array[$i], 2), $long_no_value)) {
                        $options[$key][] = FALSE;
                        $i++;
                        continue;
                    } else {
                        $i++;
                        continue;
                    }
                }
            }
        } else {
            if ($flag_array[$i][0] == "-" && $flag_array[$i][1] != "-") {
                for ($j = 1; $j < strlen($flag_array[$i]); $j++) {
                    if (in_array($flag_array[$i][$j], $short_required_value) || in_array($flag_array[$i][$j], $short_optional_value)) {
                        if ($j == strlen($flag_array[$i]) - 1) {
                            if (in_array($flag_array[$i][$j], $short_required_value)) {
                                $options[$flag_array[$i][$j]][] = $flag_array[$i + 1];
                                $i += 2;
                            } else {
                                if (in_array($flag_array[$i][$j], $short_optional_value) && $flag_array[$i + 1] != "" && $flag_array[$i + 1][0] != "-") {
                                    $options[$flag_array[$i][$j]][] = $flag_array[$i + 1];
                                    $i += 2;
                                } else {
                                    $options[$flag_array[$i][$j]][] = FALSE;
                                    $i++;
                                }
                            }
                            $plus_i = 0;
                            break;
                        } else {
                            $options[$flag_array[$i][$j]][] = substr($flag_array[$i], $j + 1);
                            $i++;
                            $plus_i = 0;
                            break;
                        }
                    } else {
                        if (in_array($flag_array[$i][$j], $short_no_value)) {
                            $options[$flag_array[$i][$j]][] = FALSE;
                            $plus_i = 1;
                            continue;
                        }
                    }
                }
                $i += $plus_i;
                continue;
            }
        }
        $i++;
        continue;
    }
    foreach ($options as $key => $value) {
        if (count($value) == 1) {
            $options[$key] = $value[0];
        }
    }
    return $options;
}
Example #2
0
function _getopt()
{
    /* _getopt(): Ver. 1.3      2009/05/30
       My page: http://www.ntu.beautifulworldco.com/weblog/?p=526
    
    Usage: _getopt ( [$flag,] $short_option [, $long_option] );
    
    Note that another function split_para() is required, which can be found in the same
    page.
    
    _getopt() fully simulates getopt() which is described at
    http://us.php.net/manual/en/function.getopt.php , including long options for PHP
    version under 5.3.0. (Prior to 5.3.0, long options was only available on few systems)
    
    Besides legacy usage of getopt(), I also added a new option to manipulate your own
    argument lists instead of those from command lines. This new option can be a string
    or an array such as 
    
    $flag = "-f value_f -ab --required 9 --optional=PK --option -v test -k";
    or
    $flag = array ( "-f", "value_f", "-ab", "--required", "9", "--optional=PK", "--option" );
    
    So there are four ways to work with _getopt(),
    
    1. _getopt ( $short_option );
    
      it's a legacy usage, same as getopt ( $short_option ).
    
    2. _getopt ( $short_option, $long_option );
    
      it's a legacy usage, same as getopt ( $short_option, $long_option ).
    
    3. _getopt ( $flag, $short_option );
    
      use your own argument lists instead of command line arguments.
    
    4. _getopt ( $flag, $short_option, $long_option );
    
      use your own argument lists instead of command line arguments.
    
    */
    if (func_num_args() == 1) {
        $flag = $flag_array = $GLOBALS['argv'];
        $short_option = func_get_arg(0);
        $long_option = array();
        return getopt($short_option);
    } else {
        if (func_num_args() == 2) {
            if (is_array(func_get_arg(1))) {
                $flag = $GLOBALS['argv'];
                $short_option = func_get_arg(0);
                $long_option = func_get_arg(1);
                if (PHP_VERSION_ID >= 50300) {
                    return getopt($short_option, $long_option);
                }
            } else {
                $flag = func_get_arg(0);
                $short_option = func_get_arg(1);
                $long_option = array();
                return getopt($short_option);
            }
        } else {
            if (func_num_args() == 3) {
                $flag = func_get_arg(0);
                $short_option = func_get_arg(1);
                $long_option = func_get_arg(2);
                if (PHP_VERSION_ID >= 50300) {
                    return getopt($short_option, $long_option);
                }
            } else {
                exit("wrong options\n");
            }
        }
    }
    $short_option = trim($short_option);
    $short_no_value = array();
    $short_required_value = array();
    $short_optional_value = array();
    $long_no_value = array();
    $long_required_value = array();
    $long_optional_value = array();
    $options = array();
    for ($i = 0; $i < strlen($short_option);) {
        if ($short_option[$i] != ":") {
            if ($i == strlen($short_option) - 1) {
                $short_no_value[] = $short_option[$i];
                break;
            } else {
                if ($short_option[$i + 1] != ":") {
                    $short_no_value[] = $short_option[$i];
                    $i++;
                    continue;
                } else {
                    if ($short_option[$i + 1] == ":" && $short_option[$i + 2] != ":") {
                        $short_required_value[] = $short_option[$i];
                        $i += 2;
                        continue;
                    } else {
                        if ($short_option[$i + 1] == ":" && $short_option[$i + 2] == ":") {
                            $short_optional_value[] = $short_option[$i];
                            $i += 3;
                            continue;
                        }
                    }
                }
            }
        } else {
            continue;
        }
    }
    foreach ($long_option as $a) {
        if (substr($a, -2) == "::") {
            $long_optional_value[] = substr($a, 0, -2);
            continue;
        } else {
            if (substr($a, -1) == ":") {
                $long_required_value[] = substr($a, 0, -1);
                continue;
            } else {
                $long_no_value[] = $a;
                continue;
            }
        }
    }
    if (is_array($flag)) {
        $flag_array = $flag;
    } else {
        $flag = "- {$flag}";
        $flag_array = split_para($flag);
    }
    for ($i = 0; $i < count($flag_array);) {
        if ($i >= count($flag_array)) {
            break;
        }
        if (!$flag_array[$i] || $flag_array[$i] == "-") {
            $i++;
            continue;
        }
        if ($flag_array[$i][0] != "-") {
            $i++;
            continue;
        }
        if (substr($flag_array[$i], 0, 2) == "--") {
            if (strpos($flag_array[$i], '=') != false) {
                list($key, $value) = explode('=', substr($flag_array[$i], 2), 2);
                if (in_array($key, $long_required_value) || in_array($key, $long_optional_value)) {
                    $options[$key][] = $value;
                }
                $i++;
                continue;
            }
            if (strpos($flag_array[$i], '=') == false) {
                $key = substr($flag_array[$i], 2);
                if (in_array(substr($flag_array[$i], 2), $long_required_value)) {
                    $options[$key][] = $flag_array[$i + 1];
                    $i += 2;
                    continue;
                } else {
                    if (in_array(substr($flag_array[$i], 2), $long_optional_value)) {
                        if ($flag_array[$i + 1] != "" && $flag_array[$i + 1][0] != "-") {
                            $options[$key][] = $flag_array[$i + 1];
                            $i += 2;
                        } else {
                            $options[$key][] = FALSE;
                            $i++;
                        }
                        continue;
                    } else {
                        if (in_array(substr($flag_array[$i], 2), $long_no_value)) {
                            $options[$key][] = FALSE;
                            $i++;
                            continue;
                        } else {
                            $i++;
                            continue;
                        }
                    }
                }
            }
        } else {
            if ($flag_array[$i][0] == "-" && $flag_array[$i][1] != "-") {
                for ($j = 1; $j < strlen($flag_array[$i]); $j++) {
                    if (in_array($flag_array[$i][$j], $short_required_value) || in_array($flag_array[$i][$j], $short_optional_value)) {
                        if ($j == strlen($flag_array[$i]) - 1) {
                            if (in_array($flag_array[$i][$j], $short_required_value)) {
                                $options[$flag_array[$i][$j]][] = $flag_array[$i + 1];
                                $i += 2;
                            } else {
                                if (in_array($flag_array[$i][$j], $short_optional_value) && $flag_array[$i + 1] != "" && $flag_array[$i + 1][0] != "-") {
                                    $options[$flag_array[$i][$j]][] = $flag_array[$i + 1];
                                    $i += 2;
                                } else {
                                    $options[$flag_array[$i][$j]][] = FALSE;
                                    $i++;
                                }
                            }
                            $plus_i = 0;
                            break;
                        } else {
                            $options[$flag_array[$i][$j]][] = substr($flag_array[$i], $j + 1);
                            $i++;
                            $plus_i = 0;
                            break;
                        }
                    } else {
                        if (in_array($flag_array[$i][$j], $short_no_value)) {
                            $options[$flag_array[$i][$j]][] = FALSE;
                            $plus_i = 1;
                            continue;
                        } else {
                            $plus_i = 1;
                            break;
                        }
                    }
                }
                $i += $plus_i;
                continue;
            }
        }
        $i++;
        continue;
    }
    foreach ($options as $key => $value) {
        if (count($value) == 1) {
            $options[$key] = $value[0];
        }
    }
    return $options;
}