cayman.js
function parse_arguments( argv ) {
	var parsed       = {};
	var current      = false;
	var name         = false;
	var unrecognized = false;
	var have_action  = false;
	var is_global    = false;
	var name_format, option;

	var i, j;

	for ( i = 3, len = argv.length; i < len; i++ ) {
		// Параметр или значение? //
		if ( argv[ i ][ 0 ] === '-' ) {
			// Объявление параметра //
			 
			// Сброс буфера имени текущего параметра //
			current     = false;

			// Сброс флага наличия связанного действия //
			have_action = false;
			
			// Полное или краткое название параметра? // 
			if ( argv[ i ][ 1 ] === '-' ) {
				// Полное //
				name        = argv[ i ].substr( 2 );
				name_format = 'full_name';
			} else {
				// Краткое //
				name        = argv[ i ].substr( 1 );
				name_format = 'short_name';
			}

			// Перебор параметров текущей команды //
			for ( j = 0; j < this.cmd.options.length; j++ ) {
				if ( this.cmd.options[ j ][ name_format ] === name ) {
					parsed[ this.cmd.options[ j ].access_name ] = true;
					current = this.cmd.options[ j ].access_name;
					option  = this.cmd.options[ j ];
					break;
				}
			}

			// Если параметр не принадлежит выполняемой команде //
			if ( !current ) {
				// Перебор глобальных параметров //
				for ( j = 0; j < this.options.length; j++ ) {
					if ( this.options[ j ][ name_format ] === name ) {
						parsed[ this.options[ j ].access_name ] = true;
						current = this.options[ j ].access_name;
						option  = this.options[ j ];
						break;
					}
				}	
			}

			// Если параметр определен в описании программы //
			if ( current ) {
				// Если параметр требует выполнения некой функции //
				if ( option.action ) {
					have_action = true;
					actions_quee.push({
						'action' : option.action,
						'value'  : parsed[ current ]
					});
				}
			} else {
				// Если текущий параметр не найден нигде, предупреждаем пользователя //
				unrecognized = true;
				console.warn( "  Unrecognized option '%s', see help.", name );
			}
		} else {
			// Объявление значения параметра //
			
			// Если значению предшествует название параметра //
			if ( current ) {
				// Регистрация параметра и его значения //
				parsed[ current ] = argv[ i ];

				// Если параметр имеет связанное действие //
				if ( have_action ) {
					// Регистрация значения параметра //
					actions_quee[ actions_quee.length - 1 ].value = argv[ i ];
				}
			} else {
				// WTF? //
				console.warn( "  Unexpected value '%s' without option, check syntax.", argv[ i ] );
				unrecognized = true;
			}
		}
	}

	return unrecognized ? false : parsed;
}
function parse_arguments( argv ) {
	var parsed       = {};
	var current      = false;
	var name         = false;
	var unrecognized = false;
	var have_action  = false;
	var is_global    = false;
	var name_format, option;

	var i, j;

	for ( i = 3, len = argv.length; i < len; i++ ) {
		// Параметр или значение? //
		if ( argv[ i ][ 0 ] === '-' ) {
			// Объявление параметра //
			 
			// Сброс буфера имени текущего параметра //
			current     = false;

			// Сброс флага наличия связанного действия //
			have_action = false;
			
			// Полное или краткое название параметра? // 
			if ( argv[ i ][ 1 ] === '-' ) {
				// Полное //
				name        = argv[ i ].substr( 2 );
				name_format = 'full_name';
			} else {
				// Краткое //
				name        = argv[ i ].substr( 1 );
				name_format = 'short_name';
			}

			// Перебор параметров текущей команды //
			for ( j = 0; j < this.cmd.options.length; j++ ) {
				if ( this.cmd.options[ j ][ name_format ] === name ) {
					parsed[ this.cmd.options[ j ].access_name ] = true;
					current = this.cmd.options[ j ].access_name;
					option  = this.cmd.options[ j ];
					break;
				}
			}

			// Если параметр не принадлежит выполняемой команде //
			if ( !current ) {
				// Перебор глобальных параметров //
				for ( j = 0; j < this.options.length; j++ ) {
					if ( this.options[ j ][ name_format ] === name ) {
						parsed[ this.options[ j ].access_name ] = true;
						current = this.options[ j ].access_name;
						option  = this.options[ j ];
						break;
					}
				}	
			}

			// Если параметр определен в описании программы //
			if ( current ) {
				// Если параметр требует выполнения некой функции //
				if ( option.action ) {
					have_action = true;
					actions_quee.push({
						'action' : option.action,
						'value'  : parsed[ current ]
					});
				}
			} else {
				// Если текущий параметр не найден нигде, предупреждаем пользователя //
				unrecognized = true;
				console.warn( "  Unrecognized option '%s', see help.", name );
			}
		} else {
			// Объявление значения параметра //
			
			// Если значению предшествует название параметра //
			if ( current ) {
				// Регистрация параметра и его значения //
				parsed[ current ] = argv[ i ];

				// Если параметр имеет связанное действие //
				if ( have_action ) {
					// Регистрация значения параметра //
					actions_quee[ actions_quee.length - 1 ].value = argv[ i ];
				}
			} else {
				// WTF? //
				console.warn( "  Unexpected value '%s' without option, check syntax.", argv[ i ] );
				unrecognized = true;
			}
		}
	}

	return unrecognized ? false : parsed;
}
Выполняет парсинг массива параметров в результирующий
объект согласно описанию этих параметров.
@param  {object} argv Массив переданных при запуске параметров
@return {object} 	 Результат парсинга