Source

cpython-withatomic / Lib / getopt.py

# 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'