# module getopt -- Standard command line processing.

# Function getopt.getopt() has a different interface but provides the
# same functionality as the Unix getopt() function.

# It has two arguments: the first should be argv[1:] (it doesn't want
# the script name), the second the string of option letters as passed
# to Unix getopt() (i.e., a string of allowable option letters, with
# options requiring an argument followed by a colon).

# It raises the exception getopt.error with a string argument if it
# detects an error.

# It returns two items:
# (1)	a list of pairs (option, option_argument) giving the options in
#	the order in which they were specified.  (I'd use a dictionary
#	but applications may depend on option order or multiple
#	occurrences.)  Boolean options have '' as option_argument.
# (2)	the list of remaining arguments (may be empty).

error = 'getopt error'

def getopt(args, options):
    list = []
    while args and args[0][:1] == '-' and args[0] <> '-':
    	if args[0] == '--':
    	    args = args[1:]
    	    break
    	optstring, args = args[0][1:], args[1:]
    	while optstring <> '':
    	    opt, optstring = optstring[0], optstring[1:]
    	    if classify(opt, options): # May raise exception as well
    	    	if optstring == '':
    	    	    if not args:
    	    	    	raise error, 'option -' + opt + ' requires argument'
    	    	    optstring, args = args[0], args[1:]
    	    	optarg, optstring = optstring, ''
    	    else:
    	    	optarg = ''
    	    list.append('-' + opt, optarg)
    return list, args

def classify(opt, options): # Helper to check type of option
    for i in range(len(options)):
	if opt == options[i] <> ':':
	    return options[i+1:i+2] == ':'
    raise error, 'option -' + opt + ' not recognized'
