diff options
-rw-r--r-- | it.class | 135 |
1 files changed, 126 insertions, 9 deletions
@@ -23,6 +23,10 @@ class it { + static $stdin_args = array(); + static $stdin = null; + static $stdin_filename = ""; + static $stdin_line = 0; /** * Clone an object and return copy, works for all PHP versions @@ -184,15 +188,6 @@ function bail($message = "Bailed.\n") /** - * Return "db4" or "db2" depending on availability - */ -function dba_handler() -{ - return in_array("db4", dba_handlers()) ? "db4" : "db2"; -} - - -/** * Convert a string to ASCII-only chars, map/strip ISO-8859-1 accents * @param $text Text to convert * @return mapped/stripped version of $text contains only chars [0..127] @@ -377,6 +372,7 @@ function _exec_quotevalue($value) return escapeshellarg($result); } + /** * Convert an image to a given size and type (ensures input is an image) * @param $p['in'] Input filename (mandatory) @@ -398,6 +394,127 @@ function imageconvert($p) return $result; } + +/** + * Parse command line options with Usage given as template. Example: + * Usage: myprogram.php [OPTIONS] PATTERN + * -s, --short Use short ouput + * -f, --file=FILE Use FILE for input + * -x EXTENSION Ignore EXTENSION + * Value always stored in long opt. Use double blank before explanation. Non-option text ignored. + * Mandatory non-option arguments are stored under their lowercased name. + * @param $helplines Usage parsed to determine options + * @return Associative array of opts: Boolean options are set to true, remaining args returned in 'args' + */ +function getopt($helplines) +{ + $result = array('args' => array()); + + if ($indentation = it::match('^\s+', $helplines)) + $helplines = it::replace($indentation => "\n", $helplines); + + foreach(explode("\n", trim($helplines)) as $helpline) + { + $shortoptname = $shortoptarg = $longoptname = $longoptarg = ""; + foreach (explode(',', $helpline) as $optdesc) + { + $optdesc = trim($optdesc); + if ($matches = (array)it::match('^--(\w[\w-]*)(=[A-Z])?', $optdesc)) + list($longoptname, $longoptarg) = $matches; + elseif ($matches = (array)it::match('^-(\w)( [A-Z])?', $optdesc)) + list($shortoptname, $shortoptarg) = $matches; + } + + if ($longoptname || $shortoptname) + { + if ($longoptname && $shortoptname) + $alias[$shortoptname] = $longoptname; + + $witharg[$longoptname ? $longoptname : $shortoptname] = $longoptarg || $shortoptarg; + } + } + + $mandatoryargs = array(); + if ($tmp = trim(it::replace("\n.*" => "", "^\S+\s+\S+\s*" => "", "\[.*?\]\s*" => "", trim($helplines)))) + $mandatoryargs = preg_split('/\s+/', $tmp); + + foreach (array_slice($_SERVER['argv'], 1) as $arg) + { + if ($eat) + { + if (it::match('^--?\w', $arg)) # Already next option => Missing argument? + $err = true; + else + $result[array_shift($eat)] = $arg; + } + elseif ($matches = (array)it::match('^--(\w[\w-]*)(=\S*)?', $arg)) + { + list($optname, $val) = $matches; + if (!isset($witharg[$optname]) || isset($val) && !$witharg[$optname]) + $err = true; + else if($witharg[$optname] && !$val) + $eat[] = $optname; + else + $result[$optname] = $val ? substr($val, 1) : true; + } + else if ($letters = it::match('^-(\w+)', $arg)) + { + foreach (str_split($letters, 1) as $letter) + { + $optname = $alias[$letter] ? $alias[$letter] : $letter; + if ($witharg[$optname]) + $eat[] = $optname; + else if (!isset($witharg[$optname])) + $err = true; + else + $result[$optname] = true; + } + } + elseif($mandatoryargs) + $result[strtolower(array_shift($mandatoryargs))] = $arg; + else + $result['args'][] = $arg; + } + + if ($err || $eat || $result['h'] || $result['help'] || $mandatoryargs) + { + fputs(($result['h'] || $result['help'] ? STDOUT : STDERR), trim($helplines) . "\n"); + exit(1); + } + + it::$stdin_args = $result['args'] ? $result['args'] : array("-"); + it::_stdin_next(); + + return $result; +} + +function _stdin_next() +{ + if ($result = it::$stdin_args) + { + it::$stdin_filename = array_shift(it::$stdin_args); + it::$stdin = (it::$stdin_filename == "-") ? STDIN : @fopen(it::$stdin_filename, "r"); + it::$stdin_line = 0; + } + + return $result; +} + +/** + * Get one line from stdin (or files given on command line) a la Perl <>. + * Note: You need to call getopt() before using this function. + * @return Line (including newline) or false on eof + */ +function gets() +{ + do { + $result = fgets(it::$stdin); + } while (($result === false) && it::_stdin_next()); + + it::$stdin_line++; + return $result; +} + } ?> |