Rewritten by Lars Wizenius to add long options
diff --git a/Lib/getopt.py b/Lib/getopt.py
index 7feaf9d..821ea6b 100644
--- a/Lib/getopt.py
+++ b/Lib/getopt.py
@@ -18,30 +18,95 @@
 #	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'
 
-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 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:])
 
-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'
+        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
+
+# 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'
+
+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
+
+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'
+
+if __name__ == '__main__':
+        import sys
+        print getopt(sys.argv[1:], "a:b")