]> granicus.if.org Git - python/commitdiff
Layout and cleanup by Fred
authorGuido van Rossum <guido@python.org>
Wed, 11 Sep 1996 19:43:52 +0000 (19:43 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 11 Sep 1996 19:43:52 +0000 (19:43 +0000)
Lib/getopt.py

index 821ea6b6a84da47e137a0d50ad408df9a3f45b58..5d71b282546794eee14466e9d362e0df8522a456 100644 (file)
 # 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"])