function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnknown = false) { $aQuick = array(); $aCounts = array(); foreach ($aSpec as $aLine) { if (is_array($aLine)) { if ($aLine[0]) { $aQuick['--' . $aLine[0]] = $aLine; } if ($aLine[1]) { $aQuick['-' . $aLine[1]] = $aLine; } $aCounts[$aLine[0]] = 0; } } $aResult = array(); $bUnknown = false; $iSize = sizeof($aArg); for ($i = 1; $i < $iSize; $i++) { if (isset($aQuick[$aArg[$i]])) { $aLine = $aQuick[$aArg[$i]]; $aCounts[$aLine[0]]++; $xVal = null; if ($aLine[4] == $aLine[5]) { if ($aLine[4]) { $xVal = array(); for ($n = $aLine[4]; $i < $iSize && $n; $n--) { $i++; if ($i >= $iSize || $aArg[$i][0] == '-') { showUsage($aSpec, $bExitOnError, 'Paramater of \'' . $aLine[0] . '\' is missing'); } switch ($aLine[6]) { case 'realpath': $xVal[] = realpath($aArg[$i]); break; case 'realdir': $sPath = realpath(dirname($aArg[$i])); if ($sPath) { $xVal[] = $sPath . '/' . basename($aArg[$i]); } else { $xVal[] = $sPath; } break; case 'bool': $xVal[] = (bool) $aArg[$i]; break; case 'int': $xVal[] = (int) $aArg[$i]; break; default: $xVal[] = $aArg[$i]; break; } } if ($aLine[4] == 1) { $xVal = $xVal[0]; } } else { $xVal = true; } } else { return factory::throwError('Variable numbers of params not yet supported'); } if ($aLine[3] > 1) { if (!array_key_exists($aLine[0], $aResult)) { $aResult[$aLine[0]] = array(); } $aResult[$aLine[0]][] = $xVal; } else { $aResult[$aLine[0]] = $xVal; } } else { $bUnknown = $aArg[$i]; } } if (array_key_exists('help', $aResult)) { showUsage($aSpec); } if ($bUnknown && $bExitOnUnknown) { showUsage($aSpec, $bExitOnError, 'Unknown option \'' . $bUnknown . '\''); } foreach ($aSpec as $aLine) { if (is_array($aLine)) { if ($aCounts[$aLine[0]] < $aLine[2]) { showUsage($aSpec, $bExitOnError, 'Option \'' . $aLine[0] . '\' is missing'); } if ($aCounts[$aLine[0]] > $aLine[3]) { showUsage($aSpec, $bExitOnError, 'Option \'' . $aLine[0] . '\' is pressent too many times'); } switch ($aLine[6]) { case 'bool': if (!array_key_exists($aLine[0], $aResult)) { $aResult[$aLine[0]] = false; } break; } } } return $bUnknown; }