7d310a2
diff -urp flex-2.5.33/scanopt.c flex-2.5.33-pm/scanopt.c
7d310a2
--- flex-2.5.33/scanopt.c	2002-08-29 22:30:25.000000000 +0200
9c030ea
+++ flex-2.5.33-pm/scanopt.c	2007-05-11 17:48:29.000000000 +0200
7d310a2
@@ -789,12 +789,12 @@ int     scanopt (svoid, arg, optindex)
7d310a2
 		}
7d310a2
 
7d310a2
 		optarg = pstart + 1;
7d310a2
-		arglen = 0;
7d310a2
-		while (optarg[arglen])
7d310a2
-			arglen++;
7d310a2
-
7d310a2
-		if (arglen == 0)
7d310a2
+		if (!*optarg) {
7d310a2
 			optarg = NULL;
7d310a2
+			arglen = 0;
7d310a2
+		}
7d310a2
+		else
7d310a2
+			arglen = strlen (optarg);
7d310a2
 	}
7d310a2
 
7d310a2
 	/* At this point, we have a long or short option matched at opt_offset into
9c030ea
@@ -812,13 +812,16 @@ int     scanopt (svoid, arg, optindex)
7d310a2
 
7d310a2
 	/* case: no args allowed */
7d310a2
 	if (auxp->flags & ARG_NONE) {
7d310a2
-		if (optarg) {
9c030ea
+		if (optarg && !is_short) {
9c030ea
 			scanopt_err (s, opt_offset, is_short, errcode =
9c030ea
 				     SCANOPT_ERR_ARG_NOT_ALLOWED);
7d310a2
 			INC_INDEX (s, 1);
9c030ea
 			return errcode;
9c030ea
 		}
7d310a2
-		INC_INDEX (s, 1);
9c030ea
+		else if (!optarg)
9c030ea
+			INC_INDEX (s, 1);
7d310a2
+		else
7d310a2
+			s->subscript++;
7d310a2
 		return optp->r_val;
7d310a2
 	}
7d310a2