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

Re: zpc_special [was Re: question about glob qualifier format (#qx)]



On Sat, 21 Sep 2013 16:35:31 -0700
Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
> On Sep 21,  1:30am, Bart Schaefer wrote:
> }
> } I accidentally encountered some odd behavior while confirming this.
> } With NO_EXTENDED_GLOB, #q is not supposed to be available to introduce
> } qualifiers.  However
> } 
> }     % setopt NO_EXTENDED_GLOB
> }     % echo *(#q@)
> }     <list of symlinks>
> } 
> } Whereas
> } 
> }     % echo *(#q/)
> }     zsh: unknown file attribute
> } 
> } This is inconsistent, that is, sometimes (#q@) will also give "unknown"
> } and (#q/) will work.
> 
> I believe this has to do with the new zpc_special[] array in pattern.c.

I'm aware of unfinished business for actually disabling hashes, but the
problem here is I'm using the array that's only initialised when you set
up a pattern too early in the glob process, which is why it sometimes
does the right thing after you've used a pattern.

See if this fixes everything you found...

diff --git a/Src/glob.c b/Src/glob.c
index 9299b95..0c7d22d 100644
--- a/Src/glob.c
+++ b/Src/glob.c
@@ -1112,7 +1112,8 @@ zglob(LinkList list, LinkNode np, int nountok)
     gf_pre_words = NULL;
 
     /* Check for qualifiers */
-    while (!nobareglob || zpc_special[ZPC_HASH] != Marker) {
+    while (!nobareglob ||
+	   (isset(EXTENDEDGLOB) && !zpc_disables[ZPC_HASH])) {
 	struct qual *newquals;
 	char *s;
 	int sense, paren;
@@ -1158,11 +1159,11 @@ zglob(LinkList list, LinkNode np, int nountok)
 	    case Outpar:
 		paren++; /*FALLTHROUGH*/
 	    case Bar:
-		if (zpc_special[ZPC_BAR] != Marker)
+		if (!zpc_disables[ZPC_BAR])
 		    nobareglob = 1;
 		break;
 	    case Tilde:
-		if (zpc_special[ZPC_TILDE] != Marker)
+		if (!isset(EXTENDEDGLOB) || !zpc_disables[ZPC_TILDE])
 		    nobareglob = 1;
 		break;
 	    case Inpar:
@@ -1172,7 +1173,7 @@ zglob(LinkList list, LinkNode np, int nountok)
 	}
 	if (*s != Inpar)
 	    break;
-	if (s[1] == zpc_special[ZPC_HASH]) {
+	if (isset(EXTENDEDGLOB) && !zpc_disables[ZPC_HASH] && s[1] == Pound) {
 	    if (s[2] == 'q') {
 		*s = 0;
 		s += 2;
diff --git a/Src/pattern.c b/Src/pattern.c
index b7897e7..4f0166b 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -245,7 +245,8 @@ static const char *zpc_strings[ZPC_COUNT] = {
  * Corresponding array of pattern disables as set by the user
  * using "disable -p".
  */
-static char zpc_disables[ZPC_COUNT];
+/**/
+char zpc_disables[ZPC_COUNT];
 
 /*
  * Stack of saved (compressed) zpc_disables for function scope.

-- 
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/



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