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

PATCH 6/6: compctl: print multibyte errors correctly (phew)



---

Sending this one separately because it's long and it's also not gotten a lot of
testing from being in my local tree, because it's compctl. I did try a few things
randomly and they seem to have the same result as before, whatever that is.

 Src/Zle/compctl.c | 136 +++++++++++++++++++++++-----------------------
 1 file changed, 69 insertions(+), 67 deletions(-)

diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index acd4b04358..3101030b7c 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -383,7 +383,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
      * cct is a temporary just to hold flags; it never needs freeing.
      */
     struct compctl cct;
-    char **argv = *av, argv_end[2] = "x";
+    char **argv = *av, argv_end[1] = "";
     int ready = 0, hx = 0;
 
     /* Handle `compctl + foo ...' specially:  turn it into
@@ -412,10 +412,12 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
     for (; !ready && argv[0] && argv[0][0] == '-' && (argv[0][1] || !first);) {
 	if (!argv[0][1])
 	    *argv = "-+";
-	while (!ready && *++(*argv)) {
-	    if(**argv == Meta)
-		*++*argv ^= 32;
-	    switch (**argv) {
+	++*argv;
+	while (!ready && **argv) {
+	    int sz;
+	    convchar_t arg = unmeta_one(*argv, &sz);
+	    *argv += sz;
+	    switch (arg) {
 	    case 'f':
 		cct.mask |= CC_FILES;
 		break;
@@ -511,15 +513,15 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		    char *p;
 
 		    if (cl) {
-			zwarnnam(name, "illegal option -%c", **argv);
+			zwarnnam(name, "illegal option -%c", arg);
 			return 1;
 		    }
-		    if ((*argv)[1]) {
-			p = (*argv) + 1;
+		    if (**argv) {
+			p = *argv;
 			*argv = argv_end;
 		    } else if (!argv[1]) {
 			zwarnnam(name, "retry specification expected after -%c",
-				 **argv);
+				 arg);
 			return 1;
 		    } else {
 			p = *++argv;
@@ -539,8 +541,8 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 			cct.mask2 = CC_DEFCONT;
 			break;
 		    default:
-			zwarnnam(name, "invalid retry specification character `%c'",
-				 *p);
+			convchar_t s = unmeta_one(p, NULL);
+			zwarnnam(name, "invalid retry specification character `%c'", s);
 			return 1;
 		    }
 		    if (p[1]) {
@@ -551,11 +553,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'k':
-		if ((*argv)[1]) {
-		    cct.keyvar = (*argv) + 1;
+		if (**argv) {
+		    cct.keyvar = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "variable name expected after -%c", **argv);
+		    zwarnnam(name, "variable name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.keyvar = *++argv;
@@ -563,11 +565,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'K':
-		if ((*argv)[1]) {
-		    cct.func = (*argv) + 1;
+		if (**argv) {
+		    cct.func = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "function name expected after -%c", **argv);
+		    zwarnnam(name, "function name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.func = *++argv;
@@ -580,11 +582,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 	    case 'X':
 		cct.mask &= ~CC_EXPANDEXPL;
 	    expl:
-		if ((*argv)[1]) {
-		    cct.explain = (*argv) + 1;
+		if (**argv) {
+		    cct.explain = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "string expected after -%c", **argv);
+		    zwarnnam(name, "string expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.explain = *++argv;
@@ -592,23 +594,23 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'y':
-		if ((*argv)[1]) {
-		    cct.ylist = (*argv) + 1;
+		if (**argv) {
+		    cct.ylist = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
 		    zwarnnam(name, "function/variable expected after -%c",
-			     **argv);
+			     arg);
 		} else {
 		    cct.ylist = *++argv;
 		    *argv = argv_end;
 		}
 		break;
 	    case 'P':
-		if ((*argv)[1]) {
-		    cct.prefix = (*argv) + 1;
+		if (**argv) {
+		    cct.prefix = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "string expected after -%c", **argv);
+		    zwarnnam(name, "string expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.prefix = *++argv;
@@ -616,11 +618,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'S':
-		if ((*argv)[1]) {
-		    cct.suffix = (*argv) + 1;
+		if (**argv) {
+		    cct.suffix = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "string expected after -%c", **argv);
+		    zwarnnam(name, "string expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.suffix = *++argv;
@@ -628,11 +630,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'g':
-		if ((*argv)[1]) {
-		    cct.glob = (*argv) + 1;
+		if (**argv) {
+		    cct.glob = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "glob pattern expected after -%c", **argv);
+		    zwarnnam(name, "glob pattern expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.glob = *++argv;
@@ -640,12 +642,12 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 's':
-		if ((*argv)[1]) {
-		    cct.str = (*argv) + 1;
+		if (**argv) {
+		    cct.str = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
 		    zwarnnam(name, "command string expected after -%c",
-			     **argv);
+			     arg);
 		    return 1;
 		} else {
 		    cct.str = *++argv;
@@ -654,13 +656,13 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		break;
 	    case 'l':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
-		} else if ((*argv)[1]) {
-		    cct.subcmd = (*argv) + 1;
+		} else if (**argv) {
+		    cct.subcmd = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "command name expected after -%c", **argv);
+		    zwarnnam(name, "command name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.subcmd = *++argv;
@@ -669,13 +671,13 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		break;
 	    case 'h':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
-		} else if ((*argv)[1]) {
-		    cct.substr = (*argv) + 1;
+		} else if (**argv) {
+		    cct.substr = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "command name expected after -%c", **argv);
+		    zwarnnam(name, "command name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.substr = *++argv;
@@ -683,11 +685,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'W':
-		if ((*argv)[1]) {
-		    cct.withd = (*argv) + 1;
+		if (**argv) {
+		    cct.withd = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "path expected after -%c", **argv);
+		    zwarnnam(name, "path expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.withd = *++argv;
@@ -695,11 +697,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'J':
-		if ((*argv)[1]) {
-		    cct.gname = (*argv) + 1;
+		if (**argv) {
+		    cct.gname = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "group name expected after -%c", **argv);
+		    zwarnnam(name, "group name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.gname = *++argv;
@@ -707,11 +709,11 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'V':
-		if ((*argv)[1]) {
-		    cct.gname = (*argv) + 1;
+		if (**argv) {
+		    cct.gname = *argv;
 		    *argv = argv_end;
 		} else if (!argv[1]) {
-		    zwarnnam(name, "group name expected after -%c", **argv);
+		    zwarnnam(name, "group name expected after -%c", arg);
 		    return 1;
 		} else {
 		    cct.gname = *++argv;
@@ -730,9 +732,9 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 	    case 'M':
 		if (cclist & COMP_LIST) {
 		    cclist |= COMP_LISTMATCH;
-		} else if ((*argv)[1]) {
+		} else if (**argv) {
 		    if ((cct.matcher =
-			 parse_cmatcher(name, (cct.mstr = (*argv) + 1))) ==
+			 parse_cmatcher(name, (cct.mstr = *argv))) ==
 			pcm_err) {
 			cct.matcher = NULL;
 			cct.mstr = NULL;
@@ -741,7 +743,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		    *argv = argv_end;
 		} else if (!argv[1]) {
 		    zwarnnam(name, "matching specification expected after -%c",
-			     **argv);
+			     arg);
 		    return 1;
 		} else {
 		    if ((cct.matcher =
@@ -755,16 +757,16 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    case 'H':
-		if ((*argv)[1])
-		    cct.hnum = atoi((*argv) + 1);
+		if (**argv)
+		    cct.hnum = atoi(*argv);
 		else if (argv[1])
 		    cct.hnum = atoi(*++argv);
 		else {
-		    zwarnnam(name, "number expected after -%c", **argv);
+		    zwarnnam(name, "number expected after -%c", arg);
 		    return 1;
 		}
 		if (!argv[1]) {
-		    zwarnnam(name, "missing pattern after -%c", **argv);
+		    zwarnnam(name, "missing pattern after -%c", arg);
 		    return 1;
 		}
 		cct.hpat = *++argv;
@@ -776,7 +778,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		break;
 	    case 'C':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
 		}
 		if (first && !hx) {
@@ -788,7 +790,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		break;
 	    case 'D':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
 		}
 		if (first && !hx) {
@@ -801,7 +803,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		break;
  	    case 'T':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
 		}
 		if (first && !hx) {
@@ -813,7 +815,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
  		break;
 	    case 'L':
 		if (cl) {
-		    zwarnnam(name, "illegal option -%c", **argv);
+		    zwarnnam(name, "illegal option -%c", arg);
 		    return 1;
 		}
 		if (!first || hx) {
@@ -828,7 +830,7 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		    return 1;
 		}
 		if (!argv[1]) {
-		    zwarnnam(name, "condition expected after -%c", **argv);
+		    zwarnnam(name, "condition expected after -%c", arg);
 		    return 1;
 		}
 		if (first) {
@@ -845,10 +847,10 @@ get_compctl(char *name, char ***av, Compctl cc, int first, int isdef, int cl)
 		}
 		break;
 	    default:
-		if (!first && (**argv == '-' || **argv == '+') && !argv[0][1])
-		    (*argv)--, argv--, ready = 1;
+		if (!first && (arg == '-' || arg == '+') && !**argv)
+		    *argv -= sz + 1, argv--, ready = 1;
 		else {
-		    zwarnnam(name, "bad option: -%c", **argv);
+		    zwarnnam(name, "bad option: -%c", arg);
 		    return 1;
 		}
 	    }
-- 
2.38.1





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