summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1996-09-11 19:43:52 (GMT)
committerGuido van Rossum <guido@python.org>1996-09-11 19:43:52 (GMT)
commit1550ff722d18962ec26284a32e2acccd2f626faf (patch)
tree1f95d23585d31dc5b8b0b369b3a7dc7ce5d5db5c
parent28d4ba24c9e56149ac618d66ed89abdc58e42f76 (diff)
downloadcpython-1550ff722d18962ec26284a32e2acccd2f626faf.zip
cpython-1550ff722d18962ec26284a32e2acccd2f626faf.tar.gz
cpython-1550ff722d18962ec26284a32e2acccd2f626faf.tar.bz2
Layout and cleanup by Fred
-rw-r--r--Lib/getopt.py158
1 files changed, 76 insertions, 82 deletions
diff --git a/Lib/getopt.py b/Lib/getopt.py
index 821ea6b..5d71b28 100644
--- a/Lib/getopt.py
+++ b/Lib/getopt.py
@@ -1,112 +1,106 @@
# 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).
+# similar functionality to the Unix getopt() function, with the
+# addition of long-option support. (Long option support added by Lars
+# Wirzenius <liw@iki.fi>.)
+
+# It has two required 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).
+
+# The optional third argument, if present, getopt.getopt works similar
+# to the GNU getopt_long function (but optional arguments are not
+# supported). The third argument should be a list of strings that
+# name the long options. If the name ends '=', the argument requires
+# an argument.
# It raises the exception getopt.error with a string argument if it
# detects an error.
-# It returns two items:
+# It returns two values:
# (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).
-# Added by Lars Wirzenius (liw@iki.fi): A third argument is optional.
-# If present, getopt.getopt works similar to the GNU getopt_long
-# function (but optional arguments are not supported). The third
-# argument should be a list of strings that name the long options. If
-# the name ends '=', the argument requires an argument.
-
-# (While making this addition, I rewrote the whole thing.)
-
import string
-error = 'getopt error'
+error = 'getopt.error'
def getopt(args, shortopts, longopts = []):
- list = []
- longopts = longopts[:]
- longopts.sort()
- while args and args[0][:1] == '-' and args[0] != '-':
- if args[0] == '-' or args[0] == '--':
- args = args[1:]
- break
- if args[0][:2] == '--':
- list, args = do_longs(list, args[0][2:],
- longopts, args[1:])
- else:
- list, args = do_shorts(list, args[0][1:],
- shortopts, args[1:])
-
- return list, args
+ list = []
+ longopts = longopts[:]
+ longopts.sort()
+ while args and args[0][:1] == '-' and args[0] != '-':
+ if args[0] == '--':
+ args = args[1:]
+ break
+ if args[0][:2] == '--':
+ list, args = do_longs(list, args[0][2:], longopts, args[1:])
+ else:
+ list, args = do_shorts(list, args[0][1:], shortopts, args[1:])
+
+ return list, args
def do_longs(list, opt, longopts, args):
- try:
- i = string.index(opt, '=')
- opt, optarg = opt[:i], opt[i+1:]
- except ValueError:
- optarg = ''
-
- has_arg, opt = long_has_args(opt, longopts)
- if has_arg:
- if not optarg:
- if not args:
- raise error, 'option --' + opt + \
- ' requires argument'
- optarg, args = args[0], args[1:]
- else:
- if optarg:
- raise error, 'argument --' + opt + \
- ' must not have an argument'
- list.append('--' + opt, optarg)
- return list, args
+ try:
+ i = string.index(opt, '=')
+ opt, optarg = opt[:i], opt[i+1:]
+ except ValueError:
+ optarg = None
+
+ has_arg, opt = long_has_args(opt, longopts)
+ if has_arg:
+ if optarg is None:
+ if not args:
+ raise error, 'option --%s requires argument' % opt
+ optarg, args = args[0], args[1:]
+ elif optarg:
+ raise error, 'option --%s must not have an argument' % opt
+ list.append(('--' + opt, optarg or ''))
+ return list, args
# Return:
# has_arg?
# full option name
def long_has_args(opt, longopts):
- optlen = len(opt)
- for i in range(len(longopts)):
- x, y = longopts[i][:optlen], longopts[i][optlen:]
- if opt != x:
- continue
- if y != '' and y != '=' and i+1 < len(longopts):
- if opt == longopts[i+1][:optlen]:
- raise error, 'option --' + opt + \
- ' not a unique prefix'
- if longopts[i][-1:] == '=':
- return 1, longopts[i][:-1]
- return 0, longopts[i]
- raise error, 'option --' + opt + ' not recognized'
+ optlen = len(opt)
+ for i in range(len(longopts)):
+ x, y = longopts[i][:optlen], longopts[i][optlen:]
+ if opt != x:
+ continue
+ if y != '' and y != '=' and i+1 < len(longopts):
+ if opt == longopts[i+1][:optlen]:
+ raise error, 'option --%s not a unique prefix' % opt
+ if longopts[i][-1:] in ('=', ):
+ return 1, longopts[i][:-1]
+ return 0, longopts[i]
+ raise error, 'option --' + opt + ' not recognized'
def do_shorts(list, optstring, shortopts, args):
- while optstring != '':
- opt, optstring = optstring[0], optstring[1:]
- if short_has_arg(opt, shortopts):
- 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
+ while optstring != '':
+ opt, optstring = optstring[0], optstring[1:]
+ if short_has_arg(opt, shortopts):
+ if optstring == '':
+ if not args:
+ raise error, 'option -%s requires argument' % opt
+ optstring, args = args[0], args[1:]
+ optarg, optstring = optstring, ''
+ else:
+ optarg = ''
+ list.append(('-' + opt, optarg))
+ return list, args
def short_has_arg(opt, shortopts):
- for i in range(len(shortopts)):
- if opt == shortopts[i] != ':':
- return shortopts[i+1:i+2] == ':'
- raise error, 'option -' + opt + ' not recognized'
+ for i in range(len(shortopts)):
+ if opt == shortopts[i] != ':':
+ return shortopts[i+1:i+2] == ':'
+ raise error, 'option -%s not recognized' % opt
if __name__ == '__main__':
- import sys
- print getopt(sys.argv[1:], "a:b")
+ import sys
+ print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"])