Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH 2/6: print invalid option to getopts correctly



---

This one can't use unmeta_one because we just unmetafy()ed optstr.

 Src/builtin.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/Src/builtin.c b/Src/builtin.c
index f61a41af33..723d5b8e73 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -5677,6 +5677,7 @@ bin_getopts(UNUSED(char *name), char **argv, Options ops, UNUSED(int func))
     char *optstr = unmetafy(*argv++, &lenoptstr), *var = *argv++;
     char **args = (*argv) ? argv : pparams;
     char *str, optbuf[2] = " ", *p, opch;
+    convchar_t wopch;
 
     // note that resetting + restoring OPTIND happens in doshfunc(), so using -p
     // or enabling POSIX_BUILTINS inside a function that calls getopts is not
@@ -5718,7 +5719,9 @@ bin_getopts(UNUSED(char *name), char **argv, Options ops, UNUSED(int func))
 	}
 	optcind++;
     }
-    opch = str[optcind++];
+    opch = str[optcind];
+    MB_CHARINIT();
+    optcind += MB_CHARLENCONV(str + optcind, lenstr - optcind, &wopch);
     if(str[0] == '+') {
 	optbuf[0] = '+';
 	lenoptbuf = 2;
@@ -5740,7 +5743,7 @@ bin_getopts(UNUSED(char *name), char **argv, Options ops, UNUSED(int func))
 	    zoptarg = metafy(optbuf, lenoptbuf, META_DUP);
 	} else {
 	    zwarn("bad option: %c%c",
-		  "?-+"[lenoptbuf], opch);
+		  "?-+"[lenoptbuf], wopch);
 	    zoptarg=ztrdup("");
 	}
 	return 0;
@@ -5763,7 +5766,7 @@ bin_getopts(UNUSED(char *name), char **argv, Options ops, UNUSED(int func))
 		    setsparam(var, ztrdup("?"));
 		    zoptarg = ztrdup("");
 		    zwarn("argument expected after %c%c option",
-			  "?-+"[lenoptbuf], opch);
+			  "?-+"[lenoptbuf], wopch);
 		}
 		return 0;
 	    }
-- 
2.38.1





Messages sorted by: Reverse Date, Date, Thread, Author