/**
  * The actual implementation of the argument parsing code.
  */
 static function doGetopt($version, $args, $short_options, $long_options = null)
 {
     if (empty($args)) {
         return array(array(), array());
     }
     $opts = array();
     $non_opts = array();
     settype($args, 'array');
     if ($long_options) {
         sort($long_options);
     }
     /*
      * Preserve backwards compatibility with callers that relied on
      * erroneous POSIX fix.
      */
     if ($version < 2) {
         if (isset($args[0][0]) && $args[0][0] != '-') {
             array_shift($args);
         }
     }
     reset($args);
     while (list($i, $arg) = each($args)) {
         /* The special element '--' means explicit end of
            options. Treat the rest of the arguments as non-options
            and end the loop. */
         if ($arg == '--') {
             $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
             break;
         }
         if ($arg[0] != '-' || strlen($arg) > 1 && $arg[1] == '-' && !$long_options) {
             $non_opts = array_merge($non_opts, array_slice($args, $i));
             break;
         } elseif (strlen($arg) > 1 && $arg[1] == '-') {
             lmbTestGetopt::_parseLongOption(substr($arg, 2), $long_options, $opts, $args);
         } else {
             lmbTestGetopt::_parseShortOption(substr($arg, 1), $short_options, $opts, $args);
         }
     }
     return array($opts, $non_opts);
 }